Update of /cvsroot/nice/Nice/src/bossa/link
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23398/src/bossa/link
Modified Files:
Alternative.java
Log Message:
Fix sorting of alternatives, now that alternatives can belong to several
methods.
Index: Alternative.java
===================================================================
RCS file: /cvsroot/nice/Nice/src/bossa/link/Alternative.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -C2 -d -r1.48 -r1.49
*** Alternative.java 28 Feb 2004 14:23:43 -0000 1.48
--- Alternative.java 28 Feb 2004 20:24:16 -0000 1.49
***************
*** 52,67 ****
/****************************************************************
- * Graph traversal
- ****************************************************************/
-
- static final int
- UNVISITED = 1,
- VISITING = 2,
- VISITED = 3;
-
- /** Marks the state of this node in the graph traversal. */
- int mark = UNVISITED;
-
- /****************************************************************
* Order on alternatives
****************************************************************/
--- 52,55 ----
***************
*** 222,225 ****
--- 210,222 ----
/****************************************************************
+ * Graph traversal
+ ****************************************************************/
+
+ /** Marks the state of this node in the graph traversal. */
+ private int mark = 0;
+
+ private static int currentVisitedMark = 0;
+
+ /****************************************************************
* Sorting alternatives by generality
****************************************************************/
***************
*** 237,251 ****
return sortedAlternatives;
! // Test if another sort has been done before.
! // In that case reset the marks.
! if (((Alternative) alternatives.get(0)).mark != Alternative.UNVISITED)
! for(Iterator i = alternatives.iterator(); i.hasNext();)
! ((Alternative) i.next()).mark = Alternative.UNVISITED;
!
for(Iterator i = alternatives.iterator(); i.hasNext();)
{
Alternative a = (Alternative) i.next();
! if (a.mark == Alternative.UNVISITED)
! visit(a, alternatives, sortedAlternatives);
}
--- 234,247 ----
return sortedAlternatives;
! // We used a different mark for each sort.
! // Useful since an alternative can belong to several methods because of
! // overriding, and SuperExp also lists alternatives.
! int visited = ++currentVisitedMark;
!
for(Iterator i = alternatives.iterator(); i.hasNext();)
{
Alternative a = (Alternative) i.next();
! if (a.mark != visited)
! visit(a, alternatives, sortedAlternatives, visited);
}
***************
*** 256,272 ****
(final Alternative a,
final List alternatives,
! final Stack sortedAlternatives
)
{
! // Cycles are possible
! // * if two alternatives are identical (same patterns)
! // * if there is a cyclic subclass relation
! // * that's all, folks ! :-)
! switch(a.mark)
! {
! case Alternative.VISITING : User.error("Cycle in alternatives: "+a);
! case Alternative.UNVISITED: a.mark = Alternative.VISITING; break;
! case Alternative.VISITED : return; //should not happen
! }
for(Iterator i = alternatives.iterator();
--- 252,260 ----
(final Alternative a,
final List alternatives,
! final Stack sortedAlternatives,
! final int visited
)
{
! a.mark = visited;
for(Iterator i = alternatives.iterator();
***************
*** 274,283 ****
{
Alternative daughter = (Alternative) i.next();
! if(daughter != a
! && daughter.mark == Alternative.UNVISITED
! && Alternative.leq(daughter,a))
! visit(daughter,alternatives,sortedAlternatives);
}
! a.mark = Alternative.VISITED;
sortedAlternatives.push(a);
}
--- 262,270 ----
{
Alternative daughter = (Alternative) i.next();
! if (daughter.mark != visited
! && Alternative.leq(daughter,a))
! visit(daughter, alternatives, sortedAlternatives, visited);
}
!
sortedAlternatives.push(a);
}
|