Skip to content

Commit

Permalink
Replace custom code with DSL code for FieldReadNode
Browse files Browse the repository at this point in the history
Signed-off-by: Stefan Marr <[email protected]>
  • Loading branch information
smarr committed May 2, 2021
1 parent 5820ec7 commit cd562ca
Show file tree
Hide file tree
Showing 9 changed files with 119 additions and 298 deletions.
6 changes: 3 additions & 3 deletions src/trufflesom/compiler/MethodGenerationContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
package trufflesom.compiler;

import static trufflesom.interpreter.SNodeFactory.createCatchNonLocalReturn;
import static trufflesom.interpreter.SNodeFactory.createFieldRead;
import static trufflesom.interpreter.SNodeFactory.createFieldWrite;
import static trufflesom.interpreter.SNodeFactory.createNonLocalReturn;

Expand All @@ -52,6 +51,7 @@
import trufflesom.interpreter.nodes.ExpressionNode;
import trufflesom.interpreter.nodes.FieldNode;
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
import trufflesom.interpreter.nodes.ReturnNonLocalNode;
import trufflesom.interpreter.nodes.literals.BlockNode;
import trufflesom.primitives.Primitives;
Expand Down Expand Up @@ -419,8 +419,8 @@ public FieldReadNode getObjectFieldRead(final SSymbol fieldName,
if (!holderGenc.hasField(fieldName)) {
return null;
}
return createFieldRead(getSelfRead(source),
holderGenc.getFieldIndex(fieldName), source);
return FieldReadNodeGen.create(holderGenc.getFieldIndex(fieldName), getSelfRead(source))
.initialize(source);
}

