| 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);
|
|
|