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