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 bd60dc25cfdffd4c6974c249a5745a194e70615c..27cfbeed41c708351d8e1c3c275d1287d1e77015 100644 |
--- a/pkg/kernel/lib/binary/ast_to_binary.dart |
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart |
@@ -26,6 +26,9 @@ class BinaryPrinter extends Visitor { |
final BufferedSink _sink; |
+ int _binaryOffsetForSourceTable = -1; |
+ int _binaryOffsetForLinkTable = -1; |
+ |
/// Create a printer that writes to the given [sink]. |
/// |
/// The BinaryPrinter will use its own buffer, so the [sink] does not need |
@@ -65,7 +68,7 @@ class BinaryPrinter extends Visitor { |
} |
} |
- void writeMagicWord(int value) { |
+ void writeUInt32(int value) { |
writeByte((value >> 24) & 0xFF); |
writeByte((value >> 16) & 0xFF); |
writeByte((value >> 8) & 0xFF); |
@@ -131,6 +134,7 @@ class BinaryPrinter extends Visitor { |
} |
void writeLinkTable(Program program) { |
+ _binaryOffsetForLinkTable = _sink.flushedLength + _sink.length; |
List<CanonicalName> list = <CanonicalName>[]; |
void visitCanonicalName(CanonicalName node) { |
node.index = list.length; |
@@ -174,13 +178,15 @@ class BinaryPrinter extends Visitor { |
void writeProgramFile(Program program) { |
computeCanonicalNames(program); |
- writeMagicWord(Tag.ProgramFile); |
+ writeUInt32(Tag.ProgramFile); |
buildStringIndex(program); |
writeStringTable(stringIndexer); |
writeUriToSource(program); |
writeLinkTable(program); |
writeLibraries(program); |
writeMemberReference(program.mainMethod, allowNull: true); |
+ writeProgramIndex(program, program.libraries); |
+ |
_flush(); |
} |
@@ -194,7 +200,25 @@ class BinaryPrinter extends Visitor { |
writeList(program.libraries, writeNode); |
} |
+ void writeProgramIndex(Program program, List<Library> libraries) { |
+ // Fixed-size ints at the end used as an index. |
+ writeUInt32(_binaryOffsetForSourceTable); |
+ writeUInt32(_binaryOffsetForLinkTable); |
+ |
+ CanonicalName main = getCanonicalNameOfMember(program.mainMethod); |
+ if (main == null) { |
+ writeUInt32(0); |
+ } else { |
+ writeUInt32(main.index + 1); |
+ } |
+ for (Library library in libraries) { |
+ writeUInt32(library.binaryOffset); |
+ } |
+ writeUInt32(libraries.length); |
+ } |
+ |
void writeUriToSource(Program program) { |
+ _binaryOffsetForSourceTable = _sink.flushedLength + _sink.length; |
program.uriToSource.keys.forEach((uri) { |
_sourceUriIndexer.put(uri); |
}); |
@@ -280,6 +304,7 @@ class BinaryPrinter extends Visitor { |
visitLibrary(Library node) { |
insideExternalLibrary = node.isExternal; |
+ node.binaryOffset = _sink.flushedLength + _sink.length; |
writeByte(insideExternalLibrary ? 1 : 0); |
writeCanonicalNameReference(getCanonicalNameOfLibrary(node)); |
writeStringReference(node.name ?? ''); |
@@ -1140,13 +1165,17 @@ class LibraryFilteringBinaryPrinter extends BinaryPrinter { |
void writeProgramFile(Program program) { |
program.computeCanonicalNames(); |
- writeMagicWord(Tag.ProgramFile); |
+ writeUInt32(Tag.ProgramFile); |
stringIndexer.scanProgram(program); |
writeStringTable(stringIndexer); |
writeUriToSource(program); |
writeLinkTable(program); |
- writeList(program.libraries.where(predicate).toList(), writeNode); |
+ final List<Library> filteredLibraries = |
+ program.libraries.where(predicate).toList(); |
+ writeList(filteredLibraries, writeNode); |
writeMemberReference(program.mainMethod, allowNull: true); |
+ writeProgramIndex(program, filteredLibraries); |
+ |
_flush(); |
} |
} |