Skip to content

Commit 899c1eb

Browse files
committed
Fix indirect primitiveNode dispatch
1 parent e9e5291 commit 899c1eb

File tree

8 files changed

+159
-64
lines changed

8 files changed

+159
-64
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: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.MaterializedFrame;
2222
import com.oracle.truffle.api.frame.VirtualFrame;
2323
import com.oracle.truffle.api.nodes.DirectCallNode;
24+
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
2425
import com.oracle.truffle.api.nodes.IndirectCallNode;
2526
import com.oracle.truffle.api.nodes.Node;
2627
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
@@ -41,6 +42,7 @@
4142
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchDirectPrimitiveFallback0NodeGen;
4243
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchDirectedSuper0NodeFactory.DirectedSuperDispatch0NodeGen;
4344
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector0NodeFactory.DispatchSuper0NodeGen;
45+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4446
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4547
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive0;
4648
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -384,18 +386,24 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
384386
@Specialization(replaces = {"doNoPrimitive", "doCached"})
385387
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver,
386388
@Bind("this") final Node node) {
387-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
389+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388390
if (primitiveNode != null) {
389-
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver);
391+
final EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent();
392+
final Node encapsulatingNode = encapsulating.set(node);
393+
try {
394+
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver);
395+
} finally {
396+
encapsulating.set(encapsulatingNode);
397+
}
390398
} else {
391399
return null;
392400
}
393401
}
394402

395403
@TruffleBoundary
396-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver) {
404+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver) {
397405
try {
398-
return ((Primitive0) primitiveNode).execute(frame, receiver);
406+
return ((DispatchPrimitiveNode.DispatchPrimitive0Node) primitiveNode).execute(frame, receiver);
399407
} catch (final PrimitiveFailed pf) {
400408
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
401409
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.MaterializedFrame;
2222
import com.oracle.truffle.api.frame.VirtualFrame;
2323
import com.oracle.truffle.api.nodes.DirectCallNode;
24+
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
2425
import com.oracle.truffle.api.nodes.IndirectCallNode;
2526
import com.oracle.truffle.api.nodes.Node;
2627
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
@@ -41,6 +42,7 @@
4142
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchDirectPrimitiveFallback1NodeGen;
4243
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchDirectedSuper1NodeFactory.DirectedSuperDispatch1NodeGen;
4344
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector1NodeFactory.DispatchSuper1NodeGen;
45+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4446
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4547
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive1;
4648
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -384,19 +386,25 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
384386
@Specialization(replaces = {"doNoPrimitive", "doCached"})
385387
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1,
386388
@Bind("this") final Node node) {
387-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
389+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
388390
if (primitiveNode != null) {
389-
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1);
391+
final EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent();
392+
final Node encapsulatingNode = encapsulating.set(node);
393+
try {
394+
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1);
395+
} finally {
396+
encapsulating.set(encapsulatingNode);
397+
}
390398
} else {
391399
return null;
392400
}
393401
}
394402

395403
@TruffleBoundary
396-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
404+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
397405
final Object arg1) {
398406
try {
399-
return ((Primitive1) primitiveNode).execute(frame, receiver, arg1);
407+
return ((DispatchPrimitiveNode.DispatchPrimitive1Node) primitiveNode).execute(frame, receiver, arg1);
400408
} catch (final PrimitiveFailed pf) {
401409
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
402410
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.MaterializedFrame;
2222
import com.oracle.truffle.api.frame.VirtualFrame;
2323
import com.oracle.truffle.api.nodes.DirectCallNode;
24+
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
2425
import com.oracle.truffle.api.nodes.IndirectCallNode;
2526
import com.oracle.truffle.api.nodes.Node;
2627
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
@@ -41,6 +42,7 @@
4142
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchDirectPrimitiveFallback2NodeGen;
4243
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchDirectedSuper2NodeFactory.DirectedSuperDispatch2NodeGen;
4344
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector2NodeFactory.DispatchSuper2NodeGen;
45+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4446
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4547
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive2;
4648
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -386,19 +388,25 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
386388
@Specialization(replaces = {"doNoPrimitive", "doCached"})
387389
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2,
388390
@Bind("this") final Node node) {
389-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
391+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
390392
if (primitiveNode != null) {
391-
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2);
393+
final EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent();
394+
final Node encapsulatingNode = encapsulating.set(node);
395+
try {
396+
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2);
397+
} finally {
398+
encapsulating.set(encapsulatingNode);
399+
}
392400
} else {
393401
return null;
394402
}
395403
}
396404

