Skip to content

Commit d381b5e

Browse files
committed
Fix indirect primitiveNode dispatch
1 parent e9e5291 commit d381b5e

File tree

8 files changed

+103
-57
lines changed

8 files changed

+103
-57
lines changed

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/model/CompiledCodeObject.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import de.hpi.swa.trufflesqueak.nodes.bytecodes.AbstractSqueakBytecodeDecoder;
4141
import de.hpi.swa.trufflesqueak.nodes.bytecodes.SqueakBytecodeSistaV1Decoder;
4242
import de.hpi.swa.trufflesqueak.nodes.bytecodes.SqueakBytecodeV3PlusClosuresDecoder;
43+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4344
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
4546
import de.hpi.swa.trufflesqueak.shared.SqueakLanguageConfig;
@@ -53,8 +54,7 @@ public final class CompiledCodeObject extends AbstractSqueakObjectWithClassAndHa
5354
private static final String SOURCE_UNAVAILABLE_NAME = "<unavailable>";
5455
public static final String SOURCE_UNAVAILABLE_CONTENTS = "Source unavailable";
5556

56-
private static final AbstractPrimitiveNode UNINITIALIZED_PRIMITIVE_NODE = new AbstractPrimitiveNode() {
57-
};
57+
private static final DispatchPrimitiveNode UNINITIALIZED_PRIMITIVE_NODE = DispatchPrimitiveNode.create(null, 0);
5858

5959
// header info and data
6060
@CompilationFinal private int header;
@@ -66,7 +66,7 @@ public final class CompiledCodeObject extends AbstractSqueakObjectWithClassAndHa
6666
@CompilationFinal(dimensions = 1) private Object[] literals;
6767
@CompilationFinal(dimensions = 1) private byte[] bytes;
6868

69-
@CompilationFinal private AbstractPrimitiveNode primitiveNodeOrNull = UNINITIALIZED_PRIMITIVE_NODE;
69+
@CompilationFinal private DispatchPrimitiveNode primitiveNodeOrNull = UNINITIALIZED_PRIMITIVE_NODE;
7070

7171
@CompilationFinal private ExecutionData executionData;
7272

@@ -436,11 +436,16 @@ public int primitiveIndex() {
436436
}
437437

