Skip to content

Commit cd562ca

Browse files
committed
Replace custom code with DSL code for FieldReadNode
Signed-off-by: Stefan Marr <[email protected]>
1 parent 5820ec7 commit cd562ca

File tree

9 files changed

+119
-298
lines changed

9 files changed

+119
-298
lines changed

src/trufflesom/compiler/MethodGenerationContext.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
package trufflesom.compiler;
2727

2828
import static trufflesom.interpreter.SNodeFactory.createCatchNonLocalReturn;
29-
import static trufflesom.interpreter.SNodeFactory.createFieldRead;
3029
import static trufflesom.interpreter.SNodeFactory.createFieldWrite;
3130
import static trufflesom.interpreter.SNodeFactory.createNonLocalReturn;
3231

@@ -52,6 +51,7 @@
5251
import trufflesom.interpreter.nodes.ExpressionNode;
5352
import trufflesom.interpreter.nodes.FieldNode;
5453
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
54+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
5555
import trufflesom.interpreter.nodes.ReturnNonLocalNode;
5656
import trufflesom.interpreter.nodes.literals.BlockNode;
5757
import trufflesom.primitives.Primitives;
@@ -419,8 +419,8 @@ public FieldReadNode getObjectFieldRead(final SSymbol fieldName,
419419
if (!holderGenc.hasField(fieldName)) {
420420
return null;
421421
}
422-
return createFieldRead(getSelfRead(source),
423-
holderGenc.getFieldIndex(fieldName), source);
422+
return FieldReadNodeGen.create(holderGenc.getFieldIndex(fieldName), getSelfRead(source))
423+
.initialize(source);
424424
}
425425

426426
public FieldNode getObjectFieldWrite(final SSymbol fieldName,

src/trufflesom/compiler/bc/BytecodeMethodGenContext.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import trufflesom.interpreter.nodes.ExpressionNode;
6565
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
6666
import trufflesom.interpreter.nodes.FieldNode.FieldWriteNode;
67+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
6768
import trufflesom.interpreter.nodes.GlobalNode;
6869
import trufflesom.interpreter.nodes.bc.BytecodeLoopNode;
6970
import trufflesom.interpreter.nodes.literals.LiteralNode;
@@ -531,7 +532,8 @@ private FieldReadNode optimizeFieldGetter() {
531532

532533
byte idx = getIndex(1);
533534
// because we don't handle block methods, we don't need to worry about ctx > 0
534-
return new FieldReadNode(new LocalArgumentReadNode(arguments.get(universe.symSelf)), idx);
535+
return FieldReadNodeGen.create(idx,
536+
new LocalArgumentReadNode(arguments.get(universe.symSelf)));
535537
}
536538

537539
private static int expectedSetterMethodLength =

src/trufflesom/interpreter/SNodeFactory.java

-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import trufflesom.interpreter.nodes.ArgumentReadNode.NonLocalArgumentWriteNode;
1414
import trufflesom.interpreter.nodes.ExpressionNode;
1515
import trufflesom.interpreter.nodes.FieldNode;
16-
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
1716
import trufflesom.interpreter.nodes.FieldNode.UninitFieldIncNode;
1817
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldWriteNodeGen;
1918
import trufflesom.interpreter.nodes.LocalVariableNode.LocalVariableWriteNode;
@@ -33,11 +32,6 @@ public static CatchNonLocalReturnNode createCatchNonLocalReturn(
3332
methodBody, onStackMarker).initialize(methodBody.getSourceSection());
3433
}
3534

