# HG changeset patch # User Christian Humer # Date 1387291442 -3600 # Node ID 136df94b5aa8b163beaa14917a0a32517120dd38 # Parent 652f24858aad19d70183faac69952c361015aec2 SL: updated outdated implementation of write local variable nodes in SL. diff -r 652f24858aad -r 136df94b5aa8 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java Sun Dec 15 23:32:41 2013 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WriteLocalNode.java Tue Dec 17 15:44:02 2013 +0100 @@ -22,6 +22,7 @@ */ package com.oracle.truffle.sl.nodes; +import com.oracle.truffle.api.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; @@ -36,22 +37,51 @@ this(node.slot); } - @Specialization + @Specialization(guards = "isIntKind") public int write(VirtualFrame frame, int right) { frame.setInt(slot, right); return right; } - @Specialization + @Specialization(guards = "isBooleanKind") public boolean write(VirtualFrame frame, boolean right) { frame.setBoolean(slot, right); return right; } - @Specialization + @Specialization(guards = "isObjectKind") public Object writeGeneric(VirtualFrame frame, Object right) { frame.setObject(slot, right); return right; } + protected final boolean isIntKind() { + return isKind(FrameSlotKind.Int); + } + + protected final boolean isBooleanKind() { + return isKind(FrameSlotKind.Boolean); + } + + protected final boolean isObjectKind() { + if (slot.getKind() != FrameSlotKind.Object) { + CompilerDirectives.transferToInterpreter(); + slot.setKind(FrameSlotKind.Object); + } + return true; + } + + private boolean isKind(FrameSlotKind kind) { + return slot.getKind() == kind || initialSetKind(kind); + } + + private boolean initialSetKind(FrameSlotKind kind) { + if (slot.getKind() == FrameSlotKind.Illegal) { + CompilerDirectives.transferToInterpreter(); + slot.setKind(kind); + return true; + } + return false; + } + }