diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java index d93063eb23294645fa5223b444735e1140617a88..0feeb054e6b35da0b323f8c79e24c2b849778797 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AllNames.java @@ -108,7 +108,10 @@ public abstract class AllNames extends RBuiltinNode { protected Void visit(RSyntaxCall element) { accept(element.getSyntaxLHS()); for (RSyntaxElement arg : element.getSyntaxArguments()) { - accept(arg); + // unmatched arguments may still be null + if (arg != null) { + accept(arg); + } } return null; } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java index dc146c10aaf54a033654d50bf5e9e8102579ed36..99ae59e01376b256adc4054d8c54c30b968de6e9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java @@ -37,6 +37,7 @@ import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RList; +import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RNull; import com.oracle.truffle.r.runtime.data.RRaw; import com.oracle.truffle.r.runtime.data.model.RAbstractComplexVector; @@ -60,6 +61,11 @@ public abstract class AnyNA extends RBuiltinNode { casts.arg("recursive").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean()); } + @Override + public Object[] getDefaultParameterValues() { + return new Object[]{RMissing.instance, RRuntime.LOGICAL_FALSE}; + } + private static byte doScalar(boolean isNA) { return RRuntime.asLogical(isNA); } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index f93f9ac0ade8438720a70087135023fd10225ada..f1c58896bf96c6409f6df4d38544e3821b65e01d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -2700,6 +2700,10 @@ character(0) #{ all.names(expression(sin(x+y+x)), unique=T) } [1] "sin" "+" "x" "y" +##com.oracle.truffle.r.test.builtins.TestBuiltin_allnames.testAllNames# +#{ all.names(quote(switch(x, 'median' =, 'hello' = print('hello case')))) } +[1] "switch" "x" "print" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_allnames.testallnames1# #argv <- list(quote(y ~ ((g1) * exp((log(g2/g1)) * (1 - exp(-k * (x - Ta)))/(1 - exp(-k * (Tb - Ta)))))), FALSE, -1L, TRUE); .Internal(all.names(argv[[1]], argv[[2]], argv[[3]], argv[[4]])) [1] "y" "g1" "g2" "k" "x" "Ta" "Tb" diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allnames.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allnames.java index 54e5ed2846c7ff90c54ebdfbedcf09d4ff29e692..d832fd2ef53902b66b8388e0d6a00f7344122a47 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allnames.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_allnames.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2016, Oracle and/or its affiliates + * Copyright (c) 2014, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -64,5 +64,7 @@ public class TestBuiltin_allnames extends TestBase { assertEval("{ all.names(expression(sin(x+y+x)), unique=T) }"); assertEval("{ all.names(expression(sin(x+y+x)), unique=NULL) }"); assertEval("{ all.names(expression(sin(x+y+x)), unique=NA) }"); + + assertEval("{ all.names(quote(switch(x, 'median' =, 'hello' = print('hello case')))) }"); } }