Skip to content

Commit b7f3103

Browse files
committed
[GR-17457] Inline logic to read self in ReadInstanceVariableNode and WriteInstanceVariableNode
PullRequest: truffleruby/3822
2 parents 2fc989c + 1b47a3f commit b7f3103

File tree

4 files changed

+33
-34
lines changed

4 files changed

+33
-34
lines changed

src/main/java/org/truffleruby/language/objects/ReadInstanceVariableNode.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,29 @@
2020
import com.oracle.truffle.api.frame.VirtualFrame;
2121
import com.oracle.truffle.api.object.DynamicObjectLibrary;
2222
import com.oracle.truffle.api.profiles.ConditionProfile;
23+
import org.truffleruby.language.locals.ReadFrameSlotNode;
2324

2425
public class ReadInstanceVariableNode extends RubyContextSourceNode {
2526

2627
private final String name;
2728

28-
@Child private RubyNode receiver;
29+
@Child private ReadFrameSlotNode readSelfSlotNode;
2930
@Child private DynamicObjectLibrary objectLibrary;
3031

3132
private final ConditionProfile objectProfile = ConditionProfile.create();
3233

33-
public ReadInstanceVariableNode(String name, RubyNode receiver) {
34+
public ReadInstanceVariableNode(String name) {
3435
this.name = name;
35-
this.receiver = receiver;
36+
this.readSelfSlotNode = SelfNode.createReadSelfFrameSlotNode();
3637
}
3738

3839
@Override
3940
public Object execute(VirtualFrame frame) {
40-
final Object receiverObject = receiver.execute(frame);
41+
final Object self = SelfNode.readSelf(frame, readSelfSlotNode);
4142

42-
if (objectProfile.profile(receiverObject instanceof RubyDynamicObject)) {
43+
if (objectProfile.profile(self instanceof RubyDynamicObject)) {
4344
final DynamicObjectLibrary objectLibrary = getObjectLibrary();
44-
final RubyDynamicObject dynamicObject = (RubyDynamicObject) receiverObject;
45+
final RubyDynamicObject dynamicObject = (RubyDynamicObject) self;
4546
return objectLibrary.getOrDefault(dynamicObject, name, nil);
4647
} else {
4748
return nil;
@@ -50,11 +51,11 @@ public Object execute(VirtualFrame frame) {
5051

5152
@Override
5253
public Object isDefined(VirtualFrame frame, RubyLanguage language, RubyContext context) {
53-
final Object receiverObject = receiver.execute(frame);
54+
final Object self = SelfNode.readSelf(frame, readSelfSlotNode);
5455

55-
if (objectProfile.profile(receiverObject instanceof RubyDynamicObject)) {
56+
if (objectProfile.profile(self instanceof RubyDynamicObject)) {
5657
final DynamicObjectLibrary objectLibrary = getObjectLibrary();
57-
final RubyDynamicObject dynamicObject = (RubyDynamicObject) receiverObject;
58+
final RubyDynamicObject dynamicObject = (RubyDynamicObject) self;
5859
if (objectLibrary.containsKey(dynamicObject, name)) {
5960
return FrozenStrings.INSTANCE_VARIABLE;
6061
} else {
@@ -78,9 +79,7 @@ private DynamicObjectLibrary getObjectLibrary() {
7879

7980
@Override
8081
public RubyNode cloneUninitialized() {
81-
var copy = new ReadInstanceVariableNode(
82-
name,
83-
receiver.cloneUninitialized());
82+
var copy = new ReadInstanceVariableNode(name);
8483
return copy.copyFlags(this);
8584
}
8685

src/main/java/org/truffleruby/language/objects/SelfNode.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,23 @@ public class SelfNode extends RubyContextSourceNode {
3131
public SelfNode() {
3232
}
3333

34-
@Override
35-
public Object execute(VirtualFrame frame) {
34+
public static ReadFrameSlotNode createReadSelfFrameSlotNode() {
35+
return ReadFrameSlotNodeGen.create(SELF_INDEX);
36+
}
37+
38+
public static Object readSelf(VirtualFrame frame, ReadFrameSlotNode readSelfSlotNode) {
3639
assert frame.getFrameDescriptor().getSlotName(SELF_INDEX) == SELF_IDENTIFIER;
40+
return readSelfSlotNode.executeRead(frame);
41+
}
3742

43+
@Override
44+
public Object execute(VirtualFrame frame) {
3845
if (readSelfSlotNode == null) {
3946
CompilerDirectives.transferToInterpreterAndInvalidate();
40-
readSelfSlotNode = insert(ReadFrameSlotNodeGen.create(SELF_INDEX));
47+
readSelfSlotNode = insert(createReadSelfFrameSlotNode());
4148
}
4249

43-
return readSelfSlotNode.executeRead(frame);
50+
return readSelf(frame, readSelfSlotNode);
4451
}
4552

4653
@Override

src/main/java/org/truffleruby/language/objects/WriteInstanceVariableNode.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,36 +21,37 @@
2121

2222
import com.oracle.truffle.api.CompilerDirectives;
2323
import com.oracle.truffle.api.frame.VirtualFrame;
24+
import org.truffleruby.language.locals.ReadFrameSlotNode;
2425

2526
public class WriteInstanceVariableNode extends RubyContextSourceNode implements AssignableNode {
2627

2728
private final String name;
2829

29-
@Child private RubyNode receiver;
30+
@Child private ReadFrameSlotNode readSelfSlotNode;
3031
@Child private IsFrozenNode isFrozenNode;
3132
@Child private RubyNode rhs;
3233
@Child private WriteObjectFieldNode writeNode;
3334

3435
@CompilationFinal private boolean frozenProfile;
3536

36-
public WriteInstanceVariableNode(String name, RubyNode receiver, RubyNode rhs) {
37+
public WriteInstanceVariableNode(String name, RubyNode rhs) {
3738
this.name = name;
38-
this.receiver = receiver;
39+
this.readSelfSlotNode = SelfNode.createReadSelfFrameSlotNode();
3940
this.rhs = rhs;
4041
}
4142

4243
@Override
4344
public Object execute(VirtualFrame frame) {
44-
final Object object = receiver.execute(frame);
45+
final Object self = SelfNode.readSelf(frame, readSelfSlotNode);
4546
final Object value = rhs.execute(frame);
46-
write(object, value);
47+
write(self, value);
4748
return value;
4849
}
4950

5051
@Override
5152
public void assign(VirtualFrame frame, Object value) {
52-
final Object object = receiver.execute(frame);
53-
write(object, value);
53+
final Object self = SelfNode.readSelf(frame, readSelfSlotNode);
54+
write(self, value);
5455
}
5556

5657
private void write(Object object, Object value) {
@@ -96,10 +97,7 @@ public AssignableNode cloneUninitializedAssignable() {
9697

9798
@Override
9899
public RubyNode cloneUninitialized() {
99-
var copy = new WriteInstanceVariableNode(
100-
name,
101-
receiver.cloneUninitialized(),
102-
cloneUninitialized(rhs));
100+
var copy = new WriteInstanceVariableNode(name, cloneUninitialized(rhs));
103101
return copy.copyFlags(this);
104102
}
105103

src/main/java/org/truffleruby/parser/BodyTranslator.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,8 +1837,7 @@ public RubyNode visitInstAsgnNode(InstAsgnParseNode node) {
18371837
rhs = node.getValueNode().accept(this);
18381838
}
18391839

1840-
final RubyNode self = new SelfNode();
1841-
final RubyNode ret = new WriteInstanceVariableNode(name, self, rhs);
1840+
final RubyNode ret = new WriteInstanceVariableNode(name, rhs);
18421841
ret.unsafeSetSourceSection(sourceSection);
18431842
return addNewlineIfNeeded(node, ret);
18441843
}
@@ -1847,11 +1846,7 @@ public RubyNode visitInstAsgnNode(InstAsgnParseNode node) {
18471846
public RubyNode visitInstVarNode(InstVarParseNode node) {
18481847
final SourceIndexLength sourceSection = node.getPosition();
18491848
final String name = node.getName();
1850-
1851-
// About every case will use a SelfParseNode, just don't it use more than once.
1852-
final SelfNode self = new SelfNode();
1853-
1854-
final RubyNode ret = new ReadInstanceVariableNode(name, self);
1849+
final RubyNode ret = new ReadInstanceVariableNode(name);
18551850
ret.unsafeSetSourceSection(sourceSection);
18561851
return addNewlineIfNeeded(node, ret);
18571852
}

0 commit comments

Comments
 (0)