Skip to content

Commit 1350c8c

Browse files
author
jossonsmith
committed
Fix bug that loading javascript dynamically is running into cyclic class dependencies.
1 parent 80be262 commit 1350c8c

2 files changed

Lines changed: 93 additions & 8 deletions

File tree

sources/net.sf.j2s.java.core/src/java/lang/ClassExt.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ Clazz.forName = function (clazzName) {
760760

761761
/* protected */
762762
Clazz.cssAlreadyAggregated = false;
763-
Clazz.cssForcedUsingFile = true;
763+
Clazz.cssForcedUsingFile = false;
764764

765765
countxx = 0;
766766
/* private */

sources/net.sf.j2s.java.core/src/java/lang/ClassLoader.js

Lines changed: 92 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)