From ab4412213190b83fe6d9586f3578878120180d6b Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 9 Feb 2018 15:05:40 +0100
Subject: [PATCH] frameToEnvironment doesn't need TruffleBoundary

---
 .../truffle/r/nodes/builtin/base/Xtfrm.java   |  2 +-
 .../r/nodes/builtin/EnvironmentNodes.java     |  2 +-
 .../truffle/r/runtime/env/REnvironment.java   | 31 ++-----------------
 3 files changed, 4 insertions(+), 31 deletions(-)

diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java
index a6f492fda3..9f9e6abd16 100644
--- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java
+++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Xtfrm.java
@@ -64,7 +64,7 @@ public abstract class Xtfrm extends RBuiltinNode.Arg1 {
 
         REnvironment env = RArguments.getEnvironment(frame);
         if (createProfile.profile(env == null)) {
-            env = REnvironment.createEnclosingEnvironments(frame.materialize());
+            env = REnvironment.frameToEnvironment(frame.materialize());
         }
         RFunction func = (RFunction) getNode.execute(frame, "xtfrm.default", env, RType.Function.getName(), true);
         return RContext.getEngine().evalFunction(func, null, null, true, null, x);
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/EnvironmentNodes.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/EnvironmentNodes.java
index 5d6db966d1..ef47ee3c24 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/EnvironmentNodes.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/EnvironmentNodes.java
@@ -146,7 +146,7 @@ public final class EnvironmentNodes {
             }
             REnvironment env = RArguments.getEnvironment(enclosing);
             if (createProfile.profile(env == null)) {
-                return REnvironment.createEnclosingEnvironments(enclosing.materialize());
+                return REnvironment.frameToEnvironment(enclosing.materialize());
             }
             return env;
         }
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 ecfce5c159..95ba65c09f 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
@@ -660,27 +660,8 @@ public abstract class REnvironment extends RAttributeStorage {
         MaterializedFrame f = frame instanceof VirtualEvalFrame ? ((VirtualEvalFrame) frame).getOriginalFrame() : frame;
         REnvironment env = RArguments.getEnvironment(f);
         if (env == null) {
-            if (RArguments.getFunction(f) == null) {
-                throw RInternalError.shouldNotReachHere();
-            }
-            env = createEnclosingEnvironments(f);
-        }
-        return env;
-    }
-
-    /**
-     * This chain can be followed back to whichever "base" (i.e. non-function) environment the
-     * outermost function was defined in, e.g. "global" or "base". The purpose of this method is to
-     * create an analogous lexical parent chain of {@link Function} instances with the correct
-     * {@link MaterializedFrame}.
-     */
-    @TruffleBoundary
-    public static REnvironment createEnclosingEnvironments(MaterializedFrame frame) {
-        MaterializedFrame f = frame instanceof VirtualEvalFrame ? ((VirtualEvalFrame) frame).getOriginalFrame() : frame;
-        REnvironment env = RArguments.getEnvironment(f);
-        if (env == null) {
-            // parent is the env of the enclosing frame
-            env = REnvironment.Function.create(f);
+            assert RArguments.getFunction(f) != null;
+            RArguments.setEnvironment(f, env = new REnvironment.Function(f));
         }
         return env;
     }
@@ -1068,14 +1049,6 @@ public abstract class REnvironment extends RAttributeStorage {
             // function environments are not named
             super(UNNAMED, frame);
         }
-
-        private static Function create(MaterializedFrame frame) {
-            Function result = (Function) RArguments.getEnvironment(frame);
-            if (result == null) {
-                result = new Function(frame);
-            }
-            return result;
-        }
     }
 
     /**
-- 
GitLab