diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java index 73380b076b96549b3ddacea79e07178ea0573705..97d59407e63fcdbba076d896f2b946d2b3edc40e 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptForcedEagerPromiseNode.java @@ -91,7 +91,10 @@ public final class OptForcedEagerPromiseNode extends PromiseNode { call = call.getParent(); } } - return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex); + if (CompilerDirectives.inInterpreter()) { + return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex, frame.materialize()); + } + return factory.createEagerSuppliedPromise(value, alwaysValidAssumption, call, null, wrapIndex, null); } @Override diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java index ef9229e20adc23db8633d5d5e3a12fc87dab69be..2270de4f5184ab124d6cb5ee212c9b44c7b936b5 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/function/opt/OptVariablePromiseBaseNode.java @@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.function.opt; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.FrameSlot; +import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.InvalidAssumptionException; import com.oracle.truffle.api.profiles.BranchProfile; @@ -99,10 +100,16 @@ public abstract class OptVariablePromiseBaseNode extends PromiseNode implements promiseCallerProfile.enter(); call = call.getParent(); } + + MaterializedFrame execFrame = null; + if (CompilerDirectives.inInterpreter()) { + execFrame = frame.materialize(); + } + if (result instanceof RPromise) { - return factory.createPromisedPromise((RPromise) result, notChangedNonLocally, call, this); + return factory.createPromisedPromise((RPromise) result, notChangedNonLocally, call, this, execFrame); } else { - return factory.createEagerSuppliedPromise(result, notChangedNonLocally, call, this, wrapIndex); + return factory.createEagerSuppliedPromise(result, notChangedNonLocally, call, this, wrapIndex, execFrame); } } 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 434f23bb056da3702e818a2be7cee7e38aff6281..4b1ef19c90503c90823f29afb817eb2aa1c7d844 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 @@ -502,18 +502,18 @@ public final class RDataFactory { } public static RPromise createEagerPromise(PromiseState state, Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, - int wrapIndex) { + int wrapIndex, MaterializedFrame execFrame) { if (FastROptions.noEagerEval()) { throw RInternalError.shouldNotReachHere(); } - return traceDataCreated(new RPromise.EagerPromise(state, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, wrapIndex)); + return traceDataCreated(new RPromise.EagerPromise(state, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, wrapIndex, execFrame)); } - public static RPromise createPromisedPromise(Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback) { + public static RPromise createPromisedPromise(Closure exprClosure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, MaterializedFrame execFrame) { if (FastROptions.noEagerEval()) { throw RInternalError.shouldNotReachHere(); } - return traceDataCreated(new RPromise.EagerPromise(PromiseState.Promised, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, -1)); + return traceDataCreated(new RPromise.EagerPromise(PromiseState.Promised, exprClosure, eagerValue, notChangedNonLocally, targetFrame, feedback, -1, execFrame)); } public static Object createLangPairList(int size) { 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 8b7ff52fec004d9869457e7e8d49c5780ae5ebc5..f4f41a2f149b2c9dce17a4dede0ba9d1008d4c46 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 @@ -26,7 +26,6 @@ import java.util.HashMap; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerAsserts; -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.CompilerDirectives.ValueType; @@ -302,8 +301,8 @@ public class RPromise extends RObject implements RTypedValue { */ private boolean deoptimized = false; - EagerPromise(PromiseState state, Closure closure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex) { - super(state, (MaterializedFrame) null, closure); + EagerPromise(PromiseState state, Closure closure, Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex, MaterializedFrame execFrame) { + super(state, execFrame, closure); assert state != PromiseState.Explicit; this.eagerValue = eagerValue; this.notChangedNonLocally = notChangedNonLocally; @@ -318,7 +317,6 @@ public class RPromise extends RObject implements RTypedValue { public boolean deoptimize() { if (!deoptimized && !isEvaluated() && feedback != null) { deoptimized = true; - notifyFailure(); materialize(); return false; } @@ -328,8 +326,10 @@ public class RPromise extends RObject implements RTypedValue { @TruffleBoundary public void materialize() { if (execFrame == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); this.execFrame = Utils.getStackFrame(FrameAccess.MATERIALIZE, targetFrame).materialize(); + if (feedback != null) { + notifyFailure(); + } } } @@ -409,14 +409,14 @@ public class RPromise extends RObject implements RTypedValue { * until evaluation * @return An {@link EagerPromise} */ - public RPromise createEagerSuppliedPromise(Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex) { + public RPromise createEagerSuppliedPromise(Object eagerValue, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, int wrapIndex, MaterializedFrame execFrame) { return RDataFactory.createEagerPromise(state == PromiseState.Default ? PromiseState.EagerDefault : PromiseState.EagerSupplied, exprClosure, eagerValue, notChangedNonLocally, targetFrame, - feedback, wrapIndex); + feedback, wrapIndex, execFrame); } - public RPromise createPromisedPromise(RPromise promisedPromise, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback) { + public RPromise createPromisedPromise(RPromise promisedPromise, Assumption notChangedNonLocally, RCaller targetFrame, EagerFeedback feedback, MaterializedFrame execFrame) { assert state == PromiseState.Supplied; - return RDataFactory.createPromisedPromise(exprClosure, promisedPromise, notChangedNonLocally, targetFrame, feedback); + return RDataFactory.createPromisedPromise(exprClosure, promisedPromise, notChangedNonLocally, targetFrame, feedback, execFrame); } public Object getExpr() {