@@ -838,6 +838,8 @@ ClazzLoader.tryToLoadNext = function (file) {
838838 if ( ! ClazzLoader . keepOnLoading ) {
839839 return ;
840840 }
841+
842+ var loadFurther = false ;
841843 var n = ClazzLoader . findNextMustClass ( ClazzLoader . clazzTreeRoot ,
842844 ClazzNode . STATUS_KNOWN ) ;
843845 //alert ("next..." + n) ;
@@ -859,16 +861,78 @@ ClazzLoader.tryToLoadNext = function (file) {
859861 } else { // Optionals
860862 n = ClazzLoader . findNextOptionalClass ( ClazzNode . STATUS_KNOWN ) ;
861863 if ( n != null ) {
862- //log ("in optionals..." + n.name);
864+ //log ("in optionals unknown ..." + n.name);
863865 ClazzLoader . loadClassNode ( n ) ;
864866 } else {
865- //error ("no more optionals?");
866- ClazzLoader . updateNode ( node ) ;
867- ClazzLoader . globalLoaded ( ) ;
868- //error ("no optionals?");
867+ loadFurther = true ;
868+ }
869+ }
870+ }
871+ if ( loadFurther ) {
872+ //error ("no optionals?");
873+ while ( ( n = ClazzLoader . findNextMustClass ( ClazzLoader . clazzTreeRoot , ClazzNode . STATUS_CONTENT_LOADED ) ) != null ) {
874+ ClazzLoader . updateNode ( n ) ;
875+ }
876+ while ( ( n = ClazzLoader . findNextOptionalClass ( ClazzNode . STATUS_CONTENT_LOADED ) ) != null ) {
877+ ClazzLoader . updateNode ( n ) ;
878+ }
879+ while ( ClazzLoader . checkOptionalCycle ( ClazzLoader . clazzTreeRoot ) ) {
880+ }
881+ while ( ( n = ClazzLoader . findNextMustClass ( ClazzLoader . clazzTreeRoot , ClazzNode . STATUS_DECLARED ) ) != null ) {
882+ ClazzLoader . updateNode ( n ) ;
883+ }
884+ while ( ( n = ClazzLoader . findNextOptionalClass ( ClazzNode . STATUS_DECLARED ) ) != null ) {
885+ ClazzLoader . updateNode ( n ) ;
886+ }
887+
888+ ClazzLoader . globalLoaded ( ) ;
889+ //error ("end ?");
890+ }
891+ } ;
892+
893+ ClazzLoader . tracks = new Array ( ) ;
894+
895+ /* protected */
896+ ClazzLoader . checkOptionalCycle = function ( node ) {
897+ var ts = ClazzLoader . tracks ;
898+ var length = ts . length ;
899+ var cycleFound = - 1 ;
900+ for ( var i = 0 ; i < ts . length ; i ++ ) {
901+ if ( ts [ i ] == node && ts [ i ] . status >= ClazzNode . STATUS_DECLARED ) {
902+ // Cycle is found;
903+ cycleFound = i ;
904+ break ;
905+ }
906+ }
907+ ts [ ts . length ] = node ;
908+ if ( cycleFound != - 1 ) {
909+ for ( var i = cycleFound ; i < ts . length ; i ++ ) {
910+ ts [ i ] . status = ClazzNode . STATUS_OPTIONALS_LOADED ;
911+ ClazzLoader . updateNode ( ts [ i ] ) ;
912+ for ( var k = 0 ; k < ts [ i ] . parents . length ; k ++ ) {
913+ //log ("updating parent ::" + ts[i].parents[k].name);
914+ ClazzLoader . updateNode ( ts [ i ] . parents [ k ] ) ;
915+ }
916+ }
917+ ts . length = 0 ;
918+ return true ;
919+ }
920+ for ( var i = 0 ; i < node . musts . length ; i ++ ) {
921+ if ( node . musts [ i ] . status == ClazzNode . STATUS_DECLARED ) {
922+ if ( ClazzLoader . checkOptionalCycle ( node . musts [ i ] ) ) {
923+ return true ;
924+ }
925+ }
926+ }
927+ for ( var i = 0 ; i < node . optionals . length ; i ++ ) {
928+ if ( node . optionals [ i ] . status == ClazzNode . STATUS_DECLARED ) {
929+ if ( ClazzLoader . checkOptionalCycle ( node . optionals [ i ] ) ) {
930+ return true ;
869931 }
870932 }
871933 }
934+ ts . length = length ;
935+ return false ;
872936} ;
873937
874938/**
@@ -1151,8 +1215,14 @@ ClazzLoader.load = function (musts, clazz, optionals, declaration) {
11511215 }
11521216 var node = ClazzLoader . mapPath2ClassNode [ "#" + clazz ] ;
11531217 if ( node == null ) { // ClazzLoader.load called inside *.z.js?
1218+ var n = ClazzLoader . findClass ( clazz ) ;
1219+ if ( n != null ) {
1220+ node = n ;
1221+ } else {
1222+ node = new ClazzNode ( ) ;
1223+ }
11541224 //*
1155- node = new ClazzNode ( ) ;
1225+ // node = new ClazzNode ();
11561226 node . name = clazz ;
11571227 node . path = ClazzLoader . lastScriptPath ;
11581228 //error ("..." + node.path + "//" + node.name);
@@ -1212,6 +1282,7 @@ ClazzLoader.load = function (musts, clazz, optionals, declaration) {
12121282 }
12131283 node . declaration = declaration ;
12141284
1285+ var isOptionalsOK = true ;
12151286 if ( optionals != null && optionals . length != 0 ) {
12161287 ClazzLoader . unwrapArray ( optionals ) ;
12171288 for ( var i = 0 ; i < optionals . length ; i ++ ) {
@@ -1223,6 +1294,7 @@ ClazzLoader.load = function (musts, clazz, optionals, declaration) {
12231294 || ClazzLoader . isClassExcluded ( name ) ) {
12241295 continue ;
12251296 }
1297+ isOptionalsOK = false ;
12261298 var n = ClazzLoader . findClass ( name ) ;
12271299 if ( n == null ) {
12281300 n = new ClazzNode ( ) ;
@@ -1465,7 +1537,20 @@ ClazzLoader.addChildClassNode = function (parent, child, type) {
14651537 }
14661538 }
14671539 if ( ! existed ) {
1468- arr [ arr . length ] = child ;
1540+ /*
1541+ if (type != 1) { // test cyclic optionals
1542+ existed = false;
1543+ for (var j = 0; j < child.optionals.length; j++) {
1544+ if (child.optionals[j].name == parent.name) {
1545+ existed = true;
1546+ break;
1547+ }
1548+ }
1549+ }
1550+ */
1551+ if ( ! existed ) {
1552+ arr [ arr . length ] = child ;
1553+ }
14691554 }
14701555 existed = false ;
14711556 for ( var i = 0 ; i < child . parents . length ; i ++ ) {
0 commit comments