fc2enclosing.put(fc, mdCaller);
if( state.DISJOINTDEBUGSCHEDULING ) {
- System.out.println(" context changed, scheduling callee: "+mdPossible);
+ System.out.println(" context changed at callsite: "+fc+", scheduling callee: "+mdPossible);
}
if( state.DISJOINTDVISITSTACKEESONTOP ) {
Hashtable<FlatCall, ReachGraph> heapsFromCallers =
getIHMcontributions(d);
- heapsFromCallers.put(fc, rg);
+ // ensure inputs to initial contexts increase monotonically
+ ReachGraph merged = new ReachGraph();
+ merged.merge( rg );
+ merged.merge( heapsFromCallers.get( fc ) );
+
+ heapsFromCallers.put( fc, merged );
+
}
// if the taint is non-null then the predicate
// is true only if the edge exists AND has the
// taint--ONLY ONE of the ne_state or e_taint
- // may be non-null for an edge predicate
+ // may be non-null for an edge predicate, AND
+ // like the ne_state above, strip preds off this
+ // taint within a pred itself
protected Taint e_taint;
this.e_type = type;
this.e_field = field;
this.ne_state = removePreds( state );
- this.e_taint = taint;
+ this.e_taint = removePreds( taint );
this.predType = TYPE_EDGE;
n_hrnID = null;
}
return state == null ? null : Canonical.attach( state, ExistPredSet.factory() );
}
+ private Taint removePreds( Taint taint ) {
+ return taint == null ? null : Canonical.attach( taint, ExistPredSet.factory() );
+ }
+
// only consider the subest of the caller elements that
if( pred.e_taint != null ) {
return false;
}
- } else if( !e_taint.equals(pred.e_taint) ) {
+ } else if( !e_taint.equalsIgnorePreds(pred.e_taint) ) {
return false;
}
}
if( e_taint != null ) {
- hash ^= e_taint.hashCode();
+ hash ^= e_taint.hashCodeNoPreds();
}
return hash;
// is changing beta info, betaNew is always empty
betaNew = ReachSet.factory();
- if( taints != null ) {
- this.taints = taints;
- } else {
- this.taints = TaintSet.factory();
- }
+ setTaints( taints != null ? taints : TaintSet.factory() );
}
ExistPredSet eps) {
assert
(sese == null && stallSite != null) ||
- (sese != null && stallSite == null);
+ (sese != null && stallSite == null);
assert v != null;
assert as != null;
}
public int hashCodeSpecific() {
+ return hashCodeNoPreds() ^ preds.hashCode();
+ }
+
+ public int hashCodeNoPreds() {
int hash = allocSite.hashCode();
hash = hash ^ var.hashCode();
# EX: (skip first 10 visits, capture the next 3, then halt)
# -disjoint-debug-snap-method Remove 10 3 true
-DISJOINTDEBUG= -disjoint -disjoint-k 1 -enable-assertions $(DRELEASEMODE) \
- -disjoint-debug-callsite Barneshut.Insert Barneshut.run 50 500 true
+DISJOINTDEBUG= -disjoint -disjoint-k 1 -enable-assertions $(DRELEASEMODE)
+# -disjoint-write-dots all
+# -disjoint-debug-scheduling
+# -disjoint-debug-callsite Barneshut.Insert Barneshut.run 50 500 true
# -disjoint-debug-snap-method ArrayIndexedGraph.createNode 1 100 true \
# -disjoint-write-dots final \
# -flatirusermethods \
#
# -justanalyze \
# -disjoint-debug-callsite String.toString String.valueOf 1 1000 true \
-# -disjoint-debug-scheduling \
# -disjoint-desire-determinism
# -disjoint-debug-callsite Demand.add Lateral.compute 1 1000 true
# -disjoint-debug-snap-method ComputeCenterOfMass 6 2 true