1 package Analysis.OoOJava;
8 // This class formerly had lazy consistency properties, but
9 // it is being changed so that the full set and the extra
10 // hash tables to access the full set efficiently by different
11 // elements will be consistent after EVERY operation. Also,
12 // a consistent assert method allows a debugger to ask whether
13 // an operation has produced an inconsistent VarSrcTokTable.
15 // in an effort to make sure operations keep the table consistent,
16 // all public methods that are also used by other methods for
17 // intermediate results (add and remove are used in other methods)
18 // there should be a public version that calls the private version
19 // so consistency is checked after public ops, but not private ops
20 public class VarSrcTokTable {
22 // a set of every token in the table
23 private HashSet<VariableSourceToken> trueSet;
25 // these hashtables provide an efficient retreival from the true set
26 private Hashtable< TempDescriptor, Set<VariableSourceToken> > var2vst;
27 private Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> > sese2vst;
28 private Hashtable< SVKey, Set<VariableSourceToken> > sv2vst;
30 // maximum age from aging operation
31 private static final Integer MAX_AGE = new Integer( 2 );
33 public static final Integer SrcType_READY = new Integer( 34 );
34 public static final Integer SrcType_STATIC = new Integer( 35 );
35 public static final Integer SrcType_DYNAMIC = new Integer( 36 );
37 public static RBlockRelationAnalysis rblockRel;
41 public VarSrcTokTable() {
42 trueSet = new HashSet<VariableSourceToken>();
44 sese2vst = new Hashtable< FlatSESEEnterNode, Set<VariableSourceToken> >();
45 var2vst = new Hashtable< TempDescriptor, Set<VariableSourceToken> >();
46 sv2vst = new Hashtable< SVKey, Set<VariableSourceToken> >();
52 // make a deep copy of the in table
53 public VarSrcTokTable( VarSrcTokTable in ) {
60 public void add( VariableSourceToken vst ) {
65 private void addPrivate( VariableSourceToken vst ) {
67 // make sure we aren't clobbering anything!
68 if( trueSet.contains( vst ) ) {
69 // if something with the same hashcode is in the true set, they might
70 // have different reference variable sets because that set is not considered
71 // in a token's equality, so make sure we smooth that out right here
72 Iterator<VariableSourceToken> vstItr = trueSet.iterator();
73 while( vstItr.hasNext() ) {
74 VariableSourceToken vstAlready = vstItr.next();
76 if( vstAlready.equals( vst ) ) {
78 // take out the one that is in (we dont' want collisions in
79 // any of the other hash map sets either)
80 removePrivate( vstAlready );
82 // combine reference variable sets
83 vst.getRefVars().addAll( vstAlready.getRefVars() );
85 // now jump back as we are adding in a brand new token
93 Set<VariableSourceToken> s;
95 s = sese2vst.get( vst.getSESE() );
97 s = new HashSet<VariableSourceToken>();
100 sese2vst.put( vst.getSESE(), s );
102 Iterator<TempDescriptor> refVarItr = vst.getRefVars().iterator();
103 while( refVarItr.hasNext() ) {
104 TempDescriptor refVar = refVarItr.next();
105 s = var2vst.get( refVar );
107 s = new HashSet<VariableSourceToken>();
110 var2vst.put( refVar, s );
112 SVKey key = new SVKey( vst.getSESE(), refVar );
113 s = sv2vst.get( key );
115 s = new HashSet<VariableSourceToken>();
118 sv2vst.put( key, s );
122 public void addAll( Set<VariableSourceToken> s ) {
123 Iterator<VariableSourceToken> itr = s.iterator();
124 while( itr.hasNext() ) {
125 addPrivate( itr.next() );
131 public Set<VariableSourceToken> get() {
135 public Set<VariableSourceToken> get( FlatSESEEnterNode sese ) {
136 Set<VariableSourceToken> s = sese2vst.get( sese );
138 s = new HashSet<VariableSourceToken>();
139 sese2vst.put( sese, s );
144 public Set<VariableSourceToken> get( TempDescriptor refVar ) {
145 Set<VariableSourceToken> s = var2vst.get( refVar );
147 s = new HashSet<VariableSourceToken>();
148 var2vst.put( refVar, s );
153 public Set<VariableSourceToken> get( FlatSESEEnterNode sese,
154 TempDescriptor refVar ) {
155 SVKey key = new SVKey( sese, refVar );
156 Set<VariableSourceToken> s = sv2vst.get( key );
158 s = new HashSet<VariableSourceToken>();
159 sv2vst.put( key, s );
164 public Set<VariableSourceToken> get( FlatSESEEnterNode sese,
167 HashSet<VariableSourceToken> s0 = (HashSet<VariableSourceToken>) sese2vst.get( sese );
169 s0 = new HashSet<VariableSourceToken>();
170 sese2vst.put( sese, s0 );
173 Set<VariableSourceToken> s = (Set<VariableSourceToken>) s0.clone();
174 Iterator<VariableSourceToken> sItr = s.iterator();
175 while( sItr.hasNext() ) {
176 VariableSourceToken vst = sItr.next();
177 if( !vst.getAge().equals( age ) ) {
186 // merge now makes a deep copy of incoming stuff because tokens may
187 // be modified (reference var sets) by later ops that change more
188 // than one table, causing inconsistency
189 public void merge( VarSrcTokTable in ) {
195 Iterator<VariableSourceToken> vstItr = in.trueSet.iterator();
196 while( vstItr.hasNext() ) {
197 VariableSourceToken vst = vstItr.next();
198 this.addPrivate( vst.copy() );
205 // remove operations must leave the trueSet
206 // and the hash maps consistent
207 public void remove( VariableSourceToken vst ) {
208 removePrivate( vst );
212 private void removePrivate( VariableSourceToken vst ) {
213 trueSet.remove( vst );
215 Set<VariableSourceToken> s;
217 s = get( vst.getSESE() );
218 if( s != null ) { s.remove( vst ); }
220 Iterator<TempDescriptor> refVarItr = vst.getRefVars().iterator();
221 while( refVarItr.hasNext() ) {
222 TempDescriptor refVar = refVarItr.next();
228 var2vst.remove( refVar );
232 s = get( vst.getSESE(), refVar );
236 sv2vst.remove( new SVKey( vst.getSESE(), refVar ) );
243 public void remove( FlatSESEEnterNode sese ) {
244 removePrivate( sese );
248 public void removePrivate( FlatSESEEnterNode sese ) {
249 Set<VariableSourceToken> s = sese2vst.get( sese );
254 Iterator<VariableSourceToken> itr = s.iterator();
255 while( itr.hasNext() ) {
256 VariableSourceToken vst = itr.next();
257 removePrivate( vst );
260 sese2vst.remove( sese );
264 public void remove( TempDescriptor refVar ) {
265 removePrivate( refVar );
269 private void removePrivate( TempDescriptor refVar ) {
270 Set<VariableSourceToken> s = var2vst.get( refVar );
275 Set<VariableSourceToken> forRemoval = new HashSet<VariableSourceToken>();
277 // iterate over tokens that this temp can reference, make a set
278 // of tokens that need this temp stripped out of them
279 Iterator<VariableSourceToken> itr = s.iterator();
280 while( itr.hasNext() ) {
281 VariableSourceToken vst = itr.next();
282 Set<TempDescriptor> refVars = vst.getRefVars();
283 assert refVars.contains( refVar );
284 forRemoval.add( vst );
287 itr = forRemoval.iterator();
288 while( itr.hasNext() ) {
290 // here's a token marked for removal
291 VariableSourceToken vst = itr.next();
292 Set<TempDescriptor> refVars = vst.getRefVars();
294 // if there was only one one variable
295 // referencing this token, just take it
296 // out of the table all together
297 if( refVars.size() == 1 ) {
298 removePrivate( vst );
301 sv2vst.remove( new SVKey( vst.getSESE(), refVar ) );
303 refVars.remove( refVar );
306 var2vst.remove( refVar );
310 public void remove( FlatSESEEnterNode sese,
311 TempDescriptor var ) {
313 // don't seem to need this, don't bother maintaining
314 // until its clear we need it
319 // age tokens with respect to SESE curr, where
320 // any curr tokens increase age by 1
321 public void age( FlatSESEEnterNode curr ) {
323 Set<VariableSourceToken> forRemoval =
324 new HashSet<VariableSourceToken>();
326 Set<VariableSourceToken> forAddition =
327 new HashSet<VariableSourceToken>();
329 Iterator<VariableSourceToken> itr = trueSet.iterator();
330 while( itr.hasNext() ) {
331 VariableSourceToken vst = itr.next();
333 if( vst.getSESE().equals( curr ) ) {
335 // only age if the token isn't already the maximum age
336 if( vst.getAge() < MAX_AGE ) {
338 forRemoval.add( vst );
340 forAddition.add( new VariableSourceToken( vst.getRefVars(),
350 itr = forRemoval.iterator();
351 while( itr.hasNext() ) {
352 VariableSourceToken vst = itr.next();
356 itr = forRemoval.iterator();
357 while( itr.hasNext() ) {
358 VariableSourceToken vst = itr.next();
366 // at an SESE enter node, all ref vars in the SESE's in-set will
367 // be copied into the SESE's local scope, change source to itself
368 public void ownInSet( FlatSESEEnterNode curr ) {
369 Iterator<TempDescriptor> inVarItr = curr.getInVarSet().iterator();
370 while( inVarItr.hasNext() ) {
371 TempDescriptor inVar = inVarItr.next();
376 Set<TempDescriptor> refVars = new HashSet<TempDescriptor>();
377 refVars.add( inVar );
378 add( new VariableSourceToken( refVars,
389 // for the given SESE, change child tokens into this parent
390 public void remapChildTokens( FlatSESEEnterNode curr ) {
392 Iterator<FlatSESEEnterNode> childItr = curr.getLocalChildren().iterator();
393 if( childItr.hasNext() ) {
394 FlatSESEEnterNode child = childItr.next();
396 // set of VSTs for removal
397 HashSet<VariableSourceToken> removalSet=new HashSet<VariableSourceToken>();
398 // set of VSTs for additon
399 HashSet<VariableSourceToken> additionSet=new HashSet<VariableSourceToken>();
401 Iterator<VariableSourceToken> vstItr = get( child ).iterator();
402 while( vstItr.hasNext() ) {
403 VariableSourceToken vst = vstItr.next();
405 additionSet.add(new VariableSourceToken( vst.getRefVars(),
412 // remove( eah item in forremoval )
413 vstItr = removalSet.iterator();
414 while( vstItr.hasNext() ) {
415 VariableSourceToken vst = vstItr.next();
418 // add( each ite inm for additon _
419 vstItr = additionSet.iterator();
420 while( vstItr.hasNext() ) {
421 VariableSourceToken vst = vstItr.next();
430 // this method is called at the SESE exit of SESE 'curr'
431 // if the sources for a variable written by curr can also
432 // come from curr's parent or curr's siblings then we're not
433 // sure that curr will actually modify the variable. There are
434 // many ways to handle this, but for now, mark the variable as
435 // virtually read so curr insists on having ownership of it
436 // whether it ends up writing to it or not. It will always, then,
437 // appear in curr's out-set.
438 public Set<TempDescriptor>
439 calcVirtReadsAndPruneParentAndSiblingTokens( FlatSESEEnterNode exiter,
440 Set<TempDescriptor> liveVars ) {
442 Set<TempDescriptor> virtReadSet = new HashSet<TempDescriptor>();
444 // this calculation is unneeded for the main task, just return an
445 // empty set of virtual reads
446 if( rblockRel.getMainSESE() == exiter ) {
450 // who are the parent and siblings?
451 Set<FlatSESEEnterNode> alternateSESEs = new HashSet<FlatSESEEnterNode>();
452 Iterator<FlatSESEEnterNode> childItr;
454 FlatSESEEnterNode parent = exiter.getLocalParent();
456 if( parent == null ) {
457 // when some caller task is the exiter's parent, the siblings
458 // of the exiter are other local root tasks
459 parent = rblockRel.getCallerProxySESE();
460 childItr = rblockRel.getLocalRootSESEs( exiter.getfmEnclosing() ).iterator();
463 // otherwise, the siblings are locally-defined
464 childItr = parent.getLocalChildren().iterator();
467 alternateSESEs.add( parent );
468 while( childItr.hasNext() ) {
469 FlatSESEEnterNode sibling = childItr.next();
470 if( !sibling.equals( exiter ) ) {
471 alternateSESEs.add( sibling );
477 // VSTs to remove if they are alternate sources for exiter VSTs
478 // whose variables will become virtual reads
479 Set<VariableSourceToken> forRemoval = new HashSet<VariableSourceToken>();
481 // look at all of this SESE's VSTs at exit...
482 Iterator<VariableSourceToken> vstItr = get( exiter ).iterator();
483 while( vstItr.hasNext() ) {
484 VariableSourceToken vstExiterSrc = vstItr.next();
486 // only interested in tokens that come from our current instance
487 if( vstExiterSrc.getAge() != 0 ) {
491 // for each variable that might come from those sources...
492 Iterator<TempDescriptor> refVarItr = vstExiterSrc.getRefVars().iterator();
493 while( refVarItr.hasNext() ) {
494 TempDescriptor refVar = refVarItr.next();
496 // only matters for live variables at SESE exit program point
497 if( !liveVars.contains( refVar ) ) {
501 // examine other sources for a variable...
502 Iterator<VariableSourceToken> srcItr = get( refVar ).iterator();
503 while( srcItr.hasNext() ) {
504 VariableSourceToken vstPossibleOtherSrc = srcItr.next();
506 if( vstPossibleOtherSrc.getSESE().equals( exiter ) &&
507 vstPossibleOtherSrc.getAge() > 0
509 // this is an alternate source if its
510 // an older instance of this SESE
511 virtReadSet.add( refVar );
512 forRemoval.add( vstPossibleOtherSrc );
514 } else if( alternateSESEs.contains( vstPossibleOtherSrc.getSESE() ) ) {
515 // this is an alternate source from parent or sibling
516 virtReadSet.add( refVar );
517 forRemoval.add( vstPossibleOtherSrc );
520 if( !vstPossibleOtherSrc.getSESE().equals( exiter ) ||
521 !vstPossibleOtherSrc.getAge().equals( 0 )
523 System.out.println( "For refVar="+refVar+" at exit of "+exiter+
524 ", unexpected possible variable source "+vstPossibleOtherSrc );
532 vstItr = forRemoval.iterator();
533 while( vstItr.hasNext() ) {
534 VariableSourceToken vst = vstItr.next();
543 // given a table from a subsequent program point, decide
544 // which variables are going from a non-dynamic to a
545 // dynamic source and return them
546 public Hashtable<TempDescriptor, VSTWrapper>
547 getReadyOrStatic2DynamicSet( VarSrcTokTable nextTable,
548 Set<TempDescriptor> nextLiveIn,
549 FlatSESEEnterNode current
552 Hashtable<TempDescriptor, VSTWrapper> out =
553 new Hashtable<TempDescriptor, VSTWrapper>();
555 Iterator itr = var2vst.entrySet().iterator();
556 while( itr.hasNext() ) {
557 Map.Entry me = (Map.Entry) itr.next();
558 TempDescriptor var = (TempDescriptor) me.getKey();
559 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
561 // only worth tracking if live
562 if( nextLiveIn.contains( var ) ) {
564 VSTWrapper vstIfStaticBefore = new VSTWrapper();
565 VSTWrapper vstIfStaticAfter = new VSTWrapper();
567 Integer srcTypeBefore = this.getRefVarSrcType( var, current, vstIfStaticBefore );
568 Integer srcTypeAfter = nextTable.getRefVarSrcType( var, current, vstIfStaticAfter );
570 if( !srcTypeBefore.equals( SrcType_DYNAMIC ) &&
571 srcTypeAfter.equals( SrcType_DYNAMIC )
573 // remember the variable and a source
574 // it had before crossing the transition
575 // 1) if it was ready, vstIfStatic.vst is null
576 // 2) if is was static, use vstIfStatic.vst
577 out.put( var, vstIfStaticBefore );
586 // for some reference variable, return the type of source
587 // it might have in this table, which might be:
588 // 1. Ready -- this variable is
589 // definitely available when you are issued.
590 // 2. Static -- there is definitely one child SESE with
591 // a known age that will produce the value
592 // 3. Dynamic -- we don't know where the value will come
593 // from statically, so we'll track it dynamically
594 public Integer getRefVarSrcType( TempDescriptor refVar,
595 FlatSESEEnterNode currentSESE,
596 VSTWrapper vstIfStatic ) {
597 assert refVar != null;
598 assert vstIfStatic != null;
600 vstIfStatic.vst = null;
602 // when the current SESE is null, that simply means it is
603 // an unknown placeholder, in which case the system will
604 // ensure that any variables are READY
605 if( currentSESE == null ) {
606 return SrcType_READY;
609 // if there appear to be no sources, it means this variable
610 // comes from outside of any statically-known SESE scope,
611 // which means the system guarantees its READY, so jump over
613 Set<VariableSourceToken> srcs = get( refVar );
614 Iterator<VariableSourceToken> itrSrcs = srcs.iterator();
615 while( itrSrcs.hasNext() ) {
616 VariableSourceToken vst = itrSrcs.next();
618 // to make the refVar non-READY we have to find at least
619 // one child token, there are two cases
620 // 1. if the current task invoked the local method context,
621 // its children are the locally-defined root tasks
623 currentSESE.getIsCallerProxySESE() &&
624 rblockRel.getLocalRootSESEs().contains( vst.getSESE() );
626 // 2. if the child task is a locally-defined child of the current task
627 boolean case2 = currentSESE.getLocalChildren().contains( vst.getSESE() );
629 if( case1 || case2 ) {
631 // if we ever have at least one child source with an
632 // unknown age, have to treat var as dynamic
633 if( vst.getAge().equals( OoOJavaAnalysis.maxSESEage ) ) {
634 return SrcType_DYNAMIC;
637 // if we have a known-age child source, this var is
638 // either static or dynamic now: it's static if this
639 // source is the only source, otherwise dynamic
640 if( srcs.size() > 1 ) {
641 return SrcType_DYNAMIC;
644 vstIfStatic.vst = vst;
645 return SrcType_STATIC;
649 // if we never found a child source, all other
650 // sources must be READY before we could even
652 return SrcType_READY;
656 // any reference variables that are not live can be pruned
657 // from the table, and if any VSTs are then no longer
658 // referenced, they can be dropped as well
659 // THIS CAUSES INCONSISTENCY, FIX LATER, NOT REQUIRED
660 public void pruneByLiveness( Set<TempDescriptor> rootLiveSet ) {
662 // the set of reference variables in the table minus the
663 // live set gives the set of reference variables to remove
664 Set<TempDescriptor> deadRefVars = new HashSet<TempDescriptor>();
665 deadRefVars.addAll( var2vst.keySet() );
667 if( rootLiveSet != null ) {
668 deadRefVars.removeAll( rootLiveSet );
671 // just use the remove operation to prune the table now
672 Iterator<TempDescriptor> deadItr = deadRefVars.iterator();
673 while( deadItr.hasNext() ) {
674 TempDescriptor dead = deadItr.next();
675 removePrivate( dead );
683 // use as an aid for debugging, where true-set is checked
684 // against the alternate mappings: assert that nothing is
685 // missing or extra in the alternates
686 public void assertConsistency() {
691 Set<VariableSourceToken> trueSetByAlts = new HashSet<VariableSourceToken>();
692 itr = sese2vst.entrySet().iterator();
693 while( itr.hasNext() ) {
694 Map.Entry me = (Map.Entry) itr.next();
695 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
696 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
699 // the trueSet should have all entries in s1
700 assert trueSet.containsAll( s1 );
702 // s1 should not have anything that doesn't appear in trueset
703 Set<VariableSourceToken> sInt = (Set<VariableSourceToken>) s1.clone();
704 sInt.removeAll( trueSet );
706 assert sInt.isEmpty();
708 // add s1 to a running union--at the end check if trueSet has extra
709 trueSetByAlts.addAll( s1 );
711 // make sure trueSet isn't too big
712 assert trueSetByAlts.containsAll( trueSet );
715 trueSetByAlts = new HashSet<VariableSourceToken>();
716 itr = var2vst.entrySet().iterator();
717 while( itr.hasNext() ) {
718 Map.Entry me = (Map.Entry) itr.next();
719 TempDescriptor var = (TempDescriptor) me.getKey();
720 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
723 // the trueSet should have all entries in s1
724 assert trueSet.containsAll( s1 );
726 // s1 should not have anything that doesn't appear in trueset
727 Set<VariableSourceToken> sInt = (Set<VariableSourceToken>) s1.clone();
728 sInt.removeAll( trueSet );
730 assert sInt.isEmpty();
732 // add s1 to a running union--at the end check if trueSet has extra
733 trueSetByAlts.addAll( s1 );
735 // make sure trueSet isn't too big
736 assert trueSetByAlts.containsAll( trueSet );
739 trueSetByAlts = new HashSet<VariableSourceToken>();
740 itr = sv2vst.entrySet().iterator();
741 while( itr.hasNext() ) {
742 Map.Entry me = (Map.Entry) itr.next();
743 SVKey key = (SVKey) me.getKey();
744 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
747 // the trueSet should have all entries in s1
748 assert trueSet.containsAll( s1 );
750 // s1 should not have anything that doesn't appear in trueset
751 Set<VariableSourceToken> sInt = (Set<VariableSourceToken>) s1.clone();
752 sInt.removeAll( trueSet );
754 assert sInt.isEmpty();
756 // add s1 to a running union--at the end check if trueSet has extra
757 trueSetByAlts.addAll( s1 );
759 // make sure trueSet isn't too big
760 assert trueSetByAlts.containsAll( trueSet );
763 // also check that the reference var sets are consistent
764 Hashtable<VariableSourceToken, Set<TempDescriptor> > vst2refVars =
765 new Hashtable<VariableSourceToken, Set<TempDescriptor> >();
766 itr = var2vst.entrySet().iterator();
767 while( itr.hasNext() ) {
768 Map.Entry me = (Map.Entry) itr.next();
769 TempDescriptor refVar = (TempDescriptor) me.getKey();
770 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
771 Iterator<VariableSourceToken> vstItr = s1.iterator();
772 while( vstItr.hasNext() ) {
773 VariableSourceToken vst = vstItr.next();
774 assert vst.getRefVars().contains( refVar );
776 Set<TempDescriptor> refVarsPart = vst2refVars.get( vst );
777 if( refVarsPart == null ) {
778 refVarsPart = new HashSet<TempDescriptor>();
780 refVarsPart.add( refVar );
781 vst2refVars.put( vst, refVarsPart );
784 itr = vst2refVars.entrySet().iterator();
785 while( itr.hasNext() ) {
786 Map.Entry me = (Map.Entry) itr.next();
787 VariableSourceToken vst = (VariableSourceToken) me.getKey();
788 Set<TempDescriptor> s1 = (Set<TempDescriptor>) me.getValue();
790 assert vst.getRefVars().equals( s1 );
795 public boolean equals( Object o ) {
800 if( !(o instanceof VarSrcTokTable) ) {
804 VarSrcTokTable table = (VarSrcTokTable) o;
805 return trueSet.equals( table.trueSet );
808 public int hashCode() {
809 return trueSet.hashCode();
812 public Iterator<VariableSourceToken> iterator() {
813 return trueSet.iterator();
816 public String toString() {
817 return toStringPretty();
820 public String toStringVerbose() {
821 return "trueSet ="+trueSet.toString()+"\n"+
822 "sese2vst="+sese2vst.toString()+"\n"+
823 "var2vst ="+var2vst.toString()+"\n"+
824 "sv2vst ="+sv2vst.toString();
827 public String toStringPretty() {
828 String tokHighlighter = "o";
830 String str = "VarSrcTokTable\n";
831 Iterator<VariableSourceToken> vstItr = trueSet.iterator();
832 while( vstItr.hasNext() ) {
833 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
838 public String toStringPrettyVerbose() {
839 String tokHighlighter = "o";
841 String str = "VarSrcTokTable\n";
845 Iterator<VariableSourceToken> vstItr;
848 vstItr = trueSet.iterator();
849 while( vstItr.hasNext() ) {
850 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
853 str += " sese2vst\n";
854 itr = sese2vst.entrySet().iterator();
855 while( itr.hasNext() ) {
856 Map.Entry me = (Map.Entry) itr.next();
857 FlatSESEEnterNode sese = (FlatSESEEnterNode) me.getKey();
858 HashSet<VariableSourceToken> s1 = (HashSet<VariableSourceToken>) me.getValue();
861 str += " "+sese.getPrettyIdentifier()+" -> \n";
863 vstItr = s1.iterator();
864 while( vstItr.hasNext() ) {
865 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
870 itr = var2vst.entrySet().iterator();
871 while( itr.hasNext() ) {
872 Map.Entry me = (Map.Entry) itr.next();
873 TempDescriptor var = (TempDescriptor) me.getKey();
874 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
877 str += " "+var+" -> \n";
879 vstItr = s1.iterator();
880 while( vstItr.hasNext() ) {
881 str += " "+tokHighlighter+" "+vstItr.next()+"\n";
886 itr = sv2vst.entrySet().iterator();
887 while( itr.hasNext() ) {
888 Map.Entry me = (Map.Entry) itr.next();
889 SVKey key = (SVKey) me.getKey();
890 Set<VariableSourceToken> s1 = (Set<VariableSourceToken>) me.getValue();
893 str += " "+key+" -> \n";
895 vstItr = s1.iterator();
896 while( vstItr.hasNext() ) {
897 str += " "+tokHighlighter+" "+vstItr.next()+"\n";