changeset 13875:042a2d972174

support frame slot removal
author Michael Haupt <michael.haupt@oracle.com>
date Wed, 05 Feb 2014 11:40:13 +0100
parents d04be74665fb
children 54892f32714e
files graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java
diffstat 2 files changed, 20 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java	Wed Feb 05 09:32:30 2014 +0100
+++ b/graal/com.oracle.truffle.api.test/src/com/oracle/truffle/api/test/FrameTest.java	Wed Feb 05 11:40:13 2014 +0100
@@ -37,7 +37,8 @@
  * {@link FrameDescriptor} represents the current structure of the frame. The method
  * {@link FrameDescriptor#addFrameSlot(Object, FrameSlotKind)} can be used to create predefined
  * frame slots. The setter and getter methods in the {@link Frame} class can be used to access the
- * current value of a particular frame slot.
+ * current value of a particular frame slot. Values can be removed from a frame via the
+ * {@link FrameDescriptor#removeFrameSlot(Object)} method.
  * </p>
  * 
  * <p>
@@ -64,11 +65,20 @@
     public void test() {
         TruffleRuntime runtime = Truffle.getRuntime();
         FrameDescriptor frameDescriptor = new FrameDescriptor();
-        FrameSlot slot = frameDescriptor.addFrameSlot("localVar", FrameSlotKind.Int);
+        String varName = "localVar";
+        FrameSlot slot = frameDescriptor.addFrameSlot(varName, FrameSlotKind.Int);
         TestRootNode rootNode = new TestRootNode(frameDescriptor, new AssignLocal(slot), new ReadLocal(slot));
         CallTarget target = runtime.createCallTarget(rootNode);
         Object result = target.call();
         Assert.assertEquals(42, result);
+        frameDescriptor.removeFrameSlot(varName);
+        boolean slotMissing = false;
+        try {
+            result = target.call();
+        } catch (IllegalArgumentException iae) {
+            slotMissing = true;
+        }
+        Assert.assertTrue(slotMissing);
     }
 
     class TestRootNode extends RootNode {
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Wed Feb 05 09:32:30 2014 +0100
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Wed Feb 05 11:40:13 2014 +0100
@@ -86,6 +86,14 @@
         return addFrameSlot(identifier, kind);
     }
 
+    public void removeFrameSlot(Object identifier) {
+        assert identifierToSlotMap.containsKey(identifier);
+        slots.remove(identifierToSlotMap.get(identifier));
+        identifierToSlotMap.remove(identifier);
+        updateVersion();
+        getNotInFrameAssumption(identifier);
+    }
+
     public int getSize() {
         return slots.size();
     }