public FieldNode getObjectFieldWrite(final SSymbol fieldName,
Expand Down
4 changes: 3 additions & 1 deletion src/trufflesom/compiler/bc/BytecodeMethodGenContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import trufflesom.interpreter.nodes.ExpressionNode;
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
import trufflesom.interpreter.nodes.FieldNode.FieldWriteNode;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
import trufflesom.interpreter.nodes.GlobalNode;
import trufflesom.interpreter.nodes.bc.BytecodeLoopNode;
import trufflesom.interpreter.nodes.literals.LiteralNode;
Expand Down Expand Up @@ -531,7 +532,8 @@ private FieldReadNode optimizeFieldGetter() {

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

private static int expectedSetterMethodLength =
Expand Down
6 changes: 0 additions & 6 deletions src/trufflesom/interpreter/SNodeFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import trufflesom.interpreter.nodes.ArgumentReadNode.NonLocalArgumentWriteNode;
import trufflesom.interpreter.nodes.ExpressionNode;
import trufflesom.interpreter.nodes.FieldNode;
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
import trufflesom.interpreter.nodes.FieldNode.UninitFieldIncNode;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldWriteNodeGen;
import trufflesom.interpreter.nodes.LocalVariableNode.LocalVariableWriteNode;
Expand All @@ -33,11 +32,6 @@ public static CatchNonLocalReturnNode createCatchNonLocalReturn(
methodBody, onStackMarker).initialize(methodBody.getSourceSection());
}

public static FieldReadNode createFieldRead(final ExpressionNode self,
final int fieldIndex, final SourceSection source) {
return new FieldReadNode(self, fieldIndex).initialize(source);
}

public static FieldNode createFieldWrite(final ExpressionNode self,
final ExpressionNode exp, final int fieldIndex, final SourceSection source) {
if (exp instanceof IntIncrementNode
Expand Down
113 changes: 72 additions & 41 deletions src/trufflesom/interpreter/nodes/FieldNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
package trufflesom.interpreter.nodes;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.NodeChild;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
Expand All @@ -31,40 +32,37 @@
import bd.primitives.nodes.PreevaluatedExpression;
import trufflesom.compiler.Variable.Argument;
import trufflesom.interpreter.nodes.ArgumentReadNode.LocalArgumentReadNode;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldWriteNodeGen;
import trufflesom.interpreter.objectstorage.FieldAccessorNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.IncrementLongFieldNode;
import trufflesom.interpreter.objectstorage.ObjectLayout;
import trufflesom.interpreter.objectstorage.StorageLocation;
import trufflesom.interpreter.objectstorage.StorageLocation.DoubleStorageLocation;
import trufflesom.interpreter.objectstorage.StorageLocation.LongStorageLocation;
import trufflesom.vm.NotYetImplementedException;
import trufflesom.vm.constants.Nil;
import trufflesom.vmobjects.SObject;


public abstract class FieldNode extends ExpressionNode {

protected abstract ExpressionNode getSelf();

public static final class FieldReadNode extends FieldNode
@NodeChild(value = "self", type = ExpressionNode.class)
public abstract static class FieldReadNode extends FieldNode
implements PreevaluatedExpression {
@Child private ExpressionNode self;
@Child private AbstractReadFieldNode read;

public FieldReadNode(final ExpressionNode self, final int fieldIndex) {
this.self = self;
read = FieldAccessorNode.createRead(fieldIndex);
}
protected final int fieldIndex;

public int getFieldIndex() {
return read.getFieldIndex();
public FieldReadNode(final int fieldIndex) {
this.fieldIndex = fieldIndex;
}

@Override
protected ExpressionNode getSelf() {
return self;
}
public abstract Object executeEvaluated(SObject obj);

public Object executeEvaluated(final SObject obj) {
return read.read(obj);
public int getFieldIndex() {
return fieldIndex;
}

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

@Override
public long executeLong(final VirtualFrame frame) throws UnexpectedResultException {
SObject obj = self.executeSObject(frame);
return read.readLong(obj);
}

@Override
public double executeDouble(final VirtualFrame frame) throws UnexpectedResultException {
SObject obj = self.executeSObject(frame);
return read.readDouble(obj);
@Specialization(
assumptions = "layout.getAssumption()",
guards = {
"obj.getObjectLayout() == layout",
"layout.isLongLocation(fieldIndex)"},
rewriteOn = UnexpectedResultException.class)
public long readLong(final SObject obj,
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
@Cached("layout.getLongLocation(fieldIndex)") final LongStorageLocation storage)
throws UnexpectedResultException {
return storage.readLong(obj);
}

@Specialization(
assumptions = "layout.getAssumption()",
guards = {
"obj.getObjectLayout() == layout",
"layout.isDoubleLocation(fieldIndex)"},
rewriteOn = UnexpectedResultException.class)
public double readDouble(final SObject obj,
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
@Cached("layout.getDoubleLocation(fieldIndex)") final DoubleStorageLocation storage)
throws UnexpectedResultException {
return storage.readDouble(obj);
}

@Specialization(
assumptions = "layout.getAssumption()",
guards = {
"obj.getObjectLayout() == layout",
"layout.isUnwrittenLocation(fieldIndex)"},
rewriteOn = UnexpectedResultException.class)
public SObject readNil(final SObject obj,
@Cached("obj.getObjectLayout()") final ObjectLayout layout)
throws UnexpectedResultException {
return Nil.nilObject;
}

@Specialization(
assumptions = "layout.getAssumption()",
guards = {
"obj.getObjectLayout() == layout",
"layout.isObjectLocation(fieldIndex)"})
public Object readObject(final SObject obj,
@Cached("obj.getObjectLayout()") final ObjectLayout layout,
@Cached("layout.getObjectLocation(fieldIndex)") final StorageLocation storage) {
return storage.read(obj);
}

@Specialization(guards = "!obj.getObjectLayout().isValid()")
public Object updateObject(final SObject obj) {
obj.updateLayoutToMatchClass();
return executeEvaluated(obj);
}

@Override
public Object executeGeneric(final VirtualFrame frame) {
SObject obj;
try {
obj = self.executeSObject(frame);
} catch (UnexpectedResultException e) {
CompilerDirectives.transferToInterpreter();
throw new RuntimeException("This should never happen by construction");
}
return executeEvaluated(obj);
@Specialization
public Object readObject(final SObject obj) {
return obj.getObjectLayout().getStorageLocation(fieldIndex).read(obj);
}

@Override
Expand All @@ -104,10 +138,7 @@ public boolean isTrivial() {

@Override
public PreevaluatedExpression copyTrivialNode() {
FieldReadNode node = (FieldReadNode) copy();
node.self = null;
node.read = (AbstractReadFieldNode) node.read.deepCopy();
return node;
return FieldReadNodeGen.create(fieldIndex, getSelf());
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@
import trufflesom.interpreter.Types;
import trufflesom.interpreter.bc.RestartLoopException;
import trufflesom.interpreter.nodes.ExpressionNode;
import trufflesom.interpreter.nodes.FieldNode.FieldReadNode;
import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen;
import trufflesom.interpreter.nodes.GlobalNode;
import trufflesom.interpreter.nodes.MessageSendNode;
import trufflesom.interpreter.nodes.MessageSendNode.AbstractMessageSendNode;
Expand All @@ -98,7 +100,6 @@
import trufflesom.interpreter.nodes.nary.TernaryExpressionNode;
import trufflesom.interpreter.nodes.nary.UnaryExpressionNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode;
import trufflesom.interpreter.objectstorage.FieldAccessorNode.IncrementLongFieldNode;
import trufflesom.primitives.Primitives;
Expand Down Expand Up @@ -273,10 +274,10 @@ public Object executeGeneric(final VirtualFrame frame) {
Node node = quickened[bytecodeIndex];
if (node == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
node = quickened[bytecodeIndex] = insert(FieldAccessorNode.createRead(fieldIdx));
node = quickened[bytecodeIndex] = insert(FieldReadNodeGen.create(fieldIdx, null));
}

Object value = ((AbstractReadFieldNode) node).read(obj);
Object value = ((FieldReadNode) node).executeEvaluated(obj);
stackPointer += 1;
stack[stackPointer] = value;
break;
Expand Down
Loading

0 comments on commit cd562ca

Please sign in to comment.