Skip to content

Commit 5f1bd0e

Browse files
committed
Rewrite ReadFrameSlotNode to avoid exceptions
* Similar to the approach in JSReadCurrentFrameSlotNode. * These exceptions can be costly in the interpreter.
1 parent 977d5c4 commit 5f1bd0e

File tree

1 file changed

+16
-25
lines changed

1 file changed

+16
-25
lines changed

src/main/java/org/truffleruby/language/locals/ReadFrameSlotNode.java

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
*/
1010
package org.truffleruby.language.locals;
1111

12+
import com.oracle.truffle.api.frame.FrameUtil;
1213
import org.truffleruby.language.RubyBaseWithoutContextNode;
1314

1415
import com.oracle.truffle.api.dsl.Specialization;
1516
import com.oracle.truffle.api.frame.Frame;
1617
import com.oracle.truffle.api.frame.FrameSlot;
17-
import com.oracle.truffle.api.frame.FrameSlotTypeException;
1818

1919
public abstract class ReadFrameSlotNode extends RubyBaseWithoutContextNode {
2020

@@ -26,38 +26,29 @@ public ReadFrameSlotNode(FrameSlot slot) {
2626

2727
public abstract Object executeRead(Frame frame);
2828

29-
@Specialization(rewriteOn = FrameSlotTypeException.class)
30-
protected boolean readBoolean(Frame frame) throws FrameSlotTypeException {
31-
return frame.getBoolean(frameSlot);
29+
@Specialization(guards = "frame.isBoolean(frameSlot)")
30+
protected boolean readBoolean(Frame frame) {
31+
return FrameUtil.getBooleanSafe(frame, frameSlot);
3232
}
3333

34-
@Specialization(rewriteOn = FrameSlotTypeException.class)
35-
protected int readInt(Frame frame) throws FrameSlotTypeException {
36-
return frame.getInt(frameSlot);
34+
@Specialization(guards = "frame.isInt(frameSlot)")
35+
protected int readInt(Frame frame) {
36+
return FrameUtil.getIntSafe(frame, frameSlot);
3737
}
3838

39-
@Specialization(rewriteOn = FrameSlotTypeException.class)
40-
protected long readLong(Frame frame) throws FrameSlotTypeException {
41-
return frame.getLong(frameSlot);
39+
@Specialization(guards = "frame.isLong(frameSlot)")
40+
protected long readLong(Frame frame) {
41+
return FrameUtil.getLongSafe(frame, frameSlot);
4242
}
4343

44-
@Specialization(rewriteOn = FrameSlotTypeException.class)
45-
protected double readDouble(Frame frame) throws FrameSlotTypeException {
46-
return frame.getDouble(frameSlot);
44+
@Specialization(guards = "frame.isDouble(frameSlot)")
45+
protected double readDouble(Frame frame) {
46+
return FrameUtil.getDoubleSafe(frame, frameSlot);
4747
}
4848

49-
@Specialization(rewriteOn = FrameSlotTypeException.class)
50-
protected Object readObject(Frame frame) throws FrameSlotTypeException {
51-
return frame.getObject(frameSlot);
52-
}
53-
54-
@Specialization(replaces = { "readBoolean", "readInt", "readLong", "readDouble", "readObject" })
55-
protected Object readAny(Frame frame) {
56-
return frame.getValue(frameSlot);
57-
}
58-
59-
public final FrameSlot getFrameSlot() {
60-
return frameSlot;
49+
@Specialization(guards = "frame.isObject(frameSlot)")
50+
protected Object readObject(Frame frame) {
51+
return FrameUtil.getObjectSafe(frame, frameSlot);
6152
}
6253

6354
}

0 commit comments

Comments
 (0)