Skip to content

Commit 48b2427

Browse files
committed
Make arguments of n-ary message nodes concrete
Do not use array of node children, instead make these nodes have explicit child nodes. This solves an issue with escaping frames, and avoids the additional indirection of the array. Signed-off-by: Stefan Marr <git@stefan-marr.de>
1 parent fee676d commit 48b2427

File tree

9 files changed

+82
-79
lines changed

9 files changed

+82
-79
lines changed

src/som/interpreter/Method.java

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public ExpressionNode inline(final CallTarget inlinableCallTarget, final SSymbol
142142
inlinableCallTarget, frameDescriptor, selfSlot, nonLocalReturnMarker,
143143
argumentSlots, temporarySlots);
144144
case 2:
145-
return new TernaryInlinedMethod(selector, universe, body, null, null,
145+
return new TernaryInlinedMethod(selector, universe, body, null, null, null,
146146
inlinableCallTarget, frameDescriptor, selfSlot, nonLocalReturnMarker,
147147
argumentSlots, temporarySlots);
148148
default:
@@ -216,9 +216,9 @@ public ExpressionNode getReceiver() {
216216
}
217217

218218
private static final class BinaryInlinedMethod extends BinaryMessageNode implements InlinedCallSite {
219-
@Child private ExpressionNode expressionOrSequence;
220-
@Child private ExpressionNode receiver;
221-
@Children private ExpressionNode[] arguments;
219+
@Child private ExpressionNode expressionOrSequence;
220+
@Child private ExpressionNode receiver;
221+
@Child private ExpressionNode argument;
222222

223223
private final CallTarget callTarget;
224224
private final FrameDescriptor frameDescriptor;
@@ -230,8 +230,8 @@ private static final class BinaryInlinedMethod extends BinaryMessageNode impleme
230230

231231
BinaryInlinedMethod(final SSymbol selector, final Universe universe,
232232
final ExpressionNode msgBody, final ExpressionNode receiver,
233-
final ExpressionNode[] arguments,
234-
final CallTarget callTarget, final FrameDescriptor frameDescriptor,
233+
final ExpressionNode argument, final CallTarget callTarget,
234+
final FrameDescriptor frameDescriptor,
235235
final FrameSlot selfSlot, final FrameSlot nonLocalReturnMarker,
236236
final FrameSlot[] argumentSlots,
237237
final FrameSlot[] temporarySlots) {
@@ -243,7 +243,7 @@ private static final class BinaryInlinedMethod extends BinaryMessageNode impleme
243243
this.nonLocalReturnMarker = nonLocalReturnMarker;
244244
this.argumentSlots = argumentSlots;
245245
this.temporarySlots = temporarySlots;
246-
this.arguments = arguments;
246+
this.argument = argument;
247247
}
248248

249249
@ExplodeLoop
@@ -265,7 +265,7 @@ private FrameOnStackMarker initializeFrame(final VirtualFrame frame) {
265265
@Override
266266
public Object executeGeneric(final VirtualFrame frame) {
267267
Object rcvr = receiver.executeGeneric(frame);
268-
Object arg = arguments[0].executeGeneric(frame);
268+
Object arg = argument.executeGeneric(frame);
269269
return executeEvaluated(frame, rcvr, arg);
270270
}
271271

@@ -288,15 +288,16 @@ public ExpressionNode getReceiver() {
288288
}
289289

290290
@Override
291-
public ExpressionNode[] getArguments() {
292-
return arguments;
291+
public ExpressionNode getArgument() {
292+
return argument;
293293
}
294294
}
295295

296296
private static final class TernaryInlinedMethod extends TernaryMessageNode implements InlinedCallSite {
297-
@Child private ExpressionNode expressionOrSequence;
298-
@Child private ExpressionNode receiver;
299-
@Children private ExpressionNode[] arguments;
297+
@Child private ExpressionNode expressionOrSequence;
298+
@Child private ExpressionNode receiver;
299+
@Child private ExpressionNode firstArg;
300+
@Child private ExpressionNode secondArg;
300301

301302
private final CallTarget callTarget;
302303
private final FrameDescriptor frameDescriptor;
@@ -308,7 +309,7 @@ private static final class TernaryInlinedMethod extends TernaryMessageNode imple
308309

309310
TernaryInlinedMethod(final SSymbol selector, final Universe universe,
310311
final ExpressionNode msgBody, final ExpressionNode receiver,
311-
final ExpressionNode[] arguments,
312+
final ExpressionNode firstArg, final ExpressionNode secondArg,
312313
final CallTarget callTarget, final FrameDescriptor frameDescriptor,
313314
final FrameSlot selfSlot, final FrameSlot nonLocalReturnMarker,
314315
final FrameSlot[] argumentSlots,
@@ -321,7 +322,8 @@ private static final class TernaryInlinedMethod extends TernaryMessageNode imple
321322
this.nonLocalReturnMarker = nonLocalReturnMarker;
322323
this.argumentSlots = argumentSlots;
323324
this.temporarySlots = temporarySlots;
324-
this.arguments = arguments;
325+
this.firstArg = firstArg;
326+
this.secondArg = secondArg;
325327
}
326328

327329
@ExplodeLoop
@@ -344,8 +346,8 @@ private FrameOnStackMarker initializeFrame(final VirtualFrame frame) {
344346
@Override
345347
public Object executeGeneric(final VirtualFrame frame) {
346348
Object rcvr = receiver.executeGeneric(frame);
347-
Object arg1 = arguments[0].executeGeneric(frame);
348-
Object arg2 = arguments[1].executeGeneric(frame);
349+
Object arg1 = firstArg.executeGeneric(frame);
350+
Object arg2 = secondArg.executeGeneric(frame);
349351
return executeEvaluated(frame, rcvr, arg1, arg2);
350352
}
351353

@@ -368,8 +370,13 @@ public ExpressionNode getReceiver() {
368370
}
369371

370372
@Override
371-
public ExpressionNode[] getArguments() {
372-
return arguments;
373+
public ExpressionNode getFirstArg() {
374+
return firstArg;
375+
}
376+
377+
@Override
378+
public ExpressionNode getSecondArg() {
379+
return secondArg;
373380
}
374381
}
375382

src/som/interpreter/nodes/AbstractNAryMessageNode.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

src/som/interpreter/nodes/BinaryMessageNode.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
import som.vm.Universe;
44
import som.vmobjects.SSymbol;
55

6+
import com.oracle.truffle.api.dsl.NodeChild;
7+
import com.oracle.truffle.api.dsl.NodeChildren;
68
import com.oracle.truffle.api.frame.VirtualFrame;
79

8-
public abstract class BinaryMessageNode extends AbstractNAryMessageNode {
10+
@NodeChildren({
11+
@NodeChild(value = "receiver", type = ExpressionNode.class),
12+
@NodeChild(value = "argument", type = ExpressionNode.class)})
13+
public abstract class BinaryMessageNode extends AbstractMessageNode {
914

1015
public BinaryMessageNode(final SSymbol selector, final Universe universe) {
1116
super(selector, universe);
@@ -16,4 +21,5 @@ public BinaryMessageNode(final BinaryMessageNode node) {
1621
}
1722

1823
public abstract Object executeEvaluated(final VirtualFrame frame, final Object receiver, Object argument);
24+
public abstract ExpressionNode getArgument();
1925
}

src/som/interpreter/nodes/NodeFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,17 @@ public static UnaryMessageNode createUnaryMessageNode(final SSymbol selector, fi
4848
}
4949

5050
public static BinaryMessageNode createBinaryMessageNode(final SSymbol selector, final Universe universe, final ExpressionNode receiver, final ExpressionNode arg) {
51-
return BinarySendNode.create(selector, universe, receiver, new ExpressionNode[] {arg});
51+
return BinarySendNode.create(selector, universe, receiver, arg);
5252
}
5353

5454
public static AbstractMessageNode createMessageNode(final SSymbol selector, final Universe universe, final ExpressionNode receiver, final ExpressionNode[] arguments) {
5555
switch (arguments.length) {
5656
case 0:
5757
return createUnaryMessageNode(selector, universe, receiver);
5858
case 1:
59-
return BinarySendNode.create(selector, universe, receiver, arguments);
59+
return BinarySendNode.create(selector, universe, receiver, arguments[0]);
6060
case 2:
61-
return TernarySendNode.create(selector, universe, receiver, arguments);
61+
return TernarySendNode.create(selector, universe, receiver, arguments[0], arguments[1]);
6262
default:
6363
ArgumentEvaluationNode args = new ArgumentEvaluationNode(arguments);
6464
return KeywordSendNode.create(selector, universe, receiver, args);

src/som/interpreter/nodes/TernaryMessageNode.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
import som.vm.Universe;
44
import som.vmobjects.SSymbol;
55

6+
import com.oracle.truffle.api.dsl.NodeChild;
7+
import com.oracle.truffle.api.dsl.NodeChildren;
68
import com.oracle.truffle.api.frame.VirtualFrame;
79

8-
public abstract class TernaryMessageNode extends AbstractNAryMessageNode {
10+
@NodeChildren({
11+
@NodeChild(value = "receiver", type = ExpressionNode.class),
12+
@NodeChild(value = "firstArg", type = ExpressionNode.class),
13+
@NodeChild(value = "secondArg", type = ExpressionNode.class)})
14+
public abstract class TernaryMessageNode extends AbstractMessageNode {
915
public TernaryMessageNode(final SSymbol selector, final Universe universe) {
1016
super(selector, universe);
1117
}
@@ -15,4 +21,6 @@ public TernaryMessageNode(final TernaryMessageNode node) {
1521
}
1622

1723
public abstract Object executeEvaluated(final VirtualFrame frame, final Object receiver, Object firstArg, Object secondArg);
24+
public abstract ExpressionNode getFirstArg();
25+
public abstract ExpressionNode getSecondArg();
1826
}

src/som/interpreter/nodes/VariableWriteNode.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import com.oracle.truffle.api.frame.MaterializedFrame;
77
import com.oracle.truffle.api.frame.VirtualFrame;
88

9-
//@NodeChild(value = "exp", type = ExpressionNode.class)
10-
//abstract
119
public class VariableWriteNode extends VariableNode {
1210
@Child private ExpressionNode exp;
1311

src/som/interpreter/nodes/messages/BinarySendNode.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,19 @@
2222

2323
public abstract class BinarySendNode extends BinaryMessageNode {
2424

25-
@Child protected ExpressionNode receiverExpr;
26-
@Children protected ExpressionNode[] argumentsNodes;
25+
@Child protected ExpressionNode receiverExpr;
26+
@Child protected ExpressionNode argumentNode;
2727

2828
private BinarySendNode(final SSymbol selector,
2929
final Universe universe, final ExpressionNode receiver,
30-
final ExpressionNode[] arguments) {
30+
final ExpressionNode argument) {
3131
super(selector, universe);
32-
this.receiverExpr = adoptChild(receiver);
33-
this.argumentsNodes = adoptChildren(arguments);
32+
this.receiverExpr = adoptChild(receiver);
33+
this.argumentNode = adoptChild(argument);
3434
}
3535

3636
private BinarySendNode(final BinarySendNode node) {
37-
this(node.selector, node.universe, node.receiverExpr, node.argumentsNodes);
37+
this(node.selector, node.universe, node.receiverExpr, node.argumentNode);
3838
}
3939

4040
@Override
@@ -43,21 +43,21 @@ public ExpressionNode getReceiver() {
4343
}
4444

4545
@Override
46-
public ExpressionNode[] getArguments() {
47-
return argumentsNodes;
46+
public ExpressionNode getArgument() {
47+
return argumentNode;
4848
}
4949

5050
@Override
5151
public final Object executeGeneric(final VirtualFrame frame) {
5252
Object receiverValue = receiverExpr.executeGeneric(frame);
53-
Object argument = argumentsNodes[0].executeGeneric(frame);
53+
Object argument = argumentNode.executeGeneric(frame);
5454
return executeEvaluated(frame, receiverValue, argument);
5555
}
5656

5757
public static BinarySendNode create(final SSymbol selector,
5858
final Universe universe, final ExpressionNode receiver,
59-
final ExpressionNode[] arguments) {
60-
return new UninitializedSendNode(selector, universe, receiver, arguments, 0);
59+
final ExpressionNode argument) {
60+
return new UninitializedSendNode(selector, universe, receiver, argument, 0);
6161
}
6262

6363
private static final class CachedSendNode extends BinarySendNode {
@@ -91,9 +91,9 @@ private static final class UninitializedSendNode extends BinarySendNode {
9191
protected final int depth;
9292

9393
UninitializedSendNode(final SSymbol selector, final Universe universe,
94-
final ExpressionNode receiver, final ExpressionNode[] arguments,
94+
final ExpressionNode receiver, final ExpressionNode argument,
9595
final int depth) {
96-
super(selector, universe, receiver, arguments);
96+
super(selector, universe, receiver, argument);
9797
this.depth = depth;
9898
}
9999

src/som/interpreter/nodes/messages/TernarySendNode.java

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@
2222

2323
public abstract class TernarySendNode extends TernaryMessageNode {
2424

25-
@Child protected ExpressionNode receiverExpr;
26-
@Children protected ExpressionNode[] argumentsNodes;
25+
@Child protected ExpressionNode receiverExpr;
26+
@Child protected ExpressionNode firstArgNode;
27+
@Child protected ExpressionNode secondArgNode;
2728

2829
private TernarySendNode(final SSymbol selector,
2930
final Universe universe, final ExpressionNode receiver,
30-
final ExpressionNode[] arguments) {
31+
final ExpressionNode firstArg, final ExpressionNode secondArg) {
3132
super(selector, universe);
32-
this.receiverExpr = adoptChild(receiver);
33-
this.argumentsNodes = adoptChildren(arguments);
33+
this.receiverExpr = adoptChild(receiver);
34+
this.firstArgNode = adoptChild(firstArg);
35+
this.secondArgNode = adoptChild(secondArg);
3436
}
3537

3638
private TernarySendNode(final TernarySendNode node) {
37-
this(node.selector, node.universe, node.receiverExpr, node.argumentsNodes);
39+
this(node.selector, node.universe, node.receiverExpr, node.firstArgNode, node.secondArgNode);
3840
}
3941

4042
@Override
@@ -43,22 +45,27 @@ public ExpressionNode getReceiver() {
4345
}
4446

4547
@Override
46-
public ExpressionNode[] getArguments() {
47-
return argumentsNodes;
48+
public ExpressionNode getFirstArg() {
49+
return firstArgNode;
50+
}
51+
52+
@Override
53+
public ExpressionNode getSecondArg() {
54+
return secondArgNode;
4855
}
4956

5057
@Override
5158
public final Object executeGeneric(final VirtualFrame frame) {
5259
Object receiverValue = receiverExpr.executeGeneric(frame);
53-
Object argument1 = argumentsNodes[0].executeGeneric(frame);
54-
Object argument2 = argumentsNodes[1].executeGeneric(frame);
60+
Object argument1 = firstArgNode.executeGeneric(frame);
61+
Object argument2 = secondArgNode.executeGeneric(frame);
5562
return executeEvaluated(frame, receiverValue, argument1, argument2);
5663
}
5764

5865
public static TernarySendNode create(final SSymbol selector,
5966
final Universe universe, final ExpressionNode receiver,
60-
final ExpressionNode[] arguments) {
61-
return new UninitializedSendNode(selector, universe, receiver, arguments, 0);
67+
final ExpressionNode firstArg, final ExpressionNode secondArg) {
68+
return new UninitializedSendNode(selector, universe, receiver, firstArg, secondArg, 0);
6269
}
6370

6471
private static final class CachedSendNode extends TernarySendNode {
@@ -92,9 +99,9 @@ private static final class UninitializedSendNode extends TernarySendNode {
9299
protected final int depth;
93100

94101
UninitializedSendNode(final SSymbol selector, final Universe universe,
95-
final ExpressionNode receiver, final ExpressionNode[] arguments,
96-
final int depth) {
97-
super(selector, universe, receiver, arguments);
102+
final ExpressionNode receiver, final ExpressionNode firstArg,
103+
final ExpressionNode secondArg, final int depth) {
104+
super(selector, universe, receiver, firstArg, secondArg);
98105
this.depth = depth;
99106
}
100107

src/som/primitives/Primitives.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ public static SMethod constructPrimitive(final SSymbol signature,
7979
new SelfReadNode(mgen.getSelfSlot(), 0));
8080
} else if (numArgs == 1) {
8181
primNode = nodeFactory.createNode(signature, universe,
82-
new SelfReadNode(mgen.getSelfSlot(), 0), args);
82+
new SelfReadNode(mgen.getSelfSlot(), 0), args[0]);
8383
} else if (numArgs == 2) {
8484
primNode = nodeFactory.createNode(signature, universe,
85-
new SelfReadNode(mgen.getSelfSlot(), 0), args);
85+
new SelfReadNode(mgen.getSelfSlot(), 0), args[0], args[1]);
8686
} else {
8787
ArgumentEvaluationNode argEvalNode = new ArgumentEvaluationNode(args);
8888
primNode = nodeFactory.createNode(signature, universe,

0 commit comments

Comments
 (0)