Skip to content

Replace custom code with DSL code for FieldReadNode #69

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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;
import static trufflesom.vm.SymbolTable.symBlockSelf;
Expand Down Expand Up @@ -56,6 +55,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 @@ -435,8 +435,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 @@ -74,6 +74,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.bc.BytecodeLoopNode.BackJump;
Expand Down Expand Up @@ -610,7 +611,8 @@ private FieldReadNode optimizeFieldGetter(final boolean onlyReturnBytecode,
}

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

private ExpressionNode optimizeFieldSetter(final byte returnCandidate) {
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 {

public 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
public 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 @@ -117,6 +117,8 @@
import trufflesom.interpreter.bc.Bytecodes;
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 @@ -127,7 +129,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 @@ -372,11 +373,11 @@ 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));
}

stackPointer += 1;
stack[stackPointer] = ((AbstractReadFieldNode) node).read(
stack[stackPointer] = ((FieldReadNode) node).executeEvaluated(
(SObject) currentOrContext.getArguments()[0]);
break;
}
Expand Down
Loading