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

Commit 3fc752b

Browse files
committed
use a single internal state symbol
1 parent ca24dec commit 3fc752b

File tree

3 files changed

+63
-56
lines changed

3 files changed

+63
-56
lines changed

bench/1-register-loading.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -664,8 +664,9 @@ function declaredSystemJSLoader() {
664664
declareBundle(sjsLoader);
665665
return sjsLoader;
666666
}
667-
668-
RegisterLoader.prototype.normalize = function(key) { return key; };
667+
RegisterLoader.prototype[RegisterLoader.resolve] = function(key) {
668+
return key;
669+
};
669670
function declaredRegisterLoader() {
670671
var loader = new RegisterLoader();
671672
declareBundle(loader);

core/loader-polyfill.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,11 @@ Registry.prototype.set = function (key, namespace) {
165165
};
166166
// 4.4.8
167167
Registry.prototype.has = function (key) {
168-
return !!this[REGISTRY][key];
168+
return Object.hasOwnProperty.call(this[REGISTRY], key);
169169
};
170170
// 4.4.9
171171
Registry.prototype.delete = function (key) {
172-
if (this[REGISTRY][key]) {
172+
if (Object.hasOwnProperty.call(this[REGISTRY], key)) {
173173
delete this[REGISTRY][key];
174174
return true;
175175
}

core/register-loader.js

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ export default RegisterLoader;
1515
* - build tracing support by providing a .trace=true and .loads object format
1616
*/
1717

18-
var REGISTER_REGISTRY = createSymbol('registerRegistry');
19-
var REGISTERED_LAST_ANON = createSymbol('registeredLastAnon');
18+
var REGISTER_INTERNAL = createSymbol('register-internal');
2019

2120
function RegisterLoader () {
2221
Loader.call(this);
2322

24-
// last anonymous System.register call
25-
this[REGISTERED_LAST_ANON] = undefined;
26-
27-
// in-flight es module load records
28-
this[REGISTER_REGISTRY] = {};
23+
this[REGISTER_INTERNAL] = {
24+
// last anonymous System.register call
25+
lastRegister: undefined,
26+
// in-flight es module load records
27+
records: {}
28+
}
2929

3030
// tracing
3131
this.trace = false;
@@ -67,8 +67,8 @@ RegisterLoader.prototype[Loader.resolve] = resolve;
6767
// once evaluated, the linkRecord is set to undefined leaving just the other load record properties
6868
// this allows tracking new binding listeners for es modules through importerSetters
6969
// for dynamic modules, the load record is removed entirely.
70-
function createLoadRecord (key, registration) {
71-
return this[REGISTER_REGISTRY][key] = {
70+
function createLoadRecord (state, key, registration) {
71+
return state.records[key] = {
7272
key: key,
7373

7474
// defined System.register cache
@@ -117,10 +117,10 @@ function createLoadRecord (key, registration) {
117117

118118
RegisterLoader.prototype[Loader.resolveInstantiate] = function (key, parentKey) {
119119
var loader = this;
120+
var state = this[REGISTER_INTERNAL];
120121
var registry = loader.registry[loader.registry._registry];
121-
var registerRegistry = loader[REGISTER_REGISTRY];
122122

123-
return resolveInstantiate(loader, key, parentKey, registry, registerRegistry)
123+
return resolveInstantiate(loader, key, parentKey, registry, state)
124124
.then(function (instantiated) {
125125
if (instantiated instanceof ModuleNamespace)
126126
return instantiated;
@@ -131,11 +131,11 @@ RegisterLoader.prototype[Loader.resolveInstantiate] = function (key, parentKey)
131131

132132
// resolveInstantiate always returns a load record with a link record and no module value
133133
if (instantiated.linkRecord.linked)
134-
return ensureEvaluate(loader, instantiated, instantiated.linkRecord, registry, registerRegistry, undefined);
134+
return ensureEvaluate(loader, instantiated, instantiated.linkRecord, registry, state, undefined);
135135

136-
return instantiateDeps(loader, instantiated, instantiated.linkRecord, registry, registerRegistry, [instantiated])
136+
return instantiateDeps(loader, instantiated, instantiated.linkRecord, registry, state, [instantiated])
137137
.then(function () {
138-
return ensureEvaluate(loader, instantiated, instantiated.linkRecord, registry, registerRegistry, undefined);
138+
return ensureEvaluate(loader, instantiated, instantiated.linkRecord, registry, state, undefined);
139139
})
140140
.catch(function (err) {
141141
clearLoadErrors(loader, instantiated);
@@ -144,18 +144,18 @@ RegisterLoader.prototype[Loader.resolveInstantiate] = function (key, parentKey)
144144
});
145145
};
146146

147-
function resolveInstantiate (loader, key, parentKey, registry, registerRegistry) {
147+
function resolveInstantiate (loader, key, parentKey, registry, state) {
148148
// normalization shortpath for already-normalized key
149149
// could add a plain name filter, but doesn't yet seem necessary for perf
150150
var module = registry[key];
151151
if (module)
152152
return Promise.resolve(module);
153153

154-
var load = registerRegistry[key];
154+
var load = state.records[key];
155155

156156
// already linked but not in main registry is ignored
157157
if (load && !load.module)
158-
return instantiate(loader, load, load.linkRecord, registry, registerRegistry);
158+
return instantiate(loader, load, load.linkRecord, registry, state);
159159

160160
return resolve.call(loader, key, parentKey)
161161
.then(function (resolvedKey) {
@@ -164,51 +164,51 @@ function resolveInstantiate (loader, key, parentKey, registry, registerRegistry)
164164
if (module)
165165
return module;
166166

167-
load = registerRegistry[resolvedKey];
167+
load = state.records[resolvedKey];
168168

169169
// already has a module value but not already in the registry (load.module)
170170
// means it was removed by registry.delete, so we should
171171
// disgard the current load record creating a new one over it
172172
// but keep any existing registration
173173
if (!load || load.module)
174-
load = createLoadRecord.call(loader, resolvedKey, load && load.registration);
174+
load = createLoadRecord(state, resolvedKey, load && load.registration);
175175

176176
var link = load.linkRecord;
177177
if (!link)
178178
return load;
179179

180-
return instantiate(loader, load, link, registry, registerRegistry);
180+
return instantiate(loader, load, link, registry, state);
181181
});
182182
}
183183

184-
function createProcessAnonRegister (loader, load) {
184+
function createProcessAnonRegister (loader, load, state) {
185185
return function () {
186-
var registeredLastAnon = loader[REGISTERED_LAST_ANON];
186+
var lastRegister = state.lastRegister;
187187

188-
if (!registeredLastAnon)
188+
if (!lastRegister)
189189
return !!load.registration;
190190

191-
loader[REGISTERED_LAST_ANON] = undefined;
192-
load.registration = registeredLastAnon;
191+
state.lastRegister = undefined;
192+
load.registration = lastRegister;
193193

194194
return true;
195195
};
196196
}
197197

198-
function instantiate (loader, load, link, registry, registerRegistry) {
198+
function instantiate (loader, load, link, registry, state) {
199199
return link.instantiatePromise || (link.instantiatePromise =
200200
// if there is already an existing registration, skip running instantiate
201201
(load.registration ? Promise.resolve() : Promise.resolve().then(function () {
202-
loader[REGISTERED_LAST_ANON] = undefined;
203-
return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load));
202+
state.lastRegister = undefined;
203+
return loader[INSTANTIATE](load.key, loader[INSTANTIATE].length > 1 && createProcessAnonRegister(loader, load, state));
204204
}))
205205
.then(function (instantiation) {
206206
// direct module return from instantiate -> we're done
207207
if (instantiation !== undefined) {
208208
if (!(instantiation instanceof ModuleNamespace))
209209
throw new TypeError('Instantiate did not return a valid Module object.');
210210

211-
delete registerRegistry[load.key];
211+
delete state.records[load.key];
212212
if (loader.trace)
213213
traceLoad(loader, load, link);
214214
return registry[load.key] = instantiation;
@@ -254,11 +254,11 @@ function instantiate (loader, load, link, registry, registerRegistry) {
254254
}
255255

256256
// like resolveInstantiate, but returning load records for linking
257-
function resolveInstantiateDep (loader, key, parentKey, registry, registerRegistry, traceDepMap) {
257+
function resolveInstantiateDep (loader, key, parentKey, registry, state, traceDepMap) {
258258
// normalization shortpaths for already-normalized key
259259
// DISABLED to prioritise consistent resolver calls
260260
// could add a plain name filter, but doesn't yet seem necessary for perf
261-
/* var load = registerRegistry[key];
261+
/* var load = state.records[key];
262262
var module = registry[key];
263263
264264
if (module) {
@@ -276,15 +276,15 @@ function resolveInstantiateDep (loader, key, parentKey, registry, registerRegist
276276
if (load && !load.module) {
277277
if (traceDepMap)
278278
traceDepMap[key] = key;
279-
return instantiate(loader, load, load.linkRecord, registry, registerRegistry);
279+
return instantiate(loader, load, load.linkRecord, registry, state);
280280
} */
281281
return resolve.call(loader, key, parentKey)
282282
.then(function (resolvedKey) {
283283
if (traceDepMap)
284284
traceDepMap[key] = key;
285285

286286
// normalization shortpaths for already-normalized key
287-
var load = registerRegistry[resolvedKey];
287+
var load = state.records[resolvedKey];
288288
var module = registry[resolvedKey];
289289

290290
// main loader registry always takes preference
@@ -296,13 +296,13 @@ function resolveInstantiateDep (loader, key, parentKey, registry, registerRegist
296296
// disgard the current load record creating a new one over it
297297
// but keep any existing registration
298298
if (!load || !module && load.module)
299-
load = createLoadRecord.call(loader, resolvedKey, load && load.registration);
299+
load = createLoadRecord(state, resolvedKey, load && load.registration);
300300

301301
var link = load.linkRecord;
302302
if (!link)
303303
return load;
304304

305-
return instantiate(loader, load, link, registry, registerRegistry);
305+
return instantiate(loader, load, link, registry, state);
306306
});
307307
}
308308

@@ -387,13 +387,13 @@ function registerDeclarative (loader, load, link, declare) {
387387
}
388388
}
389389

390-
function instantiateDeps (loader, load, link, registry, registerRegistry, seen) {
390+
function instantiateDeps (loader, load, link, registry, state, seen) {
391391
return (link.depsInstantiatePromise || (link.depsInstantiatePromise = Promise.resolve()
392392
.then(function () {
393393
var depsInstantiatePromises = Array(link.dependencies.length);
394394

395395
for (var i = 0; i < link.dependencies.length; i++)
396-
depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, registerRegistry, loader.trace && (link.depMap = {}));
396+
depsInstantiatePromises[i] = resolveInstantiateDep(loader, link.dependencies[i], load.key, registry, state, loader.trace && (link.depMap = {}));
397397

398398
return Promise.all(depsInstantiatePromises);
399399
})
@@ -435,7 +435,7 @@ function instantiateDeps (loader, load, link, registry, registerRegistry, seen)
435435
continue;
436436
seen.push(depLoad);
437437

438-
deepDepsInstantiatePromises.push(instantiateDeps(loader, depLoad, depLoad.linkRecord, registry, registerRegistry, seen));
438+
deepDepsInstantiatePromises.push(instantiateDeps(loader, depLoad, depLoad.linkRecord, registry, state, seen));
439439
}
440440

441441
return Promise.all(deepDepsInstantiatePromises);
@@ -463,9 +463,11 @@ function instantiateDeps (loader, load, link, registry, registerRegistry, seen)
463463

464464
// clears an errored load and all its errored dependencies from the loads registry
465465
function clearLoadErrors (loader, load) {
466+
var state = loader[REGISTER_INTERNAL];
467+
466468
// clear from loads
467-
if (loader[REGISTER_REGISTRY][load.key] === load)
468-
delete loader[REGISTER_REGISTRY][load.key];
469+
if (state.records[load.key] === load)
470+
delete state.records[load.key];
469471

470472
var link = load.linkRecord;
471473

@@ -480,7 +482,7 @@ function clearLoadErrors (loader, load) {
480482
if (depLoad.linkRecord) {
481483
if (depLoad.linkRecord.error) {
482484
// provides a circular reference check
483-
if (loader[REGISTER_REGISTRY][depLoad.key] === depLoad)
485+
if (state.records[depLoad.key] === depLoad)
484486
clearLoadErrors(loader, depLoad);
485487
}
486488

@@ -497,14 +499,16 @@ function clearLoadErrors (loader, load) {
497499
* System.register
498500
*/
499501
RegisterLoader.prototype.register = function (key, deps, declare) {
502+
var state = this[REGISTER_INTERNAL];
503+
500504
// anonymous modules get stored as lastAnon
501505
if (declare === undefined) {
502-
this[REGISTERED_LAST_ANON] = [key, deps, false];
506+
state.lastRegister = [key, deps, false];
503507
}
504508

505509
// everything else registers into the register cache
506510
else {
507-
var load = this[REGISTER_REGISTRY][key] || createLoadRecord.call(this, key, undefined);
511+
var load = state.records[key] || createLoadRecord(state, key, undefined);
508512
load.registration = [deps, declare, false];
509513
}
510514
};
@@ -513,14 +517,16 @@ RegisterLoader.prototype.register = function (key, deps, declare) {
513517
* System.registerDyanmic
514518
*/
515519
RegisterLoader.prototype.registerDynamic = function (key, deps, execute) {
520+
var state = this[REGISTER_INTERNAL];
521+
516522
// anonymous modules get stored as lastAnon
517523
if (typeof key !== 'string') {
518-
this[REGISTERED_LAST_ANON] = [key, typeof deps === 'boolean' ? dynamicExecuteCompat(key, deps, execute) : deps, true];
524+
state.lastRegister = [key, typeof deps === 'boolean' ? dynamicExecuteCompat(key, deps, execute) : deps, true];
519525
}
520526

521527
// everything else registers into the register cache
522528
else {
523-
var load = this[REGISTER_REGISTRY][key] || createLoadRecord.call(this, key, undefined);
529+
var load = state.records[key] || createLoadRecord(state, key, undefined);
524530
load.registration = [deps, typeof execute === 'boolean' ? dynamicExecuteCompat(deps, execute, arguments[3]) : execute, true];
525531
}
526532
};
@@ -559,7 +565,7 @@ ContextualLoader.prototype.load = function (key) {
559565
};
560566

561567
// this is the execution function bound to the Module namespace record
562-
function ensureEvaluate (loader, load, link, registry, registerRegistry, seen) {
568+
function ensureEvaluate (loader, load, link, registry, state, seen) {
563569
if (load.module)
564570
return load.module;
565571

@@ -571,7 +577,7 @@ function ensureEvaluate (loader, load, link, registry, registerRegistry, seen) {
571577

572578
// for ES loads we always run ensureEvaluate on top-level, so empty seen is passed regardless
573579
// for dynamic loads, we pass seen if also dynamic
574-
var err = doEvaluate(loader, load, link, registry, registerRegistry, load.setters ? [] : seen || []);
580+
var err = doEvaluate(loader, load, link, registry, state, load.setters ? [] : seen || []);
575581
if (err) {
576582
clearLoadErrors(loader, load);
577583
throw err;
@@ -580,7 +586,7 @@ function ensureEvaluate (loader, load, link, registry, registerRegistry, seen) {
580586
return load.module;
581587
}
582588

583-
function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, registerRegistry, seen) {
589+
function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations, registry, state, seen) {
584590
// we can only require from already-known dependencies
585591
return function (name) {
586592
for (var i = 0; i < dependencies.length; i++) {
@@ -591,7 +597,7 @@ function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations
591597
if (depLoad instanceof ModuleNamespace)
592598
module = depLoad;
593599
else
594-
module = ensureEvaluate(loader, depLoad, depLoad.linkRecord, registry, registerRegistry, seen);
600+
module = ensureEvaluate(loader, depLoad, depLoad.linkRecord, registry, state, seen);
595601

596602
return module.__useDefault ? module.default : module;
597603
}
@@ -602,7 +608,7 @@ function makeDynamicRequire (loader, key, dependencies, dependencyInstantiations
602608

603609
// ensures the given es load is evaluated
604610
// returns the error if any
605-
function doEvaluate (loader, load, link, registry, registerRegistry, seen) {
611+
function doEvaluate (loader, load, link, registry, state, seen) {
606612
seen.push(load);
607613

608614
var err;
@@ -625,7 +631,7 @@ function doEvaluate (loader, load, link, registry, registerRegistry, seen) {
625631
else
626632
// dynamic / declarative boundaries clear the "seen" list
627633
// we just let cross format circular throw as would happen in real implementations
628-
err = doEvaluate(loader, depLoad, depLink, registry, registerRegistry, depLink.setters ? seen : []);
634+
err = doEvaluate(loader, depLoad, depLink, registry, state, depLink.setters ? seen : []);
629635
}
630636

631637
if (err)
@@ -655,7 +661,7 @@ function doEvaluate (loader, load, link, registry, registerRegistry, seen) {
655661
}
656662
});
657663
err = doExecute(link.execute, module.exports, [
658-
makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, registerRegistry, seen),
664+
makeDynamicRequire(loader, load.key, link.dependencies, link.dependencyInstantiations, registry, state, seen),
659665
module.exports,
660666
module
661667
]);

0 commit comments

Comments
 (0)