OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 library kernel.ast_from_binary; | 4 library kernel.ast_from_binary; |
5 | 5 |
6 import 'dart:convert'; | 6 import 'dart:convert'; |
7 import 'dart:typed_data'; | 7 import 'dart:typed_data'; |
8 | 8 |
9 import '../ast.dart'; | 9 import '../ast.dart'; |
10 import '../transformations/flags.dart'; | 10 import '../transformations/flags.dart'; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 | 126 |
127 String readStringReference() { | 127 String readStringReference() { |
128 return _stringTable[readUInt()]; | 128 return _stringTable[readUInt()]; |
129 } | 129 } |
130 | 130 |
131 String readStringOrNullIfEmpty() { | 131 String readStringOrNullIfEmpty() { |
132 var string = readStringReference(); | 132 var string = readStringReference(); |
133 return string.isEmpty ? null : string; | 133 return string.isEmpty ? null : string; |
134 } | 134 } |
135 | 135 |
136 InferredValue readOptionalInferredValue() { | |
137 if (readAndCheckOptionTag()) { | |
138 Reference baseClass = readClassReference(allowNull: true); | |
139 BaseClassKind baseClassKind = BaseClassKind.values[readByte()]; | |
140 int valueBits = readByte(); | |
141 return new InferredValue.byReference(baseClass, baseClassKind, valueBits); | |
142 } | |
143 return null; | |
144 } | |
145 | |
146 bool readAndCheckOptionTag() { | 136 bool readAndCheckOptionTag() { |
147 int tag = readByte(); | 137 int tag = readByte(); |
148 if (tag == Tag.Nothing) { | 138 if (tag == Tag.Nothing) { |
149 return false; | 139 return false; |
150 } else if (tag == Tag.Something) { | 140 } else if (tag == Tag.Something) { |
151 return true; | 141 return true; |
152 } else { | 142 } else { |
153 throw fail('Invalid Option tag: $tag'); | 143 throw fail('Invalid Option tag: $tag'); |
154 } | 144 } |
155 } | 145 } |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 node = new Field(null, reference: reference); | 436 node = new Field(null, reference: reference); |
447 } | 437 } |
448 int fileOffset = readOffset(); | 438 int fileOffset = readOffset(); |
449 int fileEndOffset = readOffset(); | 439 int fileEndOffset = readOffset(); |
450 int flags = readByte(); | 440 int flags = readByte(); |
451 var name = readName(); | 441 var name = readName(); |
452 var fileUri = readUriReference(); | 442 var fileUri = readUriReference(); |
453 var annotations = readAnnotationList(node); | 443 var annotations = readAnnotationList(node); |
454 debugPath.add(node.name?.name ?? 'field'); | 444 debugPath.add(node.name?.name ?? 'field'); |
455 var type = readDartType(); | 445 var type = readDartType(); |
456 var inferredValue = readOptionalInferredValue(); | |
457 var initializer = readExpressionOption(); | 446 var initializer = readExpressionOption(); |
458 int transformerFlags = getAndResetTransformerFlags(); | 447 int transformerFlags = getAndResetTransformerFlags(); |
459 debugPath.removeLast(); | 448 debugPath.removeLast(); |
460 if (shouldWriteData) { | 449 if (shouldWriteData) { |
461 node.fileOffset = fileOffset; | 450 node.fileOffset = fileOffset; |
462 node.fileEndOffset = fileEndOffset; | 451 node.fileEndOffset = fileEndOffset; |
463 node.flags = flags; | 452 node.flags = flags; |
464 node.name = name; | 453 node.name = name; |
465 node.fileUri = fileUri; | 454 node.fileUri = fileUri; |
466 node.annotations = annotations; | 455 node.annotations = annotations; |
467 node.type = type; | 456 node.type = type; |
468 node.inferredValue = inferredValue; | |
469 node.initializer = initializer; | 457 node.initializer = initializer; |
470 node.initializer?.parent = node; | 458 node.initializer?.parent = node; |
471 node.transformerFlags = transformerFlags; | 459 node.transformerFlags = transformerFlags; |
472 } | 460 } |
473 return node; | 461 return node; |
474 } | 462 } |
475 | 463 |
476 Constructor readConstructor() { | 464 Constructor readConstructor() { |
477 int tag = readByte(); | 465 int tag = readByte(); |
478 assert(tag == Tag.Constructor); | 466 assert(tag == Tag.Constructor); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 int endOffset = readOffset(); | 563 int endOffset = readOffset(); |
576 AsyncMarker asyncMarker = AsyncMarker.values[readByte()]; | 564 AsyncMarker asyncMarker = AsyncMarker.values[readByte()]; |
577 AsyncMarker dartAsyncMarker = AsyncMarker.values[readByte()]; | 565 AsyncMarker dartAsyncMarker = AsyncMarker.values[readByte()]; |
578 int typeParameterStackHeight = typeParameterStack.length; | 566 int typeParameterStackHeight = typeParameterStack.length; |
579 var typeParameters = readAndPushTypeParameterList(); | 567 var typeParameters = readAndPushTypeParameterList(); |
580 var requiredParameterCount = readUInt(); | 568 var requiredParameterCount = readUInt(); |
581 int variableStackHeight = variableStack.length; | 569 int variableStackHeight = variableStack.length; |
582 var positional = readAndPushVariableDeclarationList(); | 570 var positional = readAndPushVariableDeclarationList(); |
583 var named = readAndPushVariableDeclarationList(); | 571 var named = readAndPushVariableDeclarationList(); |
584 var returnType = readDartType(); | 572 var returnType = readDartType(); |
585 var inferredReturnValue = readOptionalInferredValue(); | |
586 int oldLabelStackBase = labelStackBase; | 573 int oldLabelStackBase = labelStackBase; |
587 labelStackBase = labelStack.length; | 574 labelStackBase = labelStack.length; |
588 var body = readStatementOption(); | 575 var body = readStatementOption(); |
589 labelStackBase = oldLabelStackBase; | 576 labelStackBase = oldLabelStackBase; |
590 variableStack.length = variableStackHeight; | 577 variableStack.length = variableStackHeight; |
591 typeParameterStack.length = typeParameterStackHeight; | 578 typeParameterStack.length = typeParameterStackHeight; |
592 return new FunctionNode(body, | 579 return new FunctionNode(body, |
593 typeParameters: typeParameters, | 580 typeParameters: typeParameters, |
594 requiredParameterCount: requiredParameterCount, | 581 requiredParameterCount: requiredParameterCount, |
595 positionalParameters: positional, | 582 positionalParameters: positional, |
596 namedParameters: named, | 583 namedParameters: named, |
597 returnType: returnType, | 584 returnType: returnType, |
598 inferredReturnValue: inferredReturnValue, | |
599 asyncMarker: asyncMarker, | 585 asyncMarker: asyncMarker, |
600 dartAsyncMarker: dartAsyncMarker) | 586 dartAsyncMarker: dartAsyncMarker) |
601 ..fileOffset = offset | 587 ..fileOffset = offset |
602 ..fileEndOffset = endOffset; | 588 ..fileEndOffset = endOffset; |
603 } | 589 } |
604 | 590 |
605 void pushVariableDeclaration(VariableDeclaration variable) { | 591 void pushVariableDeclaration(VariableDeclaration variable) { |
606 variableStack.add(variable); | 592 variableStack.add(variable); |
607 } | 593 } |
608 | 594 |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1120 variableStack.add(variable); | 1106 variableStack.add(variable); |
1121 return variable; | 1107 return variable; |
1122 } | 1108 } |
1123 | 1109 |
1124 VariableDeclaration readVariableDeclaration() { | 1110 VariableDeclaration readVariableDeclaration() { |
1125 int offset = readOffset(); | 1111 int offset = readOffset(); |
1126 int fileEqualsOffset = readOffset(); | 1112 int fileEqualsOffset = readOffset(); |
1127 int flags = readByte(); | 1113 int flags = readByte(); |
1128 return new VariableDeclaration(readStringOrNullIfEmpty(), | 1114 return new VariableDeclaration(readStringOrNullIfEmpty(), |
1129 type: readDartType(), | 1115 type: readDartType(), |
1130 inferredValue: readOptionalInferredValue(), | |
1131 initializer: readExpressionOption(), | 1116 initializer: readExpressionOption(), |
1132 isFinal: flags & 0x1 != 0, | 1117 isFinal: flags & 0x1 != 0, |
1133 isConst: flags & 0x2 != 0) | 1118 isConst: flags & 0x2 != 0) |
1134 ..fileOffset = offset | 1119 ..fileOffset = offset |
1135 ..fileEqualsOffset = fileEqualsOffset; | 1120 ..fileEqualsOffset = fileEqualsOffset; |
1136 } | 1121 } |
1137 | 1122 |
1138 int readOffset() { | 1123 int readOffset() { |
1139 // Offset is saved as unsigned, | 1124 // Offset is saved as unsigned, |
1140 // but actually ranges from -1 and up (thus the -1) | 1125 // but actually ranges from -1 and up (thus the -1) |
1141 return readUInt() - 1; | 1126 return readUInt() - 1; |
1142 } | 1127 } |
1143 } | 1128 } |
OLD | NEW |