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