@Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation impl = new BitVectorIntSet(impl); } boolean result = impl.addAll(set); if (result) { maybeChangeRepresentation(); } return result; }
@Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation impl = new BitVectorIntSet(impl); } boolean result = impl.addAll(set); if (result) { maybeChangeRepresentation(); } return result; }
@Override public boolean addAll(IntSet set) { if (set instanceof BitVectorIntSet && !(impl instanceof BitVectorIntSet)) { // change the representation before performing the operation impl = new BitVectorIntSet(impl); } boolean result = impl.addAll(set); if (result) { maybeChangeRepresentation(); } return result; }
@Override public IntSet getSuccNodeNumbers(T node) { if (original.containsNode(node)) { if (outEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getSuccNodeNumbers(node)); x.addAll(outEdges.get(node)); return x; } else { return original.getSuccNodeNumbers(node); } } else { if (outEdges.containsKey(node)) { return outEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getPredNodeNumbers(T node) { if (original.containsNode(node)) { if (inEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getPredNodeNumbers(node)); x.addAll(inEdges.get(node)); return x; } else { return original.getPredNodeNumbers(node); } } else { if (inEdges.containsKey(node)) { return inEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getPredNodeNumbers(T node) { if (original.containsNode(node)) { if (inEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getPredNodeNumbers(node)); x.addAll(inEdges.get(node)); return x; } else { return original.getPredNodeNumbers(node); } } else { if (inEdges.containsKey(node)) { return inEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getSuccNodeNumbers(T node) { if (original.containsNode(node)) { if (outEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getSuccNodeNumbers(node)); x.addAll(outEdges.get(node)); return x; } else { return original.getSuccNodeNumbers(node); } } else { if (outEdges.containsKey(node)) { return outEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getSuccNodeNumbers(T node) { if (original.containsNode(node)) { if (outEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getSuccNodeNumbers(node)); x.addAll(outEdges.get(node)); return x; } else { return original.getSuccNodeNumbers(node); } } else { if (outEdges.containsKey(node)) { return outEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getPredNodeNumbers(T node) { if (original.containsNode(node)) { if (inEdges.containsKey(node)) { MutableIntSet x = IntSetUtil.makeMutableCopy(original.getPredNodeNumbers(node)); x.addAll(inEdges.get(node)); return x; } else { return original.getPredNodeNumbers(node); } } else { if (inEdges.containsKey(node)) { return inEdges.get(node); } else { return EmptyIntSet.instance; } } }
@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { MutableIntSet x = IntSetUtil.makeMutableCopy(base.getRelevantParameters(caller, site)); x.addAll(isFindStatic(site.getDeclaredTarget())? params: self); return x; } }
@Override public IntSet getRelevantParameters(CGNode caller, CallSiteReference site) { MutableIntSet x = IntSetUtil.makeMutableCopy(base.getRelevantParameters(caller, site)); x.addAll(isFindStatic(site.getDeclaredTarget())? params: self); return x; } }
/** * Add all integers from the set B * * @return true iff the value of this changes */ public boolean addAll(IntSet B) { if (V == null) { V = IntSetUtil.getDefaultIntSetFactory().makeCopy(B); return (B.size() > 0); } else { boolean result = V.addAll(B); return result; } }
/** * Add all integers from the set B * * @return true iff the value of this changes */ public boolean addAll(IntSet B) { if (V == null) { V = IntSetUtil.getDefaultIntSetFactory().makeCopy(B); return (B.size() > 0); } else { boolean result = V.addAll(B); return result; } }
/** * Add all integers from the set B * * @return true iff the value of this changes */ public boolean addAll(IntSet B) { if (V == null) { V = IntSetUtil.getDefaultIntSetFactory().makeCopy(B); return (B.size() > 0); } else { boolean result = V.addAll(B); return result; } }
@Override public void visitPutField(PutFieldLabel label, Object dst) { IField field = label.getField(); PointerKey storeBase = (PointerKey) dst; if (refineFieldAccesses(field, storeBase, curPk, label, curState)) { // statements x.f = y, Y updated (X' not empty required) // update Z.f for all z in X' PointerKeyAndState storeBaseAndState = new PointerKeyAndState(storeBase, curState); encounteredStores.add(new StoreEdge(storeBaseAndState, field, curPkAndState)); for (InstanceKeyAndState ikAndState : makeOrdinalSet(find(pkToTrackedSet, storeBaseAndState))) { if (forwInstKeyToFields.get(ikAndState).contains(field)) { InstanceFieldKeyAndState ifKeyAndState = getInstFieldKey(ikAndState, field); findOrCreate(instFieldKeyToP2Set, ifKeyAndState).addAll(find(pkToP2Set, curPkAndState)); } } } else { handleAllBackCopies(curPkAndState, g.getReadsOfInstanceField(storeBase, field), MatchBarLabel.v()); } }
@Override public void visitPutField(PutFieldLabel label, Object dst) { IField field = label.getField(); PointerKey storeBase = (PointerKey) dst; if (refineFieldAccesses(field, storeBase, curPk, label, curState)) { // statements x.f = y, Y updated (X' not empty required) // update Z.f for all z in X' PointerKeyAndState storeBaseAndState = new PointerKeyAndState(storeBase, curState); encounteredStores.add(new StoreEdge(storeBaseAndState, field, curPkAndState)); for (InstanceKeyAndState ikAndState : makeOrdinalSet(find(pkToTrackedSet, storeBaseAndState))) { if (forwInstKeyToFields.get(ikAndState).contains(field)) { InstanceFieldKeyAndState ifKeyAndState = getInstFieldKey(ikAndState, field); findOrCreate(instFieldKeyToP2Set, ifKeyAndState).addAll(find(pkToP2Set, curPkAndState)); } } } else { handleAllBackCopies(curPkAndState, g.getReadsOfInstanceField(storeBase, field), MatchBarLabel.v()); } }
@Override public void visitPutField(PutFieldLabel label, Object dst) { IField field = (label).getField(); PointerKey dstPtrKey = (PointerKey) dst; // pass barred label since this is for tracked points-to sets if (refineFieldAccesses(field, curPk, dstPtrKey, label.bar(), curState)) { // x.f = y, X updated // if Y' non-empty, then update // tracked set of X.f, to trace flow // to reads PointerKeyAndState storeDst = new PointerKeyAndState(dstPtrKey, curState); encounteredStores.add(new StoreEdge(curPkAndState, field, storeDst)); IntSet trackedSet = find(pkToTrackedSet, storeDst); if (!trackedSet.isEmpty()) { for (InstanceKeyAndState ikAndState : makeOrdinalSet(find(pkToP2Set, curPkAndState))) { InstanceFieldKeyAndState ifk = getInstFieldKey(ikAndState, field); findOrCreate(instFieldKeyToTrackedSet, ifk).addAll(trackedSet); trackInstanceField(ikAndState, field, backInstKeyToFields); } } } } };
@Override public void visitPutField(PutFieldLabel label, Object dst) { IField field = label.getField(); PointerKey storeBase = (PointerKey) dst; // bar label since this is for tracked points-to sets if (refineFieldAccesses(field, storeBase, curPk, label.bar(), curState)) { PointerKeyAndState storeBaseAndState = new PointerKeyAndState(storeBase, curState); encounteredStores.add(new StoreEdge(storeBaseAndState, field, curPkAndState)); if (!addToInitWorklist(storeBaseAndState)) { for (InstanceKeyAndState ikAndState : makeOrdinalSet(find(pkToP2Set, storeBaseAndState))) { InstanceFieldKeyAndState ifk = getInstFieldKey(ikAndState, field); findOrCreate(instFieldKeyToTrackedSet, ifk).addAll(trackedSet); trackInstanceField(ikAndState, field, backInstKeyToFields); } } } else { // send to all getfield sources for (final PointerKey predPk : Iterator2Iterable.make(g.getReadsOfInstanceField(storeBase, field))) { doTransition(curState, MatchBarLabel.v(), predPkState -> { PointerKeyAndState predPkAndState = new PointerKeyAndState(predPk, predPkState); handleTrackedPred(trackedSet, predPkAndState, MatchBarLabel.v()); return null; }); } } }
/** * handle possible updated flow in both directions for a call parameter */ private void repropCallArg(PointerKeyAndState src, PointerKeyAndState dst, IFlowLabel dstToSrcLabel) { if (DEBUG) { // System.err.println("re-propping from src " + src + " to dst " + dst); } for (PointerKeyAndState srcToHandle : matchingPToQueried(dst, src.getPointerKey(), dstToSrcLabel)) { handleCopy(srcToHandle, dst, dstToSrcLabel.bar()); } for (PointerKeyAndState dstToHandle : matchingTrackedQueried(src, dst.getPointerKey(), dstToSrcLabel)) { IntSet trackedSet = find(pkToTrackedSet, dstToHandle); if (!trackedSet.isEmpty()) { if (findOrCreate(pkToTrackedSet, src).addAll(trackedSet)) { addToTrackedPToWorklist(src); } } } }
/** * handle possible updated flow in both directions for a call parameter */ private void repropCallArg(PointerKeyAndState src, PointerKeyAndState dst, IFlowLabel dstToSrcLabel) { if (DEBUG) { // System.err.println("re-propping from src " + src + " to dst " + dst); } for (PointerKeyAndState srcToHandle : matchingPToQueried(dst, src.getPointerKey(), dstToSrcLabel)) { handleCopy(srcToHandle, dst, dstToSrcLabel.bar()); } for (PointerKeyAndState dstToHandle : matchingTrackedQueried(src, dst.getPointerKey(), dstToSrcLabel)) { IntSet trackedSet = find(pkToTrackedSet, dstToHandle); if (!trackedSet.isEmpty()) { if (findOrCreate(pkToTrackedSet, src).addAll(trackedSet)) { addToTrackedPToWorklist(src); } } } }