Collection.st
changeset 14840 e4d30a482055
parent 14711 faac945df4ef
child 14861 9834bcacdd23
child 18028 e39da2aa21bc
--- a/Collection.st	Fri Mar 08 10:25:33 2013 +0100
+++ b/Collection.st	Fri Mar 08 23:36:32 2013 +0100
@@ -259,6 +259,7 @@
     ^ self withSize:n
 ! !
 
+
 !Collection class methodsFor:'Signal constants'!
 
 emptyCollectionSignal
@@ -509,6 +510,7 @@
     ].
 ! !
 
+
 !Collection methodsFor:'accessing'!
 
 anElement
@@ -4147,6 +4149,25 @@
     ].
 
     graph notEmpty ifTrue:[
+        "search for cycle"
+        |startNode checkBlock|
+
+        checkBlock := [:graphEntry :backTrace|
+            2 to:graphEntry size do:[:i|
+                |eachChild eachChildGraph|
+                eachChild := graphEntry at:i.
+                (backTrace includesIdentical:eachChild) ifTrue:[
+                    backTrace add:eachChild.
+                    self error:('cycle in ordering: %1 -> %2' bindWith:startNode with:backTrace reversed) mayProceed:true.
+                ].
+                eachChildGraph := graph at:eachChild.
+                checkBlock value:eachChildGraph value:(backTrace copyWith:eachChild).
+            ].
+        ].
+        graph keysAndValuesDo:[:eachNode :eachGraph|
+            startNode := eachNode.
+            checkBlock value:eachGraph value:(OrderedCollection with:startNode).
+        ].
         self error:'cycle in ordering' mayProceed:true.
     ].
 
@@ -4459,11 +4480,11 @@
 !Collection class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Collection.st,v 1.288 2013-01-25 10:14:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Collection.st,v 1.289 2013-03-08 22:36:32 stefan Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic/Collection.st,v 1.288 2013-01-25 10:14:44 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Collection.st,v 1.289 2013-03-08 22:36:32 stefan Exp $'
 ! !