438438
@Idempotent
439-
public AbstractPrimitiveNode getPrimitiveNodeOrNull() {
439+
public DispatchPrimitiveNode getPrimitiveNodeOrNull() {
440440
if (primitiveNodeOrNull == UNINITIALIZED_PRIMITIVE_NODE) {
441441
CompilerDirectives.transferToInterpreterAndInvalidate();
442442
if (hasPrimitive()) {
443-
primitiveNodeOrNull = PrimitiveNodeFactory.getOrCreateIndexedOrNamed(this);
443+
final AbstractPrimitiveNode nodeOrNull = PrimitiveNodeFactory.getOrCreateIndexedOrNamed(this);
444+
if (nodeOrNull != null) {
445+
primitiveNodeOrNull = DispatchPrimitiveNode.create(nodeOrNull, getNumArgs());
446+
} else {
447+
primitiveNodeOrNull = null;
448+
}
444449
} else {
445450
primitiveNodeOrNull = null;
446451
}

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector0Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchDirectPrimitiveFallback0NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchDirectedSuper0NodeFactory.DirectedSuperDispatch0NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchSuper0NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive0;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -384,7 +385,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
384385
@Specialization(replaces = {"doNoPrimitive", "doCached"})
385386
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver,
386387
@Bind("this") final Node node) {
387-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388389
if (primitiveNode != null) {
389390
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver);
390391
} else {
@@ -393,9 +394,9 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
393394
}
394395

395396
@TruffleBoundary
396-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver) {
397+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver) {
397398
try {
398-
return ((Primitive0) primitiveNode).execute(frame, receiver);
399+
return ((DispatchPrimitiveNode.DispatchPrimitive0Node) primitiveNode).execute(frame, receiver);
399400
} catch (final PrimitiveFailed pf) {
400401
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
401402
return null;

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector1Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchDirectPrimitiveFallback1NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchDirectedSuper1NodeFactory.DirectedSuperDispatch1NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchSuper1NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive1;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -384,7 +385,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
384385
@Specialization(replaces = {"doNoPrimitive", "doCached"})
385386
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1,
386387
@Bind("this") final Node node) {
387-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388389
if (primitiveNode != null) {
389390
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1);
390391
} else {
@@ -393,10 +394,10 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
393394
}
394395

395396
@TruffleBoundary
396-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
397+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
397398
final Object arg1) {
398399
try {
399-
return ((Primitive1) primitiveNode).execute(frame, receiver, arg1);
400+
return ((DispatchPrimitiveNode.DispatchPrimitive1Node) primitiveNode).execute(frame, receiver, arg1);
400401
} catch (final PrimitiveFailed pf) {
401402
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
402403
return null;

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector2Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchDirectPrimitiveFallback2NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchDirectedSuper2NodeFactory.DirectedSuperDispatch2NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchSuper2NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive2;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -386,7 +387,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
386387
@Specialization(replaces = {"doNoPrimitive", "doCached"})
387388
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2,
388389
@Bind("this") final Node node) {
389-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
390+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
390391
if (primitiveNode != null) {
391392
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2);
392393
} else {
@@ -395,10 +396,10 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
395396
}
396397

397398
@TruffleBoundary
398-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
399+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
399400
final Object arg1, final Object arg2) {
400401
try {
401-
return ((Primitive2) primitiveNode).execute(frame, receiver, arg1, arg2);
402+
return ((DispatchPrimitiveNode.DispatchPrimitive2Node) primitiveNode).execute(frame, receiver, arg1, arg2);
402403
} catch (final PrimitiveFailed pf) {
403404
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
404405
return null;

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector3Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchDirectPrimitiveFallback3NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchDirectedSuper3NodeFactory.DirectedSuperDispatch3NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchSuper3NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive3;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -390,7 +391,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
390391
@Specialization(replaces = {"doNoPrimitive", "doCached"})
391392
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
392393
@Bind("this") final Node node) {
393-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
394+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
394395
if (primitiveNode != null) {
395396
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3);
396397
} else {
@@ -399,10 +400,10 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
399400
}
400401

401402
@TruffleBoundary
402-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
403+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
403404
final Object arg1, final Object arg2, final Object arg3) {
404405
try {
405-
return ((Primitive3) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
406+
return ((DispatchPrimitiveNode.DispatchPrimitive3Node) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
406407
} catch (final PrimitiveFailed pf) {
407408
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
408409
return null;

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector4Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchDirectPrimitiveFallback4NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchDirectedSuper4NodeFactory.DirectedSuperDispatch4NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchSuper4NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive4;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -395,7 +396,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
395396
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
396397
final Object arg4,
397398
@Bind("this") final Node node) {
398-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
399+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
399400
if (primitiveNode != null) {
400401
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4);
401402
} else {
@@ -404,10 +405,10 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
404405
}
405406

406407
@TruffleBoundary
407-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
408+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
408409
final Object arg1, final Object arg2, final Object arg3, final Object arg4) {
409410
try {
410-
return ((Primitive4) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
411+
return ((DispatchPrimitiveNode.DispatchPrimitive4Node) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
411412
} catch (final PrimitiveFailed pf) {
412413
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
413414
return null;

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/dispatch/DispatchSelector5Node.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector5NodeFactory.DispatchDirectPrimitiveFallback5NodeGen;
4242
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector5NodeFactory.DispatchDirectedSuper5NodeFactory.DirectedSuperDispatch5NodeGen;
4343
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector5NodeFactory.DispatchSuper5NodeGen;
44+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4445
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4546
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive5;
4647
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -399,7 +400,7 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
399400
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
400401
final Object arg4, final Object arg5,
401402
@Bind("this") final Node node) {
402-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
403+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
403404
if (primitiveNode != null) {
404405
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4, arg5);
405406
} else {
@@ -408,10 +409,10 @@ protected static final Object doUncached(final VirtualFrame frame, final Compile
408409
}
409410

410411
@TruffleBoundary
411-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
412+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
412413
final Object arg1, final Object arg2, final Object arg3, final Object arg4, final Object arg5) {
413414
try {
414-
return ((Primitive5) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4, arg5);
415+
return ((DispatchPrimitiveNode.DispatchPrimitive5Node) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4, arg5);
415416
} catch (final PrimitiveFailed pf) {
416417
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
417418
return null;

0 commit comments

Comments
 (0)