Hashtable<Integer, ReachabilitySet> paramIndex2rewriteK =
new Hashtable<Integer, ReachabilitySet>();
+ Hashtable<Integer, ReachabilitySet> paramIndex2rewrite_d =
+ new Hashtable<Integer, ReachabilitySet>();
+
Hashtable<Integer, ReachabilitySet> paramIndex2rewriteD =
new Hashtable<Integer, ReachabilitySet>();
LabelNode argLabel_i = getLabelNodeFromTemp(argTemp_i);
paramIndex2ln.put(paramIndex, argLabel_i);
- ReachabilitySet D_i = new ReachabilitySet().makeCanonical();
+ ReachabilitySet d_i = new ReachabilitySet().makeCanonical();
Iterator<ReferenceEdge> edgeItr = argLabel_i.iteratorToReferencees();
while( edgeItr.hasNext() ) {
ReferenceEdge edge = edgeItr.next();
- D_i = D_i.union(edge.getBeta());
+ d_i = d_i.union(edge.getBeta());
}
+ paramIndex2rewrite_d.put(paramIndex, d_i);
- D_i = D_i.exhaustiveArityCombinations();
-
+ ReachabilitySet D_i = d_i.exhaustiveArityCombinations();
paramIndex2rewriteD.put(paramIndex, D_i);
}
hrn,
null,
paramIndex2rewriteH.get(index),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
paramIndex2paramToken.get(index),
paramToken2paramIndex,
null,
edgeReachable,
paramIndex2rewriteJ.get(index),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
paramIndex2paramToken.get(index),
paramToken2paramIndex,
null,
edgeUpstream,
paramIndex2rewriteK.get(index),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
paramIndex2paramToken.get(index),
paramToken2paramIndex,
hrnShadowSummary,
null,
hrnShadowSummary.getAlpha(),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
bogusToken,
paramToken2paramIndex,
hrnIthShadow,
null,
hrnIthShadow.getAlpha(),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
bogusToken,
paramToken2paramIndex,
null,
edgeNewInCallerTemplate,
edgeNewInCallerTemplate.getBeta(),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
bogusToken,
paramToken2paramIndex,
null,
edgeNewInCallerTemplate,
edgeNewInCallerTemplate.getBeta(),
+ paramIndex2rewrite_d,
paramIndex2rewriteD,
bogusToken,
paramToken2paramIndex,
HeapRegionNode hrn,
ReferenceEdge edge,
ReachabilitySet rules,
+ Hashtable<Integer, ReachabilitySet> paramIndex2rewrite_d,
Hashtable<Integer, ReachabilitySet> paramIndex2rewriteD,
TokenTuple p_i,
Hashtable<TokenTuple, Integer> paramToken2paramIndex,
ttCalleeRewrites = callerReachabilityCurrent;
callerSourceUsed = true;
- } else if( paramToken2paramIndex.containsKey( ttCallee ) ||
- paramTokenStar2paramIndex.containsKey( ttCallee ) ) {
-
- // this token is another callee parameter, or any ARITY_MANY callee parameter,
- // so rewrite it with the D rules for that parameter
- Integer paramIndex_j;
- if( paramToken2paramIndex.containsKey( ttCallee ) ) {
- paramIndex_j = paramToken2paramIndex.get( ttCallee );
- } else {
- paramIndex_j = paramTokenStar2paramIndex.get( ttCallee );
- }
+ } else if( paramToken2paramIndex.containsKey( ttCallee ) ) {
+ // use little d
+ Integer paramIndex_j = paramToken2paramIndex.get( ttCallee );
+ assert paramIndex_j != null;
+ ttCalleeRewrites = paramIndex2rewrite_d.get( paramIndex_j );
+ assert ttCalleeRewrites != null;
+ } else if( paramTokenStar2paramIndex.containsKey( ttCallee ) ) {
+ // worse, use big D
+ Integer paramIndex_j = paramTokenStar2paramIndex.get( ttCallee );
+ assert paramIndex_j != null;
ttCalleeRewrites = paramIndex2rewriteD.get( paramIndex_j );
assert ttCalleeRewrites != null;
} else {
-
// otherwise there's no need for a rewrite, just pass this one on
TokenTupleSet ttsCaller = new TokenTupleSet(ttCallee).makeCanonical();
ttCalleeRewrites = new ReachabilitySet(ttsCaller).makeCanonical();
HashSet<HeapRegionNode> visited = new HashSet<HeapRegionNode>();
// then visit every heap region node
- if( !pruneGarbage ) {
- Set s = id2hrn.entrySet();
- Iterator i = s.iterator();
- while( i.hasNext() ) {
- Map.Entry me = (Map.Entry)i.next();
- HeapRegionNode hrn = (HeapRegionNode) me.getValue();
+ Set s = id2hrn.entrySet();
+ Iterator i = s.iterator();
+ while( i.hasNext() ) {
+ Map.Entry me = (Map.Entry)i.next();
+ HeapRegionNode hrn = (HeapRegionNode) me.getValue();
+ if( !pruneGarbage ||
+ hrn.isFlagged() ||
+ hrn.getDescription().startsWith( "param" )
+ ) {
+
if( !visited.contains(hrn) ) {
traverseHeapRegionNodes(VISIT_HRN_WRITE_FULL,
- hrn,
- bw,
- null,
- visited,
- writeReferencers);
+ hrn,
+ bw,
+ null,
+ visited,
+ writeReferencers);
}
}
}
-
+
bw.write(" graphTitle[label=\""+graphName+"\",shape=box];\n");
if( writeParamMappings ) {
// then visit every label node, useful for debugging
if( writeLabels ) {
- Set s = td2ln.entrySet();
- Iterator i = s.iterator();
+ s = td2ln.entrySet();
+ i = s.iterator();
while( i.hasNext() ) {
Map.Entry me = (Map.Entry)i.next();
LabelNode ln = (LabelNode) me.getValue();