Skip to content

Commit c002b9b

Browse files
committed
Don't let the FrameSlot escape to a Block object, take the origin tree node, and let it handled the operation with the FrameSlot
Signed-off-by: Stefan Marr <git@stefan-marr.de>
1 parent 2a5c8d3 commit c002b9b

File tree

3 files changed

+25
-21
lines changed

3 files changed

+25
-21
lines changed

src/som/interpreter/nodes/literals/BlockNode.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import som.vm.Universe;
77
import som.vmobjects.SBlock;
88
import som.vmobjects.SInvokable;
9-
import som.vmobjects.SInvokable.SPrimitive;
109
import som.vmobjects.SInvokable.SMethod;
1110

1211
import com.oracle.truffle.api.frame.FrameSlot;
12+
import com.oracle.truffle.api.frame.FrameUtil;
13+
import com.oracle.truffle.api.frame.MaterializedFrame;
1314
import com.oracle.truffle.api.frame.VirtualFrame;
1415
import com.oracle.truffle.api.nodes.NodeInfo.Kind;
1516

@@ -69,9 +70,13 @@ public BlockNodeWithContext(final BlockNodeWithContext node,
6970
this(node.blockMethod, node.universe, inlinedOuterSelfSlot, node.contextLevel);
7071
}
7172

73+
public Object getOuterSelf(final MaterializedFrame frame) {
74+
return FrameUtil.getObjectSafe(frame, outerSelfSlot);
75+
}
76+
7277
@Override
7378
public SBlock executeSBlock(final VirtualFrame frame) {
74-
return universe.newBlock(blockMethod, frame.materialize(), outerSelfSlot);
79+
return universe.newBlock(blockMethod, frame.materialize(), this);
7580
}
7681

7782
@Override

src/som/vm/Universe.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import som.compiler.Disassembler;
3636
import som.interpreter.Invokable;
37+
import som.interpreter.nodes.literals.BlockNode.BlockNodeWithContext;
3738
import som.vmobjects.SAbstractObject;
3839
import som.vmobjects.SArray;
3940
import som.vmobjects.SBigInteger;
@@ -52,7 +53,6 @@
5253
import com.oracle.truffle.api.CompilerDirectives.SlowPath;
5354
import com.oracle.truffle.api.Truffle;
5455
import com.oracle.truffle.api.TruffleRuntime;
55-
import com.oracle.truffle.api.frame.FrameSlot;
5656
import com.oracle.truffle.api.frame.MaterializedFrame;
5757

5858
public class Universe {
@@ -414,8 +414,8 @@ public SArray newArray(final String[] stringArray) {
414414
}
415415

416416
public SBlock newBlock(final SMethod method, final MaterializedFrame context,
417-
final FrameSlot outerSelfSlot) {
418-
return SBlock.create(method, context, outerSelfSlot);
417+
final BlockNodeWithContext originNode) {
418+
return SBlock.create(method, context, originNode);
419419
}
420420

421421
@SlowPath

src/som/vmobjects/SBlock.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
package som.vmobjects;
2626

27+
import som.interpreter.nodes.literals.BlockNode.BlockNodeWithContext;
2728
import som.primitives.BlockPrimsFactory.ValueMorePrimFactory;
2829
import som.primitives.BlockPrimsFactory.ValueNonePrimFactory;
2930
import som.primitives.BlockPrimsFactory.ValueOnePrimFactory;
@@ -32,26 +33,24 @@
3233
import som.vm.Universe;
3334

3435
import com.oracle.truffle.api.CompilerDirectives;
35-
import com.oracle.truffle.api.frame.FrameSlot;
36-
import com.oracle.truffle.api.frame.FrameUtil;
3736
import com.oracle.truffle.api.frame.MaterializedFrame;
3837

3938
public abstract class SBlock extends SAbstractObject {
4039

4140
public static SBlock create(final SInvokable blockMethod,
42-
final MaterializedFrame context, final FrameSlot outerSelfSlot) {
41+
final MaterializedFrame context, final BlockNodeWithContext originNode) {
4342
switch (blockMethod.getNumberOfArguments()) {
44-
case 1: return new SBlock1(blockMethod, context, outerSelfSlot);
45-
case 2: return new SBlock2(blockMethod, context, outerSelfSlot);
46-
case 3: return new SBlock3(blockMethod, context, outerSelfSlot);
43+
case 1: return new SBlock1(blockMethod, context, originNode);
44+
case 2: return new SBlock2(blockMethod, context, originNode);
45+
case 3: return new SBlock3(blockMethod, context, originNode);
4746
}
4847
throw new RuntimeException("We do currently not have support for more than 3 arguments to a block.");
4948
}
5049

5150
public static final class SBlock1 extends SBlock {
5251
public SBlock1(final SInvokable blockMethod, final MaterializedFrame context,
53-
final FrameSlot outerSelfSlot) {
54-
super(blockMethod, context, outerSelfSlot);
52+
final BlockNodeWithContext originNode) {
53+
super(blockMethod, context, originNode);
5554
}
5655

5756
@Override
@@ -62,8 +61,8 @@ public SClass getSOMClass(final Universe universe) {
6261

6362
public static final class SBlock2 extends SBlock {
6463
public SBlock2(final SInvokable blockMethod, final MaterializedFrame context,
65-
final FrameSlot outerSelfSlot) {
66-
super(blockMethod, context, outerSelfSlot);
64+
final BlockNodeWithContext originNode) {
65+
super(blockMethod, context, originNode);
6766
}
6867

6968
@Override
@@ -74,8 +73,8 @@ public SClass getSOMClass(final Universe universe) {
7473

7574
public static final class SBlock3 extends SBlock {
7675
public SBlock3(final SInvokable blockMethod, final MaterializedFrame context,
77-
final FrameSlot outerSelfSlot) {
78-
super(blockMethod, context, outerSelfSlot);
76+
final BlockNodeWithContext originNode) {
77+
super(blockMethod, context, originNode);
7978
}
8079

8180
@Override
@@ -85,10 +84,10 @@ public SClass getSOMClass(final Universe universe) {
8584
}
8685

8786
public SBlock(final SInvokable blockMethod, final MaterializedFrame context,
88-
final FrameSlot outerSelfSlot) {
87+
final BlockNodeWithContext originNode) {
8988
this.method = blockMethod;
9089
this.context = context;
91-
this.outerSelfSlot = outerSelfSlot;
90+
this.originNode = originNode;
9291
}
9392

9493
public final SInvokable getMethod() {
@@ -101,7 +100,7 @@ public final MaterializedFrame getContext() {
101100
}
102101

103102
public final Object getOuterSelf() {
104-
return FrameUtil.getObjectSafe(getContext(), outerSelfSlot);
103+
return originNode.getOuterSelf(context);
105104
}
106105

107106
public static SInvokable getEvaluationPrimitive(final int numberOfArguments,
@@ -137,5 +136,5 @@ private static String computeSignatureString(final int numberOfArguments) {
137136

138137
private final SInvokable method;
139138
private final MaterializedFrame context;
140-
private final FrameSlot outerSelfSlot;
139+
private final BlockNodeWithContext originNode;
141140
}

0 commit comments

Comments
 (0)