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

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

Issue 2896493002: Add LimitedBinaryPrinter, tests and switch incremental generator to it. (Closed)
Patch Set: Created 3 years, 7 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/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 0edfdd886af300e6086061ec0f33ef07e236a8f0..daeae9e8759a474e1b8f990bda95848dea6b809a 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -19,7 +19,7 @@ class BinaryPrinter extends Visitor {
LabelIndexer _labelIndexer;
SwitchCaseIndexer _switchCaseIndexer;
final TypeParameterIndexer _typeParameterIndexer = new TypeParameterIndexer();
- final StringIndexer _stringIndexer = new StringIndexer();
+ StringIndexer _stringIndexer;
ahe 2017/05/22 09:27:05 You can keep this final by adding an optional para
ahe 2017/05/22 09:27:05 Seems like you need this field to be public.
scheglov 2017/05/22 20:36:01 Done.
scheglov 2017/05/22 20:36:01 Done.
final StringIndexer _sourceUriIndexer = new StringIndexer();
Map<DeferredImport, int> _deferredImportIndexer = <DeferredImport, int>{};
@@ -33,7 +33,11 @@ class BinaryPrinter extends Visitor {
/// If multiple binaries are to be written based on the same IR, a shared
/// [globalIndexer] may be passed in to avoid rebuilding the same indices
/// in every printer.
- BinaryPrinter(Sink<List<int>> sink) : _sink = new BufferedSink(sink);
+ BinaryPrinter(Sink<List<int>> sink) : _sink = new BufferedSink(sink) {
+ _stringIndexer = createStringIndexer();
+ }
+
+ StringIndexer createStringIndexer() => new StringIndexer();
void _flush() {
_sink.flushAndDestroy();
@@ -132,11 +136,24 @@ class BinaryPrinter extends Visitor {
}
for (var library in program.libraries) {
+ if (!shouldWriteLibraryCanonicalNames(library)) continue;
visitCanonicalName(library.canonicalName);
}
+ addCanonicalNamesForLinkTable(list);
writeList(list, writeCanonicalNameEntry);
}
+ /// Return `true` if all canonical names of the [library] should be written
+ /// into the link table. If some libraries of the program are skipped,
+ /// then [addCanonicalNamesForLinkTable] should append all the additional
+ /// names referenced by the libraries that are written by [writeLibraries].
+ bool shouldWriteLibraryCanonicalNames(Library library) => true;
+
+ /// Append additional names for entities that are referenced by the
+ /// libraries that are written by [writeLibraries], but declared outside
+ /// of these libraries.
+ void addCanonicalNamesForLinkTable(List<CanonicalName> list) {}
+
void writeCanonicalNameEntry(CanonicalName node) {
var parent = node.parent;
if (parent.isRoot) {
@@ -150,15 +167,25 @@ class BinaryPrinter extends Visitor {
void writeProgramFile(Program program) {
program.computeCanonicalNames();
writeMagicWord(Tag.ProgramFile);
- _stringIndexer.scanProgram(program);
+ buildStringIndex(program);
writeStringTable(_stringIndexer);
writeUriToSource(program);
writeLinkTable(program);
- writeList(program.libraries, writeNode);
+ writeLibraries(program);
writeMemberReference(program.mainMethod, allowNull: true);
_flush();
}
+ /// Fill the [_stringIndexer] with all strings we are going to reference.
+ void buildStringIndex(Program program) {
+ _stringIndexer.scanProgram(program);
+ }
+
+ /// Write all of some of the libraries of the [program].
+ void writeLibraries(Program program) {
+ writeList(program.libraries, writeNode);
+ }
+
void writeUriToSource(Program program) {
program.uriToSource.keys.forEach((uri) {
_sourceUriIndexer.put(uri);
@@ -1183,8 +1210,19 @@ class StringIndexer extends RecursiveVisitor<Null> {
int get numberOfStrings => index.length;
- void scanProgram(Node node) {
- node.accept(this);
+ /// Scan all the [program] libraries and [finish] indexing.
+ void scanProgram(Program program) {
+ program.accept(this);
+ finish();
+ }
+
+ /// Scan the given library, but don't [finish] indexing yet.
+ void scanLibrary(Library library) {
+ library.accept(this);
+ }
+
+ /// Finish building of the index - sort and assign indices for entries.
+ void finish() {
entries.sort();
for (int i = 0; i < entries.length; ++i) {
index[entries[i].value] = i;

Powered by Google App Engine
This is Rietveld 408576698