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 cdc92ea4a0b1724d5ed79c96c784917250418d3e..0edfdd886af300e6086061ec0f33ef07e236a8f0 100644 |
--- a/pkg/kernel/lib/binary/ast_to_binary.dart |
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart |
@@ -404,7 +404,7 @@ class BinaryPrinter extends Visitor { |
visitLocalInitializer(LocalInitializer node) { |
writeByte(Tag.LocalInitializer); |
- writeVariableDeclaration(node.variable); |
+ writeVariableDeclaration(node.variable, false); |
} |
visitFunctionNode(FunctionNode node) { |
@@ -444,9 +444,11 @@ class BinaryPrinter extends Visitor { |
node.promotedType == null) { |
writeByte(Tag.SpecializedVariableGet + index); |
writeOffset(node.fileOffset); |
+ writeUInt30(node.variable.binaryOffset); |
} else { |
writeByte(Tag.VariableGet); |
writeOffset(node.fileOffset); |
+ writeUInt30(node.variable.binaryOffset); |
writeUInt30(_variableIndexer[node.variable]); |
writeOptionalNode(node.promotedType); |
} |
@@ -458,10 +460,12 @@ class BinaryPrinter extends Visitor { |
if (index & Tag.SpecializedPayloadMask == index) { |
writeByte(Tag.SpecializedVariableSet + index); |
writeOffset(node.fileOffset); |
+ writeUInt30(node.variable.binaryOffset); |
writeNode(node.value); |
} else { |
writeByte(Tag.VariableSet); |
writeOffset(node.fileOffset); |
+ writeUInt30(node.variable.binaryOffset); |
writeUInt30(_variableIndexer[node.variable]); |
writeNode(node.value); |
} |
@@ -566,6 +570,7 @@ class BinaryPrinter extends Visitor { |
} |
visitArguments(Arguments node) { |
+ writeUInt30(node.positional.length + node.named.length); |
writeNodeList(node.types); |
writeNodeList(node.positional); |
writeNodeList(node.named); |
@@ -724,7 +729,7 @@ class BinaryPrinter extends Visitor { |
visitLet(Let node) { |
writeByte(Tag.Let); |
- writeVariableDeclaration(node.variable); |
+ writeVariableDeclaration(node.variable, false); |
writeNode(node.body); |
--_variableIndexer.stackHeight; |
} |
@@ -842,7 +847,7 @@ class BinaryPrinter extends Visitor { |
_variableIndexer.pushScope(); |
writeByte(node.isAsync ? Tag.AsyncForInStatement : Tag.ForInStatement); |
writeOffset(node.fileOffset); |
- writeVariableDeclaration(node.variable); |
+ writeVariableDeclaration(node.variable, false); |
writeNode(node.iterable); |
writeNode(node.body); |
_variableIndexer.popScope(); |
@@ -858,8 +863,12 @@ class BinaryPrinter extends Visitor { |
visitSwitchCase(SwitchCase node) { |
// Note: there is no tag on SwitchCase. |
- writeNodeList(node.expressions); |
- node.expressionOffsets.forEach(writeOffset); |
+ int length = node.expressions.length; |
+ writeUInt30(length); |
+ for (int i = 0; i < length; ++i) { |
+ writeOffset(node.expressionOffsets[i]); |
+ writeNode(node.expressions[i]); |
+ } |
writeByte(node.isDefault ? 1 : 0); |
writeNode(node.body); |
} |
@@ -885,6 +894,13 @@ class BinaryPrinter extends Visitor { |
visitTryCatch(TryCatch node) { |
writeByte(Tag.TryCatch); |
writeNode(node.body); |
+ if (node.catches.any((Catch c) => c.stackTrace != null)) { |
+ // at least one catch needs the stack trace. |
+ writeByte(1); |
+ } else { |
+ // no catch needs the stack trace. |
+ writeByte(0); |
+ } |
writeNodeList(node.catches); |
} |
@@ -912,11 +928,13 @@ class BinaryPrinter extends Visitor { |
} |
visitVariableDeclaration(VariableDeclaration node) { |
- writeByte(Tag.VariableDeclaration); |
- writeVariableDeclaration(node); |
+ writeVariableDeclaration(node, true); |
} |
- void writeVariableDeclaration(VariableDeclaration node) { |
+ void writeVariableDeclaration(VariableDeclaration node, |
+ [bool hasTag = false]) { |
+ node.binaryOffset = _sink.flushedLength + _sink.length; |
+ if (hasTag) writeByte(Tag.VariableDeclaration); |
writeOffset(node.fileOffset); |
writeOffset(node.fileEqualsOffset); |
writeByte(node.flags); |
@@ -937,14 +955,14 @@ class BinaryPrinter extends Visitor { |
writeByte(Tag.Nothing); |
} else { |
writeByte(Tag.Something); |
- writeVariableDeclaration(node); |
+ writeVariableDeclaration(node, false); |
} |
} |
visitFunctionDeclaration(FunctionDeclaration node) { |
writeByte(Tag.FunctionDeclaration); |
writeOffset(node.fileOffset); |
- writeVariableDeclaration(node.variable); |
+ writeVariableDeclaration(node.variable, false); |
writeNode(node.function); |
} |
@@ -998,6 +1016,8 @@ class BinaryPrinter extends Visitor { |
_typeParameterIndexer.enter(node.typeParameters); |
writeNodeList(node.typeParameters); |
writeUInt30(node.requiredParameterCount); |
+ writeUInt30( |
+ node.positionalParameters.length + node.namedParameters.length); |
writeNodeList(node.positionalParameters); |
writeNodeList(node.namedParameters); |
writeNode(node.returnType); |
@@ -1013,6 +1033,7 @@ class BinaryPrinter extends Visitor { |
visitTypeParameterType(TypeParameterType node) { |
writeByte(Tag.TypeParameterType); |
writeUInt30(_typeParameterIndexer[node.parameter]); |
+ writeUInt30(node.parameter.binaryOffset); |
writeOptionalNode(node.bound); |
} |
@@ -1027,6 +1048,7 @@ class BinaryPrinter extends Visitor { |
} |
visitTypeParameter(TypeParameter node) { |
+ node.binaryOffset = _sink.flushedLength + _sink.length; |
writeStringReference(node.name ?? ''); |
writeNode(node.bound); |
} |
@@ -1307,6 +1329,7 @@ class BufferedSink { |
final Sink<List<int>> _sink; |
Uint8List _buffer = new Uint8List(SIZE); |
int length = 0; |
+ int flushedLength = 0; |
BufferedSink(this._sink); |
@@ -1316,6 +1339,7 @@ class BufferedSink { |
_sink.add(_buffer); |
_buffer = new Uint8List(SIZE); |
length = 0; |
+ flushedLength += SIZE; |
} |
} |
@@ -1326,6 +1350,7 @@ class BufferedSink { |
(bytes.length < SMALL || length < SMALL)) { |
if (length == 0) { |
_sink.add(bytes); |
+ flushedLength += bytes.length; |
} else { |
_buffer.setRange(length, length + bytes.length, bytes); |
length += bytes.length; |
@@ -1341,10 +1366,13 @@ class BufferedSink { |
_buffer = new Uint8List(SIZE); |
_buffer.setRange(0, remainder, bytes, alreadyEmitted); |
length = remainder; |
+ flushedLength += SIZE; |
} else { |
_sink.add(_buffer.sublist(0, length)); |
_sink.add(bytes); |
_buffer = new Uint8List(SIZE); |
+ flushedLength += length; |
+ flushedLength += bytes.length; |
length = 0; |
} |
} |
@@ -1352,6 +1380,7 @@ class BufferedSink { |
void flush() { |
_sink.add(_buffer.sublist(0, length)); |
_buffer = new Uint8List(SIZE); |
+ flushedLength += length; |
length = 0; |
} |