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