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 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 isSyntheticMixinImplementationFlag | | 389 isSyntheticMixinImplementationFlag | |
390 levelFlags; | 390 levelFlags; |
391 } | 391 } |
392 | 392 |
393 visitClass(Class node) { | 393 visitClass(Class node) { |
394 int flags = _encodeClassFlags(node.isAbstract, node.isEnum, | 394 int flags = _encodeClassFlags(node.isAbstract, node.isEnum, |
395 node.isSyntheticMixinImplementation, node.level); | 395 node.isSyntheticMixinImplementation, node.level); |
396 if (node.canonicalName == null) { | 396 if (node.canonicalName == null) { |
397 throw 'Missing canonical name for $node'; | 397 throw 'Missing canonical name for $node'; |
398 } | 398 } |
399 node.binaryOffset = _sink.flushedLength + _sink.length; | |
400 writeByte(Tag.Class); | 399 writeByte(Tag.Class); |
401 writeCanonicalNameReference(getCanonicalNameOfClass(node)); | 400 writeCanonicalNameReference(getCanonicalNameOfClass(node)); |
402 writeOffset(node.fileOffset); | 401 writeOffset(node.fileOffset); |
403 writeOffset(node.fileEndOffset); | 402 writeOffset(node.fileEndOffset); |
404 writeByte(flags); | 403 writeByte(flags); |
405 writeStringReference(node.name ?? ''); | 404 writeStringReference(node.name ?? ''); |
406 writeUriReference(node.fileUri ?? ''); | 405 writeUriReference(node.fileUri ?? ''); |
407 writeStringReference(node.documentationComment ?? ''); | 406 writeStringReference(node.documentationComment ?? ''); |
408 writeAnnotationList(node.annotations); | 407 writeAnnotationList(node.annotations); |
409 _typeParameterIndexer.enter(node.typeParameters); | 408 _typeParameterIndexer.enter(node.typeParameters); |
(...skipping 12 matching lines...) Expand all Loading... |
422 visitConstructor(Constructor node) { | 421 visitConstructor(Constructor node) { |
423 if (node.canonicalName == null) { | 422 if (node.canonicalName == null) { |
424 throw 'Missing canonical name for $node'; | 423 throw 'Missing canonical name for $node'; |
425 } | 424 } |
426 _variableIndexer = new VariableIndexer(); | 425 _variableIndexer = new VariableIndexer(); |
427 writeByte(Tag.Constructor); | 426 writeByte(Tag.Constructor); |
428 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 427 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
429 writeOffset(node.fileOffset); | 428 writeOffset(node.fileOffset); |
430 writeOffset(node.fileEndOffset); | 429 writeOffset(node.fileEndOffset); |
431 writeByte(node.flags); | 430 writeByte(node.flags); |
432 assert(node.parent is Class); | |
433 Class parent = node.parent; | |
434 writeUInt30(parent.binaryOffset); | |
435 writeName(node.name ?? _emptyName); | 431 writeName(node.name ?? _emptyName); |
436 writeStringReference(node.documentationComment ?? ''); | 432 writeStringReference(node.documentationComment ?? ''); |
437 writeAnnotationList(node.annotations); | 433 writeAnnotationList(node.annotations); |
438 assert(node.function.typeParameters.isEmpty); | 434 assert(node.function.typeParameters.isEmpty); |
439 writeNode(node.function); | 435 writeNode(node.function); |
440 // Parameters are in scope in the initializers. | 436 // Parameters are in scope in the initializers. |
441 _variableIndexer.restoreScope(node.function.positionalParameters.length + | 437 _variableIndexer.restoreScope(node.function.positionalParameters.length + |
442 node.function.namedParameters.length); | 438 node.function.namedParameters.length); |
443 writeNodeList(node.initializers); | 439 writeNodeList(node.initializers); |
444 _variableIndexer = null; | 440 _variableIndexer = null; |
445 } | 441 } |
446 | 442 |
447 visitProcedure(Procedure node) { | 443 visitProcedure(Procedure node) { |
448 if (node.canonicalName == null) { | 444 if (node.canonicalName == null) { |
449 throw 'Missing canonical name for $node'; | 445 throw 'Missing canonical name for $node'; |
450 } | 446 } |
451 _variableIndexer = new VariableIndexer(); | 447 _variableIndexer = new VariableIndexer(); |
452 writeByte(Tag.Procedure); | 448 writeByte(Tag.Procedure); |
453 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 449 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
454 writeOffset(node.fileOffset); | 450 writeOffset(node.fileOffset); |
455 writeOffset(node.fileEndOffset); | 451 writeOffset(node.fileEndOffset); |
456 writeByte(node.kind.index); | 452 writeByte(node.kind.index); |
457 writeByte(node.flags); | 453 writeByte(node.flags); |
458 if (node.parent is Class) { | |
459 Class parent = node.parent; | |
460 writeUInt30(parent.binaryOffset); | |
461 } else { | |
462 writeUInt30(0); // 0 is a valid offset, but not for a class. | |
463 } | |
464 writeName(node.name ?? ''); | 454 writeName(node.name ?? ''); |
465 writeUriReference(node.fileUri ?? ''); | 455 writeUriReference(node.fileUri ?? ''); |
466 writeStringReference(node.documentationComment ?? ''); | 456 writeStringReference(node.documentationComment ?? ''); |
467 writeAnnotationList(node.annotations); | 457 writeAnnotationList(node.annotations); |
468 writeOptionalNode(node.function); | 458 writeOptionalNode(node.function); |
469 _variableIndexer = null; | 459 _variableIndexer = null; |
470 } | 460 } |
471 | 461 |
472 visitField(Field node) { | 462 visitField(Field node) { |
473 if (node.canonicalName == null) { | 463 if (node.canonicalName == null) { |
474 throw 'Missing canonical name for $node'; | 464 throw 'Missing canonical name for $node'; |
475 } | 465 } |
476 _variableIndexer = new VariableIndexer(); | 466 _variableIndexer = new VariableIndexer(); |
477 writeByte(Tag.Field); | 467 writeByte(Tag.Field); |
478 writeCanonicalNameReference(getCanonicalNameOfMember(node)); | 468 writeCanonicalNameReference(getCanonicalNameOfMember(node)); |
479 writeOffset(node.fileOffset); | 469 writeOffset(node.fileOffset); |
480 writeOffset(node.fileEndOffset); | 470 writeOffset(node.fileEndOffset); |
481 writeByte(node.flags); | 471 writeByte(node.flags); |
482 if (node.parent is Class) { | |
483 Class parent = node.parent; | |
484 writeUInt30(parent.binaryOffset); | |
485 } else { | |
486 writeUInt30(0); // 0 is a valid offset, but not for a class. | |
487 } | |
488 writeName(node.name); | 472 writeName(node.name); |
489 writeUriReference(node.fileUri ?? ''); | 473 writeUriReference(node.fileUri ?? ''); |
490 writeStringReference(node.documentationComment ?? ''); | 474 writeStringReference(node.documentationComment ?? ''); |
491 writeAnnotationList(node.annotations); | 475 writeAnnotationList(node.annotations); |
492 writeNode(node.type); | 476 writeNode(node.type); |
493 writeOptionalNode(node.initializer); | 477 writeOptionalNode(node.initializer); |
494 _variableIndexer = null; | 478 _variableIndexer = null; |
495 } | 479 } |
496 | 480 |
497 visitInvalidInitializer(InvalidInitializer node) { | 481 visitInvalidInitializer(InvalidInitializer node) { |
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1171 writeByte(Tag.VectorType); | 1155 writeByte(Tag.VectorType); |
1172 } | 1156 } |
1173 | 1157 |
1174 visitTypedefType(TypedefType node) { | 1158 visitTypedefType(TypedefType node) { |
1175 writeByte(Tag.TypedefType); | 1159 writeByte(Tag.TypedefType); |
1176 writeReference(node.typedefReference); | 1160 writeReference(node.typedefReference); |
1177 writeNodeList(node.typeArguments); | 1161 writeNodeList(node.typeArguments); |
1178 } | 1162 } |
1179 | 1163 |
1180 visitTypeParameter(TypeParameter node) { | 1164 visitTypeParameter(TypeParameter node) { |
1181 node.binaryOffset = _sink.flushedLength + _sink.length; | |
1182 writeStringReference(node.name ?? ''); | 1165 writeStringReference(node.name ?? ''); |
1183 writeNode(node.bound); | 1166 writeNode(node.bound); |
1184 } | 1167 } |
1185 | 1168 |
1186 defaultNode(Node node) { | 1169 defaultNode(Node node) { |
1187 throw 'Unsupported node: $node'; | 1170 throw 'Unsupported node: $node'; |
1188 } | 1171 } |
1189 } | 1172 } |
1190 | 1173 |
1191 typedef bool LibraryFilter(Library _); | 1174 typedef bool LibraryFilter(Library _); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1567 _sink.add(_buffer.sublist(0, length)); | 1550 _sink.add(_buffer.sublist(0, length)); |
1568 _buffer = new Uint8List(SIZE); | 1551 _buffer = new Uint8List(SIZE); |
1569 flushedLength += length; | 1552 flushedLength += length; |
1570 length = 0; | 1553 length = 0; |
1571 } | 1554 } |
1572 | 1555 |
1573 void flushAndDestroy() { | 1556 void flushAndDestroy() { |
1574 _sink.add(_buffer.sublist(0, length)); | 1557 _sink.add(_buffer.sublist(0, length)); |
1575 } | 1558 } |
1576 } | 1559 } |
OLD | NEW |