From 2d7c6bf2b936b9231e98829e67215ee370ebcc22 Mon Sep 17 00:00:00 2001 From: Florian Angerer <florian.angerer@oracle.com> Date: Mon, 16 Oct 2017 13:09:36 +0200 Subject: [PATCH] Initialize promise with exec frame if in interpreter. --- .../opt/OptForcedEagerPromiseNode.java | 5 ++++- .../opt/OptVariablePromiseBaseNode.java | 11 +++++++++-- .../truffle/r/runtime/data/RDataFactory.java | 8 ++++---- .../truffle/r/runtime/data/RPromise.java | 18 +++++++++--------- 4 files changed, 26 insertions(+), 16 deletions(-) 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 73380b076b..97d59407e6 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 ef9229e20a..2270de4f51 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 434f23bb05..4b1ef19c90 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 8b7ff52fec..f4f41a2f14 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() { -- GitLab