From 0c3001ed97eee0f952d19f3bc05d5abd80a76b28 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Wed, 22 Mar 2017 15:45:28 +0100 Subject: [PATCH] Fix: NPE in all.names when skipping a parameter. --- .../com/oracle/truffle/r/nodes/builtin/base/AllNames.java | 5 ++++- .../src/com/oracle/truffle/r/nodes/builtin/base/AnyNA.java | 6 ++++++ .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test | 4 ++++ .../truffle/r/test/builtins/TestBuiltin_allnames.java | 4 +++- 4 files changed, 17 insertions(+), 2 deletions(-) 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 d93063eb23..0feeb054e6 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 dc146c10aa..99ae59e013 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 f93f9ac0ad..f1c58896bf 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 54e5ed2846..d832fd2ef5 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')))) }"); } } -- GitLab