Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Side by Side Diff: pkg/kernel/lib/binary/ast_to_binary.dart

Issue 2626613002: More offsets in kernel (Closed)
Patch Set: Fixed FileOffset storage for classes in binary.md Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/kernel/lib/binary/ast_from_binary.dart ('k') | runtime/vm/kernel.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/kernel/lib/binary/ast_from_binary.dart ('k') | runtime/vm/kernel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698