| 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_to_binary; | 4 library kernel.ast_to_binary; |
| 5 | 5 |
| 6 import '../ast.dart'; | 6 import '../ast.dart'; |
| 7 import '../import_table.dart'; | 7 import '../import_table.dart'; |
| 8 import 'tag.dart'; | 8 import 'tag.dart'; |
| 9 import 'dart:convert'; | 9 import 'dart:convert'; |
| 10 import 'dart:typed_data'; | 10 import 'dart:typed_data'; |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 isSyntheticMixinImplementationFlag | | 375 isSyntheticMixinImplementationFlag | |
| 376 levelFlags; | 376 levelFlags; |
| 377 } | 377 } |
| 378 | 378 |
| 379 visitClass(Class node) { | 379 visitClass(Class node) { |
| 380 int flags = _encodeClassFlags(node.isAbstract, node.isEnum, | 380 int flags = _encodeClassFlags(node.isAbstract, node.isEnum, |
| 381 node.isSyntheticMixinImplementation, node.level); | 381 node.isSyntheticMixinImplementation, node.level); |
| 382 if (node.canonicalName == null) { | 382 if (node.canonicalName == null) { |
| 383 throw 'Missing canonical name for $node'; | 383 throw 'Missing canonical name for $node'; |
| 384 } | 384 } |
| 385 node.binaryOffset = _sink.flushedLength + _sink.length; | |
| 386 writeByte(Tag.Class); | 385 writeByte(Tag.Class); |
| 387 writeCanonicalNameReference(getCanonicalNameOfClass(node)); | 386 writeCanonicalNameReference(getCanonicalNameOfClass(node)); |
| 388 writeOffset(node.fileOffset); | 387 writeOffset(node.fileOffset); |
| 389 writeOffset(node.fileEndOffset); | 388 writeOffset(node.fileEndOffset); |
| 390 writeByte(flags); | 389 writeByte(flags); |
| 391 writeStringReference(node.name ?? ''); | 390 writeStringReference(node.name ?? ''); |
| 392 writeUriReference(node.fileUri ?? ''); | 391 writeUriReference(node.fileUri ?? ''); |
| 393 writeStringReference(node.documentationComment ?? ''); | 392 writeStringReference(node.documentationComment ?? ''); |
| 394 writeAnnotationList(node.annotations); | 393 writeAnnotationList(node.annotations); |
| 395 _typeParameterIndexer.enter(node.typeParameters); | 394 _typeParameterIndexer.enter(node.typeParameters); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 408 visitConstructor(Constructor node) { | 407 visitConstructor(Constructor node) { |
| 409 if (node.canonicalName == null) { | 408 if (node.canonicalName == null) { |
| 410 throw 'Missing canonical name for $node'; | 409 throw 'Missing canonical name for $node'; |
| 411 } | 410 } |
| 412 _variableIndexer = new VariableIndexer(); | 411 _variableIndexer = new VariableIndexer(); |
| 413 writeByte(Tag.Constructor); | 412 writeByte(Tag.Constructor); |
| 414 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 413 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
| 415 writeOffset(node.fileOffset); | 414 writeOffset(node.fileOffset); |
| 416 writeOffset(node.fileEndOffset); | 415 writeOffset(node.fileEndOffset); |
| 417 writeByte(node.flags); | 416 writeByte(node.flags); |
| 418 assert(node.parent is Class); | |
| 419 Class parent = node.parent; | |
| 420 writeUInt30(parent.binaryOffset); | |
| 421 writeName(node.name ?? _emptyName); | 417 writeName(node.name ?? _emptyName); |
| 422 writeStringReference(node.documentationComment ?? ''); | 418 writeStringReference(node.documentationComment ?? ''); |
| 423 writeAnnotationList(node.annotations); | 419 writeAnnotationList(node.annotations); |
| 424 assert(node.function.typeParameters.isEmpty); | 420 assert(node.function.typeParameters.isEmpty); |
| 425 writeNode(node.function); | 421 writeNode(node.function); |
| 426 // Parameters are in scope in the initializers. | 422 // Parameters are in scope in the initializers. |
| 427 _variableIndexer.restoreScope(node.function.positionalParameters.length + | 423 _variableIndexer.restoreScope(node.function.positionalParameters.length + |
| 428 node.function.namedParameters.length); | 424 node.function.namedParameters.length); |
| 429 writeNodeList(node.initializers); | 425 writeNodeList(node.initializers); |
| 430 _variableIndexer = null; | 426 _variableIndexer = null; |
| 431 } | 427 } |
| 432 | 428 |
| 433 visitProcedure(Procedure node) { | 429 visitProcedure(Procedure node) { |
| 434 if (node.canonicalName == null) { | 430 if (node.canonicalName == null) { |
| 435 throw 'Missing canonical name for $node'; | 431 throw 'Missing canonical name for $node'; |
| 436 } | 432 } |
| 437 _variableIndexer = new VariableIndexer(); | 433 _variableIndexer = new VariableIndexer(); |
| 438 writeByte(Tag.Procedure); | 434 writeByte(Tag.Procedure); |
| 439 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 435 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
| 440 writeOffset(node.fileOffset); | 436 writeOffset(node.fileOffset); |
| 441 writeOffset(node.fileEndOffset); | 437 writeOffset(node.fileEndOffset); |
| 442 writeByte(node.kind.index); | 438 writeByte(node.kind.index); |
| 443 writeByte(node.flags); | 439 writeByte(node.flags); |
| 444 if (node.parent is Class) { | |
| 445 Class parent = node.parent; | |
| 446 writeUInt30(parent.binaryOffset); | |
| 447 } else { | |
| 448 writeUInt30(0); // 0 is a valid offset, but not for a class. | |
| 449 } | |
| 450 writeName(node.name ?? ''); | 440 writeName(node.name ?? ''); |
| 451 writeUriReference(node.fileUri ?? ''); | 441 writeUriReference(node.fileUri ?? ''); |
| 452 writeStringReference(node.documentationComment ?? ''); | 442 writeStringReference(node.documentationComment ?? ''); |
| 453 writeAnnotationList(node.annotations); | 443 writeAnnotationList(node.annotations); |
| 454 writeOptionalNode(node.function); | 444 writeOptionalNode(node.function); |
| 455 _variableIndexer = null; | 445 _variableIndexer = null; |
| 456 } | 446 } |
| 457 | 447 |
| 458 visitField(Field node) { | 448 visitField(Field node) { |
| 459 if (node.canonicalName == null) { | 449 if (node.canonicalName == null) { |
| 460 throw 'Missing canonical name for $node'; | 450 throw 'Missing canonical name for $node'; |
| 461 } | 451 } |
| 462 _variableIndexer = new VariableIndexer(); | 452 _variableIndexer = new VariableIndexer(); |
| 463 writeByte(Tag.Field); | 453 writeByte(Tag.Field); |
| 464 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 454 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
| 465 writeOffset(node.fileOffset); | 455 writeOffset(node.fileOffset); |
| 466 writeOffset(node.fileEndOffset); | 456 writeOffset(node.fileEndOffset); |
| 467 writeByte(node.flags); | 457 writeByte(node.flags); |
| 468 if (node.parent is Class) { | |
| 469 Class parent = node.parent; | |
| 470 writeUInt30(parent.binaryOffset); | |
| 471 } else { | |
| 472 writeUInt30(0); // 0 is a valid offset, but not for a class. | |
| 473 } | |
| 474 writeName(node.name); | 458 writeName(node.name); |
| 475 writeUriReference(node.fileUri ?? ''); | 459 writeUriReference(node.fileUri ?? ''); |
| 476 writeStringReference(node.documentationComment ?? ''); | 460 writeStringReference(node.documentationComment ?? ''); |
| 477 writeAnnotationList(node.annotations); | 461 writeAnnotationList(node.annotations); |
| 478 writeNode(node.type); | 462 writeNode(node.type); |
| 479 writeOptionalNode(node.initializer); | 463 writeOptionalNode(node.initializer); |
| 480 _variableIndexer = null; | 464 _variableIndexer = null; |
| 481 } | 465 } |
| 482 | 466 |
| 483 visitInvalidInitializer(InvalidInitializer node) { | 467 visitInvalidInitializer(InvalidInitializer node) { |
| (...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1151 writeByte(Tag.VectorType); | 1135 writeByte(Tag.VectorType); |
| 1152 } | 1136 } |
| 1153 | 1137 |
| 1154 visitTypedefType(TypedefType node) { | 1138 visitTypedefType(TypedefType node) { |
| 1155 writeByte(Tag.TypedefType); | 1139 writeByte(Tag.TypedefType); |
| 1156 writeReference(node.typedefReference); | 1140 writeReference(node.typedefReference); |
| 1157 writeNodeList(node.typeArguments); | 1141 writeNodeList(node.typeArguments); |
| 1158 } | 1142 } |
| 1159 | 1143 |
| 1160 visitTypeParameter(TypeParameter node) { | 1144 visitTypeParameter(TypeParameter node) { |
| 1161 node.binaryOffset = _sink.flushedLength + _sink.length; | |
| 1162 writeStringReference(node.name ?? ''); | 1145 writeStringReference(node.name ?? ''); |
| 1163 writeNode(node.bound); | 1146 writeNode(node.bound); |
| 1164 } | 1147 } |
| 1165 | 1148 |
| 1166 defaultNode(Node node) { | 1149 defaultNode(Node node) { |
| 1167 throw 'Unsupported node: $node'; | 1150 throw 'Unsupported node: $node'; |
| 1168 } | 1151 } |
| 1169 } | 1152 } |
| 1170 | 1153 |
| 1171 typedef bool LibraryFilter(Library _); | 1154 typedef bool LibraryFilter(Library _); |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 _sink.add(_buffer.sublist(0, length)); | 1524 _sink.add(_buffer.sublist(0, length)); |
| 1542 _buffer = new Uint8List(SIZE); | 1525 _buffer = new Uint8List(SIZE); |
| 1543 flushedLength += length; | 1526 flushedLength += length; |
| 1544 length = 0; | 1527 length = 0; |
| 1545 } | 1528 } |
| 1546 | 1529 |
| 1547 void flushAndDestroy() { | 1530 void flushAndDestroy() { |
| 1548 _sink.add(_buffer.sublist(0, length)); | 1531 _sink.add(_buffer.sublist(0, length)); |
| 1549 } | 1532 } |
| 1550 } | 1533 } |
| OLD | NEW |