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

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart

Issue 1229673006: Generated source mapping through CPS. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 5 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
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 4
5 library dart2js.ir_builder_task; 5 library dart2js.ir_builder_task;
6 6
7 import '../closure.dart' as closurelib; 7 import '../closure.dart' as closurelib;
8 import '../closure.dart' hide ClosureScope; 8 import '../closure.dart' hide ClosureScope;
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 redirectingConstructor.computeEffectiveTargetType(cls.thisType); 277 redirectingConstructor.computeEffectiveTargetType(cls.thisType);
278 CallStructure callStructure = new CallStructure( 278 CallStructure callStructure = new CallStructure(
279 redirectingSignature.parameterCount, 279 redirectingSignature.parameterCount,
280 namedParameters); 280 namedParameters);
281 arguments = normalizeStaticArguments(callStructure, targetConstructor, 281 arguments = normalizeStaticArguments(callStructure, targetConstructor,
282 arguments); 282 arguments);
283 ir.Primitive instance = irBuilder.buildConstructorInvocation( 283 ir.Primitive instance = irBuilder.buildConstructorInvocation(
284 targetConstructor, 284 targetConstructor,
285 callStructure, 285 callStructure,
286 targetType, 286 targetType,
287 arguments); 287 arguments,
288 irBuilder.buildReturn(instance); 288 sourceInformationBuilder.buildNew(node));
289 irBuilder.buildReturn(
290 value: instance,
291 sourceInformation: sourceInformationBuilder.buildReturn(node));
289 } 292 }
290 293
291 visitFor(ast.For node) { 294 visitFor(ast.For node) {
292 List<LocalElement> loopVariables = <LocalElement>[]; 295 List<LocalElement> loopVariables = <LocalElement>[];
293 if (node.initializer is ast.VariableDefinitions) { 296 if (node.initializer is ast.VariableDefinitions) {
294 ast.VariableDefinitions definitions = node.initializer; 297 ast.VariableDefinitions definitions = node.initializer;
295 for (ast.Node node in definitions.definitions.nodes) { 298 for (ast.Node node in definitions.definitions.nodes) {
296 LocalElement loopVariable = elements[node]; 299 LocalElement loopVariable = elements[node];
297 loopVariables.add(loopVariable); 300 loopVariables.add(loopVariable);
298 } 301 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 return null; 395 return null;
393 } 396 }
394 397
395 // Build(Return(e), C) = C'[InvokeContinuation(return, x)] 398 // Build(Return(e), C) = C'[InvokeContinuation(return, x)]
396 // where (C', x) = Build(e, C) 399 // where (C', x) = Build(e, C)
397 // 400 //
398 // Return without a subexpression is translated as if it were return null. 401 // Return without a subexpression is translated as if it were return null.
399 ir.Primitive visitReturn(ast.Return node) { 402 ir.Primitive visitReturn(ast.Return node) {
400 assert(irBuilder.isOpen); 403 assert(irBuilder.isOpen);
401 assert(invariant(node, node.beginToken.value != 'native')); 404 assert(invariant(node, node.beginToken.value != 'native'));
402 irBuilder.buildReturn(build(node.expression)); 405 irBuilder.buildReturn(
406 value: build(node.expression),
407 sourceInformation: sourceInformationBuilder.buildReturn(node));
403 return null; 408 return null;
404 } 409 }
405 410
406 visitSwitchStatement(ast.SwitchStatement node) { 411 visitSwitchStatement(ast.SwitchStatement node) {
407 assert(irBuilder.isOpen); 412 assert(irBuilder.isOpen);
408 // We do not handle switch statements with continue to labeled cases. 413 // We do not handle switch statements with continue to labeled cases.
409 for (ast.SwitchCase switchCase in node.cases) { 414 for (ast.SwitchCase switchCase in node.cases) {
410 for (ast.Node labelOrCase in switchCase.labelsAndCases) { 415 for (ast.Node labelOrCase in switchCase.labelsAndCases) {
411 if (labelOrCase is ast.Label) { 416 if (labelOrCase is ast.Label) {
412 LabelDefinition definition = elements.getLabelDefinition(labelOrCase); 417 LabelDefinition definition = elements.getLabelDefinition(labelOrCase);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 } 531 }
527 532
528 ConstantValue getConstantForNode(ast.Node node) { 533 ConstantValue getConstantForNode(ast.Node node) {
529 return irBuilder.state.constants.getConstantValueForNode(node, elements); 534 return irBuilder.state.constants.getConstantValueForNode(node, elements);
530 } 535 }
531 536
532 ConstantValue getConstantForVariable(VariableElement element) { 537 ConstantValue getConstantForVariable(VariableElement element) {
533 return irBuilder.state.constants.getConstantValueForVariable(element); 538 return irBuilder.state.constants.getConstantValueForVariable(element);
534 } 539 }
535 540
536 ir.Primitive buildConstantExpression(ConstantExpression expression) { 541 ir.Primitive buildConstantExpression(ConstantExpression expression,
542 SourceInformation sourceInformation) {
537 return irBuilder.buildConstant( 543 return irBuilder.buildConstant(
538 irBuilder.state.constants.getConstantValue(expression)); 544 irBuilder.state.constants.getConstantValue(expression),
545 sourceInformation: sourceInformation);
539 } 546 }
540 547
541 ir.Primitive visitLiteralList(ast.LiteralList node) { 548 ir.Primitive visitLiteralList(ast.LiteralList node) {
542 if (node.isConst) { 549 if (node.isConst) {
543 return translateConstant(node); 550 return translateConstant(node);
544 } 551 }
545 List<ir.Primitive> values = node.elements.nodes.mapToList(visit); 552 List<ir.Primitive> values = node.elements.nodes.mapToList(visit);
546 InterfaceType type = elements.getType(node); 553 InterfaceType type = elements.getType(node);
547 return irBuilder.buildListLiteral(type, values); 554 return irBuilder.buildListLiteral(type, values);
548 } 555 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 599
593 // ## Sends ## 600 // ## Sends ##
594 @override 601 @override
595 ir.Primitive visitAssert(ast.Send node, ast.Node condition, _) { 602 ir.Primitive visitAssert(ast.Send node, ast.Node condition, _) {
596 assert(irBuilder.isOpen); 603 assert(irBuilder.isOpen);
597 if (compiler.enableUserAssertions) { 604 if (compiler.enableUserAssertions) {
598 return giveup(node, 'assert in checked mode not implemented'); 605 return giveup(node, 'assert in checked mode not implemented');
599 } else { 606 } else {
600 // The call to assert and its argument expression must be ignored 607 // The call to assert and its argument expression must be ignored
601 // in production mode. 608 // in production mode.
602 // Assertions can only occur in expression statements, so no value needs 609 // Assertions can onl)y occur in expression statements, so no value needs
603 // to be returned. 610 // to be returned.
604 return null; 611 return null;
605 } 612 }
606 } 613 }
607 614
608 ir.Primitive visitNamedArgument(ast.NamedArgument node) { 615 ir.Primitive visitNamedArgument(ast.NamedArgument node) {
609 assert(irBuilder.isOpen); 616 assert(irBuilder.isOpen);
610 return visit(node.expression); 617 return visit(node.expression);
611 } 618 }
612 619
613 @override 620 @override
614 ir.Primitive visitExpressionInvoke(ast.Send node, 621 ir.Primitive visitExpressionInvoke(ast.Send node,
615 ast.Node expression, 622 ast.Node expression,
616 ast.NodeList arguments, 623 ast.NodeList argumentsNode,
617 Selector selector, _) { 624 Selector selector, _) {
618 ir.Primitive receiver = visit(expression); 625 ir.Primitive receiver = visit(expression);
619 List<ir.Primitive> arguments = node.arguments.mapToList(visit); 626 List<ir.Primitive> arguments = node.arguments.mapToList(visit);
620 arguments = normalizeDynamicArguments(selector.callStructure, arguments); 627 arguments = normalizeDynamicArguments(selector.callStructure, arguments);
621 return irBuilder.buildCallInvocation( 628 return irBuilder.buildCallInvocation(
622 receiver, selector.callStructure, arguments); 629 receiver, selector.callStructure, arguments,
630 sourceInformation:
631 sourceInformationBuilder.buildCall(node, argumentsNode));
623 } 632 }
624 633
625 /// Returns `true` if [node] is a super call. 634 /// Returns `true` if [node] is a super call.
626 // TODO(johnniwinther): Remove the need for this. 635 // TODO(johnniwinther): Remove the need for this.
627 bool isSuperCall(ast.Send node) { 636 bool isSuperCall(ast.Send node) {
628 return node != null && node.receiver != null && node.receiver.isSuper(); 637 return node != null && node.receiver != null && node.receiver.isSuper();
629 } 638 }
630 639
631 @override 640 @override
632 ir.Primitive handleConstantGet( 641 ir.Primitive handleConstantGet(
633 ast.Node node, 642 ast.Node node,
634 ConstantExpression constant, _) { 643 ConstantExpression constant, _) {
635 return buildConstantExpression(constant); 644 return buildConstantExpression(constant,
645 sourceInformationBuilder.buildGet(node));
636 } 646 }
637 647
638 /// If [node] is null, returns this. 648 /// If [node] is null, returns this.
639 /// Otherwise visits [node] and returns the result. 649 /// Otherwise visits [node] and returns the result.
640 ir.Primitive translateReceiver(ast.Expression node) { 650 ir.Primitive translateReceiver(ast.Expression node) {
641 return node != null ? visit(node) : irBuilder.buildThis(); 651 return node != null ? visit(node) : irBuilder.buildThis();
642 } 652 }
643 653
644 @override 654 @override
645 ir.Primitive handleDynamicGet( 655 ir.Primitive handleDynamicGet(
(...skipping 18 matching lines...) Expand all
664 target, 674 target,
665 nested(() => irBuilder.buildDynamicGet( 675 nested(() => irBuilder.buildDynamicGet(
666 target, selector, elements.getTypeMask(node)))); 676 target, selector, elements.getTypeMask(node))));
667 } 677 }
668 678
669 @override 679 @override
670 ir.Primitive visitDynamicTypeLiteralGet( 680 ir.Primitive visitDynamicTypeLiteralGet(
671 ast.Send node, 681 ast.Send node,
672 ConstantExpression constant, 682 ConstantExpression constant,
673 _) { 683 _) {
674 return buildConstantExpression(constant); 684 return buildConstantExpression(constant,
685 sourceInformationBuilder.buildGet(node));
675 } 686 }
676 687
677 @override 688 @override
678 ir.Primitive visitLocalVariableGet( 689 ir.Primitive visitLocalVariableGet(
679 ast.Send node, 690 ast.Send node,
680 LocalVariableElement element, 691 LocalVariableElement element,
681 _) { 692 _) {
682 return element.isConst 693 return element.isConst
683 ? irBuilder.buildConstant(getConstantForVariable(element)) 694 ? irBuilder.buildConstant(getConstantForVariable(element),
695 sourceInformation: sourceInformationBuilder.buildGet(node))
684 : irBuilder.buildLocalVariableGet(element); 696 : irBuilder.buildLocalVariableGet(element);
685 } 697 }
686 698
687 @override 699 @override
688 ir.Primitive handleLocalGet( 700 ir.Primitive handleLocalGet(
689 ast.Send node, 701 ast.Send node,
690 LocalElement element, 702 LocalElement element,
691 _) { 703 _) {
692 return irBuilder.buildLocalVariableGet(element); 704 return irBuilder.buildLocalVariableGet(element);
693 } 705 }
(...skipping 16 matching lines...) Expand all
710 return giveup(node, 'handleStaticFunctionGet: foreign: $function'); 722 return giveup(node, 'handleStaticFunctionGet: foreign: $function');
711 } 723 }
712 return irBuilder.buildStaticFunctionGet(function); 724 return irBuilder.buildStaticFunctionGet(function);
713 } 725 }
714 726
715 @override 727 @override
716 ir.Primitive handleStaticGetterGet( 728 ir.Primitive handleStaticGetterGet(
717 ast.Send node, 729 ast.Send node,
718 FunctionElement getter, 730 FunctionElement getter,
719 _) { 731 _) {
720 return irBuilder.buildStaticGetterGet(getter); 732 return irBuilder.buildStaticGetterGet(
733 getter, sourceInformationBuilder.buildGet(node));
721 } 734 }
722 735
723 @override 736 @override
724 ir.Primitive visitSuperFieldGet( 737 ir.Primitive visitSuperFieldGet(
725 ast.Send node, 738 ast.Send node,
726 FieldElement field, 739 FieldElement field,
727 _) { 740 _) {
728 return irBuilder.buildSuperFieldGet(field); 741 return irBuilder.buildSuperFieldGet(field);
729 } 742 }
730 743
731 @override 744 @override
732 ir.Primitive visitSuperGetterGet( 745 ir.Primitive visitSuperGetterGet(
733 ast.Send node, 746 ast.Send node,
734 FunctionElement getter, 747 FunctionElement getter,
735 _) { 748 _) {
736 return irBuilder.buildSuperGetterGet(getter); 749 return irBuilder.buildSuperGetterGet(
750 getter, sourceInformationBuilder.buildGet(node));
737 } 751 }
738 752
739 @override 753 @override
740 ir.Primitive visitSuperMethodGet( 754 ir.Primitive visitSuperMethodGet(
741 ast.Send node, 755 ast.Send node,
742 MethodElement method, 756 MethodElement method,
743 _) { 757 _) {
744 return irBuilder.buildSuperMethodGet(method); 758 return irBuilder.buildSuperMethodGet(method);
745 } 759 }
746 760
747 @override 761 @override
748 ir.Primitive visitUnresolvedSuperGet( 762 ir.Primitive visitUnresolvedSuperGet(
749 ast.Send node, 763 ast.Send node,
750 Element element, _) { 764 Element element, _) {
751 return buildInstanceNoSuchMethod( 765 return buildInstanceNoSuchMethod(
752 elements.getSelector(node), elements.getTypeMask(node), []); 766 elements.getSelector(node), elements.getTypeMask(node), []);
753 } 767 }
754 768
755 @override 769 @override
756 ir.Primitive visitThisGet(ast.Identifier node, _) { 770 ir.Primitive visitThisGet(ast.Identifier node, _) {
757 if (irBuilder.state.thisParameter == null) { 771 if (irBuilder.state.thisParameter == null) {
758 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method. 772 // TODO(asgerf,johnniwinther): Should be in a visitInvalidThis method.
759 // 'this' in static context. Just translate to null. 773 // 'this' in static context. Just translate to null.
760 assert(compiler.compilationFailed); 774 assert(compiler.compilationFailed);
761 return irBuilder.buildNullConstant(); 775 return irBuilder.buildNullConstant();
762 } 776 }
763 return irBuilder.buildThis(); 777 return irBuilder.buildThis();
764 } 778 }
765 779
766 ir.Primitive translateTypeVariableTypeLiteral(TypeVariableElement element) { 780 ir.Primitive translateTypeVariableTypeLiteral(
767 return irBuilder.buildReifyTypeVariable(element.type); 781 TypeVariableElement element,
782 SourceInformation sourceInformation) {
783 return irBuilder.buildReifyTypeVariable(element.type, sourceInformation);
768 } 784 }
769 785
770 @override 786 @override
771 ir.Primitive visitTypeVariableTypeLiteralGet(ast.Send node, 787 ir.Primitive visitTypeVariableTypeLiteralGet(ast.Send node,
772 TypeVariableElement element, _) { 788 TypeVariableElement element, _) {
773 return translateTypeVariableTypeLiteral(element); 789 return translateTypeVariableTypeLiteral(element,
790 sourceInformationBuilder.buildGet(node));
774 } 791 }
775 792
776 ir.Primitive translateLogicalOperator(ast.Expression left, 793 ir.Primitive translateLogicalOperator(ast.Expression left,
777 ast.Expression right, 794 ast.Expression right,
778 {bool isLazyOr}) { 795 {bool isLazyOr}) {
779 ir.Primitive leftValue = visit(left); 796 ir.Primitive leftValue = visit(left);
780 797
781 ir.Primitive buildRightValue(IrBuilder rightBuilder) { 798 ir.Primitive buildRightValue(IrBuilder rightBuilder) {
782 return withBuilder(rightBuilder, () => visit(right)); 799 return withBuilder(rightBuilder, () => visit(right));
783 } 800 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 852
836 ir.Primitive translateBinary(ast.Send node, 853 ir.Primitive translateBinary(ast.Send node,
837 ast.Node left, 854 ast.Node left,
838 op.BinaryOperator operator, 855 op.BinaryOperator operator,
839 ast.Node right) { 856 ast.Node right) {
840 Selector selector = new Selector.binaryOperator(operator.selectorName); 857 Selector selector = new Selector.binaryOperator(operator.selectorName);
841 ir.Primitive receiver = visit(left); 858 ir.Primitive receiver = visit(left);
842 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)]; 859 List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
843 arguments = normalizeDynamicArguments(selector.callStructure, arguments); 860 arguments = normalizeDynamicArguments(selector.callStructure, arguments);
844 return irBuilder.buildDynamicInvocation( 861 return irBuilder.buildDynamicInvocation(
845 receiver, selector, elements.getTypeMask(node), arguments); 862 receiver, selector, elements.getTypeMask(node), arguments,
863 sourceInformation:
864 sourceInformationBuilder.buildCall(node, node.selector));
846 } 865 }
847 866
848 @override 867 @override
849 ir.Primitive visitBinary(ast.Send node, 868 ir.Primitive visitBinary(ast.Send node,
850 ast.Node left, 869 ast.Node left,
851 op.BinaryOperator operator, 870 op.BinaryOperator operator,
852 ast.Node right, _) { 871 ast.Node right, _) {
853 return translateBinary(node, left, operator, right); 872 return translateBinary(node, left, operator, right);
854 } 873 }
855 874
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 // semantic correlation between arguments and invocation. 991 // semantic correlation between arguments and invocation.
973 List<ir.Primitive> translateStaticArguments(ast.NodeList nodeList, 992 List<ir.Primitive> translateStaticArguments(ast.NodeList nodeList,
974 Element element, 993 Element element,
975 CallStructure callStructure) { 994 CallStructure callStructure) {
976 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit); 995 List<ir.Primitive> arguments = nodeList.nodes.mapToList(visit);
977 return normalizeStaticArguments(callStructure, element, arguments); 996 return normalizeStaticArguments(callStructure, element, arguments);
978 } 997 }
979 998
980 ir.Primitive translateCallInvoke(ir.Primitive target, 999 ir.Primitive translateCallInvoke(ir.Primitive target,
981 ast.NodeList arguments, 1000 ast.NodeList arguments,
982 CallStructure callStructure) { 1001 CallStructure callStructure,
1002 SourceInformation sourceInformation) {
983 1003
984 return irBuilder.buildCallInvocation(target, callStructure, 1004 return irBuilder.buildCallInvocation(target, callStructure,
985 translateDynamicArguments(arguments, callStructure)); 1005 translateDynamicArguments(arguments, callStructure),
1006 sourceInformation: sourceInformation);
986 } 1007 }
987 1008
988 @override 1009 @override
989 ir.Primitive handleConstantInvoke( 1010 ir.Primitive handleConstantInvoke(
990 ast.Send node, 1011 ast.Send node,
991 ConstantExpression constant, 1012 ConstantExpression constant,
992 ast.NodeList arguments, 1013 ast.NodeList arguments,
993 CallStructure callStructure, 1014 CallStructure callStructure,
994 _) { 1015 _) {
995 ir.Primitive target = buildConstantExpression(constant); 1016 ir.Primitive target = buildConstantExpression(constant,
996 return translateCallInvoke(target, arguments, callStructure); 1017 sourceInformationBuilder.buildGet(node));
1018 return translateCallInvoke(target, arguments, callStructure,
1019 sourceInformationBuilder.buildCall(node, arguments));
997 } 1020 }
998 1021
999 @override 1022 @override
1000 ir.Primitive handleDynamicInvoke( 1023 ir.Primitive handleDynamicInvoke(
1001 ast.Send node, 1024 ast.Send node,
1002 ast.Node receiver, 1025 ast.Node receiver,
1003 ast.NodeList arguments, 1026 ast.NodeList arguments,
1004 Selector selector, 1027 Selector selector,
1005 _) { 1028 _) {
1006 return irBuilder.buildDynamicInvocation( 1029 return irBuilder.buildDynamicInvocation(
1007 translateReceiver(receiver), selector, elements.getTypeMask(node), 1030 translateReceiver(receiver), selector, elements.getTypeMask(node),
1008 translateDynamicArguments(arguments, selector.callStructure)); 1031 translateDynamicArguments(arguments, selector.callStructure),
1032 sourceInformation:
1033 sourceInformationBuilder.buildCall(node, node.selector));
1009 } 1034 }
1010 1035
1011 @override 1036 @override
1012 ir.Primitive visitIfNotNullDynamicPropertyInvoke( 1037 ir.Primitive visitIfNotNullDynamicPropertyInvoke(
1013 ast.Send node, 1038 ast.Send node,
1014 ast.Node receiver, 1039 ast.Node receiver,
1015 ast.NodeList arguments, 1040 ast.NodeList arguments,
1016 Selector selector, 1041 Selector selector,
1017 _) { 1042 _) {
1018 ir.Primitive target = visit(receiver); 1043 ir.Primitive target = visit(receiver);
1019 return irBuilder.buildIfNotNullSend( 1044 return irBuilder.buildIfNotNullSend(
1020 target, 1045 target,
1021 nested(() => irBuilder.buildDynamicInvocation( 1046 nested(() => irBuilder.buildDynamicInvocation(
1022 target, selector, elements.getTypeMask(node), 1047 target, selector, elements.getTypeMask(node),
1023 translateDynamicArguments(arguments, selector.callStructure)))); 1048 translateDynamicArguments(arguments, selector.callStructure))));
1024 } 1049 }
1025 1050
1026 ir.Primitive handleLocalInvoke( 1051 ir.Primitive handleLocalInvoke(
1027 ast.Send node, 1052 ast.Send node,
1028 LocalElement element, 1053 LocalElement element,
1029 ast.NodeList arguments, 1054 ast.NodeList arguments,
1030 CallStructure callStructure, 1055 CallStructure callStructure,
1031 _) { 1056 _) {
1032 return irBuilder.buildLocalVariableInvocation(element, callStructure, 1057 return irBuilder.buildLocalVariableInvocation(element, callStructure,
1033 translateDynamicArguments(arguments, callStructure)); 1058 translateDynamicArguments(arguments, callStructure),
1059 callSourceInformation:
1060 sourceInformationBuilder.buildCall(node, arguments));
1034 } 1061 }
1035 1062
1036 @override 1063 @override
1037 ir.Primitive visitLocalFunctionInvoke( 1064 ir.Primitive visitLocalFunctionInvoke(
1038 ast.Send node, 1065 ast.Send node,
1039 LocalFunctionElement function, 1066 LocalFunctionElement function,
1040 ast.NodeList arguments, 1067 ast.NodeList arguments,
1041 CallStructure callStructure, 1068 CallStructure callStructure,
1042 _) { 1069 _) {
1043 return irBuilder.buildLocalFunctionInvocation(function, callStructure, 1070 return irBuilder.buildLocalFunctionInvocation(function, callStructure,
1044 translateDynamicArguments(arguments, callStructure)); 1071 translateDynamicArguments(arguments, callStructure),
1072 sourceInformationBuilder.buildCall(node, arguments));
1045 } 1073 }
1046 1074
1047 @override 1075 @override
1048 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { 1076 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) {
1049 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node)); 1077 return buildStaticFieldGet(field, sourceInformationBuilder.buildGet(node));
1050 } 1078 }
1051 1079
1052 @override 1080 @override
1053 ir.Primitive handleStaticFieldInvoke( 1081 ir.Primitive handleStaticFieldInvoke(
1054 ast.Send node, 1082 ast.Send node,
1055 FieldElement field, 1083 FieldElement field,
1056 ast.NodeList arguments, 1084 ast.NodeList arguments,
1057 CallStructure callStructure, 1085 CallStructure callStructure,
1058 _) { 1086 _) {
1059 SourceInformation src = sourceInformationBuilder.buildGet(node); 1087 SourceInformation src = sourceInformationBuilder.buildGet(node);
1060 ir.Primitive target = buildStaticFieldGet(field, src); 1088 ir.Primitive target = buildStaticFieldGet(field, src);
1061 return irBuilder.buildCallInvocation(target, 1089 return irBuilder.buildCallInvocation(target,
1062 callStructure, 1090 callStructure,
1063 translateDynamicArguments(arguments, callStructure)); 1091 translateDynamicArguments(arguments, callStructure),
1092 sourceInformation:
1093 sourceInformationBuilder.buildCall(node, arguments));
1064 } 1094 }
1065 1095
1066 @override 1096 @override
1067 ir.Primitive handleStaticFunctionInvoke( 1097 ir.Primitive handleStaticFunctionInvoke(
1068 ast.Send node, 1098 ast.Send node,
1069 MethodElement function, 1099 MethodElement function,
1070 ast.NodeList arguments, 1100 ast.NodeList arguments,
1071 CallStructure callStructure, 1101 CallStructure callStructure,
1072 _); 1102 _);
1073 1103
(...skipping 11 matching lines...) Expand all
1085 @override 1115 @override
1086 ir.Primitive handleStaticGetterInvoke( 1116 ir.Primitive handleStaticGetterInvoke(
1087 ast.Send node, 1117 ast.Send node,
1088 FunctionElement getter, 1118 FunctionElement getter,
1089 ast.NodeList arguments, 1119 ast.NodeList arguments,
1090 CallStructure callStructure, 1120 CallStructure callStructure,
1091 _) { 1121 _) {
1092 if (compiler.backend.isForeign(getter)) { 1122 if (compiler.backend.isForeign(getter)) {
1093 return giveup(node, 'handleStaticGetterInvoke: foreign: $getter'); 1123 return giveup(node, 'handleStaticGetterInvoke: foreign: $getter');
1094 } 1124 }
1095 ir.Primitive target = irBuilder.buildStaticGetterGet(getter); 1125 ir.Primitive target = irBuilder.buildStaticGetterGet(
1126 getter, sourceInformationBuilder.buildGet(node));
1096 return irBuilder.buildCallInvocation(target, 1127 return irBuilder.buildCallInvocation(target,
1097 callStructure, 1128 callStructure,
1098 translateDynamicArguments(arguments, callStructure)); 1129 translateDynamicArguments(arguments, callStructure),
1130 sourceInformation:
1131 sourceInformationBuilder.buildCall(node, arguments));
1099 } 1132 }
1100 1133
1101 @override 1134 @override
1102 ir.Primitive visitSuperFieldInvoke( 1135 ir.Primitive visitSuperFieldInvoke(
1103 ast.Send node, 1136 ast.Send node,
1104 FieldElement field, 1137 FieldElement field,
1105 ast.NodeList arguments, 1138 ast.NodeList arguments,
1106 CallStructure callStructure, 1139 CallStructure callStructure,
1107 _) { 1140 _) {
1108 ir.Primitive target = irBuilder.buildSuperFieldGet(field); 1141 ir.Primitive target = irBuilder.buildSuperFieldGet(field);
1109 return irBuilder.buildCallInvocation(target, 1142 return irBuilder.buildCallInvocation(target,
1110 callStructure, 1143 callStructure,
1111 translateDynamicArguments(arguments, callStructure)); 1144 translateDynamicArguments(arguments, callStructure),
1145 sourceInformation:
1146 sourceInformationBuilder.buildCall(node, arguments));
1112 } 1147 }
1113 1148
1114 @override 1149 @override
1115 ir.Primitive visitSuperGetterInvoke( 1150 ir.Primitive visitSuperGetterInvoke(
1116 ast.Send node, 1151 ast.Send node,
1117 FunctionElement getter, 1152 FunctionElement getter,
1118 ast.NodeList arguments, 1153 ast.NodeList arguments,
1119 CallStructure callStructure, 1154 CallStructure callStructure,
1120 _) { 1155 _) {
1121 ir.Primitive target = irBuilder.buildSuperGetterGet(getter); 1156 ir.Primitive target = irBuilder.buildSuperGetterGet(
1157 getter, sourceInformationBuilder.buildGet(node));
1122 return irBuilder.buildCallInvocation(target, 1158 return irBuilder.buildCallInvocation(target,
1123 callStructure, 1159 callStructure,
1124 translateDynamicArguments(arguments, callStructure)); 1160 translateDynamicArguments(arguments, callStructure),
1161 sourceInformation:
1162 sourceInformationBuilder.buildCall(node, arguments));
1125 } 1163 }
1126 1164
1127 @override 1165 @override
1128 ir.Primitive visitSuperMethodInvoke( 1166 ir.Primitive visitSuperMethodInvoke(
1129 ast.Send node, 1167 ast.Send node,
1130 MethodElement method, 1168 MethodElement method,
1131 ast.NodeList arguments, 1169 ast.NodeList arguments,
1132 CallStructure callStructure, 1170 CallStructure callStructure,
1133 _) { 1171 _) {
1134 return irBuilder.buildSuperMethodInvocation(method, callStructure, 1172 return irBuilder.buildSuperMethodInvocation(method, callStructure,
1135 translateDynamicArguments(arguments, callStructure)); 1173 translateDynamicArguments(arguments, callStructure),
1174 sourceInformation:
1175 sourceInformationBuilder.buildCall(node, node.selector));
1136 } 1176 }
1137 1177
1138 @override 1178 @override
1139 ir.Primitive visitSuperMethodIncompatibleInvoke( 1179 ir.Primitive visitSuperMethodIncompatibleInvoke(
1140 ast.Send node, 1180 ast.Send node,
1141 MethodElement method, 1181 MethodElement method,
1142 ast.NodeList arguments, 1182 ast.NodeList arguments,
1143 CallStructure callStructure, _) { 1183 CallStructure callStructure, _) {
1144 return buildInstanceNoSuchMethod( 1184 return buildInstanceNoSuchMethod(
1145 elements.getSelector(node), 1185 elements.getSelector(node),
(...skipping 12 matching lines...) Expand all
1158 elements.getTypeMask(node), 1198 elements.getTypeMask(node),
1159 translateDynamicArguments(arguments, selector.callStructure)); 1199 translateDynamicArguments(arguments, selector.callStructure));
1160 } 1200 }
1161 1201
1162 @override 1202 @override
1163 ir.Primitive visitThisInvoke( 1203 ir.Primitive visitThisInvoke(
1164 ast.Send node, 1204 ast.Send node,
1165 ast.NodeList arguments, 1205 ast.NodeList arguments,
1166 CallStructure callStructure, 1206 CallStructure callStructure,
1167 _) { 1207 _) {
1168 return translateCallInvoke(irBuilder.buildThis(), arguments, callStructure); 1208 return translateCallInvoke(
1209 irBuilder.buildThis(),
1210 arguments,
1211 callStructure,
1212 sourceInformationBuilder.buildCall(node, arguments));
1169 } 1213 }
1170 1214
1171 @override 1215 @override
1172 ir.Primitive visitTypeVariableTypeLiteralInvoke( 1216 ir.Primitive visitTypeVariableTypeLiteralInvoke(
1173 ast.Send node, 1217 ast.Send node,
1174 TypeVariableElement element, 1218 TypeVariableElement element,
1175 ast.NodeList arguments, 1219 ast.NodeList arguments,
1176 CallStructure callStructure, 1220 CallStructure callStructure,
1177 _) { 1221 _) {
1178 return translateCallInvoke( 1222 return translateCallInvoke(
1179 translateTypeVariableTypeLiteral(element), 1223 translateTypeVariableTypeLiteral(
1224 element, sourceInformationBuilder.buildGet(node)),
1180 arguments, 1225 arguments,
1181 callStructure); 1226 callStructure,
1227 sourceInformationBuilder.buildCall(node, arguments));
1182 } 1228 }
1183 1229
1184 @override 1230 @override
1185 ir.Primitive visitIndexSet( 1231 ir.Primitive visitIndexSet(
1186 ast.SendSet node, 1232 ast.SendSet node,
1187 ast.Node receiver, 1233 ast.Node receiver,
1188 ast.Node index, 1234 ast.Node index,
1189 ast.Node rhs, 1235 ast.Node rhs,
1190 _) { 1236 _) {
1191 return irBuilder.buildDynamicIndexSet( 1237 return irBuilder.buildDynamicIndexSet(
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 return irBuilder.buildStaticSetterSet(setter, visit(rhs)); 1366 return irBuilder.buildStaticSetterSet(setter, visit(rhs));
1321 } 1367 }
1322 1368
1323 @override 1369 @override
1324 ir.Primitive handleTypeLiteralConstantCompounds( 1370 ir.Primitive handleTypeLiteralConstantCompounds(
1325 ast.SendSet node, 1371 ast.SendSet node,
1326 ConstantExpression constant, 1372 ConstantExpression constant,
1327 CompoundRhs rhs, 1373 CompoundRhs rhs,
1328 arg) { 1374 arg) {
1329 return translateCompounds( 1375 return translateCompounds(
1330 getValue: () => buildConstantExpression(constant), 1376 getValue: () {
1377 return buildConstantExpression(constant,
1378 sourceInformationBuilder.buildGet(node));
1379 },
1331 rhs: rhs, 1380 rhs: rhs,
1332 setValue: (value) {}, // The binary operator will throw before this. 1381 setValue: (value) {}, // The binary operator will throw before this.
1333 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); 1382 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node));
1334 } 1383 }
1335 1384
1336 @override 1385 @override
1337 ir.Primitive handleDynamicCompounds( 1386 ir.Primitive handleDynamicCompounds(
1338 ast.SendSet node, 1387 ast.SendSet node,
1339 ast.Node receiver, 1388 ast.Node receiver,
1340 CompoundRhs rhs, 1389 CompoundRhs rhs,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1412 CompoundSetter setterKind, 1461 CompoundSetter setterKind,
1413 CompoundRhs rhs, 1462 CompoundRhs rhs,
1414 arg) { 1463 arg) {
1415 return translateCompounds( 1464 return translateCompounds(
1416 getValue: () { 1465 getValue: () {
1417 switch (getterKind) { 1466 switch (getterKind) {
1418 case CompoundGetter.FIELD: 1467 case CompoundGetter.FIELD:
1419 SourceInformation src = sourceInformationBuilder.buildGet(node); 1468 SourceInformation src = sourceInformationBuilder.buildGet(node);
1420 return irBuilder.buildStaticFieldGet(getter, src); 1469 return irBuilder.buildStaticFieldGet(getter, src);
1421 case CompoundGetter.GETTER: 1470 case CompoundGetter.GETTER:
1422 return irBuilder.buildStaticGetterGet(getter); 1471 return irBuilder.buildStaticGetterGet(
1472 getter, sourceInformationBuilder.buildGet(node));
1423 case CompoundGetter.METHOD: 1473 case CompoundGetter.METHOD:
1424 return irBuilder.buildStaticFunctionGet(getter); 1474 return irBuilder.buildStaticFunctionGet(getter);
1425 case CompoundGetter.UNRESOLVED: 1475 case CompoundGetter.UNRESOLVED:
1426 return buildStaticNoSuchGetter(getter); 1476 return buildStaticNoSuchGetter(getter);
1427 } 1477 }
1428 }, 1478 },
1429 rhs: rhs, 1479 rhs: rhs,
1430 setValue: (ir.Primitive result) { 1480 setValue: (ir.Primitive result) {
1431 switch (setterKind) { 1481 switch (setterKind) {
1432 case CompoundSetter.FIELD: 1482 case CompoundSetter.FIELD:
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 Element setter, 1516 Element setter,
1467 CompoundSetter setterKind, 1517 CompoundSetter setterKind,
1468 CompoundRhs rhs, 1518 CompoundRhs rhs,
1469 arg) { 1519 arg) {
1470 return translateCompounds( 1520 return translateCompounds(
1471 getValue: () { 1521 getValue: () {
1472 switch (getterKind) { 1522 switch (getterKind) {
1473 case CompoundGetter.FIELD: 1523 case CompoundGetter.FIELD:
1474 return irBuilder.buildSuperFieldGet(getter); 1524 return irBuilder.buildSuperFieldGet(getter);
1475 case CompoundGetter.GETTER: 1525 case CompoundGetter.GETTER:
1476 return irBuilder.buildSuperGetterGet(getter); 1526 return irBuilder.buildSuperGetterGet(
1527 getter, sourceInformationBuilder.buildGet(node));
1477 case CompoundGetter.METHOD: 1528 case CompoundGetter.METHOD:
1478 return irBuilder.buildSuperMethodGet(getter); 1529 return irBuilder.buildSuperMethodGet(getter);
1479 case CompoundGetter.UNRESOLVED: 1530 case CompoundGetter.UNRESOLVED:
1480 // TODO(johnniwinther): Ensure [getter] is not null. 1531 // TODO(johnniwinther): Ensure [getter] is not null.
1481 return buildSuperNoSuchGetter( 1532 return buildSuperNoSuchGetter(
1482 getter != null ? getter : setter, 1533 getter != null ? getter : setter,
1483 elements.getGetterTypeMaskInComplexSendSet(node)); 1534 elements.getGetterTypeMaskInComplexSendSet(node));
1484 } 1535 }
1485 }, 1536 },
1486 rhs: rhs, 1537 rhs: rhs,
(...skipping 11 matching lines...) Expand all
1498 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); 1549 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node));
1499 } 1550 }
1500 1551
1501 @override 1552 @override
1502 ir.Primitive handleTypeVariableTypeLiteralCompounds( 1553 ir.Primitive handleTypeVariableTypeLiteralCompounds(
1503 ast.SendSet node, 1554 ast.SendSet node,
1504 TypeVariableElement typeVariable, 1555 TypeVariableElement typeVariable,
1505 CompoundRhs rhs, 1556 CompoundRhs rhs,
1506 arg) { 1557 arg) {
1507 return translateCompounds( 1558 return translateCompounds(
1508 getValue: () => irBuilder.buildReifyTypeVariable(typeVariable.type), 1559 getValue: () {
1560 return irBuilder.buildReifyTypeVariable(
1561 typeVariable.type,
1562 sourceInformationBuilder.buildGet(node));
1563 },
1509 rhs: rhs, 1564 rhs: rhs,
1510 setValue: (value) {}, // The binary operator will throw before this. 1565 setValue: (value) {}, // The binary operator will throw before this.
1511 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node)); 1566 operatorTypeMask: elements.getOperatorTypeMaskInComplexSendSet(node));
1512 } 1567 }
1513 1568
1514 @override 1569 @override
1515 ir.Primitive handleIndexCompounds( 1570 ir.Primitive handleIndexCompounds(
1516 ast.SendSet node, 1571 ast.SendSet node,
1517 ast.Node receiver, 1572 ast.Node receiver,
1518 ast.Node index, 1573 ast.Node index,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1614 1669
1615 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) { 1670 ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
1616 assert(irBuilder.isOpen); 1671 assert(irBuilder.isOpen);
1617 List<ir.Primitive> parts = <ir.Primitive>[]; 1672 List<ir.Primitive> parts = <ir.Primitive>[];
1618 buildStringParts(node, parts); 1673 buildStringParts(node, parts);
1619 return irBuilder.buildStringConcatenation(parts); 1674 return irBuilder.buildStringConcatenation(parts);
1620 } 1675 }
1621 1676
1622 ir.Primitive translateConstant(ast.Node node) { 1677 ir.Primitive translateConstant(ast.Node node) {
1623 assert(irBuilder.isOpen); 1678 assert(irBuilder.isOpen);
1624 return irBuilder.buildConstant(getConstantForNode(node)); 1679 return irBuilder.buildConstant(
1680 getConstantForNode(node),
1681 sourceInformation: sourceInformationBuilder.buildGet(node));
1625 } 1682 }
1626 1683
1627 ir.Primitive visitThrow(ast.Throw node) { 1684 ir.Primitive visitThrow(ast.Throw node) {
1628 assert(irBuilder.isOpen); 1685 assert(irBuilder.isOpen);
1629 // This function is not called for throw expressions occurring as 1686 // This function is not called for throw expressions occurring as
1630 // statements. 1687 // statements.
1631 return irBuilder.buildNonTailThrow(visit(node.expression)); 1688 return irBuilder.buildNonTailThrow(visit(node.expression));
1632 } 1689 }
1633 1690
1634 ir.Primitive buildStaticNoSuchMethod( 1691 ir.Primitive buildStaticNoSuchMethod(
(...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 /// Builds the IR for creating an instance of the closure class corresponding 2305 /// Builds the IR for creating an instance of the closure class corresponding
2249 /// to the given nested function. 2306 /// to the given nested function.
2250 ClosureClassElement makeSubFunction(ast.FunctionExpression node) { 2307 ClosureClassElement makeSubFunction(ast.FunctionExpression node) {
2251 ClosureClassMap innerMap = 2308 ClosureClassMap innerMap =
2252 compiler.closureToClassMapper.getMappingForNestedFunction(node); 2309 compiler.closureToClassMapper.getMappingForNestedFunction(node);
2253 ClosureClassElement closureClass = innerMap.closureClassElement; 2310 ClosureClassElement closureClass = innerMap.closureClassElement;
2254 return closureClass; 2311 return closureClass;
2255 } 2312 }
2256 2313
2257 ir.Primitive visitFunctionExpression(ast.FunctionExpression node) { 2314 ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
2258 return irBuilder.buildFunctionExpression(makeSubFunction(node)); 2315 return irBuilder.buildFunctionExpression(makeSubFunction(node),
2316 sourceInformationBuilder.buildCreate(node));
2259 } 2317 }
2260 2318
2261 visitFunctionDeclaration(ast.FunctionDeclaration node) { 2319 visitFunctionDeclaration(ast.FunctionDeclaration node) {
2262 LocalFunctionElement element = elements[node.function]; 2320 LocalFunctionElement element = elements[node.function];
2263 Object inner = makeSubFunction(node.function); 2321 Object inner = makeSubFunction(node.function);
2264 irBuilder.declareLocalFunction(element, inner); 2322 irBuilder.declareLocalFunction(element, inner,
2323 sourceInformationBuilder.buildCreate(node.function));
2265 } 2324 }
2266 2325
2267 Map mapValues(Map map, dynamic fn(dynamic)) { 2326 Map mapValues(Map map, dynamic fn(dynamic)) {
2268 Map result = {}; 2327 Map result = {};
2269 map.forEach((key, value) { 2328 map.forEach((key, value) {
2270 result[key] = fn(value); 2329 result[key] = fn(value);
2271 }); 2330 });
2272 return result; 2331 return result;
2273 } 2332 }
2274 2333
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
2369 } 2428 }
2370 closureClassMap = 2429 closureClassMap =
2371 compiler.closureToClassMapper.computeClosureToClassMapping( 2430 compiler.closureToClassMapper.computeClosureToClassMapping(
2372 element, 2431 element,
2373 element.node, 2432 element.node,
2374 elements); 2433 elements);
2375 IrBuilder builder = getBuilderFor(element); 2434 IrBuilder builder = getBuilderFor(element);
2376 return withBuilder(builder, () { 2435 return withBuilder(builder, () {
2377 irBuilder.buildFunctionHeader(<Local>[]); 2436 irBuilder.buildFunctionHeader(<Local>[]);
2378 ir.Primitive initialValue = visit(element.initializer); 2437 ir.Primitive initialValue = visit(element.initializer);
2379 irBuilder.buildReturn(initialValue); 2438 ast.VariableDefinitions node = element.node;
2439 ast.SendSet sendSet = node.definitions.nodes.head;
2440 irBuilder.buildReturn(
2441 value: initialValue,
2442 sourceInformation:
2443 sourceInformationBuilder.buildReturn(sendSet.assignmentOperator));
2380 return irBuilder.makeFunctionDefinition(); 2444 return irBuilder.makeFunctionDefinition();
2381 }); 2445 });
2382 } 2446 }
2383 2447
2384 /// Make a visitor suitable for translating ASTs taken from [context]. 2448 /// Make a visitor suitable for translating ASTs taken from [context].
2385 /// 2449 ///
2386 /// Every visitor can only be applied to nodes in one context, because 2450 /// Every visitor can only be applied to nodes in one context, because
2387 /// the [elements] field is specific to that context. 2451 /// the [elements] field is specific to that context.
2388 JsIrBuilderVisitor makeVisitorForContext(AstElement context) { 2452 JsIrBuilderVisitor makeVisitorForContext(AstElement context) {
2389 return new JsIrBuilderVisitor( 2453 return new JsIrBuilderVisitor(
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
2494 List<ir.Primitive> instanceArguments = <ir.Primitive>[]; 2558 List<ir.Primitive> instanceArguments = <ir.Primitive>[];
2495 classElement.forEachInstanceField((ClassElement c, FieldElement field) { 2559 classElement.forEachInstanceField((ClassElement c, FieldElement field) {
2496 ir.Primitive value = fieldValues[field]; 2560 ir.Primitive value = fieldValues[field];
2497 if (value != null) { 2561 if (value != null) {
2498 instanceArguments.add(value); 2562 instanceArguments.add(value);
2499 } else { 2563 } else {
2500 assert(Elements.isNativeOrExtendsNative(c)); 2564 assert(Elements.isNativeOrExtendsNative(c));
2501 // Native fields are initialized elsewhere. 2565 // Native fields are initialized elsewhere.
2502 } 2566 }
2503 }, includeSuperAndInjectedMembers: true); 2567 }, includeSuperAndInjectedMembers: true);
2568
2504 ir.Primitive instance = new ir.CreateInstance( 2569 ir.Primitive instance = new ir.CreateInstance(
2505 classElement, 2570 classElement,
2506 instanceArguments, 2571 instanceArguments,
2507 typeInformation); 2572 typeInformation,
2573 constructor.hasNode
2574 ? sourceInformationBuilder.buildCreate(constructor.node)
2575 // TODO(johnniwinther): Provide source information for creation
2576 // through synthetic constructors.
2577 : null);
2508 irBuilder.add(new ir.LetPrim(instance)); 2578 irBuilder.add(new ir.LetPrim(instance));
2509 2579
2510 // --- Call constructor bodies --- 2580 // --- Call constructor bodies ---
2511 for (ConstructorElement target in constructorList) { 2581 for (ConstructorElement target in constructorList) {
2512 ConstructorBodyElement bodyElement = getConstructorBody(target); 2582 ConstructorBodyElement bodyElement = getConstructorBody(target);
2513 if (bodyElement == null) continue; // Skip if constructor has no body. 2583 if (bodyElement == null) continue; // Skip if constructor has no body.
2514 List<ir.Primitive> bodyArguments = <ir.Primitive>[]; 2584 List<ir.Primitive> bodyArguments = <ir.Primitive>[];
2515 for (Local param in getConstructorBodyParameters(bodyElement)) { 2585 for (Local param in getConstructorBodyParameters(bodyElement)) {
2516 bodyArguments.add(irBuilder.environment.lookup(param)); 2586 bodyArguments.add(irBuilder.environment.lookup(param));
2517 } 2587 }
2518 irBuilder.buildInvokeDirectly(bodyElement, instance, bodyArguments); 2588 irBuilder.buildInvokeDirectly(bodyElement, instance, bodyArguments);
2519 } 2589 }
2520 2590
2521 // --- step 4: return the created object ---- 2591 // --- step 4: return the created object ----
2522 irBuilder.buildReturn(instance); 2592 irBuilder.buildReturn(
2593 value: instance,
2594 sourceInformation:
2595 sourceInformationBuilder.buildImplicitReturn(constructor));
2523 2596
2524 return irBuilder.makeFunctionDefinition(); 2597 return irBuilder.makeFunctionDefinition();
2525 }); 2598 });
2526 } 2599 }
2527 2600
2528 /// Evaluates all field initializers on [constructor] and all constructors 2601 /// Evaluates all field initializers on [constructor] and all constructors
2529 /// invoked through `this()` or `super()` ("superconstructors"). 2602 /// invoked through `this()` or `super()` ("superconstructors").
2530 /// 2603 ///
2531 /// The resulting field values will be available in [fieldValues]. The values 2604 /// The resulting field values will be available in [fieldValues]. The values
2532 /// are not stored in any fields. 2605 /// are not stored in any fields.
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2967 _) { 3040 _) {
2968 List<ir.Primitive> arguments = 3041 List<ir.Primitive> arguments =
2969 node.send.arguments.mapToList(visit, growable:false); 3042 node.send.arguments.mapToList(visit, growable:false);
2970 // Use default values from the effective target, not the immediate target. 3043 // Use default values from the effective target, not the immediate target.
2971 ConstructorElement target = constructor.effectiveTarget; 3044 ConstructorElement target = constructor.effectiveTarget;
2972 arguments = normalizeStaticArguments(callStructure, target, arguments); 3045 arguments = normalizeStaticArguments(callStructure, target, arguments);
2973 return irBuilder.buildConstructorInvocation( 3046 return irBuilder.buildConstructorInvocation(
2974 target, 3047 target,
2975 callStructure, 3048 callStructure,
2976 constructor.computeEffectiveTargetType(type), 3049 constructor.computeEffectiveTargetType(type),
2977 arguments); 3050 arguments,
3051 sourceInformationBuilder.buildNew(node));
2978 } 3052 }
2979 3053
2980 @override 3054 @override
2981 ir.Primitive buildStaticNoSuchMethod(Selector selector, 3055 ir.Primitive buildStaticNoSuchMethod(Selector selector,
2982 List<ir.Primitive> arguments) { 3056 List<ir.Primitive> arguments) {
2983 Element thrower = backend.getThrowNoSuchMethod(); 3057 Element thrower = backend.getThrowNoSuchMethod();
2984 ir.Primitive receiver = irBuilder.buildStringConstant(''); 3058 ir.Primitive receiver = irBuilder.buildStringConstant('');
2985 ir.Primitive name = irBuilder.buildStringConstant(selector.name); 3059 ir.Primitive name = irBuilder.buildStringConstant(selector.name);
2986 ir.Primitive argumentList = irBuilder.buildListLiteral(null, arguments); 3060 ir.Primitive argumentList = irBuilder.buildListLiteral(null, arguments);
2987 ir.Primitive expectedArgumentNames = irBuilder.buildNullConstant(); 3061 ir.Primitive expectedArgumentNames = irBuilder.buildNullConstant();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3020 3094
3021 @override 3095 @override
3022 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) { 3096 ir.Primitive handleStaticFieldGet(ast.Send node, FieldElement field, _) {
3023 SourceInformation src = sourceInformationBuilder.buildGet(node); 3097 SourceInformation src = sourceInformationBuilder.buildGet(node);
3024 return buildStaticFieldGet(field, src); 3098 return buildStaticFieldGet(field, src);
3025 } 3099 }
3026 3100
3027 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) { 3101 ir.Primitive buildStaticFieldGet(FieldElement field, SourceInformation src) {
3028 ConstantValue constant = getConstantForVariable(field); 3102 ConstantValue constant = getConstantForVariable(field);
3029 if (constant != null && !field.isAssignable) { 3103 if (constant != null && !field.isAssignable) {
3030 return irBuilder.buildConstant(constant); 3104 return irBuilder.buildConstant(constant, sourceInformation: src);
3031 } else if (backend.constants.lazyStatics.contains(field)) { 3105 } else if (backend.constants.lazyStatics.contains(field)) {
3032 return irBuilder.buildStaticFieldLazyGet(field, src); 3106 return irBuilder.buildStaticFieldLazyGet(field, src);
3033 } else { 3107 } else {
3034 return irBuilder.buildStaticFieldGet(field, src); 3108 return irBuilder.buildStaticFieldGet(field, src);
3035 } 3109 }
3036 } 3110 }
3037 3111
3038 /// Build code to handle foreign code, that is, native JavaScript code, or 3112 /// Build code to handle foreign code, that is, native JavaScript code, or
3039 /// builtin values and operations of the backend. 3113 /// builtin values and operations of the backend.
3040 ir.Primitive handleForeignCode(ast.Send node, 3114 ir.Primitive handleForeignCode(ast.Send node,
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
3319 } 3393 }
3320 3394
3321 processSetStatic(ir.SetStatic node) { 3395 processSetStatic(ir.SetStatic node) {
3322 node.body = replacementFor(node.body); 3396 node.body = replacementFor(node.body);
3323 } 3397 }
3324 3398
3325 processContinuation(ir.Continuation node) { 3399 processContinuation(ir.Continuation node) {
3326 node.body = replacementFor(node.body); 3400 node.body = replacementFor(node.body);
3327 } 3401 }
3328 } 3402 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698