+
+
+ // NOTE: this line number+compilation unit is collected for debugging,
+ // so we don't want to spend time on this unless OOODEBUG or some new
+ // option controls it. Disjoint and Pointer analysis use this currently.
+ lineNumber = -1;
+ compilationUnit = null;
+
+ // find the class the current program point belongs to
+ if( currentProgramPoint == null ) {
+ return;
+ }
+ Set<FlatNode> visited = new HashSet<FlatNode>();
+ Set<FlatNode> toVisit = new HashSet<FlatNode>();
+ toVisit.add( currentProgramPoint );
+
+ while( !toVisit.isEmpty() ) {
+ FlatNode fn = toVisit.iterator().next();
+ toVisit.remove( fn );
+ visited.add( fn );
+
+ // when we find a flat method, remember every node we visited
+ // belongs to that compilation unit
+ if( fn instanceof FlatMethod ) {
+ MethodDescriptor md = ((FlatMethod)fn).getMethod();
+ if( md != null ) {
+ ClassDescriptor cd = md.getClassDesc();
+ if( cd != null ) {
+ fn2cd.put( fn, cd );
+ }
+ }
+ }
+
+ if( fn2cd.containsKey( fn ) ) {
+ compilationUnit = fn2cd.get( fn );
+
+ for( FlatNode fnKnown: visited ) {
+ fn2cd.put( fnKnown, compilationUnit );
+ }
+
+ lineNumber = currentProgramPoint.getNumLine();
+ break;
+ }
+
+ for( int i = 0; i < fn.numPrev(); ++i ) {
+ FlatNode prev = fn.getPrev( i );
+ if( !visited.contains( prev ) ) {
+ toVisit.add( prev );
+ }
+ }
+ }