changeset 11810:91a676d0bbbe

Truffle: add not-in-frame assumption feature.
author Andreas Woess <andreas.woess@jku.at>
date Thu, 26 Sep 2013 13:47:12 +0200
parents c7769440afd8
children ec90fc830e45
files graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java
diffstat 1 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Wed Sep 25 17:34:01 2013 +0200
+++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java	Thu Sep 26 13:47:12 2013 +0200
@@ -39,6 +39,7 @@
     private final ArrayList<FrameSlotImpl> slots;
     private final HashMap<Object, FrameSlotImpl> identifierToSlotMap;
     private Assumption version;
+    private HashMap<Object, Assumption> identifierToNotInFrameAssumptionMap;
 
     public FrameDescriptor() {
         this(DefaultFrameTypeConversion.getInstance());
@@ -61,6 +62,7 @@
         slots.add(slot);
         identifierToSlotMap.put(identifier, slot);
         updateVersion();
+        invalidateNotInFrameAssumption(identifier);
         return slot;
     }
 
@@ -133,4 +135,32 @@
     public FrameTypeConversion getTypeConversion() {
         return typeConversion;
     }
+
+    public Assumption getNotInFrameAssumption(Object identifier) {
+        if (identifierToSlotMap.containsKey(identifier)) {
+            throw new IllegalArgumentException("Cannot get not-in-frame assumption for existing frame slot!");
+        }
+
+        if (identifierToNotInFrameAssumptionMap == null) {
+            identifierToNotInFrameAssumptionMap = new HashMap<>();
+        } else {
+            Assumption assumption = identifierToNotInFrameAssumptionMap.get(identifier);
+            if (assumption != null) {
+                return assumption;
+            }
+        }
+        Assumption assumption = Truffle.getRuntime().createAssumption("not in frame: " + identifier);
+        identifierToNotInFrameAssumptionMap.put(identifier, assumption);
+        return assumption;
+    }
+
+    private void invalidateNotInFrameAssumption(Object identifier) {
+        if (identifierToNotInFrameAssumptionMap != null) {
+            Assumption assumption = identifierToNotInFrameAssumptionMap.get(identifier);
+            if (assumption != null) {
+                assumption.invalidate();
+                identifierToNotInFrameAssumptionMap.remove(identifier);
+            }
+        }
+    }
 }