397405
@TruffleBoundary
398-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
406+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
399407
final Object arg1, final Object arg2) {
400408
try {
401-
return ((Primitive2) primitiveNode).execute(frame, receiver, arg1, arg2);
409+
return ((DispatchPrimitiveNode.DispatchPrimitive2Node) primitiveNode).execute(frame, receiver, arg1, arg2);
402410
} catch (final PrimitiveFailed pf) {
403411
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
404412
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.MaterializedFrame;
2222
import com.oracle.truffle.api.frame.VirtualFrame;
2323
import com.oracle.truffle.api.nodes.DirectCallNode;
24+
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
2425
import com.oracle.truffle.api.nodes.IndirectCallNode;
2526
import com.oracle.truffle.api.nodes.Node;
2627
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
@@ -41,6 +42,7 @@
4142
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchDirectPrimitiveFallback3NodeGen;
4243
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchDirectedSuper3NodeFactory.DirectedSuperDispatch3NodeGen;
4344
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector3NodeFactory.DispatchSuper3NodeGen;
45+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4446
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4547
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive3;
4648
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -390,19 +392,25 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
390392
@Specialization(replaces = {"doNoPrimitive", "doCached"})
391393
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
392394
@Bind("this") final Node node) {
393-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
395+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
394396
if (primitiveNode != null) {
395-
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3);
397+
final EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent();
398+
final Node encapsulatingNode = encapsulating.set(node);
399+
try {
400+
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3);
401+
} finally {
402+
encapsulating.set(encapsulatingNode);
403+
}
396404
} else {
397405
return null;
398406
}
399407
}
400408

401409
@TruffleBoundary
402-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
410+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
403411
final Object arg1, final Object arg2, final Object arg3) {
404412
try {
405-
return ((Primitive3) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
413+
return ((DispatchPrimitiveNode.DispatchPrimitive3Node) primitiveNode).execute(frame, receiver, arg1, arg2, arg3);
406414
} catch (final PrimitiveFailed pf) {
407415
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
408416
return null;

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.MaterializedFrame;
2222
import com.oracle.truffle.api.frame.VirtualFrame;
2323
import com.oracle.truffle.api.nodes.DirectCallNode;
24+
import com.oracle.truffle.api.nodes.EncapsulatingNodeReference;
2425
import com.oracle.truffle.api.nodes.IndirectCallNode;
2526
import com.oracle.truffle.api.nodes.Node;
2627
import com.oracle.truffle.api.profiles.InlinedBranchProfile;
@@ -41,6 +42,7 @@
4142
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchDirectPrimitiveFallback4NodeGen;
4243
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchDirectedSuper4NodeFactory.DirectedSuperDispatch4NodeGen;
4344
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelector4NodeFactory.DispatchSuper4NodeGen;
45+
import de.hpi.swa.trufflesqueak.nodes.dispatch.DispatchSelectorNaryNode.DispatchPrimitiveNode;
4446
import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode;
4547
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive4;
4648
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
@@ -395,19 +397,25 @@ protected static final Object doCached(final VirtualFrame frame, @SuppressWarnin
395397
protected static final Object doUncached(final VirtualFrame frame, final CompiledCodeObject method, final Object receiver, final Object arg1, final Object arg2, final Object arg3,
396398
final Object arg4,
397399
@Bind("this") final Node node) {
398-
final AbstractPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
400+
final DispatchPrimitiveNode primitiveNode = method.getPrimitiveNodeOrNull();
399401
if (primitiveNode != null) {
400-
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4);
402+
final EncapsulatingNodeReference encapsulating = EncapsulatingNodeReference.getCurrent();
403+
final Node encapsulatingNode = encapsulating.set(node);
404+
try {
405+
return tryPrimitive(primitiveNode, frame.materialize(), node, method, receiver, arg1, arg2, arg3, arg4);
406+
} finally {
407+
encapsulating.set(encapsulatingNode);
408+
}
401409
} else {
402410
return null;
403411
}
404412
}
405413

406414
@TruffleBoundary
407-
private static Object tryPrimitive(final AbstractPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
415+
private static Object tryPrimitive(final DispatchPrimitiveNode primitiveNode, final MaterializedFrame frame, final Node node, final CompiledCodeObject method, final Object receiver,
408416
final Object arg1, final Object arg2, final Object arg3, final Object arg4) {
409417
try {
410-
return ((Primitive4) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
418+
return ((DispatchPrimitiveNode.DispatchPrimitive4Node) primitiveNode).execute(frame, receiver, arg1, arg2, arg3, arg4);
411419
} catch (final PrimitiveFailed pf) {
412420
DispatchUtils.handlePrimitiveFailedIndirect(node, method, pf);
413421
return null;

0 commit comments

Comments
 (0)