From dcee66851fabe08212dbb278591466354148e2e5 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 22 Mar 2018 18:08:52 +0100
Subject: [PATCH] allow Rf_eval in emptyenv

---
 .../com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java   | 6 +++++-
 .../com/oracle/truffle/r/runtime/env/REnvironment.java    | 8 ++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java
index 87225b56dc..cd6d41817b 100644
--- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java
+++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/RfEvalNode.java
@@ -141,7 +141,11 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 {
         if (envIsNullProfile.profile(envArg == RNull.instance)) {
             return REnvironment.globalEnv(RContext.getInstance());
         } else if (envArg instanceof REnvironment) {
-            return (REnvironment) envArg;
+            REnvironment env = (REnvironment) envArg;
+            if (env == REnvironment.emptyEnv()) {
+                return RContext.getInstance().stateREnvironment.getEmptyDummy();
+            }
+            return env;
         }
         CompilerDirectives.transferToInterpreter();
         throw RError.error(RError.NO_CALLER, ARGUMENT_NOT_ENVIRONMENT);
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java
index 1253a0a809..1907281242 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/env/REnvironment.java
@@ -124,8 +124,12 @@ public abstract class REnvironment extends RAttributeStorage {
         @CompilationFinal private SearchPath searchPath;
         @CompilationFinal private MaterializedFrame parentGlobalFrame; // SHARED_PARENT_RW only
 
+        @CompilationFinal private REnvironment emptyDummy; // used when evaluating in emptyenv
+
         private ContextStateImpl(MaterializedFrame globalFrame) {
             this.globalFrame = globalFrame;
+            this.emptyDummy = RDataFactory.createNewEnv(null, false, 0);
+            RArguments.initializeEnclosingFrame(this.emptyDummy.getFrame(), null);
         }
 
         public REnvironment getGlobalEnv() {
@@ -144,6 +148,10 @@ public abstract class REnvironment extends RAttributeStorage {
             return baseEnv;
         }
 
+        public REnvironment getEmptyDummy() {
+            return emptyDummy;
+        }
+
         public REnvironment getBaseNamespace() {
             return baseEnv.getNamespace();
         }
-- 
GitLab