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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 if (allowNull) { | 196 if (allowNull) { |
197 writeByte(Tag.NullReference); | 197 writeByte(Tag.NullReference); |
198 } else { | 198 } else { |
199 throw 'Expected a member reference to be valid but was `null`.'; | 199 throw 'Expected a member reference to be valid but was `null`.'; |
200 } | 200 } |
201 } else { | 201 } else { |
202 node.acceptReference(this); | 202 node.acceptReference(this); |
203 } | 203 } |
204 } | 204 } |
205 | 205 |
206 writeOffset(TreeNode node) { | 206 writeOffset(TreeNode node, int offset) { |
207 // TODO(jensj): Delta-encoding. | 207 // TODO(jensj): Delta-encoding. |
208 // File offset ranges from -1 and up, | 208 // File offset ranges from -1 and up, |
209 // but is here saved as unsigned (thus the +1) | 209 // but is here saved as unsigned (thus the +1) |
210 writeUInt30(node.fileOffset + 1); | 210 writeUInt30(offset + 1); |
211 } | 211 } |
212 | 212 |
213 void visitClassReference(Class node) { | 213 void visitClassReference(Class node) { |
214 var library = node.enclosingLibrary; | 214 var library = node.enclosingLibrary; |
215 writeByte(node.isMixinApplication | 215 writeByte(node.isMixinApplication |
216 ? Tag.MixinClassReference | 216 ? Tag.MixinClassReference |
217 : Tag.NormalClassReference); | 217 : Tag.NormalClassReference); |
218 writeLibraryReference(library); | 218 writeLibraryReference(library); |
219 writeClassIndex(node); | 219 writeClassIndex(node); |
220 } | 220 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 writeList(annotations, writeAnnotation); | 283 writeList(annotations, writeAnnotation); |
284 } | 284 } |
285 | 285 |
286 visitClass(Class node) { | 286 visitClass(Class node) { |
287 int flags = node.isAbstract ? 1 : 0; | 287 int flags = node.isAbstract ? 1 : 0; |
288 if (node.level == ClassLevel.Type) { | 288 if (node.level == ClassLevel.Type) { |
289 flags |= 0x2; | 289 flags |= 0x2; |
290 } | 290 } |
291 if (node.isMixinApplication) { | 291 if (node.isMixinApplication) { |
292 writeByte(Tag.MixinClass); | 292 writeByte(Tag.MixinClass); |
| 293 writeOffset(node, node.fileOffset); |
293 writeByte(flags); | 294 writeByte(flags); |
294 writeStringReference(node.name ?? ''); | 295 writeStringReference(node.name ?? ''); |
295 writeUriReference(node.fileUri ?? ''); | 296 writeUriReference(node.fileUri ?? ''); |
296 writeAnnotationList(node.annotations); | 297 writeAnnotationList(node.annotations); |
297 _typeParameterIndexer.enter(node.typeParameters); | 298 _typeParameterIndexer.enter(node.typeParameters); |
298 writeNodeList(node.typeParameters); | 299 writeNodeList(node.typeParameters); |
299 writeNode(node.supertype); | 300 writeNode(node.supertype); |
300 writeNode(node.mixedInType); | 301 writeNode(node.mixedInType); |
301 writeNodeList(node.implementedTypes); | 302 writeNodeList(node.implementedTypes); |
302 writeNodeList(node.constructors); | 303 writeNodeList(node.constructors); |
303 _typeParameterIndexer.exit(node.typeParameters); | 304 _typeParameterIndexer.exit(node.typeParameters); |
304 } else { | 305 } else { |
305 writeByte(Tag.NormalClass); | 306 writeByte(Tag.NormalClass); |
| 307 writeOffset(node, node.fileOffset); |
306 writeByte(flags); | 308 writeByte(flags); |
307 writeStringReference(node.name ?? ''); | 309 writeStringReference(node.name ?? ''); |
308 writeUriReference(node.fileUri ?? ''); | 310 writeUriReference(node.fileUri ?? ''); |
309 writeAnnotationList(node.annotations); | 311 writeAnnotationList(node.annotations); |
310 _typeParameterIndexer.enter(node.typeParameters); | 312 _typeParameterIndexer.enter(node.typeParameters); |
311 writeNodeList(node.typeParameters); | 313 writeNodeList(node.typeParameters); |
312 writeOptionalNode(node.supertype); | 314 writeOptionalNode(node.supertype); |
313 writeNodeList(node.implementedTypes); | 315 writeNodeList(node.implementedTypes); |
314 writeNodeList(node.fields); | 316 writeNodeList(node.fields); |
315 writeNodeList(node.constructors); | 317 writeNodeList(node.constructors); |
316 writeNodeList(node.procedures); | 318 writeNodeList(node.procedures); |
317 _typeParameterIndexer.exit(node.typeParameters); | 319 _typeParameterIndexer.exit(node.typeParameters); |
318 } | 320 } |
319 } | 321 } |
320 | 322 |
321 static final Name _emptyName = new Name(''); | 323 static final Name _emptyName = new Name(''); |
322 | 324 |
323 visitConstructor(Constructor node) { | 325 visitConstructor(Constructor node) { |
324 _variableIndexer = new VariableIndexer(); | 326 _variableIndexer = new VariableIndexer(); |
325 writeByte(Tag.Constructor); | 327 writeByte(Tag.Constructor); |
| 328 writeOffset(node, node.fileOffset); |
| 329 writeOffset(node, node.fileEndOffset); |
326 writeByte(node.flags); | 330 writeByte(node.flags); |
327 writeName(node.name ?? _emptyName); | 331 writeName(node.name ?? _emptyName); |
328 writeAnnotationList(node.annotations); | 332 writeAnnotationList(node.annotations); |
329 assert(node.function.typeParameters.isEmpty); | 333 assert(node.function.typeParameters.isEmpty); |
330 writeNode(node.function); | 334 writeNode(node.function); |
331 // Parameters are in scope in the initializers. | 335 // Parameters are in scope in the initializers. |
332 _variableIndexer.restoreScope(node.function.positionalParameters.length + | 336 _variableIndexer.restoreScope(node.function.positionalParameters.length + |
333 node.function.namedParameters.length); | 337 node.function.namedParameters.length); |
334 writeNodeList(node.initializers); | 338 writeNodeList(node.initializers); |
335 _variableIndexer = null; | 339 _variableIndexer = null; |
336 } | 340 } |
337 | 341 |
338 visitProcedure(Procedure node) { | 342 visitProcedure(Procedure node) { |
339 _variableIndexer = new VariableIndexer(); | 343 _variableIndexer = new VariableIndexer(); |
340 writeByte(Tag.Procedure); | 344 writeByte(Tag.Procedure); |
| 345 writeOffset(node, node.fileOffset); |
| 346 writeOffset(node, node.fileEndOffset); |
341 writeByte(node.kind.index); | 347 writeByte(node.kind.index); |
342 writeByte(node.flags); | 348 writeByte(node.flags); |
343 writeName(node.name ?? ''); | 349 writeName(node.name ?? ''); |
344 writeUriReference(node.fileUri ?? ''); | 350 writeUriReference(node.fileUri ?? ''); |
345 writeAnnotationList(node.annotations); | 351 writeAnnotationList(node.annotations); |
346 writeOptionalNode(node.function); | 352 writeOptionalNode(node.function); |
347 _variableIndexer = null; | 353 _variableIndexer = null; |
348 } | 354 } |
349 | 355 |
350 visitField(Field node) { | 356 visitField(Field node) { |
351 _variableIndexer = new VariableIndexer(); | 357 _variableIndexer = new VariableIndexer(); |
352 writeByte(Tag.Field); | 358 writeByte(Tag.Field); |
353 writeOffset(node); | 359 writeOffset(node, node.fileOffset); |
| 360 writeOffset(node, node.fileEndOffset); |
354 writeByte(node.flags); | 361 writeByte(node.flags); |
355 writeName(node.name ?? ''); | 362 writeName(node.name ?? ''); |
356 writeUriReference(node.fileUri ?? ''); | 363 writeUriReference(node.fileUri ?? ''); |
357 writeAnnotationList(node.annotations); | 364 writeAnnotationList(node.annotations); |
358 writeNode(node.type); | 365 writeNode(node.type); |
359 writeOptionalInferredValue(node.inferredValue); | 366 writeOptionalInferredValue(node.inferredValue); |
360 writeOptionalNode(node.initializer); | 367 writeOptionalNode(node.initializer); |
361 _variableIndexer = null; | 368 _variableIndexer = null; |
362 } | 369 } |
363 | 370 |
(...skipping 26 matching lines...) Expand all Loading... |
390 | 397 |
391 visitFunctionNode(FunctionNode node) { | 398 visitFunctionNode(FunctionNode node) { |
392 assert(_variableIndexer != null); | 399 assert(_variableIndexer != null); |
393 _variableIndexer.pushScope(); | 400 _variableIndexer.pushScope(); |
394 var oldLabels = _labelIndexer; | 401 var oldLabels = _labelIndexer; |
395 _labelIndexer = new LabelIndexer(); | 402 _labelIndexer = new LabelIndexer(); |
396 var oldCases = _switchCaseIndexer; | 403 var oldCases = _switchCaseIndexer; |
397 _switchCaseIndexer = new SwitchCaseIndexer(); | 404 _switchCaseIndexer = new SwitchCaseIndexer(); |
398 // Note: FunctionNode has no tag. | 405 // Note: FunctionNode has no tag. |
399 _typeParameterIndexer.enter(node.typeParameters); | 406 _typeParameterIndexer.enter(node.typeParameters); |
| 407 writeOffset(node, node.fileOffset); |
| 408 writeOffset(node, node.fileEndOffset); |
400 writeByte(node.asyncMarker.index); | 409 writeByte(node.asyncMarker.index); |
| 410 writeByte(node.debuggable ? 1 : 0); |
401 writeNodeList(node.typeParameters); | 411 writeNodeList(node.typeParameters); |
402 writeUInt30(node.requiredParameterCount); | 412 writeUInt30(node.requiredParameterCount); |
403 writeVariableDeclarationList(node.positionalParameters); | 413 writeVariableDeclarationList(node.positionalParameters); |
404 writeVariableDeclarationList(node.namedParameters); | 414 writeVariableDeclarationList(node.namedParameters); |
405 writeNode(node.returnType); | 415 writeNode(node.returnType); |
406 writeOptionalInferredValue(node.inferredReturnValue); | 416 writeOptionalInferredValue(node.inferredReturnValue); |
407 writeOptionalNode(node.body); | 417 writeOptionalNode(node.body); |
408 _labelIndexer = oldLabels; | 418 _labelIndexer = oldLabels; |
409 _switchCaseIndexer = oldCases; | 419 _switchCaseIndexer = oldCases; |
410 _typeParameterIndexer.exit(node.typeParameters); | 420 _typeParameterIndexer.exit(node.typeParameters); |
411 _variableIndexer.popScope(); | 421 _variableIndexer.popScope(); |
412 } | 422 } |
413 | 423 |
414 visitInvalidExpression(InvalidExpression node) { | 424 visitInvalidExpression(InvalidExpression node) { |
415 writeByte(Tag.InvalidExpression); | 425 writeByte(Tag.InvalidExpression); |
416 } | 426 } |
417 | 427 |
418 visitVariableGet(VariableGet node) { | 428 visitVariableGet(VariableGet node) { |
419 assert(_variableIndexer != null); | 429 assert(_variableIndexer != null); |
420 int index = _variableIndexer[node.variable]; | 430 int index = _variableIndexer[node.variable]; |
421 assert(index != null); | 431 assert(index != null); |
422 if (index & Tag.SpecializedPayloadMask == index && | 432 if (index & Tag.SpecializedPayloadMask == index && |
423 node.promotedType == null) { | 433 node.promotedType == null) { |
424 writeByte(Tag.SpecializedVariableGet + index); | 434 writeByte(Tag.SpecializedVariableGet + index); |
| 435 writeOffset(node, node.fileOffset); |
425 } else { | 436 } else { |
426 writeByte(Tag.VariableGet); | 437 writeByte(Tag.VariableGet); |
| 438 writeOffset(node, node.fileOffset); |
427 writeUInt30(_variableIndexer[node.variable]); | 439 writeUInt30(_variableIndexer[node.variable]); |
428 writeOptionalNode(node.promotedType); | 440 writeOptionalNode(node.promotedType); |
429 } | 441 } |
430 } | 442 } |
431 | 443 |
432 visitVariableSet(VariableSet node) { | 444 visitVariableSet(VariableSet node) { |
433 assert(_variableIndexer != null); | 445 assert(_variableIndexer != null); |
434 int index = _variableIndexer[node.variable]; | 446 int index = _variableIndexer[node.variable]; |
435 if (index & Tag.SpecializedPayloadMask == index) { | 447 if (index & Tag.SpecializedPayloadMask == index) { |
436 writeByte(Tag.SpecializedVariableSet + index); | 448 writeByte(Tag.SpecializedVariableSet + index); |
| 449 writeOffset(node, node.fileOffset); |
437 writeNode(node.value); | 450 writeNode(node.value); |
438 } else { | 451 } else { |
439 writeByte(Tag.VariableSet); | 452 writeByte(Tag.VariableSet); |
| 453 writeOffset(node, node.fileOffset); |
440 writeUInt30(_variableIndexer[node.variable]); | 454 writeUInt30(_variableIndexer[node.variable]); |
441 writeNode(node.value); | 455 writeNode(node.value); |
442 } | 456 } |
443 } | 457 } |
444 | 458 |
445 visitPropertyGet(PropertyGet node) { | 459 visitPropertyGet(PropertyGet node) { |
446 writeByte(Tag.PropertyGet); | 460 writeByte(Tag.PropertyGet); |
447 writeOffset(node); | 461 writeOffset(node, node.fileOffset); |
448 writeNode(node.receiver); | 462 writeNode(node.receiver); |
449 writeName(node.name); | 463 writeName(node.name); |
450 writeMemberReference(node.interfaceTarget, allowNull: true); | 464 writeMemberReference(node.interfaceTarget, allowNull: true); |
451 } | 465 } |
452 | 466 |
453 visitPropertySet(PropertySet node) { | 467 visitPropertySet(PropertySet node) { |
454 writeByte(Tag.PropertySet); | 468 writeByte(Tag.PropertySet); |
455 writeOffset(node); | 469 writeOffset(node, node.fileOffset); |
456 writeNode(node.receiver); | 470 writeNode(node.receiver); |
457 writeName(node.name); | 471 writeName(node.name); |
458 writeNode(node.value); | 472 writeNode(node.value); |
459 writeMemberReference(node.interfaceTarget, allowNull: true); | 473 writeMemberReference(node.interfaceTarget, allowNull: true); |
460 } | 474 } |
461 | 475 |
462 visitSuperPropertyGet(SuperPropertyGet node) { | 476 visitSuperPropertyGet(SuperPropertyGet node) { |
463 writeByte(Tag.SuperPropertyGet); | 477 writeByte(Tag.SuperPropertyGet); |
464 writeName(node.name); | 478 writeName(node.name); |
465 writeMemberReference(node.interfaceTarget, allowNull: true); | 479 writeMemberReference(node.interfaceTarget, allowNull: true); |
(...skipping 14 matching lines...) Expand all Loading... |
480 | 494 |
481 visitDirectPropertySet(DirectPropertySet node) { | 495 visitDirectPropertySet(DirectPropertySet node) { |
482 writeByte(Tag.DirectPropertySet); | 496 writeByte(Tag.DirectPropertySet); |
483 writeNode(node.receiver); | 497 writeNode(node.receiver); |
484 writeMemberReference(node.target); | 498 writeMemberReference(node.target); |
485 writeNode(node.value); | 499 writeNode(node.value); |
486 } | 500 } |
487 | 501 |
488 visitStaticGet(StaticGet node) { | 502 visitStaticGet(StaticGet node) { |
489 writeByte(Tag.StaticGet); | 503 writeByte(Tag.StaticGet); |
490 writeOffset(node); | 504 writeOffset(node, node.fileOffset); |
491 writeMemberReference(node.target); | 505 writeMemberReference(node.target); |
492 } | 506 } |
493 | 507 |
494 visitStaticSet(StaticSet node) { | 508 visitStaticSet(StaticSet node) { |
495 writeByte(Tag.StaticSet); | 509 writeByte(Tag.StaticSet); |
496 writeMemberReference(node.target); | 510 writeMemberReference(node.target); |
497 writeNode(node.value); | 511 writeNode(node.value); |
498 } | 512 } |
499 | 513 |
500 visitMethodInvocation(MethodInvocation node) { | 514 visitMethodInvocation(MethodInvocation node) { |
501 writeByte(Tag.MethodInvocation); | 515 writeByte(Tag.MethodInvocation); |
502 writeOffset(node); | 516 writeOffset(node, node.fileOffset); |
503 writeNode(node.receiver); | 517 writeNode(node.receiver); |
504 writeName(node.name); | 518 writeName(node.name); |
505 writeNode(node.arguments); | 519 writeNode(node.arguments); |
506 writeMemberReference(node.interfaceTarget, allowNull: true); | 520 writeMemberReference(node.interfaceTarget, allowNull: true); |
507 } | 521 } |
508 | 522 |
509 visitSuperMethodInvocation(SuperMethodInvocation node) { | 523 visitSuperMethodInvocation(SuperMethodInvocation node) { |
510 writeByte(Tag.SuperMethodInvocation); | 524 writeByte(Tag.SuperMethodInvocation); |
511 writeOffset(node); | 525 writeOffset(node, node.fileOffset); |
512 writeName(node.name); | 526 writeName(node.name); |
513 writeNode(node.arguments); | 527 writeNode(node.arguments); |
514 writeMemberReference(node.interfaceTarget, allowNull: true); | 528 writeMemberReference(node.interfaceTarget, allowNull: true); |
515 } | 529 } |
516 | 530 |
517 visitDirectMethodInvocation(DirectMethodInvocation node) { | 531 visitDirectMethodInvocation(DirectMethodInvocation node) { |
518 writeByte(Tag.DirectMethodInvocation); | 532 writeByte(Tag.DirectMethodInvocation); |
519 writeNode(node.receiver); | 533 writeNode(node.receiver); |
520 writeMemberReference(node.target); | 534 writeMemberReference(node.target); |
521 writeNode(node.arguments); | 535 writeNode(node.arguments); |
522 } | 536 } |
523 | 537 |
524 visitStaticInvocation(StaticInvocation node) { | 538 visitStaticInvocation(StaticInvocation node) { |
525 writeByte(node.isConst ? Tag.ConstStaticInvocation : Tag.StaticInvocation); | 539 writeByte(node.isConst ? Tag.ConstStaticInvocation : Tag.StaticInvocation); |
526 writeOffset(node); | 540 writeOffset(node, node.fileOffset); |
527 writeMemberReference(node.target); | 541 writeMemberReference(node.target); |
528 writeNode(node.arguments); | 542 writeNode(node.arguments); |
529 } | 543 } |
530 | 544 |
531 visitConstructorInvocation(ConstructorInvocation node) { | 545 visitConstructorInvocation(ConstructorInvocation node) { |
532 writeByte(node.isConst | 546 writeByte(node.isConst |
533 ? Tag.ConstConstructorInvocation | 547 ? Tag.ConstConstructorInvocation |
534 : Tag.ConstructorInvocation); | 548 : Tag.ConstructorInvocation); |
535 writeOffset(node); | 549 writeOffset(node, node.fileOffset); |
536 writeMemberReference(node.target); | 550 writeMemberReference(node.target); |
537 writeNode(node.arguments); | 551 writeNode(node.arguments); |
538 } | 552 } |
539 | 553 |
540 visitArguments(Arguments node) { | 554 visitArguments(Arguments node) { |
541 writeNodeList(node.types); | 555 writeNodeList(node.types); |
542 writeNodeList(node.positional); | 556 writeNodeList(node.positional); |
543 writeNodeList(node.named); | 557 writeNodeList(node.named); |
544 } | 558 } |
545 | 559 |
(...skipping 27 matching lines...) Expand all Loading... |
573 visitConditionalExpression(ConditionalExpression node) { | 587 visitConditionalExpression(ConditionalExpression node) { |
574 writeByte(Tag.ConditionalExpression); | 588 writeByte(Tag.ConditionalExpression); |
575 writeNode(node.condition); | 589 writeNode(node.condition); |
576 writeNode(node.then); | 590 writeNode(node.then); |
577 writeNode(node.otherwise); | 591 writeNode(node.otherwise); |
578 writeOptionalNode(node.staticType); | 592 writeOptionalNode(node.staticType); |
579 } | 593 } |
580 | 594 |
581 visitStringConcatenation(StringConcatenation node) { | 595 visitStringConcatenation(StringConcatenation node) { |
582 writeByte(Tag.StringConcatenation); | 596 writeByte(Tag.StringConcatenation); |
| 597 writeOffset(node, node.fileOffset); |
583 writeNodeList(node.expressions); | 598 writeNodeList(node.expressions); |
584 } | 599 } |
585 | 600 |
586 visitIsExpression(IsExpression node) { | 601 visitIsExpression(IsExpression node) { |
587 writeByte(Tag.IsExpression); | 602 writeByte(Tag.IsExpression); |
| 603 writeOffset(node, node.fileOffset); |
588 writeNode(node.operand); | 604 writeNode(node.operand); |
589 writeNode(node.type); | 605 writeNode(node.type); |
590 } | 606 } |
591 | 607 |
592 visitAsExpression(AsExpression node) { | 608 visitAsExpression(AsExpression node) { |
593 writeByte(Tag.AsExpression); | 609 writeByte(Tag.AsExpression); |
594 writeNode(node.operand); | 610 writeNode(node.operand); |
595 writeNode(node.type); | 611 writeNode(node.type); |
596 } | 612 } |
597 | 613 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 visitThisExpression(ThisExpression node) { | 664 visitThisExpression(ThisExpression node) { |
649 writeByte(Tag.ThisExpression); | 665 writeByte(Tag.ThisExpression); |
650 } | 666 } |
651 | 667 |
652 visitRethrow(Rethrow node) { | 668 visitRethrow(Rethrow node) { |
653 writeByte(Tag.Rethrow); | 669 writeByte(Tag.Rethrow); |
654 } | 670 } |
655 | 671 |
656 visitThrow(Throw node) { | 672 visitThrow(Throw node) { |
657 writeByte(Tag.Throw); | 673 writeByte(Tag.Throw); |
658 writeOffset(node); | 674 writeOffset(node, node.fileOffset); |
659 writeNode(node.expression); | 675 writeNode(node.expression); |
660 } | 676 } |
661 | 677 |
662 visitListLiteral(ListLiteral node) { | 678 visitListLiteral(ListLiteral node) { |
663 writeByte(node.isConst ? Tag.ConstListLiteral : Tag.ListLiteral); | 679 writeByte(node.isConst ? Tag.ConstListLiteral : Tag.ListLiteral); |
664 writeNode(node.typeArgument); | 680 writeNode(node.typeArgument); |
665 writeNodeList(node.expressions); | 681 writeNodeList(node.expressions); |
666 } | 682 } |
667 | 683 |
668 visitMapLiteral(MapLiteral node) { | 684 visitMapLiteral(MapLiteral node) { |
669 writeByte(node.isConst ? Tag.ConstMapLiteral : Tag.MapLiteral); | 685 writeByte(node.isConst ? Tag.ConstMapLiteral : Tag.MapLiteral); |
| 686 writeOffset(node, node.fileOffset); |
670 writeNode(node.keyType); | 687 writeNode(node.keyType); |
671 writeNode(node.valueType); | 688 writeNode(node.valueType); |
672 writeNodeList(node.entries); | 689 writeNodeList(node.entries); |
673 } | 690 } |
674 | 691 |
675 visitMapEntry(MapEntry node) { | 692 visitMapEntry(MapEntry node) { |
676 // Note: there is no tag on MapEntry | 693 // Note: there is no tag on MapEntry |
677 writeNode(node.key); | 694 writeNode(node.key); |
678 writeNode(node.value); | 695 writeNode(node.value); |
679 } | 696 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 | 811 |
795 visitIfStatement(IfStatement node) { | 812 visitIfStatement(IfStatement node) { |
796 writeByte(Tag.IfStatement); | 813 writeByte(Tag.IfStatement); |
797 writeNode(node.condition); | 814 writeNode(node.condition); |
798 writeNode(node.then); | 815 writeNode(node.then); |
799 writeStatementOrEmpty(node.otherwise); | 816 writeStatementOrEmpty(node.otherwise); |
800 } | 817 } |
801 | 818 |
802 visitReturnStatement(ReturnStatement node) { | 819 visitReturnStatement(ReturnStatement node) { |
803 writeByte(Tag.ReturnStatement); | 820 writeByte(Tag.ReturnStatement); |
| 821 writeOffset(node, node.fileOffset); |
804 writeOptionalNode(node.expression); | 822 writeOptionalNode(node.expression); |
805 } | 823 } |
806 | 824 |
807 visitTryCatch(TryCatch node) { | 825 visitTryCatch(TryCatch node) { |
808 writeByte(Tag.TryCatch); | 826 writeByte(Tag.TryCatch); |
809 writeNode(node.body); | 827 writeNode(node.body); |
810 writeNodeList(node.catches); | 828 writeNodeList(node.catches); |
811 } | 829 } |
812 | 830 |
813 visitCatch(Catch node) { | 831 visitCatch(Catch node) { |
814 // Note: there is no tag on Catch. | 832 // Note: there is no tag on Catch. |
815 _variableIndexer.pushScope(); | 833 _variableIndexer.pushScope(); |
816 writeNode(node.guard); | 834 writeNode(node.guard); |
817 writeOptionalVariableDeclaration(node.exception); | 835 writeOptionalVariableDeclaration(node.exception); |
818 writeOptionalVariableDeclaration(node.stackTrace); | 836 writeOptionalVariableDeclaration(node.stackTrace); |
819 writeNode(node.body); | 837 writeNode(node.body); |
820 _variableIndexer.popScope(); | 838 _variableIndexer.popScope(); |
821 } | 839 } |
822 | 840 |
823 visitTryFinally(TryFinally node) { | 841 visitTryFinally(TryFinally node) { |
824 writeByte(Tag.TryFinally); | 842 writeByte(Tag.TryFinally); |
825 writeNode(node.body); | 843 writeNode(node.body); |
826 writeNode(node.finalizer); | 844 writeNode(node.finalizer); |
827 } | 845 } |
828 | 846 |
829 visitYieldStatement(YieldStatement node) { | 847 visitYieldStatement(YieldStatement node) { |
830 writeByte(Tag.YieldStatement); | 848 writeByte(Tag.YieldStatement); |
| 849 writeOffset(node, node.fileOffset); |
831 writeByte(node.flags); | 850 writeByte(node.flags); |
832 writeNode(node.expression); | 851 writeNode(node.expression); |
833 } | 852 } |
834 | 853 |
835 visitVariableDeclaration(VariableDeclaration node) { | 854 visitVariableDeclaration(VariableDeclaration node) { |
836 writeByte(Tag.VariableDeclaration); | 855 writeByte(Tag.VariableDeclaration); |
837 writeVariableDeclaration(node); | 856 writeVariableDeclaration(node); |
838 } | 857 } |
839 | 858 |
840 void writeVariableDeclaration(VariableDeclaration node) { | 859 void writeVariableDeclaration(VariableDeclaration node) { |
| 860 writeOffset(node, node.fileOffset); |
841 writeByte(node.flags); | 861 writeByte(node.flags); |
842 writeStringReference(node.name ?? ''); | 862 writeStringReference(node.name ?? ''); |
843 writeNode(node.type); | 863 writeNode(node.type); |
844 writeOptionalInferredValue(node.inferredValue); | 864 writeOptionalInferredValue(node.inferredValue); |
845 writeOptionalNode(node.initializer); | 865 writeOptionalNode(node.initializer); |
846 // Declare the variable after its initializer. It is not in scope in its | 866 // Declare the variable after its initializer. It is not in scope in its |
847 // own initializer. | 867 // own initializer. |
848 _variableIndexer.declare(node); | 868 _variableIndexer.declare(node); |
849 } | 869 } |
850 | 870 |
851 void writeVariableDeclarationList(List<VariableDeclaration> nodes) { | 871 void writeVariableDeclarationList(List<VariableDeclaration> nodes) { |
852 writeList(nodes, writeVariableDeclaration); | 872 writeList(nodes, writeVariableDeclaration); |
853 } | 873 } |
854 | 874 |
855 void writeOptionalVariableDeclaration(VariableDeclaration node) { | 875 void writeOptionalVariableDeclaration(VariableDeclaration node) { |
856 if (node == null) { | 876 if (node == null) { |
857 writeByte(Tag.Nothing); | 877 writeByte(Tag.Nothing); |
858 } else { | 878 } else { |
859 writeByte(Tag.Something); | 879 writeByte(Tag.Something); |
860 writeVariableDeclaration(node); | 880 writeVariableDeclaration(node); |
861 } | 881 } |
862 } | 882 } |
863 | 883 |
864 visitFunctionDeclaration(FunctionDeclaration node) { | 884 visitFunctionDeclaration(FunctionDeclaration node) { |
865 writeByte(Tag.FunctionDeclaration); | 885 writeByte(Tag.FunctionDeclaration); |
| 886 writeOffset(node, node.fileOffset); |
866 writeVariableDeclaration(node.variable); | 887 writeVariableDeclaration(node.variable); |
867 writeNode(node.function); | 888 writeNode(node.function); |
868 } | 889 } |
869 | 890 |
870 visitBottomType(BottomType node) { | 891 visitBottomType(BottomType node) { |
871 writeByte(Tag.BottomType); | 892 writeByte(Tag.BottomType); |
872 } | 893 } |
873 | 894 |
874 visitInvalidType(InvalidType node) { | 895 visitInvalidType(InvalidType node) { |
875 writeByte(Tag.InvalidType); | 896 writeByte(Tag.InvalidType); |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 void flush() { | 1241 void flush() { |
1221 _sink.add(_buffer.sublist(0, length)); | 1242 _sink.add(_buffer.sublist(0, length)); |
1222 _buffer = new Uint8List(SIZE); | 1243 _buffer = new Uint8List(SIZE); |
1223 length = 0; | 1244 length = 0; |
1224 } | 1245 } |
1225 | 1246 |
1226 void flushAndDestroy() { | 1247 void flushAndDestroy() { |
1227 _sink.add(_buffer.sublist(0, length)); | 1248 _sink.add(_buffer.sublist(0, length)); |
1228 } | 1249 } |
1229 } | 1250 } |
OLD | NEW |