Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(972)

Unified Diff: pkg/dev_compiler/lib/js/legacy/dart_library.js

Issue 2697093002: Deferred parsing for legacy modules (Closed)
Patch Set: Removing pending Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/dev_compiler/lib/js/legacy/dart_library.js
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index e94086395b284bdf154bc181e953600bffb31ff6..19fa131fe0bb9f5b9cc3f2f825064a74881d366f 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -27,6 +27,24 @@ dart_library =
// Longer term, we can easily migrate to an existing JS module system:
// ES6, AMD, RequireJS, ....
+ // Returns a proxy that delegates to the underlying loader.
+ // This defers loading of a module until a library is actually used.
+ const loadedModule = Symbol('loadedModule');
+ dart_library.defer = function(module, name, patch) {
+ var revocable = Proxy.revocable(module, {
+ get: function(o, p) {
+ var mod = o[loadedModule];
+ var lib = mod[name];
+ // Install unproxied module and library in caller's context.
+ patch(mod, lib);
+ // Ensure proxy is only used on first access.
+ revocable.revoke();
+ return lib[p];
+ }
+ });
+ return revocable.proxy;
+ };
+
class LibraryLoader {
constructor(name, defaultValue, imports, loader) {
@@ -65,8 +83,31 @@ dart_library =
let args = this.loadImports();
// Load the library
- args.unshift(this._library);
- this._loader.apply(null, args);
+ let loader = this;
+ let library = this._library;
+ library[loadedModule] = library;
+ args.unshift(library);
+
+ if (this._name == 'dart_sdk') {
+ // Eagerly load the SDK.
+ this._loader.apply(null, args);
+ loader._loader = null;
+ } else {
+ // Load / parse other modules on demand.
+ let done = false;
+ this._library = new Proxy(args, {
+ get: function(o, name) {
+ if (done) {
+ return library[name];
+ }
+ done = true;
+ loader._loader.apply(null, o);
+ loader._loader = null;
+ return library[name];
+ }
+ });
+ }
+
this._state = LibraryLoader.READY;
this._library[dartLibraryName] = this._name;
this._library[libraryImports] = this._imports;
@@ -121,14 +162,14 @@ dart_library =
if (libraryName == null) libraryName = moduleName;
let library = import_(moduleName)[libraryName];
let dart_sdk = import_('dart_sdk');
+
if (!_currentIsolate) {
- // Create isolate and run main.
+ // Create isolate.
_currentIsolate = true;
- dart_sdk._isolate_helper.startRootIsolate(library.main, []);
- } else {
- // Main isolate is already initialized - just run main.
- library.main();
+ dart_sdk._isolate_helper.startRootIsolate(() => {}, []);
}
+
+ library.main();
}
dart_library.start = start;

Powered by Google App Engine
This is Rietveld 408576698