Skip to content

Commit 1b9f1df

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

File tree

9 files changed

+119
-298
lines changed

9 files changed

+119
-298
lines changed

src/trufflesom/compiler/MethodGenerationContext.java

Lines changed: 3 additions & 3 deletions
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
import static trufflesom.vm.SymbolTable.symBlockSelf;
@@ -56,6 +55,7 @@
5655
import trufflesom.interpreter.nodes.ExpressionNode;
5756
import trufflesom.interpreter.nodes.FieldNode;
5857
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
58+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
5959
import trufflesom.interpreter.nodes.ReturnNonLocalNode;
6060
import trufflesom.interpreter.nodes.literals.BlockNode;
6161
import trufflesom.primitives.Primitives;
@@ -435,8 +435,8 @@ public FieldReadNode getObjectFieldRead(final SSymbol fieldName,
435435
if (!holderGenc.hasField(fieldName)) {
436436
return null;
437437
}
438-
return createFieldRead(getSelfRead(source),
439-
holderGenc.getFieldIndex(fieldName), source);
438+
return FieldReadNodeGen.create(holderGenc.getFieldIndex(fieldName), getSelfRead(source))
439+
.initialize(source);
440440
}
441441

442442
public FieldNode getObjectFieldWrite(final SSymbol fieldName,

src/trufflesom/compiler/bc/BytecodeMethodGenContext.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import trufflesom.interpreter.nodes.ExpressionNode;
7575
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
7676
import trufflesom.interpreter.nodes.FieldNode.FieldWriteNode;
77+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
7778
import trufflesom.interpreter.nodes.GlobalNode;
7879
import trufflesom.interpreter.nodes.bc.BytecodeLoopNode;
7980
import trufflesom.interpreter.nodes.bc.BytecodeLoopNode.BackJump;
@@ -610,7 +611,8 @@ private FieldReadNode optimizeFieldGetter(final boolean onlyReturnBytecode,
610611
}
611612

612613
// because we don't handle block methods, we don't need to worry about ctx > 0
613-
return new FieldReadNode(new LocalArgumentReadNode(arguments.get(symSelf)), idx);
614+
return FieldReadNodeGen.create(idx,
615+
new LocalArgumentReadNode(arguments.get(universe.symSelf)));
614616
}
615617

616618
private ExpressionNode optimizeFieldSetter(final byte returnCandidate) {

src/trufflesom/interpreter/SNodeFactory.java

Lines changed: 0 additions & 6 deletions
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

Lines changed: 72 additions & 41 deletions
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
public 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-
public 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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@
117117
import trufflesom.interpreter.bc.Bytecodes;
118118
import trufflesom.interpreter.bc.RestartLoopException;
119119
import trufflesom.interpreter.nodes.ExpressionNode;
120+
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
121+
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
120122
import trufflesom.interpreter.nodes.GlobalNode;
121123
import trufflesom.interpreter.nodes.MessageSendNode;
122124
import trufflesom.interpreter.nodes.MessageSendNode.AbstractMessageSendNode;
@@ -127,7 +129,6 @@
127129
import trufflesom.interpreter.nodes.nary.TernaryExpressionNode;
128130
import trufflesom.interpreter.nodes.nary.UnaryExpressionNode;
129131
import trufflesom.interpreter.objectstorage.FieldAccessorNode;
130-
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode;
131132
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode;
132133
import trufflesom.interpreter.objectstorage.FieldAccessorNode.IncrementLongFieldNode;
133134
import trufflesom.primitives.Primitives;
@@ -372,11 +373,11 @@ public Object executeGeneric(final VirtualFrame frame) {
372373
Node node = quickened[bytecodeIndex];
373374
if (node == null) {
374375
CompilerDirectives.transferToInterpreterAndInvalidate();
375-
node = quickened[bytecodeIndex] = insert(FieldAccessorNode.createRead(fieldIdx));
376+
node = quickened[bytecodeIndex] = insert(FieldReadNodeGen.create(fieldIdx, null));
376377
}
377378

378379
stackPointer += 1;
379-
stack[stackPointer] = ((AbstractReadFieldNode) node).read(
380+
stack[stackPointer] = ((FieldReadNode) node).executeEvaluated(
380381
(SObject) currentOrContext.getArguments()[0]);
381382
break;
382383
}

0 commit comments

Comments
 (0)