@@ -901,8 +901,13 @@ ClazzLoader.tryToLoadNext = function (file) {
901901 while ( ( n = ClazzLoader . findNextMustClass ( ClazzLoader . clazzTreeRoot , ClazzNode . STATUS_CONTENT_LOADED ) ) != null ) {
902902 ClazzLoader . updateNode ( n ) ;
903903 }
904+ var lastNode = null ;
904905 while ( ( n = ClazzLoader . findNextOptionalClass ( ClazzNode . STATUS_CONTENT_LOADED ) ) != null ) {
906+ if ( lastNode == n ) { // Already existed cycle ?
907+ n . status = ClazzNode . STATUS_OPTIONALS_LOADED ;
908+ }
905909 ClazzLoader . updateNode ( n ) ;
910+ lastNode = n ;
906911 }
907912 while ( ClazzLoader . checkOptionalCycle ( ClazzLoader . clazzTreeRoot ) ) {
908913 }
@@ -944,6 +949,7 @@ ClazzLoader.checkOptionalCycle = function (node) {
944949 //log ("updating parent ::" + ts[i].parents[k].name);
945950 ClazzLoader . updateNode ( ts [ i ] . parents [ k ] ) ;
946951 }
952+ ts [ i ] . parents = new Array ( ) ;
947953 }
948954 ts . length = 0 ;
949955 return true ;
@@ -979,6 +985,7 @@ ClazzLoader.checkOptionalCycle = function (node) {
979985ClazzLoader . updateNode = function ( node ) {
980986 if ( node . name == null
981987 || node . status >= ClazzNode . STATUS_OPTIONALS_LOADED ) {
988+ ClazzLoader . destroyClassNode ( node ) ;
982989 return ;
983990 }
984991 var isMustsOK = false ;
@@ -1140,6 +1147,9 @@ ClazzLoader.updateParents = function (node, level) {
11401147 }
11411148 ClazzLoader . updateNode ( p ) ;
11421149 }
1150+ if ( level == ClazzNode . STATUS_OPTIONALS_LOADED ) {
1151+ node . parents = new Array ( ) ;
1152+ }
11431153} ;
11441154
11451155/* private */
@@ -1187,45 +1197,45 @@ ClazzLoader.findNextOptionalClass = function (status) {
11871197/*-# findNodeNextOptionalClass -> fNNO #-*/
11881198ClazzLoader . findNodeNextOptionalClass = function ( node , status ) {
11891199 var rnd = ClazzLoader . clazzTreeRoot . random ;
1190- if ( node != null ) {
1191- if ( node . musts != null && node . musts . length != 0 ) {
1192- for ( var i = 0 ; i < node . musts . length ; i ++ ) {
1193- var n = node . musts [ i ] ;
1194- if ( n . status == status ) {
1195- return n ;
1196- } else {
1197- if ( n . random == rnd ) {
1198- continue ;
1199- }
1200- n . random = rnd ;
1201- var nn = ClazzLoader . findNodeNextOptionalClass ( n , status ) ;
1202- if ( nn != null ) {
1203- return nn ;
1204- }
1205- }
1206- }
1200+ // search musts first
1201+ if ( node . musts != null && node . musts . length != 0 ) {
1202+ var n = ClazzLoader . searchClassArray ( node . musts , rnd , status ) ;
1203+ if ( n != null ) {
1204+ return n ;
12071205 }
1208- if ( node . optionals != null && node . optionals . length != 0 ) {
1209- for ( var i = 0 ; i < node . optionals . length ; i ++ ) {
1210- var n = node . optionals [ i ] ;
1211- if ( n . status == status ) {
1212- return n ;
1213- } else {
1214- if ( n . random == rnd ) {
1215- continue ;
1216- }
1217- n . random = rnd ;
1218- var nn = ClazzLoader . findNodeNextOptionalClass ( n , status ) ;
1219- if ( nn != null ) {
1220- return nn ;
1221- }
1222- }
1223- }
1206+ }
1207+ // search optionals second
1208+ if ( node . optionals != null && node . optionals . length != 0 ) {
1209+ var n = ClazzLoader . searchClassArray ( node . optionals , rnd , status ) ;
1210+ if ( n != null ) {
1211+ return n ;
12241212 }
1225- if ( node . status == status ) {
1226- return node ;
1213+ }
1214+ // search itself
1215+ if ( node . status == status ) {
1216+ return node ;
1217+ }
1218+ return null ;
1219+ } ;
1220+
1221+ /* private */
1222+ ClazzLoader . searchClassArray = function ( arr , rnd , status ) {
1223+ for ( var i = 0 ; i < arr . length ; i ++ ) {
1224+ var n = arr [ i ] ;
1225+ if ( n . status == status ) {
1226+ return n ;
1227+ } else {
1228+ if ( n . random == rnd ) {
1229+ continue ;
1230+ }
1231+ n . random = rnd ; // mark as visited!
1232+ var nn = ClazzLoader . findNodeNextOptionalClass ( n , status ) ;
1233+ if ( nn != null ) {
1234+ return nn ;
1235+ }
12271236 }
12281237 }
1238+ return null ;
12291239} ;
12301240
12311241/**
@@ -1599,5 +1609,35 @@ ClazzLoader.addChildClassNode = function (parent, child, type) {
15991609 }
16001610} ;
16011611
1612+ /* private */
1613+ ClazzLoader . removeFromArray = function ( node , arr ) {
1614+ if ( arr == null || node == null ) {
1615+ return false ;
1616+ }
1617+ for ( var i = 0 ; i < arr . length ; i ++ ) {
1618+ if ( arr [ i ] == node ) {
1619+ arr [ i ] = null ;
1620+ for ( var j = i ; j < arr . length - 1 ; j ++ ) {
1621+ arr [ j ] = arr [ j + 1 ] ;
1622+ }
1623+ arr . length -- ;
1624+ return true ;
1625+ }
1626+ }
1627+ return false ;
1628+ } ;
1629+
1630+ /* private */
1631+ ClazzLoader . destroyClassNode = function ( node ) {
1632+ var parents = node . parents ;
1633+ if ( parents != null ) {
1634+ for ( var k = 0 ; k < parents . length ; k ++ ) {
1635+ if ( ! ClazzLoader . removeFromArray ( node , parents [ k ] . musts ) ) {
1636+ ClazzLoader . removeFromArray ( node , parents [ k ] . optionals ) ;
1637+ }
1638+ }
1639+ }
1640+ } ;
1641+
16021642ClassLoader = ClazzLoader ;
16031643
0 commit comments