Skip to content

Commit 3319511

Browse files
committed
Initialize local slots with nil.
Signed-off-by: Stefan Marr <git@stefan-marr.de>
1 parent 45a986c commit 3319511

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

src/som/compiler/MethodGenerationContext.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,19 @@ public Invokable assemblePrimitive(final Universe universe) {
103103

104104
public Method assemble(final Universe universe, final SequenceNode expressions) {
105105
FrameSlot[] argSlots = new FrameSlot[arguments.size()];
106+
FrameSlot[] localSlots = new FrameSlot[locals.size()];
106107

107108
for (int i = 0; i < arguments.size(); i++) {
108109
argSlots[i] = frameDescriptor.findFrameSlot(arguments.get(i));
109110
}
110111

112+
for (int i = 0; i < locals.size(); i++) {
113+
localSlots[i] = frameDescriptor.findFrameSlot(locals.get(i));
114+
}
115+
111116
som.interpreter.nodes.Method truffleMethod =
112117
new som.interpreter.nodes.Method(expressions,
113-
selfSlot, argSlots, nonLocalReturnMarker);
118+
selfSlot, argSlots, localSlots, nonLocalReturnMarker, universe);
114119

115120
Method meth = universe.newMethod(signature, truffleMethod, frameDescriptor);
116121

src/som/interpreter/nodes/Method.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
*/
2222
package som.interpreter.nodes;
2323

24+
import som.vm.Universe;
25+
2426
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
2527
import com.oracle.truffle.api.frame.FrameSlot;
2628
import com.oracle.truffle.api.frame.FrameSlotTypeException;
@@ -35,17 +37,23 @@ public class Method extends RootNode {
3537
@Child private final SequenceNode expressions;
3638

3739
private final FrameSlot selfSlot;
38-
@CompilationFinal private final FrameSlot[] argumentSlots;
40+
@CompilationFinal private final FrameSlot[] argumentSlots;
41+
@CompilationFinal private final FrameSlot[] temporarySlots;
3942
private final FrameSlot nonLocalReturnMarker;
43+
private final Universe universe;
4044

4145
public Method(final SequenceNode expressions,
4246
final FrameSlot selfSlot,
4347
final FrameSlot[] argumentSlots,
44-
final FrameSlot nonLocalReturnMarker) {
48+
final FrameSlot[] temporarySlots,
49+
final FrameSlot nonLocalReturnMarker,
50+
final Universe universe) {
4551
this.expressions = expressions;
4652
this.selfSlot = selfSlot;
4753
this.argumentSlots = argumentSlots;
54+
this.temporarySlots = temporarySlots;
4855
this.nonLocalReturnMarker = nonLocalReturnMarker;
56+
this.universe = universe;
4957
}
5058

5159
@Override
@@ -81,6 +89,10 @@ private FrameOnStackMarker initializeFrame(MaterializedFrame frame) {
8189
FrameOnStackMarker marker = new FrameOnStackMarker();
8290
frame.setObject(nonLocalReturnMarker, marker);
8391

92+
for (int i = 0; i < temporarySlots.length; i++) {
93+
frame.setObject(temporarySlots[i], universe.nilObject);
94+
}
95+
8496
return marker;
8597
} catch (FrameSlotTypeException e) {
8698
throw new RuntimeException("Should not happen, since we only have one type currently!");

0 commit comments

Comments
 (0)