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

Unified Diff: pkg/compiler/lib/src/kernel/kernel_visitor.dart

Issue 2691753002: Add deferred loading to Kernel. (Closed)
Patch Set: . 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/task.dart » ('j') | pkg/compiler/lib/src/ssa/builder_kernel.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/kernel/kernel_visitor.dart
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
index 8ba98d0bea7888a493cd276aa5633eabf2f41ff5..f947a3f247d06f498b39de8e6e96385fbeba7574 100644
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
@@ -214,6 +214,10 @@ class KernelVisitor extends Object
bool isVoidContext = false;
+ /// If non-null, reference to a deferred library that a subsequent getter is
+ /// using.
+ ir.DeferredImport _deferredLibrary;
+
KernelVisitor(this.currentElement, this.elements, this.kernel);
KernelVisitor get sendVisitor => this;
@@ -363,7 +367,16 @@ class KernelVisitor extends Object
}
@override
- void previsitDeferredAccess(Send node, PrefixElement prefix, _) {}
+ void previsitDeferredAccess(Send node, PrefixElement prefix, _) {
+ // This is visited before any element access, and if it is deferred,
+ // prefix.isDeferred = true.
+ if (prefix != null && prefix.isDeferred) {
+ _deferredLibrary = new ir.DeferredImport(
+ kernel.libraries[prefix.deferredImport.importedLibrary], prefix.name);
+ } else {
+ _deferredLibrary = null;
+ }
+ }
@override
internalError(Spannable spannable, String message) {
@@ -1994,7 +2007,14 @@ class KernelVisitor extends Object
}
ir.Expression buildStaticGet(Element element) {
- return buildStaticAccessor(element).buildSimpleRead();
+ var expression = buildStaticAccessor(element).buildSimpleRead();
+ if (_deferredLibrary != null) {
+ ir.Let let = new ir.Let(
+ makeOrReuseVariable(new ir.CheckLibraryIsLoaded(_deferredLibrary)),
+ expression);
+ return let;
+ }
+ return expression;
}
@override
@@ -2232,21 +2252,31 @@ class KernelVisitor extends Object
@override
ir.Expression handleStaticGetterGet(Send node, FunctionElement getter, _) {
if (getter.isDeferredLoaderGetter) {
- // TODO(ahe): Support deferred load.
- return new ir.InvalidExpression();
+ // This is the LoadLibrary call.
+ var deferredLibrary = new ir.DeferredImport(
sra1 2017/02/14 03:14:06 I would expect there to be a single shared Deferre
Emily Fortuna 2017/02/14 20:56:28 Changed to PutIfAbsent. I'm not convinced this is
+ kernel.libraries[getter.prefix.deferredImport.importedLibrary],
+ getter.prefix.name);
+ assert(deferredLibrary != null);
+ return new ir.LoadLibrary(deferredLibrary);
}
- return buildStaticGet(getter);
+ var expression = buildStaticGet(getter);
+ return expression;
}
@override
ir.Expression handleStaticGetterInvoke(Send node, FunctionElement getter,
NodeList arguments, CallStructure callStructure, _) {
+ var expression;
if (getter.isDeferredLoaderGetter) {
- // TODO(ahe): Support deferred load.
- return new ir.InvalidExpression();
+ var deferredLibrary = new ir.DeferredImport(
+ kernel.libraries[getter.prefix.deferredImport.importedLibrary],
+ getter.prefix.name);
+ assert(deferredLibrary != null);
+ expression = new ir.LoadLibrary(deferredLibrary);
sra1 2017/02/14 03:14:06 This code is the same as above. I'd put it in a se
Emily Fortuna 2017/02/14 20:56:28 done. See above.
+ } else {
+ expression = buildStaticGet(getter);
}
- return associateNode(
- buildCall(buildStaticGet(getter), callStructure, arguments), node);
+ return associateNode(buildCall(expression, callStructure, arguments), node);
}
@override
@@ -2816,7 +2846,8 @@ class KernelVisitor extends Object
if (currentElement.isGenerativeConstructor) {
return buildGenerativeConstructor(currentElement, null, null);
} else {
- return internalError(currentElement, "Unhandled synthetic function.");
+ return internalError(currentElement,
+ "Unhandled synthetic function.");
}
} else {
Node node = currentElement.node;
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/task.dart » ('j') | pkg/compiler/lib/src/ssa/builder_kernel.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698