Skip to content

Commit 851549a

Browse files
committed
Introduced cloneForInlining
Signed-off-by: Stefan Marr <git@stefan-marr.de>
1 parent ad02c27 commit 851549a

File tree

8 files changed

+58
-1
lines changed

8 files changed

+58
-1
lines changed

src/som/interpreter/nodes/ExpressionNode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ public abstract class ExpressionNode extends SOMNode {
2929

3030
public abstract Object executeGeneric(VirtualFrame frame);
3131

32+
public abstract ExpressionNode cloneForInlining();
33+
3234
}

src/som/interpreter/nodes/FieldNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ public Object executeGeneric(VirtualFrame frame) {
5858
Object self = getSelfFromMaterialized(ctx);
5959
return self.getField(fieldIndex);
6060
}
61+
62+
@Override
63+
public ExpressionNode cloneForInlining() {
64+
return this;
65+
}
6166
}
6267

6368
public static class FieldWriteNode extends FieldNode {
@@ -80,5 +85,10 @@ public Object executeGeneric(VirtualFrame frame) {
8085
self.setField(fieldIndex, value);
8186
return value;
8287
}
88+
89+
@Override
90+
public ExpressionNode cloneForInlining() {
91+
return new FieldWriteNode(fieldIndex, contextLevel, exp.cloneForInlining());
92+
}
8393
}
8494
}

src/som/interpreter/nodes/GlobalNode.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected Object getSelfFromVirtual(final VirtualFrame frame) {
5050

5151
public static class GlobalReadNode extends GlobalNode {
5252

53-
public GlobalReadNode(final Symbol globalName, final Universe universe) {
53+
public GlobalReadNode(final Symbol globalName, final Universe universe) {
5454
super(globalName, universe);
5555
}
5656

@@ -69,4 +69,9 @@ public Object executeGeneric(VirtualFrame frame) {
6969
}
7070
}
7171
}
72+
73+
@Override
74+
public ExpressionNode cloneForInlining() {
75+
return this;
76+
}
7277
}

src/som/interpreter/nodes/LiteralNode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public Object executeGeneric(VirtualFrame frame) {
4040
return this.value;
4141
}
4242

43+
@Override
44+
public ExpressionNode cloneForInlining() {
45+
return this;
46+
}
47+
4348
public static class BlockNode extends LiteralNode {
4449

4550
protected final Universe universe;
@@ -55,5 +60,7 @@ public Object executeGeneric(VirtualFrame frame) {
5560
Method method = (Method) value;
5661
return universe.newBlock(method, frame.materialize(), method.getNumberOfArguments());
5762
}
63+
64+
// TODO: should we do something else for cloneForInlining() in this class?
5865
}
5966
}

src/som/interpreter/nodes/MessageNode.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ public MessageNode(final ExpressionNode receiver,
5555
this.universe = universe;
5656
}
5757

58+
/**
59+
* @return uninitialized node to allow for specialization
60+
*/
61+
@Override
62+
public ExpressionNode cloneForInlining() {
63+
return new MessageNode(receiver, arguments, selector, universe);
64+
}
65+
5866
protected Object[] determineArguments(final VirtualFrame frame) {
5967
int numArgs = (arguments == null) ? 0 : arguments.length;
6068

src/som/interpreter/nodes/ReturnNonLocalNode.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,10 @@ public Object executeGeneric(VirtualFrame frame) {
8181
return self.sendEscapedBlock(block, universe, frame.pack());
8282
}
8383
}
84+
85+
@Override
86+
public ExpressionNode cloneForInlining() {
87+
return new ReturnNonLocalNode(expression.cloneForInlining(), contextLevel,
88+
universe);
89+
}
8490
}

src/som/interpreter/nodes/SequenceNode.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,14 @@ public Object executeGeneric(VirtualFrame frame) {
4545
return last;
4646
}
4747

48+
@Override
49+
public ExpressionNode cloneForInlining() {
50+
ExpressionNode[] exprs = new ExpressionNode[expressions.length];
51+
52+
for (int i = 0; i < expressions.length; i++) {
53+
exprs[i] = expressions[i].cloneForInlining();
54+
}
55+
56+
return new SequenceNode(exprs);
57+
}
4858
}

src/som/interpreter/nodes/VariableNode.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public Object executeGeneric(VirtualFrame frame) {
5858
}
5959
}
6060

61+
@Override
62+
public ExpressionNode cloneForInlining() {
63+
return this;
64+
}
6165
}
6266

6367
public static class SelfReadNode extends VariableReadNode {
@@ -92,5 +96,10 @@ public Object executeGeneric(VirtualFrame frame) {
9296
}
9397
return result;
9498
}
99+
100+
@Override
101+
public ExpressionNode cloneForInlining() {
102+
return new VariableWriteNode(slot, contextLevel, exp.cloneForInlining());
103+
}
95104
}
96105
}

0 commit comments

Comments
 (0)