public LargeNumberedMap(ArrayNumberer<K> universe) { this.universe = universe; int newsize = universe.size(); if (newsize < 8) { newsize = 8; } values = new Object[newsize]; }
public int getNumAllocNodes() { return allocNodeNumberer.size(); }
public boolean put(Numberable key, V value) { int number = key.getNumber(); if (number == 0) { throw new RuntimeException(String.format("oops, forgot to initialize. Object is of type %s, and looks like this: %s", key.getClass().getName(), key.toString())); } if (number >= values.length) { Object[] oldValues = values; values = new Object[universe.size() * 2 + 5]; System.arraycopy(oldValues, 0, values, 0, oldValues.length); } boolean ret = (values[number] != value); values[number] = value; return ret; }
public BitPointsToSet(Type type, PAG pag) { super(type); this.pag = pag; bits = new BitVector(pag.getAllocNodeNumberer().size()); }
protected final void convertToBits() { if (bits != null) { return; } // ++numBitVectors; bits = new BitVector(pag.getAllocNodeNumberer().size()); for (Node node : nodes) { if (node != null) { fastAdd(node); } } }
public OTFMethodSCCManager() { int size = Scene.v().getMethodNumberer().size(); disj = new DisjointSets(size + 1); }
/** Actually collapse the SCCs in the PAG. */ public void collapse() { boolean verbose = pag.getOpts().verbose(); if (verbose) { logger.debug("" + "Total VarNodes: " + pag.getVarNodeNumberer().size() + ". Collapsing SCCs..."); } new TopoSorter(pag, ignoreTypes).sort(); TreeSet<VarNode> s = new TreeSet<VarNode>(); for (final VarNode v : pag.getVarNodeNumberer()) { s.add(v); } for (VarNode v : s) { dfsVisit(v, v); } if (verbose) { logger.debug("" + "" + numCollapsed + " nodes were collapsed."); } visited = null; }
/** Actually collapse the EBBs in the PAG. */ public void collapse() { boolean verbose = pag.getOpts().verbose(); if (verbose) { logger.debug("" + "Total VarNodes: " + pag.getVarNodeNumberer().size() + ". Collapsing EBBs..."); } collapseAlloc(); collapseLoad(); collapseSimple(); if (verbose) { logger.debug("" + "" + numCollapsed + " nodes were collapsed."); } }
private final void doubleSize() { int uniSize = universe.size(); if (array.length * 128 > uniSize) { bits = new BitVector(uniSize); Numberable[] oldArray = array; array = null; for (Numberable element : oldArray) { if (element != null) { bits.set(element.getNumber()); } } } else { Numberable[] oldArray = array; array = new Numberable[array.length * 2]; for (Numberable element : oldArray) { if (element != null) { array[findPosition(element)] = element; } } } }
logger.debug("Doing full graph"); bases = new ArrayList<VarNode>(pag.getVarNodeNumberer().size()); for (VarNode v : pag.getVarNodeNumberer()) { bases.add(v);
final private BitVector makeMaskOfInterface(SootClass interf) { if (!(interf.isInterface())) { throw new RuntimeException(); } BitVector ret = new BitVector(pag.getAllocNodeNumberer().size()); typeMask.put(interf.getType(), ret); Collection<SootClass> implementers = getFastHierarchy().getAllImplementersOfInterface(interf); for (SootClass impl : implementers) { BitVector other = typeMask.get(impl.getType()); if (other == null) { other = makeClassTypeMask(impl); } ret.or(other); } // I think, the following can be eliminated. It is added to make // type-masks exactly the same as the original type-masks if (implementers.size() == 0) { for (AllocNode an : anySubtypeAllocs) { ret.set(an.getNumber()); } } return ret; }
int nBits = pag.getAllocNodeNumberer().size(); final BitVector mask = new BitVector(nBits);
public boolean add(Node n) { /* * This algorithm is described in the paper "IBM Research Report: Fast Pointer Analysis" by Hirzel, Dincklage, Diwan, and * Hind, pg. 11 */ if (contains(n)) { return false; } ++numElements; if (!overflow.full()) { overflow.add(n); } else { // Put everything in the bitvector PointsToBitVector newBitVector; if (bitVector == null) { newBitVector = new PointsToBitVector(pag.getAllocNodeNumberer().size()); } else { newBitVector = new PointsToBitVector(bitVector); } newBitVector.add(n); // add n to it add(newBitVector, overflow); // Now everything is in newBitVector, and it must have numElements // ones // The algorithm would still work without this step, but wouldn't be // a // shared implmentation at all. findAppropriateBitVector(newBitVector, null, 0, numElements - overflow.size() - 1); } return true; }
BitVector mask = new BitVector(allocNodes.size()); for (Node n : allocNodes) { if (castNeverFails(n.getType(), t)) {
newBitVector = new PointsToBitVector(pag.getAllocNodeNumberer().size()); } else { newBitVector = new PointsToBitVector(exclude.bitVector);
public LargeNumberedMap( ArrayNumberer universe ) { this.universe = universe; int newsize = universe.size(); if( newsize < 8 ) newsize = 8; values = new Object[newsize]; } public boolean put( Numberable key, Object value ) {
public LargeNumberedMap( ArrayNumberer universe ) { this.universe = universe; int newsize = universe.size(); if( newsize < 8 ) newsize = 8; values = new Object[newsize]; } public boolean put( Numberable key, Object value ) {
public boolean put( Numberable key, Object value ) { int number = key.getNumber(); if( number == 0 ) throw new RuntimeException( "oops, forgot to initialize" ); if( number >= values.length ) { Object[] oldValues = values; values = new Object[ universe.size()*2+5 ]; System.arraycopy(oldValues,0,values,0,oldValues.length); } boolean ret = ( values[number] != value ); values[number] = value; return ret; } public Object get( Numberable key ) {
public boolean put( Numberable key, Object value ) { int number = key.getNumber(); if( number == 0 ) throw new RuntimeException( "oops, forgot to initialize" ); if( number >= values.length ) { Object[] oldValues = values; values = new Object[ universe.size()*2+5 ]; System.arraycopy(oldValues,0,values,0,oldValues.length); } boolean ret = ( values[number] != value ); values[number] = value; return ret; } public Object get( Numberable key ) {