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

Unified Diff: pkg/kernel/lib/binary/ast_to_binary.dart

Issue 2659343002: Add IR nodes needed for deferred loading. (Closed)
Patch Set: Update binary.md Created 3 years, 11 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 | « pkg/kernel/lib/binary/ast_from_binary.dart ('k') | pkg/kernel/lib/binary/tag.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/kernel/lib/binary/ast_to_binary.dart
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 6d3dabda980afd5aa453172db000a029a3974d87..87a01b505f13cc2e6262409316e10d737d066f2e 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -24,6 +24,7 @@ class BinaryPrinter extends Visitor {
final GlobalIndexer _globalIndexer;
final StringIndexer _stringIndexer = new StringIndexer();
final StringIndexer _sourceUriIndexer = new StringIndexer();
+ Map<DeferredImport, int> _deferredImportIndexer = <DeferredImport, int>{};
final BufferedSink _sink;
@@ -175,6 +176,14 @@ class BinaryPrinter extends Visitor {
writeUInt30(index);
}
+ void writeDeferredImportReference(DeferredImport node) {
+ int index = _deferredImportIndexer[node];
+ if (index == null) {
+ throw 'Reference to deferred import $node out of scope';
+ }
+ writeUInt30(index);
+ }
+
void writeClassIndex(Class node) {
writeUInt30(_globalIndexer[node]);
}
@@ -269,11 +278,29 @@ class BinaryPrinter extends Visitor {
writeStringReference('${node.importUri}');
// TODO(jensj): We save (almost) the same URI twice.
writeUriReference(node.fileUri ?? '');
+ writeDeferredImports(node);
writeNodeList(node.classes);
writeNodeList(node.fields);
writeNodeList(node.procedures);
}
+ void writeDeferredImports(Library library) {
+ _deferredImportIndexer = library.deferredImports.isEmpty
+ ? const <DeferredImport, int>{}
+ : <DeferredImport, int>{};
+ writeUInt30(library.deferredImports.length);
+ for (int i = 0; i < library.deferredImports.length; ++i) {
+ var importNode = library.deferredImports[i];
+ _deferredImportIndexer[importNode] = i;
+ writeDeferredImport(importNode);
+ }
+ }
+
+ void writeDeferredImport(DeferredImport node) {
+ writeLibraryReference(node.importedLibrary);
+ writeStringReference(node.name);
+ }
+
void writeAnnotation(Expression annotation) {
_variableIndexer ??= new VariableIndexer();
writeNode(annotation);
@@ -712,6 +739,16 @@ class BinaryPrinter extends Visitor {
--_variableIndexer.stackHeight;
}
+ visitLoadLibrary(LoadLibrary node) {
+ writeByte(Tag.LoadLibrary);
+ writeDeferredImportReference(node.import);
+ }
+
+ visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node) {
+ writeByte(Tag.CheckLibraryIsLoaded);
+ writeDeferredImportReference(node.import);
+ }
+
writeStatementOrEmpty(Statement node) {
if (node == null) {
writeByte(Tag.EmptyStatement);
@@ -1098,6 +1135,10 @@ class StringIndexer extends RecursiveVisitor<Null> {
node.visitChildren(this);
}
+ visitDeferredImport(DeferredImport node) {
+ put(node.name);
+ }
+
visitClass(Class node) {
putOptional(node.name);
node.visitChildren(this);
« no previous file with comments | « pkg/kernel/lib/binary/ast_from_binary.dart ('k') | pkg/kernel/lib/binary/tag.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698