36-
public static FieldReadNode createFieldRead(final ExpressionNode self,
37-
final int fieldIndex, final SourceSection source) {
38-
return new FieldReadNode(self, fieldIndex).initialize(source);
39-
}
40-
4135
public static FieldNode createFieldWrite(final ExpressionNode self,
4236
final ExpressionNode exp, final int fieldIndex, final SourceSection source) {
4337
if (exp instanceof IntIncrementNode

src/trufflesom/interpreter/nodes/FieldNode.java

+72-41
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
package trufflesom.interpreter.nodes;
2323

2424
import com.oracle.truffle.api.CompilerDirectives;
25+
import com.oracle.truffle.api.dsl.Cached;
2526
import com.oracle.truffle.api.dsl.NodeChild;
2627
import com.oracle.truffle.api.dsl.Specialization;
2728
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -31,40 +32,37 @@
3132
import bd.primitives.nodes.PreevaluatedExpression;
3233
import trufflesom.compiler.Variable.Argument;
3334
import trufflesom.interpreter.nodes.ArgumentReadNode.LocalArgumentReadNode;
35+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
3436
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldWriteNodeGen;
3537
import trufflesom.interpreter.objectstorage.FieldAccessorNode;
36-
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode;
3738
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode;
3839
import trufflesom.interpreter.objectstorage.FieldAccessorNode.IncrementLongFieldNode;
40+
import trufflesom.interpreter.objectstorage.ObjectLayout;
41+
import trufflesom.interpreter.objectstorage.StorageLocation;
42+
import trufflesom.interpreter.objectstorage.StorageLocation.DoubleStorageLocation;
43+
import trufflesom.interpreter.objectstorage.StorageLocation.LongStorageLocation;
3944
import trufflesom.vm.NotYetImplementedException;
45+
import trufflesom.vm.constants.Nil;
4046
import trufflesom.vmobjects.SObject;
4147

4248

4349
public abstract class FieldNode extends ExpressionNode {
4450

4551
protected abstract ExpressionNode getSelf();
4652

47-
public static final class FieldReadNode extends FieldNode
53+
@NodeChild(value = "self", type = ExpressionNode.class)
54+
public abstract static class FieldReadNode extends FieldNode
4855
implements PreevaluatedExpression {
49-
@Child private ExpressionNode self;
50-
@Child private AbstractReadFieldNode read;
51-
52-
public FieldReadNode(final ExpressionNode self, final int fieldIndex) {
53-
this.self = self;
54-
read = FieldAccessorNode.createRead(fieldIndex);
55-
}
56+
protected final int fieldIndex;
5657

57-
public int getFieldIndex() {
58-
return read.getFieldIndex();
58+
public FieldReadNode(final int fieldIndex) {
59+
this.fieldIndex = fieldIndex;
5960
}
6061

61-
@Override
62-
protected ExpressionNode getSelf() {
63-
return self;
64-
}
62+
public abstract Object executeEvaluated(SObject obj);
6563

66-
public Object executeEvaluated(final SObject obj) {
67-
return read.read(obj);
64+
public int getFieldIndex() {
65+
return fieldIndex;
6866
}
6967

7068
@Override
@@ -73,28 +71,64 @@ public Object doPreEvaluated(final VirtualFrame frame,
7371
return executeEvaluated((SObject) arguments[0]);
7472
}
7573

76-
@Override
77-
public long executeLong(final VirtualFrame frame) throws UnexpectedResultException {
78-
SObject obj = self.executeSObject(frame);
79-
return read.readLong(obj);
80-
}
81-
82-
@Override
83-
public double executeDouble(final VirtualFrame frame) throws UnexpectedResultException {
84-
SObject obj = self.executeSObject(frame);
85-
return read.readDouble(obj);
74+
@Specialization(
75+
assumptions = "layout.getAssumption()",
76+
guards = {
77+
"obj.getObjectLayout() == layout",
78+
"layout.isLongLocation(fieldIndex)"},
79+
rewriteOn = UnexpectedResultException.class)
80+
public long readLong(final SObject obj,
81+
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
82+
@Cached("layout.getLongLocation(fieldIndex)") final LongStorageLocation storage)
83+
throws UnexpectedResultException {
84+
return storage.readLong(obj);
85+
}
86+
87+
@Specialization(
88+
assumptions = "layout.getAssumption()",
89+
guards = {
90+
"obj.getObjectLayout() == layout",
91+
"layout.isDoubleLocation(fieldIndex)"},
92+
rewriteOn = UnexpectedResultException.class)
93+
public double readDouble(final SObject obj,
94+
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
95+
@Cached("layout.getDoubleLocation(fieldIndex)") final DoubleStorageLocation storage)
96+
throws UnexpectedResultException {
97+
return storage.readDouble(obj);
98+
}
99+
100+
@Specialization(
101+
assumptions = "layout.getAssumption()",
102+
guards = {
103+
"obj.getObjectLayout() == layout",
104+
"layout.isUnwrittenLocation(fieldIndex)"},
105+
rewriteOn = UnexpectedResultException.class)
106+
public SObject readNil(final SObject obj,
107+
@Cached("obj.getObjectLayout()") final ObjectLayout layout)
108+
throws UnexpectedResultException {
109+
return Nil.nilObject;
110+
}
111+
112+
@Specialization(
113+
assumptions = "layout.getAssumption()",
114+
guards = {
115+
"obj.getObjectLayout() == layout",
116+
"layout.isObjectLocation(fieldIndex)"})
117+
public Object readObject(final SObject obj,
118+
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
119+
@Cached("layout.getObjectLocation(fieldIndex)") final StorageLocation storage) {
120+
return storage.read(obj);
121+
}
122+
123+
@Specialization(guards = "!obj.getObjectLayout().isValid()")
124+
public Object updateObject(final SObject obj) {
125+
obj.updateLayoutToMatchClass();
126+
return executeEvaluated(obj);
86127
}
87128

88-
@Override
89-
public Object executeGeneric(final VirtualFrame frame) {
90-
SObject obj;
91-
try {
92-
obj = self.executeSObject(frame);
93-
} catch (UnexpectedResultException e) {
94-
CompilerDirectives.transferToInterpreter();
95-
throw new RuntimeException("This should never happen by construction");
96-
}
97-
return executeEvaluated(obj);
129+
@Specialization
130+
public Object readObject(final SObject obj) {
131+
return obj.getObjectLayout().getStorageLocation(fieldIndex).read(obj);
98132
}
99133

100134
@Override
@@ -104,10 +138,7 @@ public boolean isTrivial() {
104138

105139
@Override
106140
public PreevaluatedExpression copyTrivialNode() {
107-
FieldReadNode node = (FieldReadNode) copy();
108-
node.self = null;
109-
node.read = (AbstractReadFieldNode) node.read.deepCopy();
110-
return node;
141+
return FieldReadNodeGen.create(fieldIndex, getSelf());
111142
}
112143
}
113144

src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
import trufflesom.interpreter.Types;
8989
import trufflesom.interpreter.bc.RestartLoopException;
9090
import trufflesom.interpreter.nodes.ExpressionNode;
91+
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
92+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
9193
import trufflesom.interpreter.nodes.GlobalNode;
9294
import trufflesom.interpreter.nodes.MessageSendNode;
9395
import trufflesom.interpreter.nodes.MessageSendNode.AbstractMessageSendNode;
@@ -98,7 +100,6 @@
98100
import trufflesom.interpreter.nodes.nary.TernaryExpressionNode;
99101
import trufflesom.interpreter.nodes.nary.UnaryExpressionNode;
100102
import trufflesom.interpreter.objectstorage.FieldAccessorNode;
101-
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode;
102103
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode;
103104
import trufflesom.interpreter.objectstorage.FieldAccessorNode.IncrementLongFieldNode;
104105
import trufflesom.primitives.Primitives;
@@ -273,10 +274,10 @@ public Object executeGeneric(final VirtualFrame frame) {
273274
Node node = quickened[bytecodeIndex];
274275
if (node == null) {
275276
CompilerDirectives.transferToInterpreterAndInvalidate();
276-
node = quickened[bytecodeIndex] = insert(FieldAccessorNode.createRead(fieldIdx));
277+
node = quickened[bytecodeIndex] = insert(FieldReadNodeGen.create(fieldIdx, null));
277278
}
278279

279-
Object value = ((AbstractReadFieldNode) node).read(obj);
280+
Object value = ((FieldReadNode) node).executeEvaluated(obj);
280281
stackPointer += 1;
281282
stack[stackPointer] = value;
282283
break;

0 commit comments

Comments
 (0)