From 9df4183e0416af110bfd5b710290ef9fdc67153b Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Thu, 5 Nov 2015 10:30:08 +0100
Subject: [PATCH] resolve promises during RVN specialization

---
 .../access/variables/ReadVariableNode.java    | 23 ++++++++++++++-----
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
index 329e4ca35f..937d538f82 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/variables/ReadVariableNode.java
@@ -311,16 +311,18 @@ public final class ReadVariableNode extends RNode implements RSyntaxNode, Visibi
 
     private static final class DescriptorStableMatch extends DescriptorLevel {
 
-        private final StableValue<Object> valueAssumption;
+        private final Assumption assumption;
+        private final Object value;
 
-        public DescriptorStableMatch(StableValue<Object> valueAssumption) {
-            this.valueAssumption = valueAssumption;
+        public DescriptorStableMatch(Assumption assumption, Object value) {
+            this.assumption = assumption;
+            this.value = value;
         }
 
         @Override
         public Object execute(VirtualFrame frame) throws InvalidAssumptionException {
-            valueAssumption.getAssumption().check();
-            return valueAssumption.getValue();
+            assumption.check();
+            return value;
         }
 
         @Override
@@ -524,7 +526,16 @@ public final class ReadVariableNode extends RNode implements RSyntaxNode, Visibi
         if (match) {
             ReadVariableLevel level = levels.get(levels.size() - 1);
             if (level.valueAssumption != null) {
-                lastLevel = new DescriptorStableMatch(level.valueAssumption);
+                Assumption assumption = level.valueAssumption.getAssumption();
+                Object value = level.valueAssumption.getValue();
+                if (kind != ReadKind.UnforcedSilentLocal && value instanceof RPromise) {
+                    RPromise promise = (RPromise) value;
+                    Object promiseValue = PromiseHelperNode.evaluateSlowPath(frame, promise);
+                    if (promiseValue instanceof RFunction) {
+                        value = promiseValue;
+                    }
+                }
+                lastLevel = new DescriptorStableMatch(assumption, value);
             } else {
                 complex = true;
                 lastLevel = new Match(level.slot);
-- 
GitLab