From cd562ca3d5237669c557aedcb2f0ac5d5ccce8d9 Mon Sep 17 00:00:00 2001 From: Stefan Marr Date: Sun, 25 Apr 2021 22:41:12 +0100 Subject: [PATCH] Replace custom code with DSL code for FieldReadNode Signed-off-by: Stefan Marr --- .../compiler/MethodGenerationContext.java | 6 +- .../compiler/bc/BytecodeMethodGenContext.java | 4 +- src/trufflesom/interpreter/SNodeFactory.java | 6 - .../interpreter/nodes/FieldNode.java | 113 +++++++---- .../nodes/bc/BytecodeLoopNode.java | 7 +- .../objectstorage/FieldAccessorNode.java | 187 ------------------ .../objectstorage/ObjectLayout.java | 30 +++ .../objectstorage/StorageLocation.java | 51 ----- .../primitives/reflection/IndexDispatch.java | 13 +- 9 files changed, 119 insertions(+), 298 deletions(-) diff --git a/src/trufflesom/compiler/MethodGenerationContext.java b/src/trufflesom/compiler/MethodGenerationContext.java index 44b9dd6f4..69ba68107 100644 --- a/src/trufflesom/compiler/MethodGenerationContext.java +++ b/src/trufflesom/compiler/MethodGenerationContext.java @@ -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; @@ -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; @@ -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, diff --git a/src/trufflesom/compiler/bc/BytecodeMethodGenContext.java b/src/trufflesom/compiler/bc/BytecodeMethodGenContext.java index 6268f7c29..9b22cf45b 100644 --- a/src/trufflesom/compiler/bc/BytecodeMethodGenContext.java +++ b/src/trufflesom/compiler/bc/BytecodeMethodGenContext.java @@ -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; @@ -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 = diff --git a/src/trufflesom/interpreter/SNodeFactory.java b/src/trufflesom/interpreter/SNodeFactory.java index 2fe6175b3..86beb1cd7 100644 --- a/src/trufflesom/interpreter/SNodeFactory.java +++ b/src/trufflesom/interpreter/SNodeFactory.java @@ -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; @@ -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 diff --git a/src/trufflesom/interpreter/nodes/FieldNode.java b/src/trufflesom/interpreter/nodes/FieldNode.java index 1c21a05ed..f0014d4df 100644 --- a/src/trufflesom/interpreter/nodes/FieldNode.java +++ b/src/trufflesom/interpreter/nodes/FieldNode.java @@ -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; @@ -31,12 +32,17 @@ 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; @@ -44,27 +50,19 @@ 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 @@ -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 @@ -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()); } } diff --git a/src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java b/src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java index 62b4cea95..8501b2f5e 100644 --- a/src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java +++ b/src/trufflesom/interpreter/nodes/bc/BytecodeLoopNode.java @@ -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; @@ -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; @@ -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; diff --git a/src/trufflesom/interpreter/objectstorage/FieldAccessorNode.java b/src/trufflesom/interpreter/objectstorage/FieldAccessorNode.java index 8e33e2abf..0ef0261fc 100644 --- a/src/trufflesom/interpreter/objectstorage/FieldAccessorNode.java +++ b/src/trufflesom/interpreter/objectstorage/FieldAccessorNode.java @@ -3,24 +3,17 @@ import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.nodes.InvalidAssumptionException; import com.oracle.truffle.api.nodes.Node; -import com.oracle.truffle.api.nodes.UnexpectedResultException; import trufflesom.interpreter.TruffleCompiler; -import trufflesom.interpreter.TypesGen; import trufflesom.interpreter.objectstorage.StorageLocation.AbstractObjectStorageLocation; import trufflesom.interpreter.objectstorage.StorageLocation.DoubleStorageLocation; import trufflesom.interpreter.objectstorage.StorageLocation.LongStorageLocation; -import trufflesom.vm.constants.Nil; import trufflesom.vmobjects.SObject; public abstract class FieldAccessorNode extends Node { protected final int fieldIndex; - public static AbstractReadFieldNode createRead(final int fieldIndex) { - return new UninitializedReadFieldNode(fieldIndex); - } - public static AbstractWriteFieldNode createWrite(final int fieldIndex) { return new UninitializedWriteFieldNode(fieldIndex); } @@ -39,186 +32,6 @@ public final int getFieldIndex() { return fieldIndex; } - public abstract static class AbstractReadFieldNode extends FieldAccessorNode { - public AbstractReadFieldNode(final int fieldIndex) { - super(fieldIndex); - } - - public abstract Object read(SObject obj); - - public long readLong(final SObject obj) throws UnexpectedResultException { - return TypesGen.expectLong(read(obj)); - } - - public double readDouble(final SObject obj) throws UnexpectedResultException { - return TypesGen.expectDouble(read(obj)); - } - - protected final Object specializeAndRead(final SObject obj, final String reason, - final AbstractReadFieldNode next) { - return specialize(obj, reason, next).read(obj); - } - - protected final AbstractReadFieldNode specialize(final SObject obj, - final String reason, final AbstractReadFieldNode next) { - TruffleCompiler.transferToInterpreterAndInvalidate(reason); - obj.updateLayoutToMatchClass(); - - final ObjectLayout layout = obj.getObjectLayout(); - final StorageLocation location = layout.getStorageLocation(fieldIndex); - - AbstractReadFieldNode newNode = location.getReadNode(fieldIndex, layout, next); - return replace(newNode, reason); - } - } - - private static final class UninitializedReadFieldNode extends AbstractReadFieldNode { - - UninitializedReadFieldNode(final int fieldIndex) { - super(fieldIndex); - } - - @Override - public Object read(final SObject obj) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - return specializeAndRead(obj, "uninitalized node", - new UninitializedReadFieldNode(fieldIndex)); - } - } - - public abstract static class ReadSpecializedFieldNode extends AbstractReadFieldNode { - protected final ObjectLayout layout; - @Child protected AbstractReadFieldNode nextInCache; - - public ReadSpecializedFieldNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - super(fieldIndex); - this.layout = layout; - nextInCache = next; - } - - protected final boolean hasExpectedLayout(final SObject obj) - throws InvalidAssumptionException { - layout.checkIsLatest(); - return layout == obj.getObjectLayout(); - } - - protected final AbstractReadFieldNode respecializedNodeOrNext(final SObject obj) { - if (layout.layoutForSameClass(obj.getObjectLayout())) { - return specialize(obj, "update outdated read node", nextInCache); - } else { - return nextInCache; - } - } - } - - public static final class ReadUnwrittenFieldNode extends ReadSpecializedFieldNode { - public ReadUnwrittenFieldNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - super(fieldIndex, layout, next); - } - - @Override - public Object read(final SObject obj) { - try { - if (hasExpectedLayout(obj)) { - return Nil.nilObject; - } else { - return respecializedNodeOrNext(obj).read(obj); - } - } catch (InvalidAssumptionException e) { - return replace(nextInCache).read(obj); - } - } - } - - public static final class ReadLongFieldNode extends ReadSpecializedFieldNode { - private final LongStorageLocation storage; - - public ReadLongFieldNode(final int fieldIndex, final ObjectLayout layout, - final AbstractReadFieldNode next) { - super(fieldIndex, layout, next); - this.storage = (LongStorageLocation) layout.getStorageLocation(fieldIndex); - } - - @Override - public long readLong(final SObject obj) throws UnexpectedResultException { - try { - if (hasExpectedLayout(obj)) { - return storage.readLong(obj); - } else { - return respecializedNodeOrNext(obj).readLong(obj); - } - } catch (InvalidAssumptionException e) { - return replace(nextInCache).readLong(obj); - } - } - - @Override - public Object read(final SObject obj) { - try { - return readLong(obj); - } catch (UnexpectedResultException e) { - return e.getResult(); - } - } - } - - public static final class ReadDoubleFieldNode extends ReadSpecializedFieldNode { - private final DoubleStorageLocation storage; - - public ReadDoubleFieldNode(final int fieldIndex, final ObjectLayout layout, - final AbstractReadFieldNode next) { - super(fieldIndex, layout, next); - this.storage = (DoubleStorageLocation) layout.getStorageLocation(fieldIndex); - } - - @Override - public double readDouble(final SObject obj) throws UnexpectedResultException { - try { - if (hasExpectedLayout(obj)) { - return storage.readDouble(obj); - } else { - return respecializedNodeOrNext(obj).readDouble(obj); - } - } catch (InvalidAssumptionException e) { - return replace(nextInCache).readDouble(obj); - } - } - - @Override - public Object read(final SObject obj) { - try { - return readDouble(obj); - } catch (UnexpectedResultException e) { - return e.getResult(); - } - } - } - - public static final class ReadObjectFieldNode extends ReadSpecializedFieldNode { - private final AbstractObjectStorageLocation storage; - - public ReadObjectFieldNode(final int fieldIndex, final ObjectLayout layout, - final AbstractReadFieldNode next) { - super(fieldIndex, layout, next); - this.storage = (AbstractObjectStorageLocation) layout.getStorageLocation(fieldIndex); - } - - @Override - public Object read(final SObject obj) { - try { - if (hasExpectedLayout(obj)) { - return storage.read(obj); - } else { - return respecializedNodeOrNext(obj).read(obj); - } - } catch (InvalidAssumptionException e) { - return replace(nextInCache).read(obj); - } - } - } - public abstract static class AbstractWriteFieldNode extends FieldAccessorNode { public AbstractWriteFieldNode(final int fieldIndex) { super(fieldIndex); diff --git a/src/trufflesom/interpreter/objectstorage/ObjectLayout.java b/src/trufflesom/interpreter/objectstorage/ObjectLayout.java index 420de7687..43fd63c4e 100644 --- a/src/trufflesom/interpreter/objectstorage/ObjectLayout.java +++ b/src/trufflesom/interpreter/objectstorage/ObjectLayout.java @@ -5,6 +5,8 @@ import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.nodes.InvalidAssumptionException; +import trufflesom.interpreter.objectstorage.StorageLocation.DoubleStorageLocation; +import trufflesom.interpreter.objectstorage.StorageLocation.LongStorageLocation; import trufflesom.interpreter.objectstorage.StorageLocation.UnwrittenStorageLocation; import trufflesom.vmobjects.SClass; import trufflesom.vmobjects.SObject; @@ -140,6 +142,34 @@ public StorageLocation getStorageLocation(final int fieldIndex) { return storageLocations[fieldIndex]; } + public LongStorageLocation getLongLocation(final int fieldIndex) { + return (LongStorageLocation) storageLocations[fieldIndex]; + } + + public DoubleStorageLocation getDoubleLocation(final int fieldIndex) { + return (DoubleStorageLocation) storageLocations[fieldIndex]; + } + + public StorageLocation getObjectLocation(final int fieldIndex) { + return storageLocations[fieldIndex]; + } + + public boolean isLongLocation(final int fieldIndex) { + return storageTypes[fieldIndex] == Long.class; + } + + public boolean isDoubleLocation(final int fieldIndex) { + return storageTypes[fieldIndex] == Double.class; + } + + public boolean isObjectLocation(final int fieldIndex) { + return storageTypes[fieldIndex] == Object.class; + } + + public boolean isUnwrittenLocation(final int fieldIndex) { + return storageTypes[fieldIndex] == null; + } + public int getNumberOfUsedExtendedObjectStorageLocations() { int requiredExtensionFields = objectStorageLocationsUsed - SObject.NUM_OBJECT_FIELDS; if (requiredExtensionFields < 0) { diff --git a/src/trufflesom/interpreter/objectstorage/StorageLocation.java b/src/trufflesom/interpreter/objectstorage/StorageLocation.java index f8fc83691..4b0ae75ba 100644 --- a/src/trufflesom/interpreter/objectstorage/StorageLocation.java +++ b/src/trufflesom/interpreter/objectstorage/StorageLocation.java @@ -7,12 +7,7 @@ import sun.misc.Unsafe; import trufflesom.interpreter.TruffleCompiler; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode; import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.ReadDoubleFieldNode; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.ReadLongFieldNode; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.ReadObjectFieldNode; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.ReadUnwrittenFieldNode; import trufflesom.interpreter.objectstorage.FieldAccessorNode.WriteDoubleFieldNode; import trufflesom.interpreter.objectstorage.FieldAccessorNode.WriteLongFieldNode; import trufflesom.interpreter.objectstorage.FieldAccessorNode.WriteObjectFieldNode; @@ -101,9 +96,6 @@ protected StorageLocation(final ObjectLayout layout, final long fieldIndex) { public abstract void write(SObject obj, Object value); - public abstract AbstractReadFieldNode getReadNode(int fieldIndex, ObjectLayout layout, - AbstractReadFieldNode next); - public abstract AbstractWriteFieldNode getWriteNode(int fieldIndex, ObjectLayout layout, AbstractWriteFieldNode next); @@ -120,7 +112,6 @@ public boolean isSet(final SObject obj) { @Override public Object read(final SObject obj) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); return Nil.nilObject; } @@ -130,13 +121,6 @@ public void write(final SObject obj, final Object value) { obj.setUninitializedField(fieldIndex, value); } - @Override - public AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadUnwrittenFieldNode(fieldIndex, layout, next); - } - @Override public AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { @@ -160,13 +144,6 @@ public AbstractObjectStorageLocation(final ObjectLayout layout, final int fieldI @Override public abstract void write(SObject obj, Object value); - @Override - public final AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadObjectFieldNode(fieldIndex, layout, next); - } - @Override public final AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { @@ -317,13 +294,6 @@ public void writeDouble(final SObject obj, final double value) { markAsSet(obj); } - @Override - public AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadDoubleFieldNode(fieldIndex, layout, next); - } - @Override public AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { @@ -390,13 +360,6 @@ public void writeLong(final SObject obj, final long value) { markAsSet(obj); } - @Override - public AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadLongFieldNode(fieldIndex, layout, next); - } - @Override public AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { @@ -475,13 +438,6 @@ public void writeLong(final SObject obj, final long value) { markAsSet(obj); } - @Override - public AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadLongFieldNode(fieldIndex, layout, next); - } - @Override public AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { @@ -548,13 +504,6 @@ public void writeDouble(final SObject obj, final double value) { markAsSet(obj); } - @Override - public AbstractReadFieldNode getReadNode(final int fieldIndex, - final ObjectLayout layout, final AbstractReadFieldNode next) { - CompilerAsserts.neverPartOfCompilation("StorageLocation"); - return new ReadDoubleFieldNode(fieldIndex, layout, next); - } - @Override public AbstractWriteFieldNode getWriteNode(final int fieldIndex, final ObjectLayout layout, final AbstractWriteFieldNode next) { diff --git a/src/trufflesom/primitives/reflection/IndexDispatch.java b/src/trufflesom/primitives/reflection/IndexDispatch.java index edd19ac5f..755f7dc2f 100644 --- a/src/trufflesom/primitives/reflection/IndexDispatch.java +++ b/src/trufflesom/primitives/reflection/IndexDispatch.java @@ -6,9 +6,10 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.nodes.Node; +import trufflesom.interpreter.nodes.FieldNode.FieldReadNode; +import trufflesom.interpreter.nodes.FieldNodeFactory.FieldReadNodeGen; import trufflesom.interpreter.nodes.dispatch.DispatchChain; import trufflesom.interpreter.objectstorage.FieldAccessorNode; -import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractReadFieldNode; import trufflesom.interpreter.objectstorage.FieldAccessorNode.AbstractWriteFieldNode; import trufflesom.vm.Universe; import trufflesom.vmobjects.SClass; @@ -86,9 +87,9 @@ public int lengthOfDispatchChain() { } private static final class CachedReadDispatchNode extends IndexDispatch { - private final int index; - private final SClass clazz; - @Child private AbstractReadFieldNode access; + private final int index; + private final SClass clazz; + @Child private FieldReadNode access; // TODO: have a second cached class for the writing... @Child private IndexDispatch next; @@ -98,13 +99,13 @@ private static final class CachedReadDispatchNode extends IndexDispatch { this.index = index; this.clazz = clazz; this.next = next; - access = FieldAccessorNode.createRead(index); + access = FieldReadNodeGen.create(index, null); } @Override public Object executeDispatch(final SObject obj, final int index) { if (this.index == index && this.clazz == obj.getSOMClass(universe)) { - return access.read(obj); + return access.executeEvaluated(obj); } else { return next.executeDispatch(obj, index); }