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