Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

Commit 987119f

Browse files
committed
invariant checking
1 parent b4af2d4 commit 987119f

File tree

1 file changed

+75
-1
lines changed

1 file changed

+75
-1
lines changed

lib/loader.js

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,67 @@ function logloads(loads) {
5151
return log;
5252
} */
5353

54+
55+
function checkInvariants() {
56+
// see https://bugs.ecmascript.org/show_bug.cgi?id=2603#c1
57+
58+
var loads = System._loader.loads;
59+
var linkSets = [];
60+
61+
for (var i = 0; i < loads.length; i++) {
62+
var load = loads[i];
63+
console.assert(load.status == 'loading' || load.status == 'loaded', 'Each load is loading or loaded');
64+
65+
for (var j = 0; j < load.linkSets.length; j++) {
66+
var linkSet = load.linkSets[j];
67+
68+
for (var k = 0; k < linkSet.loads.length; k++)
69+
console.assert(loads.indexOf(linkSet.loads[k]) != -1, 'linkSet loads are a subset of loader loads');
70+
71+
if (linkSets.indexOf(linkSet) == -1)
72+
linkSets.push(linkSet);
73+
}
74+
}
75+
76+
for (var i = 0; i < loads.length; i++) {
77+
var load = loads[i];
78+
for (var j = 0; j < linkSets.length; j++) {
79+
var linkSet = linkSets[j];
80+
81+
if (linkSet.loads.indexOf(load) != -1)
82+
console.assert(load.linkSets.indexOf(linkSet) != -1, 'linkSet contains load -> load contains linkSet');
83+
84+
if (load.linkSets.indexOf(linkSet) != -1)
85+
console.assert(linkSet.loads.indexOf(load) != -1, 'load contains linkSet -> linkSet contains load');
86+
}
87+
}
88+
89+
for (var i = 0; i < linkSets.length; i++) {
90+
var linkSet = linkSets[i];
91+
for (var j = 0; j < linkSet.loads.length; j++) {
92+
var load = linkSet.loads[j];
93+
94+
for (var k = 0; k < load.dependencies.length; k++) {
95+
var depName = load.dependencies[k].value;
96+
var depLoad;
97+
for (var l = 0; l < loads.length; l++) {
98+
if (loads[l].name != depName)
99+
continue;
100+
depLoad = loads[l];
101+
break;
102+
}
103+
104+
// loading records are allowed not to have their dependencies yet
105+
// if (load.status != 'loading')
106+
// console.assert(depLoad, 'depLoad found');
107+
108+
// console.assert(linkSet.loads.indexOf(depLoad) != -1, 'linkset contains all dependencies');
109+
}
110+
}
111+
}
112+
}
113+
114+
54115
(function (__global) {
55116
(function() {
56117
var Promise = __global.Promise || require('es6-promise').Promise;
@@ -126,12 +187,14 @@ function logloads(loads) {
126187

127188
// 15.2.4.2
128189
function requestLoad(loader, request, refererName, refererAddress) {
190+
checkInvariants();
129191
// 15.2.4.2.1 CallNormalize
130192
return new Promise(function(resolve, reject) {
131193
resolve(loader.loaderObj.normalize(request, refererName, refererAddress));
132194
})
133195
// 15.2.4.2.2 GetOrCreateLoad
134196
.then(function(name) {
197+
checkInvariants();
135198
var load;
136199
if (loader.modules[name]) {
137200
load = createLoad(name);
@@ -159,6 +222,7 @@ function logloads(loads) {
159222

160223
// 15.2.4.3
161224
function proceedToLocate(loader, load) {
225+
checkInvariants();
162226
proceedToFetch(loader, load,
163227
Promise.resolve()
164228
// 15.2.4.3.1 CallLocate
@@ -170,6 +234,7 @@ function logloads(loads) {
170234

171235
// 15.2.4.4
172236
function proceedToFetch(loader, load, p) {
237+
checkInvariants();
173238
proceedToTranslate(loader, load,
174239
p
175240
// 15.2.4.4.1 CallFetch
@@ -185,16 +250,19 @@ function logloads(loads) {
185250

186251
// 15.2.4.5
187252
function proceedToTranslate(loader, load, p) {
253+
checkInvariants();
188254
p
189255
// 15.2.4.5.1 CallTranslate
190256
.then(function(source) {
257+
checkInvariants();
191258
if (load.status != 'loading')
192259
return;
193260
return loader.loaderObj.translate({ name: load.name, metadata: load.metadata, address: load.address, source: source });
194261
})
195262

196263
// 15.2.4.5.2 CallInstantiate
197264
.then(function(source) {
265+
checkInvariants();
198266
if (load.status != 'loading')
199267
return;
200268
load.source = source;
@@ -203,6 +271,7 @@ function logloads(loads) {
203271

204272
// 15.2.4.5.3 InstantiateSucceeded
205273
.then(function(instantiateResult) {
274+
checkInvariants();
206275
if (load.status != 'loading')
207276
return;
208277

@@ -288,14 +357,16 @@ function logloads(loads) {
288357

289358
// 15.2.4.6 ProcessLoadDependencies
290359
load.dependencies = [];
291-
load.depsList = depsList
360+
load.depsList = depsList;
292361
var loadPromises = [];
293362
for (var i = 0, l = depsList.length; i < l; i++) (function(request) {
363+
checkInvariants();
294364
loadPromises.push(
295365
requestLoad(loader, request, load.name, load.address)
296366

297367
// 15.2.4.6.1 AddDependencyLoad (load is parentLoad)
298368
.then(function(depLoad) {
369+
checkInvariants();
299370

300371
console.assert(!load.dependencies.some(function(dep) {
301372
return dep.key == request;
@@ -323,6 +394,7 @@ function logloads(loads) {
323394

324395
// 15.2.4.6.2 LoadSucceeded
325396
.then(function() {
397+
checkInvariants();
326398
// console.log('LoadSucceeded ' + load.name);
327399
// snapshot(loader);
328400

@@ -337,6 +409,7 @@ function logloads(loads) {
337409

338410
// 15.2.4.5.4 LoadFailed
339411
['catch'](function(exc) {
412+
checkInvariants();
340413
console.assert(load.status == 'loading', 'is loading on fail');
341414
load.status = 'failed';
342415
load.exception = exc;
@@ -353,6 +426,7 @@ function logloads(loads) {
353426

354427
// 15.2.4.7.1
355428
function asyncStartLoadPartwayThrough(stepState) {
429+
checkInvariants();
356430
return function(resolve, reject) {
357431
var loader = stepState.loader;
358432
var name = stepState.moduleName;

0 commit comments

Comments
 (0)