# HG changeset patch # User Andreas Woess # Date 1380196032 -7200 # Node ID 91a676d0bbbe5e9ce72df7cd2234d5f3b121d28a # Parent c7769440afd8793bf131a3444349b6c51d5d9b86 Truffle: add not-in-frame assumption feature. diff -r c7769440afd8 -r 91a676d0bbbe graal/com.oracle.truffle.api/src/com/oracle/truffle/api/frame/FrameDescriptor.java --- 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 slots; private final HashMap identifierToSlotMap; private Assumption version; + private HashMap 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); + } + } + } }