Skip to content

Commit e74f1d5

Browse files
committed
Make unoptimized cases warn nicely.
1 parent 524f3c7 commit e74f1d5

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

src/main/java/org/truffleruby/language/arguments/ReadCallerFrameNode.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
package org.truffleruby.language.arguments;
1111

1212
import org.truffleruby.language.FrameSendingNode;
13+
import org.truffleruby.language.NotOptimizedWarningNode;
1314
import org.truffleruby.language.RubyBaseNode;
1415

1516
import com.oracle.truffle.api.CompilerDirectives;
1617
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
1718
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
1819
import com.oracle.truffle.api.frame.FrameInstance.FrameAccess;
19-
import com.oracle.truffle.api.frame.Frame;
2020
import com.oracle.truffle.api.frame.MaterializedFrame;
21+
import com.oracle.truffle.api.frame.VirtualFrame;
2122
import com.oracle.truffle.api.nodes.DirectCallNode;
2223
import com.oracle.truffle.api.nodes.IndirectCallNode;
2324
import com.oracle.truffle.api.nodes.Node;
@@ -27,12 +28,13 @@ public class ReadCallerFrameNode extends RubyBaseNode {
2728

2829
private final ConditionProfile callerFrameProfile = ConditionProfile.createBinaryProfile();
2930
@CompilationFinal private volatile boolean deoptWhenNotPassedCallerFrame = true;
31+
@Child private NotOptimizedWarningNode notOptimizedNode = null;
3032

3133
public static ReadCallerFrameNode create() {
3234
return new ReadCallerFrameNode();
3335
}
3436

35-
public MaterializedFrame execute(Frame frame) {
37+
public MaterializedFrame execute(VirtualFrame frame) {
3638
final MaterializedFrame callerFrame = RubyArguments.getCallerFrame(frame);
3739

3840
if (callerFrameProfile.profile(callerFrame != null)) {
@@ -53,6 +55,7 @@ private MaterializedFrame getCallerFrame() {
5355
if (!notifyCallerToSendFrame()) {
5456
// If we fail to notify the call node (e.g., because it is a UncachedDispatchNode which is not handled yet),
5557
// we don't want to deoptimize this CallTarget on every call.
58+
getNotOptimizedNode().warn("Unoptimized reading of caller frame.");
5659
deoptWhenNotPassedCallerFrame = false;
5760
}
5861
return getContext().getCallStack().getCallerFrameIgnoringSend(FrameAccess.MATERIALIZE).materialize();
@@ -68,7 +71,6 @@ private boolean notifyCallerToSendFrame() {
6871
return true;
6972
}
7073
if (parent instanceof RubyBaseNode) {
71-
new Error().printStackTrace();
7274
return false;
7375
}
7476
parent = parent.getParent();
@@ -78,4 +80,11 @@ private boolean notifyCallerToSendFrame() {
7880
return false;
7981
}
8082

83+
public NotOptimizedWarningNode getNotOptimizedNode() {
84+
if (notOptimizedNode == null) {
85+
CompilerDirectives.transferToInterpreterAndInvalidate();
86+
notOptimizedNode = insert(NotOptimizedWarningNode.create());
87+
}
88+
return notOptimizedNode;
89+
}
8190
}

0 commit comments

Comments
 (0)