Chromium Code Reviews| 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 98582c98cfd46998fb180aaf25a994414e376f56..2a29306eb3dba69bf111c58b5f35650ce047a2df 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.map((c) => c.stackTrace != null).contains(true)) { |
|
Kevin Millikin (Google)
2017/05/11 10:38:35
node.catches.any((Catch c) => c.stacktrace != null
jensj
2017/05/11 12:59:24
Done.
|
| + // 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); |
| } |
| visitVectorType(VectorType node) { |
| @@ -1026,6 +1047,7 @@ class BinaryPrinter extends Visitor { |
| } |
| visitTypeParameter(TypeParameter node) { |
| + node.binaryOffset = _sink.flushedLength + _sink.length; |
| writeStringReference(node.name ?? ''); |
| writeNode(node.bound); |
| } |
| @@ -1306,6 +1328,7 @@ class BufferedSink { |
| final Sink<List<int>> _sink; |
| Uint8List _buffer = new Uint8List(SIZE); |
| int length = 0; |
| + int flushedLength = 0; |
| BufferedSink(this._sink); |
| @@ -1315,6 +1338,7 @@ class BufferedSink { |
| _sink.add(_buffer); |
| _buffer = new Uint8List(SIZE); |
| length = 0; |
| + flushedLength += SIZE; |
| } |
| } |
| @@ -1325,6 +1349,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; |
| @@ -1340,10 +1365,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; |
| } |
| } |
| @@ -1351,6 +1379,7 @@ class BufferedSink { |
| void flush() { |
| _sink.add(_buffer.sublist(0, length)); |
| _buffer = new Uint8List(SIZE); |
| + flushedLength += length; |
| length = 0; |
| } |