SymbolicAddressMap { public SymbolicAddressMap cloneFilterStack(int bound) { if(this.isTop()) return this; SymbolicAddressMap copy = new SymbolicAddressMap(this.bsFactory); for(Entry<Location, BoundedSet<SymbolicAddress>> entry : mapP.entrySet()) { Location loc = entry.getKey(); if(loc.isHeapLoc() || loc.stackLoc < bound) { copy.put(loc, entry.getValue()); } } return copy; } SymbolicAddressMap(BoundedSetFactory<SymbolicAddress> bsFactory); private  SymbolicAddressMap(BoundedSetFactory<SymbolicAddress> bsFactory,
							   HashMap<Location,BoundedSet<SymbolicAddress>> initP,
							   HashMap<String,BoundedSet<SymbolicAddress>> initA); boolean isTop(); static SymbolicAddressMap top(); @Override int hashCode(); @Override boolean equals(Object obj); boolean isSubset(SymbolicAddressMap other); SymbolicAddressMap cloneFilterStack(int bound); SymbolicAddressMap cloneInvoke(int framePtr); void addStackUpto(SymbolicAddressMap in, int bound); void join(SymbolicAddressMap b); void joinReturned(SymbolicAddressMap returned, int framePtr); void copyStack(SymbolicAddressMap in, int dst, int src); BoundedSet<SymbolicAddress> getStack(int index); void putStack(int index, BoundedSet<SymbolicAddress> bs); BoundedSet<SymbolicAddress> getHeap(String staticfield); void putHeap(String staticfield, BoundedSet<SymbolicAddress> pointers); void put(Location l, BoundedSet<SymbolicAddress> bs); void addAlias(String ty, BoundedSet<SymbolicAddress> newAliases); BoundedSet<SymbolicAddress> getAliases(String fieldType); void print(PrintStream out, int indent); @Override String toString();  }
@Test public void testCloneFilterStack() { SymbolicAddressMap m1 = map1(); SymbolicAddressMap m2 = map2(); SymbolicAddressMap top = SymbolicAddressMap.top(); SymbolicAddressMap m1a = m1.cloneFilterStack(2); assert(! m1a.equals(m1)); assert(m1a.isSubset(m1)); assert(m1a.getStack(0).equals(m1.getStack(0))); assert(m1a.getStack(1).equals(m1.getStack(1))); assert(!m1a.getStack(2).equals(m1.getStack(2))); m1a.putStack(2, m1.getStack(2)); assert(m1a.equals(m1)); SymbolicAddressMap m2a = m2.cloneFilterStack(2); assert(m2a.equals(m2)); SymbolicAddressMap topa = top.cloneFilterStack(1); assert(topa.equals(top)); }