cycle algorithm final adjustments and tests

This commit is contained in:
guybedford 2014-05-05 15:12:53 -07:00
parent 1699351fc1
commit 656bcffbfd
10 changed files with 126 additions and 30 deletions

View File

@ -316,12 +316,20 @@ function register(loader) {
// now we know the entry is in our unlinked linkage group
var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
if (depEntry.groupIndex === undefined) {
// the group index of an entry is always the maximum
if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) {
// if already in a group, remove from the old group
if (depEntry.groupIndex) {
groups[depEntry.groupIndex].splice(groups[depEntry.groupIndex].indexOf(depEntry), 1);
// if the old group is empty, then we have a mixed depndency cycle
if (groups[depEntry.groupIndex].length == 0)
throw new TypeError("Mixed dependency cycle detected");
}
depEntry.groupIndex = depGroupIndex;
}
else if (depEntry.groupIndex != depGroupIndex) {
throw new TypeError('System.register mixed dependency cycle');
}
buildGroups(depEntry, loader, groups);
}
@ -336,7 +344,7 @@ function register(loader) {
buildGroups(startEntry, loader, groups);
var curGroupDeclarative = startEntry.declarative == groups.length % 2;
var curGroupDeclarative = !!startEntry.declarative == groups.length % 2;
for (var i = groups.length - 1; i >= 0; i--) {
var group = groups[i];
for (var j = 0; j < group.length; j++) {
@ -482,8 +490,12 @@ function register(loader) {
for (var i = 0; i < entry.normalizedDeps.length; i++) {
var depName = entry.normalizedDeps[i];
if (indexOf.call(seen, depName) == -1)
ensureEvaluated(depName, seen, loader);
if (indexOf.call(seen, depName) == -1) {
if (!loader.defined[depName])
loader.get(depName);
else
ensureEvaluated(depName, seen, loader);
}
}
if (entry.evaluated)

File diff suppressed because one or more lines are too long

26
dist/system.js vendored
View File

@ -409,12 +409,20 @@ function register(loader) {
// now we know the entry is in our unlinked linkage group
var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
if (depEntry.groupIndex === undefined) {
// the group index of an entry is always the maximum
if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) {
// if already in a group, remove from the old group
if (depEntry.groupIndex) {
groups[depEntry.groupIndex].splice(groups[depEntry.groupIndex].indexOf(depEntry), 1);
// if the old group is empty, then we have a mixed depndency cycle
if (groups[depEntry.groupIndex].length == 0)
throw new TypeError("Mixed dependency cycle detected");
}
depEntry.groupIndex = depGroupIndex;
}
else if (depEntry.groupIndex != depGroupIndex) {
throw new TypeError('System.register mixed dependency cycle');
}
buildGroups(depEntry, loader, groups);
}
@ -429,7 +437,7 @@ function register(loader) {
buildGroups(startEntry, loader, groups);
var curGroupDeclarative = startEntry.declarative == groups.length % 2;
var curGroupDeclarative = !!startEntry.declarative == groups.length % 2;
for (var i = groups.length - 1; i >= 0; i--) {
var group = groups[i];
for (var j = 0; j < group.length; j++) {
@ -575,8 +583,12 @@ function register(loader) {
for (var i = 0; i < entry.normalizedDeps.length; i++) {
var depName = entry.normalizedDeps[i];
if (indexOf.call(seen, depName) == -1)
ensureEvaluated(depName, seen, loader);
if (indexOf.call(seen, depName) == -1) {
if (!loader.defined[depName])
loader.get(depName);
else
ensureEvaluated(depName, seen, loader);
}
}
if (entry.evaluated)

2
dist/system.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -83,12 +83,20 @@ function register(loader) {
// now we know the entry is in our unlinked linkage group
var depGroupIndex = entry.groupIndex + (depEntry.declarative != entry.declarative);
if (depEntry.groupIndex === undefined) {
// the group index of an entry is always the maximum
if (depEntry.groupIndex === undefined || depEntry.groupIndex < depGroupIndex) {
// if already in a group, remove from the old group
if (depEntry.groupIndex) {
groups[depEntry.groupIndex].splice(groups[depEntry.groupIndex].indexOf(depEntry), 1);
// if the old group is empty, then we have a mixed depndency cycle
if (groups[depEntry.groupIndex].length == 0)
throw new TypeError("Mixed dependency cycle detected");
}
depEntry.groupIndex = depGroupIndex;
}
else if (depEntry.groupIndex != depGroupIndex) {
throw new TypeError('System.register mixed dependency cycle');
}
buildGroups(depEntry, loader, groups);
}
@ -103,7 +111,7 @@ function register(loader) {
buildGroups(startEntry, loader, groups);
var curGroupDeclarative = startEntry.declarative == groups.length % 2;
var curGroupDeclarative = !!startEntry.declarative == groups.length % 2;
for (var i = groups.length - 1; i >= 0; i--) {
var group = groups[i];
for (var j = 0; j < group.length; j++) {
@ -249,8 +257,12 @@ function register(loader) {
for (var i = 0; i < entry.normalizedDeps.length; i++) {
var depName = entry.normalizedDeps[i];
if (indexOf.call(seen, depName) == -1)
ensureEvaluated(depName, seen, loader);
if (indexOf.call(seen, depName) == -1) {
if (!loader.defined[depName])
loader.get(depName);
else
ensureEvaluated(depName, seen, loader);
}
}
if (entry.evaluated)

View File

@ -361,12 +361,10 @@ asyncTest('System.register Circular', function() {
}, err);
});
asyncTest('AMD, CJS circular, System.register circular, ES6 circular', function() {
asyncTest('AMD -> System.register circular -> ES6', function() {
System['import']('tests/all-layers1').then(function(m) {
ok(m == true)
start();
}, err);
});
/*
asyncTest('CJS loading ES6 circular, CJS circular, System.register circular', function() {
}); */

View File

@ -0,0 +1,3 @@
define(['./all-layers2'], function(al2) {
return al2.q == 10 && al2.r == 5;
});

39
test/tests/all-layers2.js Normal file
View File

@ -0,0 +1,39 @@
System.register(["./all-layers3"], function($__0) {
"use strict";
var q,
r;
function p() {
if (q)
r = $__0[0]["c"];
else
q = $__0[0]["c"];
}
return {
exports: {
get q() {
return q;
},
get r() {
return r;
},
get p() {
return p;
},
set q(value) {
q = value;
},
set r(value) {
r = value;
},
set p(value) {
p = value;
}
},
execute: function() {
;
$__0[0]["c"] = 5;
;
p();
}
};
});

19
test/tests/all-layers3.js Normal file
View File

@ -0,0 +1,19 @@
System.register(["./all-layers2", "./all-layers4"], function($__0) {
"use strict";
var c;
return {
exports: {
get c() {
return c;
},
set c(value) {
c = value;
}
},
execute: function() {
c = $__0[1]["c"];
;
$__0[0]["p"]();
}
};
});

View File

@ -0,0 +1 @@
export var c = 10;