Skip to content
Snippets Groups Projects
Commit 45375d34 authored by Mick Jordan's avatar Mick Jordan
Browse files

add na.rm to all builtin

parent 126b3a31
Branches
No related tags found
No related merge requests found
......@@ -31,42 +31,51 @@ import com.oracle.truffle.r.nodes.unary.*;
import com.oracle.truffle.r.runtime.*;
import com.oracle.truffle.r.runtime.data.*;
/**
* TODO: Added primitive {@code na.rm} support, but this code needs rewriting in the same manner as
* {@link Any} and there is opportunity to share code.
*/
@RBuiltin(name = "all", kind = PRIMITIVE, parameterNames = {"...", "na.rm"})
public abstract class All extends RBuiltinNode {
@Child private CastLogicalNode castLogicalNode;
@Override
public Object[] getDefaultParameterValues() {
return new Object[]{RArgsValuesAndNames.EMPTY, RRuntime.LOGICAL_FALSE};
}
@Override
protected void createCasts(CastBuilder casts) {
casts.toLogical(0);
}
@Specialization
protected byte all(byte value) {
protected byte all(byte value, @SuppressWarnings("unused") byte naRm) {
controlVisibility();
return value;
}
@Specialization
protected byte all(RLogicalVector vector) {
protected byte all(RLogicalVector vector, byte naRm) {
controlVisibility();
return accumulate(vector);
return accumulate(vector, naRm);
}
@Specialization
protected byte all(@SuppressWarnings("unused") RNull vector) {
protected byte all(@SuppressWarnings("unused") RNull vector, @SuppressWarnings("unused") byte naRm) {
controlVisibility();
return RRuntime.LOGICAL_TRUE;
}
@Specialization
protected byte all(@SuppressWarnings("unused") RMissing vector) {
protected byte all(@SuppressWarnings("unused") RMissing vector, @SuppressWarnings("unused") byte naRm) {
controlVisibility();
return RRuntime.LOGICAL_TRUE;
}
@Specialization
protected byte all(RArgsValuesAndNames args) {
protected byte all(RArgsValuesAndNames args, byte naRm) {
if (castLogicalNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
castLogicalNode = insert(CastLogicalNodeGen.create(true, false, false));
......@@ -76,11 +85,14 @@ public abstract class All extends RBuiltinNode {
for (Object argValue : argValues) {
byte result;
if (argValue instanceof RVector || argValue instanceof RSequence) {
result = accumulate((RLogicalVector) castLogicalNode.execute(argValue));
result = accumulate((RLogicalVector) castLogicalNode.execute(argValue), naRm);
} else if (argValue == RNull.instance) {
result = RRuntime.LOGICAL_TRUE;
} else {
result = (byte) castLogicalNode.execute(argValue);
if (result == RRuntime.LOGICAL_NA && naRm != RRuntime.LOGICAL_FALSE) {
continue;
}
}
if (result != RRuntime.LOGICAL_TRUE) {
return result;
......@@ -89,9 +101,12 @@ public abstract class All extends RBuiltinNode {
return RRuntime.LOGICAL_TRUE;
}
private static byte accumulate(RLogicalVector vector) {
private static byte accumulate(RLogicalVector vector, byte naRm) {
for (int i = 0; i < vector.getLength(); i++) {
byte b = vector.getDataAt(i);
if (b == RRuntime.LOGICAL_NA && naRm != RRuntime.LOGICAL_FALSE) {
continue;
}
if (b != RRuntime.LOGICAL_TRUE) {
return b;
}
......
......@@ -117,7 +117,7 @@ public class TestBuiltin_all extends TestBase {
assertEval("{ all(TRUE, FALSE, NA, na.rm=TRUE) }");
assertEval("{ all(TRUE, TRUE, NA, na.rm=FALSE) }");
assertEval(Ignored.Unknown, "{ all(TRUE, TRUE, NA, na.rm=TRUE) }");
assertEval("{ all(TRUE, TRUE, NA, na.rm=TRUE) }");
// FIXME coercion warning missing
assertEval(Ignored.Unknown, "{ all(1) }");
assertEval(Ignored.Unknown, "{ all(0) }");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment