From 6e9ff5d0f49cdf76ad8792503b4b1831f3157ff2 Mon Sep 17 00:00:00 2001
From: Mick Jordan <mick.jordan@oracle.com>
Date: Sun, 22 Jun 2014 21:50:48 -0700
Subject: [PATCH] encapsulate RPromise evaluation, add evaluate in frame

---
 .../com/oracle/truffle/r/engine/REngine.java  |  21 +++++-
 .../lib/darwin/libRDerived.dylib              | Bin 25064 -> 21008 bytes
 .../r/nodes/builtin/base/EvalFunctions.java   |   4 +-
 .../truffle/r/nodes/function/PromiseNode.java |   2 +-
 .../oracle/truffle/r/runtime/RContext.java    |  10 ++-
 .../truffle/r/runtime/data/RDataFactory.java  |  12 +++-
 .../truffle/r/runtime/data/RPromise.java      |  62 +++++++++++++-----
 7 files changed, 86 insertions(+), 25 deletions(-)

diff --git a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
index c5bcf37bf1..69e36da327 100644
--- a/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
+++ b/com.oracle.truffle.r.engine/src/com/oracle/truffle/r/engine/REngine.java
@@ -168,10 +168,14 @@ public final class REngine implements RContext.Engine {
      * on return.
      *
      * @param function the actual function that invoked the "eval", e.g. {@code eval}, {@code evalq}
-     *            , {@code local}.
+     *            , {@code local}, or {@code null} if identification isn't important.
      */
     public Object eval(RFunction function, RLanguage expr, REnvironment envir, REnvironment enclos) throws PutException {
-        RootCallTarget callTarget = makeCallTarget((RNode) expr.getRep(), REnvironment.globalEnv());
+        return eval(function, (RNode) expr.getRep(), envir, enclos);
+    }
+
+    private static Object eval(RFunction function, RNode exprRep, REnvironment envir, @SuppressWarnings("unused") REnvironment enclos) throws PutException {
+        RootCallTarget callTarget = makeCallTarget(exprRep, REnvironment.globalEnv());
         MaterializedFrame envFrame = envir.getFrame();
         VirtualFrame vFrame = RRuntime.createVirtualFrame();
         // We make the new frame look like it was a real call to "function".
@@ -219,7 +223,18 @@ public final class REngine implements RContext.Engine {
 
     public Object evalPromise(RPromise expr, VirtualFrame frame) throws RError {
         RootCallTarget callTarget = makeCallTarget((RNode) expr.getRep(), REnvironment.emptyEnv());
-        return expr.setValue(runCall(callTarget, frame, false, false));
+        return runCall(callTarget, frame, false, false);
+    }
+
+    public Object evalPromise(RPromise promise) throws RError {
+        // have to do the full out eval
+        try {
+            return eval(lookupBuiltin("eval"), (RNode) promise.getRep(), promise.getEnv(), null);
+        } catch (PutException ex) {
+            // TODO a new, rather unlikely, error
+            assert false;
+            return null;
+        }
     }
 
     private static Object parseAndEvalImpl(ANTLRStringStream stream, Source source, VirtualFrame frame, REnvironment envForFrame, boolean printResult) {
diff --git a/com.oracle.truffle.r.native/lib/darwin/libRDerived.dylib b/com.oracle.truffle.r.native/lib/darwin/libRDerived.dylib
index 8d58a619d4c489fe40556023a711d7e24dc88d08..7357b08e5493dfd3624a3345209e9f84f6d9a3a4 100755
GIT binary patch
literal 21008
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
Q9F5=z1V<f4e1qKu055q+W&i*H

literal 25064
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
YDM$ho>>zFN;GhRb6F7n}qLP6D02YudsQ>@~

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java
index 1ebdab8606..1878e1c16f 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/base/EvalFunctions.java
@@ -97,6 +97,8 @@ public class EvalFunctions {
     @RBuiltin(name = "eval", nonEvalArgs = {0}, kind = SUBSTITUTE)
     public abstract static class Eval extends EvalAdapter {
 
+        public abstract Object execute(VirtualFrame frame, RPromise expr, REnvironment envir, RMissing enclos);
+
         @Specialization
         public Object doEval(VirtualFrame frame, RPromise expr, @SuppressWarnings("unused") RMissing envir, RMissing enclos) {
             return doEval(frame, expr, REnvironment.globalEnv(), enclos);
@@ -114,7 +116,7 @@ public class EvalFunctions {
              * caller, so we can evaluate the promise using frame.
              */
             controlVisibility();
-            Object exprVal = RContext.getEngine().evalPromise(expr, frame);
+            Object exprVal = expr.getValue(frame);
             return doEvalBody(exprVal, envir, enclos);
         }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
index 6a6fcdc898..0cf58769a4 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/PromiseNode.java
@@ -45,7 +45,7 @@ public final class PromiseNode extends RNode {
      */
     @Override
     public Object execute(VirtualFrame frame) {
-        return new RPromise(languageRep.getRep());
+        return RDataFactory.createPromise(languageRep.getRep());
     }
 
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
index 395daa1647..01a62746c5 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RContext.java
@@ -168,11 +168,17 @@ public final class RContext extends ExecutionContext {
         Object eval(RFunction function, RLanguage expr, REnvironment envir, REnvironment enclos) throws PutException;
 
         /**
-         * Evaluate a promise in the given frame (for a builtin, where we can use the
-         * {@link VirtualFrame}) of the caller directly).
+         * Evaluate a promise in the given frame, where we can use the {@link VirtualFrame}) of the
+         * caller directly). This should <b>only</b> be called by the {@link RPromise} class.
          */
         Object evalPromise(RPromise expr, VirtualFrame frame) throws RError;
 
+        /**
+         * Evaluate a promise in the {@link MaterializedFrame} stored with the promise. This should
+         * <b>only</b> be called by the {@link RPromise} class.
+         */
+        Object evalPromise(RPromise expr) throws RError;
+
     }
 
     private final HashMap<Object, RFunction> cachedFunctions = new HashMap<>();
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
index cd9a544d38..e3da591a9e 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RDataFactory.java
@@ -317,11 +317,19 @@ public final class RDataFactory {
     }
 
     public static RSymbol createSymbol(String name) {
-        return new RSymbol(name);
+        return traceDataCreated(new RSymbol(name));
     }
 
     public static RLanguage createLanguage(Object rep) {
-        return new RLanguage(rep);
+        return traceDataCreated(new RLanguage(rep));
+    }
+
+    public static RPromise createPromise(Object rep, REnvironment env) {
+        return traceDataCreated(new RPromise(rep, env));
+    }
+
+    public static RPromise createPromise(Object rep) {
+        return createPromise(rep, null);
     }
 
 }
diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
index b1244a0a25..3fb095a023 100644
--- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
+++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/RPromise.java
@@ -22,43 +22,73 @@
  */
 package com.oracle.truffle.r.runtime.data;
 
+import com.oracle.truffle.api.frame.*;
+import com.oracle.truffle.r.runtime.*;
+
 /**
  * Denotes an R {@code promise}. It extends {@link RLanguageRep} with a (lazily) evaluated value.
  */
 @com.oracle.truffle.api.CompilerDirectives.ValueType
 public class RPromise extends RLanguageRep {
     /**
-     * Denotes a promise that raised an error during evaluation.
+     * For promises associated with environments (frames) that are not top-level.
+     */
+    private REnvironment env;
+    /**
+     * When {@code null} the promise has not been evaluated.
      */
-    private static Object ERROR = new Object();
-
     private Object value;
 
     /**
-     * Create the promise with a representation that allow evaluation later.
+     * Create the promise with a representation that allows evaluation later in the "current" frame.
+     * The frame may need to be set if the promise is passed as an argument to another function.
      */
-    public RPromise(Object rep) {
+    RPromise(Object rep) {
+        this(rep, null);
+    }
+
+    /**
+     * Create the promise with a representation that allows evaluation later in a given frame.
+     */
+    RPromise(Object rep, REnvironment env) {
         super(rep);
+        this.env = env;
+    }
+
+    public REnvironment getEnv() {
+        return env;
     }
 
     /**
-     * This is a workaround for the fact that REngine can't be called from here (at the moment),
-     * otherwise the evaluation would be implicitly done in {@link #getValue}.
+     * Get the value of the promise, evaluating it if necessary in the associated environment. A
+     * promise is evaluate-once.
      */
-    public Object setValue(Object newValue) {
+    public Object getValue() {
         if (value == null) {
-            if (newValue == null) {
-                this.value = ERROR;
-            } else {
-                this.value = newValue;
+            assert env != null;
+            try {
+                value = RContext.getEngine().evalPromise(this);
+            } catch (RError e) {
+                value = e;
+                throw e;
             }
-        } else {
-            assert false : "promise already has a value";
         }
-        return this.value;
+        return value;
     }
 
-    public Object getValue() {
+    /**
+     * Get the value of the promise, evaluating it if necessary in the given {@link VirtualFrame}. A
+     * promise is evaluate-once.
+     */
+    public Object getValue(VirtualFrame frame) {
+        if (value == null) {
+            try {
+                value = RContext.getEngine().evalPromise(this, frame);
+            } catch (RError e) {
+                value = e;
+                throw e;
+            }
+        }
         return value;
     }
 
-- 
GitLab