diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java index 3be03b99133e8b48791416edae3f4fbcfcbdcb0b..1139df347c88ba98ffad02fb0074ffca2aa536b4 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/builtin/InternalNode.java @@ -242,7 +242,8 @@ public abstract class InternalNode extends OperatorNode { protected Object[] prepareArgs(VirtualFrame frame) { Object[] args = new Object[arguments.length]; for (int i = 0; i < args.length; i++) { - args[i] = arguments[i].execute(frame); + Object execute = arguments[i].execute(frame); + args[i] = execute; } return args; } @@ -300,11 +301,13 @@ public abstract class InternalNode extends OperatorNode { Object[] args = new Object[factory.getSignature().getLength()]; for (int i = 0; i < args.length - 1; i++) { - args[i] = arguments[i].execute(frame); + Object arg = arguments[i].execute(frame); + args[i] = arg; } Object[] varArgs = new Object[arguments.length - (factory.getSignature().getLength() - 1)]; for (int i = 0; i < varArgs.length; i++) { - varArgs[i] = arguments[args.length - 1 + i].execute(frame); + Object arg = arguments[args.length - 1 + i].execute(frame); + varArgs[i] = arg; } args[args.length - 1] = new RArgsValuesAndNames(varArgs, ArgumentsSignature.empty(varArgs.length)); return args; 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 c3a0a12254405c034ad0cbd1c12137c5ebe61d76..4421b005683f46460eac43bb97e732a92401b227 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 @@ -540,10 +540,10 @@ public abstract class PromiseNode extends RNode { evaluatedArgs[i] = argValue; } else { size++; - evaluatedArgs[i] = promiseCheckHelper.checkEvaluate(frame, argValue); + Object arg = promiseCheckHelper.checkEvaluate(frame, argValue); + evaluatedArgs[i] = arg; } if (evaluatedArgs[i] == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); throw RInternalError.shouldNotReachHere("evaluated argument must not be null"); } } @@ -565,10 +565,10 @@ public abstract class PromiseNode extends RNode { evaluatedArgs[i] = argValue; } else { size++; - evaluatedArgs[i] = promiseCheckHelper.checkEvaluate(frame, argValue); + Object arg = promiseCheckHelper.checkEvaluate(frame, argValue); + evaluatedArgs[i] = arg; } if (evaluatedArgs[i] == null) { - CompilerDirectives.transferToInterpreterAndInvalidate(); throw RInternalError.shouldNotReachHere("evaluated argument must not be null"); } } 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 db83ac5f85b11e51bf639f764170106a24973749..627c2ea261d9df22f4e70cea74c57d32232fb889 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; @@ -301,8 +300,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; @@ -317,7 +316,6 @@ public class RPromise extends RObject implements RTypedValue { public boolean deoptimize() { if (!deoptimized && !isEvaluated() && feedback != null) { deoptimized = true; - notifyFailure(); materialize(); return false; } @@ -327,8 +325,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(); + } } } @@ -408,14 +408,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() {