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 5315b1ae7aea3500e27e7bccd6bdd505c9c5b7dc..bc293377d98b3ca0796c33bcb8b49f47c471daad 100644 |
--- a/pkg/kernel/lib/binary/ast_to_binary.dart |
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart |
@@ -347,6 +347,7 @@ class BinaryPrinter extends Visitor { |
if (node.canonicalName == null) { |
throw 'Missing canonical name for $node'; |
} |
+ node.binaryOffset = _sink.flushedLength + _sink.length; |
writeByte(Tag.Class); |
writeCanonicalNameReference(getCanonicalNameOfClass(node)); |
writeOffset(node.fileOffset); |
@@ -377,6 +378,9 @@ class BinaryPrinter extends Visitor { |
writeOffset(node.fileOffset); |
writeOffset(node.fileEndOffset); |
writeByte(node.flags); |
+ assert(node.parent is Class); |
+ Class parent = node.parent; |
+ writeUInt30(parent.binaryOffset); |
writeName(node.name ?? _emptyName); |
writeAnnotationList(node.annotations); |
assert(node.function.typeParameters.isEmpty); |
@@ -399,6 +403,12 @@ class BinaryPrinter extends Visitor { |
writeOffset(node.fileEndOffset); |
writeByte(node.kind.index); |
writeByte(node.flags); |
+ if (node.parent is Class) { |
+ Class parent = node.parent; |
+ writeUInt30(parent.binaryOffset); |
+ } else { |
+ writeUInt30(0); // 0 is a valid offset, but not for a class. |
+ } |
writeName(node.name ?? ''); |
writeUriReference(node.fileUri ?? ''); |
writeAnnotationList(node.annotations); |
@@ -416,6 +426,12 @@ class BinaryPrinter extends Visitor { |
writeOffset(node.fileOffset); |
writeOffset(node.fileEndOffset); |
writeByte(node.flags); |
+ if (node.parent is Class) { |
+ Class parent = node.parent; |
+ writeUInt30(parent.binaryOffset); |
+ } else { |
+ writeUInt30(0); // 0 is a valid offset, but not for a class. |
+ } |
writeName(node.name); |
writeUriReference(node.fileUri ?? ''); |
writeAnnotationList(node.annotations); |
@@ -448,10 +464,11 @@ class BinaryPrinter extends Visitor { |
visitLocalInitializer(LocalInitializer node) { |
writeByte(Tag.LocalInitializer); |
- writeVariableDeclaration(node.variable, false); |
+ writeVariableDeclaration(node.variable); |
} |
visitFunctionNode(FunctionNode node) { |
+ writeByte(Tag.FunctionNode); |
assert(_variableIndexer != null); |
_variableIndexer.pushScope(); |
var oldLabels = _labelIndexer; |
@@ -488,11 +505,11 @@ class BinaryPrinter extends Visitor { |
node.promotedType == null) { |
writeByte(Tag.SpecializedVariableGet + index); |
writeOffset(node.fileOffset); |
- writeUInt30(node.variable.binaryOffset); |
+ writeUInt30(node.variable.binaryOffsetNoTag); |
} else { |
writeByte(Tag.VariableGet); |
writeOffset(node.fileOffset); |
- writeUInt30(node.variable.binaryOffset); |
+ writeUInt30(node.variable.binaryOffsetNoTag); |
writeUInt30(_variableIndexer[node.variable]); |
writeOptionalNode(node.promotedType); |
} |
@@ -504,12 +521,12 @@ class BinaryPrinter extends Visitor { |
if (index & Tag.SpecializedPayloadMask == index) { |
writeByte(Tag.SpecializedVariableSet + index); |
writeOffset(node.fileOffset); |
- writeUInt30(node.variable.binaryOffset); |
+ writeUInt30(node.variable.binaryOffsetNoTag); |
writeNode(node.value); |
} else { |
writeByte(Tag.VariableSet); |
writeOffset(node.fileOffset); |
- writeUInt30(node.variable.binaryOffset); |
+ writeUInt30(node.variable.binaryOffsetNoTag); |
writeUInt30(_variableIndexer[node.variable]); |
writeNode(node.value); |
} |
@@ -773,7 +790,7 @@ class BinaryPrinter extends Visitor { |
visitLet(Let node) { |
writeByte(Tag.Let); |
- writeVariableDeclaration(node.variable, false); |
+ writeVariableDeclaration(node.variable); |
writeNode(node.body); |
--_variableIndexer.stackHeight; |
} |
@@ -891,7 +908,7 @@ class BinaryPrinter extends Visitor { |
_variableIndexer.pushScope(); |
writeByte(node.isAsync ? Tag.AsyncForInStatement : Tag.ForInStatement); |
writeOffset(node.fileOffset); |
- writeVariableDeclaration(node.variable, false); |
+ writeVariableDeclaration(node.variable); |
writeNode(node.iterable); |
writeNode(node.body); |
_variableIndexer.popScope(); |
@@ -972,13 +989,12 @@ class BinaryPrinter extends Visitor { |
} |
visitVariableDeclaration(VariableDeclaration node) { |
- writeVariableDeclaration(node, true); |
+ writeByte(Tag.VariableDeclaration); |
+ writeVariableDeclaration(node); |
} |
- void writeVariableDeclaration(VariableDeclaration node, |
- [bool hasTag = false]) { |
- node.binaryOffset = _sink.flushedLength + _sink.length; |
- if (hasTag) writeByte(Tag.VariableDeclaration); |
+ void writeVariableDeclaration(VariableDeclaration node) { |
+ node.binaryOffsetNoTag = _sink.flushedLength + _sink.length; |
writeOffset(node.fileOffset); |
writeOffset(node.fileEqualsOffset); |
writeByte(node.flags); |
@@ -999,14 +1015,14 @@ class BinaryPrinter extends Visitor { |
writeByte(Tag.Nothing); |
} else { |
writeByte(Tag.Something); |
- writeVariableDeclaration(node, false); |
+ writeVariableDeclaration(node); |
} |
} |
visitFunctionDeclaration(FunctionDeclaration node) { |
writeByte(Tag.FunctionDeclaration); |
writeOffset(node.fileOffset); |
- writeVariableDeclaration(node.variable, false); |
+ writeVariableDeclaration(node.variable); |
writeNode(node.function); |
} |