Skip to content
Snippets Groups Projects
Commit f4eff2b9 authored by Lukas Stadler's avatar Lukas Stadler
Browse files

look for deoptimizable promises in arguments, not in frame slots

parent af8edd15
No related branches found
No related tags found
No related merge requests found
......@@ -349,7 +349,7 @@ public class EnvFunctions {
MaterializedFrame matFrame = callerFrame.execute(frame);
matFrame = matFrame instanceof VirtualEvalFrame ? ((VirtualEvalFrame) matFrame).getOriginalFrame() : matFrame;
deoptFrameNode.deoptimizeFrame(matFrame);
deoptFrameNode.deoptimizeFrame(RArguments.getArguments(matFrame));
return REnvironment.frameToEnvironment(matFrame);
}
......
......@@ -444,7 +444,7 @@ public class FrameFunctions {
}
// Deoptimize every promise which is now in this frame, as it might leave it's stack
deoptFrameNode.deoptimizeFrame(result.getFrame());
deoptFrameNode.deoptimizeFrame(RArguments.getArguments(result.getFrame()));
return result;
}
}
......@@ -465,7 +465,7 @@ public class FrameFunctions {
RPairList next = result;
for (int i = 1; i < depth; i++) {
MaterializedFrame mf = helper.getNumberedFrame(frame, i).materialize();
deoptFrameNode.deoptimizeFrame(mf);
deoptFrameNode.deoptimizeFrame(RArguments.getArguments(mf));
next.setCar(REnvironment.frameToEnvironment(mf));
if (i != depth - 1) {
RPairList pl = RDataFactory.createPairList();
......
......@@ -35,6 +35,7 @@ import com.oracle.truffle.r.nodes.function.opt.EagerEvalHelper;
import com.oracle.truffle.r.nodes.function.visibility.SetVisibilityNode;
import com.oracle.truffle.r.nodes.instrumentation.RInstrumentation;
import com.oracle.truffle.r.runtime.ArgumentsSignature;
import com.oracle.truffle.r.runtime.RArguments;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RFunction;
import com.oracle.truffle.r.runtime.env.frame.FrameSlotChangeMonitor;
......@@ -68,7 +69,7 @@ public final class FunctionExpressionNode extends RSourceSectionNode implements
MaterializedFrame matFrame = frame.materialize();
if (deoptFrameNode != null) {
// Deoptimize every promise which is now in this frame, as it might leave it's stack
deoptFrameNode.deoptimizeFrame(matFrame);
deoptFrameNode.deoptimizeFrame(RArguments.getArguments(matFrame));
}
if (!initialized) {
CompilerDirectives.transferToInterpreterAndInvalidate();
......
......@@ -88,32 +88,18 @@ public final class PromiseHelperNode extends RBaseNode {
* Guarantees, that all {@link RPromise}s in frame are deoptimized and thus are safe to
* leave it's stack-branch.
*
* @param frame The frame to check for {@link RPromise}s to deoptimize
* @param arguments The frame's arguments, which will be checked for {@link RPromise}s to deoptimize
* @return Whether there was at least on {@link RPromise} which needed to be deoptimized.
*/
@TruffleBoundary
public boolean deoptimizeFrame(MaterializedFrame frame) {
public boolean deoptimizeFrame(Object[] arguments) {
boolean deoptOne = false;
for (FrameSlot slot : frame.getFrameDescriptor().getSlots().toArray(new FrameSlot[0])) {
// We're only interested in RPromises
if (slot.getKind() != FrameSlotKind.Object || !(slot.getIdentifier() instanceof String)) {
continue;
}
// Try to read it...
try {
Object value = FrameSlotChangeMonitor.getObject(slot, frame);
// If it's a promise, deoptimize it!
if (value instanceof RPromise) {
RPromise promise = (RPromise) value;
if (!promise.isEvaluated()) {
deoptOne |= deoptimize(promise);
}
for (Object value : arguments) {
// If it's a promise, deoptimize it!
if (value instanceof RPromise) {
RPromise promise = (RPromise) value;
if (!promise.isEvaluated()) {
deoptOne |= deoptimize(promise);
}
} catch (FrameSlotTypeException err) {
// Should not happen after former check on FrameSlotKind!
throw RInternalError.shouldNotReachHere();
}
}
return deoptOne;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment