From a9f0ae0662df2f4f69af99ab366c21fd163e5aa5 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 23 Mar 2018 15:51:46 +0100
Subject: [PATCH] better chaining of callers for RfEvalNode

---
 .../truffle/r/ffi/impl/nodes/RfEvalNode.java    | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

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 b19c7953b6..3def348e2a 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
@@ -60,9 +60,10 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 {
         return RfEvalNodeGen.create();
     }
 
-    private static RCaller createCall() {
+    private static RCaller createCall(REnvironment env) {
         Frame frame = Utils.getActualCurrentFrame();
-        return RArguments.getCall(frame);
+        RCaller originalCaller = RArguments.getCall(env.getFrame());
+        return RCaller.createForPromise(originalCaller, frame);
     }
 
     @Specialization
@@ -73,20 +74,22 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 {
 
     @Specialization
     @TruffleBoundary
-    Object handlePromise(RPromise expr, @SuppressWarnings("unused") REnvironment env) {
-        return getPromiseHelper().evaluate(Utils.getActualCurrentFrame().materialize(), expr);
+    Object handlePromise(RPromise expr, REnvironment env) {
+        return getPromiseHelper().evaluate(env.getFrame(), expr);
     }
 
     @Specialization
     @TruffleBoundary
     Object handleExpression(RExpression expr, Object envArg) {
-        return RContext.getEngine().eval(expr, getEnv(envArg), createCall());
+        REnvironment env = getEnv(envArg);
+        return RContext.getEngine().eval(expr, env, createCall(env));
     }
 
     @Specialization(guards = "expr.isLanguage()")
     @TruffleBoundary
     Object handleLanguage(RPairList expr, Object envArg) {
-        return RContext.getEngine().eval(expr, getEnv(envArg), createCall());
+        REnvironment env = getEnv(envArg);
+        return RContext.getEngine().eval(expr, env, createCall(env));
     }
 
     @Specialization
@@ -132,7 +135,7 @@ public abstract class RfEvalNode extends FFIUpCallNode.Arg2 {
 
     @TruffleBoundary
     private static Object evalFunction(RFunction f, REnvironment env, ArgumentsSignature argsNames, Object... args) {
-        return RContext.getEngine().evalFunction(f, env == REnvironment.globalEnv() ? null : env.getFrame(), createCall(), true, argsNames, args);
+        return RContext.getEngine().evalFunction(f, env == REnvironment.globalEnv() ? null : env.getFrame(), createCall(env), true, argsNames, args);
     }
 
     @Fallback
-- 
GitLab