From df3f069f3437ab008e4917b2078bd8d3a185150f Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Fri, 29 Sep 2017 09:36:24 +0200
Subject: [PATCH] Fix: builtin 'exists' could not handle RMissing.

---
 .../src/com/oracle/truffle/r/nodes/builtin/base/Exists.java  | 5 +++--
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test    | 4 ++++
 .../r/test/library/stats/TestRandGenerationFunctions.java    | 2 ++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
index 51bf909561..dff9b6e0bb 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Exists.java
@@ -38,6 +38,7 @@ import com.oracle.truffle.r.runtime.RError.Message;
 import com.oracle.truffle.r.runtime.RRuntime;
 import com.oracle.truffle.r.runtime.RType;
 import com.oracle.truffle.r.runtime.builtins.RBuiltin;
+import com.oracle.truffle.r.runtime.data.RMissing;
 import com.oracle.truffle.r.runtime.data.RPromise;
 import com.oracle.truffle.r.runtime.env.REnvironment;
 
@@ -68,14 +69,14 @@ public abstract class Exists extends RBuiltinNode.Arg4 {
             if (modeType != RType.Any && obj instanceof RPromise) {
                 obj = PromiseHelperNode.evaluateSlowPath((RPromise) obj);
             }
-            return RRuntime.asLogical(obj != null && RRuntime.checkType(obj, modeType));
+            return RRuntime.asLogical(obj != null && obj != RMissing.instance && RRuntime.checkType(obj, modeType));
         }
         for (REnvironment e = env; e != REnvironment.emptyEnv(); e = e.getParent()) {
             Object obj = e.get(name);
             if (modeType != RType.Any && obj instanceof RPromise) {
                 obj = PromiseHelperNode.evaluateSlowPath((RPromise) obj);
             }
-            if (obj != null && RRuntime.checkType(obj, modeType)) {
+            if (obj != null && obj != RMissing.instance && RRuntime.checkType(obj, modeType)) {
                 return RRuntime.LOGICAL_TRUE;
             }
         }
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 f0f5839ca9..ce3677460a 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
@@ -153818,6 +153818,10 @@ $variables
 list(k, y, z)
 
 
+##com.oracle.truffle.r.test.library.stats.TestRandGenerationFunctions.testDotRandomSeed#
+#exists('.Random.seed', envir = .GlobalEnv, inherits = FALSE)
+[1] FALSE
+
 ##com.oracle.truffle.r.test.library.stats.TestRandGenerationFunctions.testDotRandomSeed#Output.IgnoreErrorContext#
 #{ .Random.seed }
 Error: object '.Random.seed' not found
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestRandGenerationFunctions.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestRandGenerationFunctions.java
index 7eb611414d..79fe868db2 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestRandGenerationFunctions.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/library/stats/TestRandGenerationFunctions.java
@@ -110,5 +110,7 @@ public class TestRandGenerationFunctions extends TestBase {
         assertEval("{ get0('.Random.seed', envir = .GlobalEnv, inherits = FALSE) }");
         assertEval(Output.IgnoreErrorContext, "{ get('.Random.seed', envir = .GlobalEnv, inherits = TRUE) }");
         assertEval("{ get0('.Random.seed', envir = .GlobalEnv, inherits = TRUE) }");
+
+        assertEval("exists('.Random.seed', envir = .GlobalEnv, inherits = FALSE)");
     }
 }
-- 
GitLab