| OLD | NEW |
| 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; | 5 library dart2js.ir_builder; |
| 6 | 6 |
| 7 import '../closure.dart' as closure; | 7 import '../closure.dart' as closure; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
| 10 Names, | 10 Names, |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 646 _current = _current.plug(expr); | 646 _current = _current.plug(expr); |
| 647 } | 647 } |
| 648 } | 648 } |
| 649 | 649 |
| 650 /// Create and add a new [LetPrim] for [primitive]. | 650 /// Create and add a new [LetPrim] for [primitive]. |
| 651 ir.Primitive addPrimitive(ir.Primitive primitive) { | 651 ir.Primitive addPrimitive(ir.Primitive primitive) { |
| 652 add(new ir.LetPrim(primitive)); | 652 add(new ir.LetPrim(primitive)); |
| 653 return primitive; | 653 return primitive; |
| 654 } | 654 } |
| 655 | 655 |
| 656 ir.Primitive _buildInvokeStatic(Element element, | 656 ir.Primitive buildInvokeStatic(Element element, |
| 657 Selector selector, | 657 Selector selector, |
| 658 List<ir.Primitive> arguments, | 658 List<ir.Primitive> arguments, |
| 659 SourceInformation sourceInformation) { | 659 SourceInformation sourceInformation) { |
| 660 assert(!element.isLocal); | 660 assert(!element.isLocal); |
| 661 assert(!element.isInstanceMember); | 661 assert(!element.isInstanceMember); |
| 662 assert(isOpen); | 662 assert(isOpen); |
| 663 return addPrimitive( | 663 return addPrimitive( |
| 664 new ir.InvokeStatic(element, selector, arguments, sourceInformation)); | 664 new ir.InvokeStatic(element, selector, arguments, sourceInformation)); |
| 665 } | 665 } |
| 666 | 666 |
| 667 ir.Primitive _buildInvokeSuper(Element target, | 667 ir.Primitive _buildInvokeSuper(Element target, |
| 668 Selector selector, | 668 Selector selector, |
| 669 List<ir.Primitive> arguments, | 669 List<ir.Primitive> arguments, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 690 TypeMask mask, | 690 TypeMask mask, |
| 691 List<ir.Definition> arguments, | 691 List<ir.Definition> arguments, |
| 692 {SourceInformation sourceInformation}) { | 692 {SourceInformation sourceInformation}) { |
| 693 Selector selector = callStructure.callSelector; | 693 Selector selector = callStructure.callSelector; |
| 694 return _buildInvokeDynamic( | 694 return _buildInvokeDynamic( |
| 695 target, selector, mask, arguments, sourceInformation); | 695 target, selector, mask, arguments, sourceInformation); |
| 696 } | 696 } |
| 697 | 697 |
| 698 ir.Primitive buildStaticNoSuchMethod(Selector selector, | 698 ir.Primitive buildStaticNoSuchMethod(Selector selector, |
| 699 List<ir.Primitive> arguments) { | 699 List<ir.Primitive> arguments) { |
| 700 Element thrower = program.throwNoSuchMethod; | |
| 701 ir.Primitive receiver = buildStringConstant(''); | 700 ir.Primitive receiver = buildStringConstant(''); |
| 702 ir.Primitive name = buildStringConstant(selector.name); | 701 ir.Primitive name = buildStringConstant(selector.name); |
| 703 ir.Primitive argumentList = buildListLiteral(null, arguments); | 702 ir.Primitive argumentList = buildListLiteral(null, arguments); |
| 704 ir.Primitive expectedArgumentNames = buildNullConstant(); | 703 ir.Primitive expectedArgumentNames = buildNullConstant(); |
| 705 return buildStaticFunctionInvocation( | 704 return buildStaticFunctionInvocation( |
| 706 thrower, | 705 program.throwNoSuchMethod, |
| 707 new CallStructure.unnamed(4), | 706 <ir.Primitive>[receiver, name, argumentList, expectedArgumentNames]); |
| 708 [receiver, name, argumentList, expectedArgumentNames]); | |
| 709 } | 707 } |
| 710 | 708 |
| 711 | |
| 712 /// Create a [ir.Constant] from [value] and add it to the CPS term. | 709 /// Create a [ir.Constant] from [value] and add it to the CPS term. |
| 713 ir.Constant buildConstant(ConstantValue value, | 710 ir.Constant buildConstant(ConstantValue value, |
| 714 {SourceInformation sourceInformation}) { | 711 {SourceInformation sourceInformation}) { |
| 715 assert(isOpen); | 712 assert(isOpen); |
| 716 return addPrimitive( | 713 return addPrimitive( |
| 717 new ir.Constant(value, sourceInformation: sourceInformation)); | 714 new ir.Constant(value, sourceInformation: sourceInformation)); |
| 718 } | 715 } |
| 719 | 716 |
| 720 /// Create an integer constant and add it to the CPS term. | 717 /// Create an integer constant and add it to the CPS term. |
| 721 ir.Constant buildIntegerConstant(int value) { | 718 ir.Constant buildIntegerConstant(int value) { |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 LocalFunctionElement function, | 1016 LocalFunctionElement function, |
| 1020 CallStructure callStructure, | 1017 CallStructure callStructure, |
| 1021 List<ir.Primitive> arguments, | 1018 List<ir.Primitive> arguments, |
| 1022 SourceInformation sourceInformation) { | 1019 SourceInformation sourceInformation) { |
| 1023 // TODO(johnniwinther): Maybe this should have its own ir node. | 1020 // TODO(johnniwinther): Maybe this should have its own ir node. |
| 1024 return buildCallInvocation( | 1021 return buildCallInvocation( |
| 1025 buildLocalFunctionGet(function), callStructure, arguments, | 1022 buildLocalFunctionGet(function), callStructure, arguments, |
| 1026 sourceInformation: sourceInformation); | 1023 sourceInformation: sourceInformation); |
| 1027 } | 1024 } |
| 1028 | 1025 |
| 1029 /// Create a static invocation of [function] where argument structure is | 1026 /// Create a static invocation of [function]. |
| 1030 /// defined by [callStructure] and the argument values are defined by | 1027 /// |
| 1031 /// [arguments]. | 1028 /// The arguments are not named and their values are defined by [arguments]. |
| 1032 ir.Primitive buildStaticFunctionInvocation( | 1029 ir.Primitive buildStaticFunctionInvocation( |
| 1033 MethodElement function, | 1030 MethodElement function, |
| 1034 CallStructure callStructure, | |
| 1035 List<ir.Primitive> arguments, | 1031 List<ir.Primitive> arguments, |
| 1036 {SourceInformation sourceInformation}) { | 1032 {SourceInformation sourceInformation}) { |
| 1037 Selector selector = | 1033 Selector selector = new Selector.call( |
| 1038 new Selector(SelectorKind.CALL, function.memberName, callStructure); | 1034 function.memberName, new CallStructure(arguments.length)); |
| 1039 return _buildInvokeStatic( | 1035 return buildInvokeStatic(function, selector, arguments, sourceInformation); |
| 1040 function, selector, arguments, sourceInformation); | |
| 1041 } | 1036 } |
| 1042 | 1037 |
| 1043 /// Create a read access of the static [field]. | 1038 /// Create a read access of the static [field]. |
| 1044 ir.Primitive buildStaticFieldGet(FieldElement field, | 1039 ir.Primitive buildStaticFieldGet(FieldElement field, |
| 1045 SourceInformation sourceInformation) { | 1040 SourceInformation sourceInformation) { |
| 1046 return addPrimitive(new ir.GetStatic(field, sourceInformation)); | 1041 return addPrimitive(new ir.GetStatic(field, sourceInformation)); |
| 1047 } | 1042 } |
| 1048 | 1043 |
| 1049 /// Create a read access of a static [field] that might not have been | 1044 /// Create a read access of a static [field] that might not have been |
| 1050 /// initialized yet. | 1045 /// initialized yet. |
| 1051 ir.Primitive buildStaticFieldLazyGet(FieldElement field, | 1046 ir.Primitive buildStaticFieldLazyGet(FieldElement field, |
| 1052 SourceInformation sourceInformation) { | 1047 SourceInformation sourceInformation) { |
| 1053 return addPrimitive(new ir.GetLazyStatic(field, sourceInformation)); | 1048 return addPrimitive(new ir.GetLazyStatic(field, sourceInformation)); |
| 1054 } | 1049 } |
| 1055 | 1050 |
| 1056 /// Create a getter invocation of the static [getter]. | 1051 /// Create a getter invocation of the static [getter]. |
| 1057 ir.Primitive buildStaticGetterGet(MethodElement getter, | 1052 ir.Primitive buildStaticGetterGet(MethodElement getter, |
| 1058 SourceInformation sourceInformation) { | 1053 SourceInformation sourceInformation) { |
| 1059 Selector selector = new Selector.getter(getter.memberName); | 1054 Selector selector = new Selector.getter(getter.memberName); |
| 1060 return _buildInvokeStatic( | 1055 return buildInvokeStatic( |
| 1061 getter, selector, const <ir.Primitive>[], sourceInformation); | 1056 getter, selector, const <ir.Primitive>[], sourceInformation); |
| 1062 } | 1057 } |
| 1063 | 1058 |
| 1064 /// Create a read access of the static [function], i.e. a closurization of | 1059 /// Create a read access of the static [function], i.e. a closurization of |
| 1065 /// [function]. | 1060 /// [function]. |
| 1066 ir.Primitive buildStaticFunctionGet(MethodElement function, | 1061 ir.Primitive buildStaticFunctionGet(MethodElement function, |
| 1067 {SourceInformation sourceInformation}) { | 1062 {SourceInformation sourceInformation}) { |
| 1068 return addPrimitive(new ir.GetStatic(function, sourceInformation)); | 1063 return addPrimitive(new ir.GetStatic(function, sourceInformation)); |
| 1069 } | 1064 } |
| 1070 | 1065 |
| 1071 /// Create a write access to the static [field] with the [value]. | 1066 /// Create a write access to the static [field] with the [value]. |
| 1072 ir.Primitive buildStaticFieldSet(FieldElement field, | 1067 ir.Primitive buildStaticFieldSet(FieldElement field, |
| 1073 ir.Primitive value, | 1068 ir.Primitive value, |
| 1074 [SourceInformation sourceInformation]) { | 1069 [SourceInformation sourceInformation]) { |
| 1075 addPrimitive(new ir.SetStatic(field, value, sourceInformation)); | 1070 addPrimitive(new ir.SetStatic(field, value, sourceInformation)); |
| 1076 return value; | 1071 return value; |
| 1077 } | 1072 } |
| 1078 | 1073 |
| 1079 /// Create a setter invocation of the static [setter] with the [value]. | 1074 /// Create a setter invocation of the static [setter] with the [value]. |
| 1080 ir.Primitive buildStaticSetterSet(MethodElement setter, | 1075 ir.Primitive buildStaticSetterSet(MethodElement setter, |
| 1081 ir.Primitive value, | 1076 ir.Primitive value, |
| 1082 {SourceInformation sourceInformation}) { | 1077 {SourceInformation sourceInformation}) { |
| 1083 Selector selector = new Selector.setter(setter.memberName); | 1078 Selector selector = new Selector.setter(setter.memberName); |
| 1084 _buildInvokeStatic( | 1079 buildInvokeStatic( |
| 1085 setter, selector, <ir.Primitive>[value], sourceInformation); | 1080 setter, selector, <ir.Primitive>[value], sourceInformation); |
| 1086 return value; | 1081 return value; |
| 1087 } | 1082 } |
| 1088 | 1083 |
| 1089 /// Create an erroneous invocation where argument structure is defined by | 1084 /// Create an erroneous invocation where argument structure is defined by |
| 1090 /// [selector] and the argument values are defined by [arguments]. | 1085 /// [selector] and the argument values are defined by [arguments]. |
| 1091 // TODO(johnniwinther): Make this more fine-grained. | 1086 // TODO(johnniwinther): Make this more fine-grained. |
| 1092 ir.Primitive buildErroneousInvocation( | 1087 ir.Primitive buildErroneousInvocation( |
| 1093 Element element, | 1088 Element element, |
| 1094 Selector selector, | 1089 Selector selector, |
| 1095 List<ir.Primitive> arguments) { | 1090 List<ir.Primitive> arguments) { |
| 1096 // TODO(johnniwinther): This should have its own ir node. | 1091 // TODO(johnniwinther): This should have its own ir node. |
| 1097 return _buildInvokeStatic(element, selector, arguments, null); | 1092 return buildInvokeStatic(element, selector, arguments, null); |
| 1098 } | 1093 } |
| 1099 | 1094 |
| 1100 /// Concatenate string values. | 1095 /// Concatenate string values. The arguments must be strings. |
| 1101 /// | |
| 1102 /// The arguments must be strings; usually a call to [buildStringify] is | |
| 1103 /// needed to ensure the proper conversion takes places. | |
| 1104 ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments, | 1096 ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments, |
| 1105 {SourceInformation sourceInformation}) { | 1097 {SourceInformation sourceInformation}) { |
| 1106 assert(isOpen); | 1098 assert(isOpen); |
| 1107 return addPrimitive(new ir.ApplyBuiltinOperator( | 1099 return addPrimitive(new ir.ApplyBuiltinOperator( |
| 1108 ir.BuiltinOperator.StringConcatenate, | 1100 ir.BuiltinOperator.StringConcatenate, |
| 1109 arguments, | 1101 arguments, |
| 1110 sourceInformation)); | 1102 sourceInformation)); |
| 1111 } | 1103 } |
| 1112 | 1104 |
| 1113 /// Create an invocation of the `call` method of [functionExpression], where | 1105 /// Create an invocation of the `call` method of [functionExpression], where |
| (...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1692 | 1684 |
| 1693 ir.Primitive condition = buildConditionsFrom(0)(casesBuilder); | 1685 ir.Primitive condition = buildConditionsFrom(0)(casesBuilder); |
| 1694 IrBuilder thenBuilder = makeDelimitedBuilder(); | 1686 IrBuilder thenBuilder = makeDelimitedBuilder(); |
| 1695 caseInfo.buildBody(thenBuilder); | 1687 caseInfo.buildBody(thenBuilder); |
| 1696 if (thenBuilder.isOpen) { | 1688 if (thenBuilder.isOpen) { |
| 1697 // It is a runtime error to reach the end of a switch case, unless | 1689 // It is a runtime error to reach the end of a switch case, unless |
| 1698 // it is the last case. | 1690 // it is the last case. |
| 1699 if (caseInfo == cases.last && defaultCase == null) { | 1691 if (caseInfo == cases.last && defaultCase == null) { |
| 1700 thenBuilder.jumpTo(join); | 1692 thenBuilder.jumpTo(join); |
| 1701 } else { | 1693 } else { |
| 1702 ir.Primitive exception = thenBuilder._buildInvokeStatic( | 1694 ir.Primitive exception = thenBuilder.buildInvokeStatic( |
| 1703 error, | 1695 error, |
| 1704 new Selector.fromElement(error), | 1696 new Selector.fromElement(error), |
| 1705 <ir.Primitive>[], | 1697 <ir.Primitive>[], |
| 1706 sourceInformation); | 1698 sourceInformation); |
| 1707 thenBuilder.buildThrow(exception); | 1699 thenBuilder.buildThrow(exception); |
| 1708 } | 1700 } |
| 1709 } | 1701 } |
| 1710 | 1702 |
| 1711 ir.Continuation thenContinuation = new ir.Continuation([]); | 1703 ir.Continuation thenContinuation = new ir.Continuation([]); |
| 1712 thenContinuation.body = thenBuilder._root; | 1704 thenContinuation.body = thenBuilder._root; |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2066 // where (C', x) = Build(e, C) | 2058 // where (C', x) = Build(e, C) |
| 2067 // | 2059 // |
| 2068 // Return without a subexpression is translated as if it were return null. | 2060 // Return without a subexpression is translated as if it were return null. |
| 2069 assert(isOpen); | 2061 assert(isOpen); |
| 2070 if (value == null) { | 2062 if (value == null) { |
| 2071 value = buildNullConstant(); | 2063 value = buildNullConstant(); |
| 2072 } | 2064 } |
| 2073 jumpTo(state.returnCollector, value, sourceInformation); | 2065 jumpTo(state.returnCollector, value, sourceInformation); |
| 2074 } | 2066 } |
| 2075 | 2067 |
| 2076 /// Build a call to the closure conversion helper for the [Function] typed | |
| 2077 /// value in [value]. | |
| 2078 ir.Primitive _convertDartClosure(ir.Primitive value, FunctionType type) { | |
| 2079 ir.Constant arity = buildIntegerConstant(type.computeArity()); | |
| 2080 return buildStaticFunctionInvocation( | |
| 2081 program.closureConverter, | |
| 2082 CallStructure.TWO_ARGS, | |
| 2083 <ir.Primitive>[value, arity]); | |
| 2084 } | |
| 2085 | |
| 2086 /// Generate the body for a native function [function] that is annotated with | 2068 /// Generate the body for a native function [function] that is annotated with |
| 2087 /// an implementation in JavaScript (provided as string in [javaScriptCode]). | 2069 /// an implementation in JavaScript (provided as string in [javaScriptCode]). |
| 2088 void buildNativeFunctionBody(FunctionElement function, | 2070 void buildNativeFunctionBody(FunctionElement function, |
| 2089 String javaScriptCode) { | 2071 String javaScriptCode) { |
| 2090 NativeBehavior behavior = new NativeBehavior(); | 2072 NativeBehavior behavior = new NativeBehavior(); |
| 2091 behavior.sideEffects.setAllSideEffects(); | 2073 behavior.sideEffects.setAllSideEffects(); |
| 2092 // Generate a [ForeignCode] statement from the given native code. | 2074 // Generate a [ForeignCode] statement from the given native code. |
| 2093 buildForeignCode( | 2075 buildForeignCode( |
| 2094 js.js.statementTemplateYielding( | 2076 js.js.statementTemplateYielding( |
| 2095 new js.LiteralStatement(javaScriptCode)), | 2077 new js.LiteralStatement(javaScriptCode)), |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2117 } | 2099 } |
| 2118 // Collect all parameters of the function and templates for them to be | 2100 // Collect all parameters of the function and templates for them to be |
| 2119 // inserted into the JavaScript code. | 2101 // inserted into the JavaScript code. |
| 2120 List<String> argumentTemplates = <String>[]; | 2102 List<String> argumentTemplates = <String>[]; |
| 2121 function.functionSignature.forEachParameter((ParameterElement parameter) { | 2103 function.functionSignature.forEachParameter((ParameterElement parameter) { |
| 2122 ir.Primitive input = environment.lookup(parameter); | 2104 ir.Primitive input = environment.lookup(parameter); |
| 2123 DartType type = program.unaliasType(parameter.type); | 2105 DartType type = program.unaliasType(parameter.type); |
| 2124 if (type is FunctionType) { | 2106 if (type is FunctionType) { |
| 2125 // The parameter type is a function type either directly or through | 2107 // The parameter type is a function type either directly or through |
| 2126 // typedef(s). | 2108 // typedef(s). |
| 2127 input = _convertDartClosure(input, type); | 2109 ir.Constant arity = buildIntegerConstant(type.computeArity()); |
| 2110 input = buildStaticFunctionInvocation( |
| 2111 program.closureConverter, <ir.Primitive>[input, arity]); |
| 2128 } | 2112 } |
| 2129 arguments.add(input); | 2113 arguments.add(input); |
| 2130 argumentTemplates.add('#'); | 2114 argumentTemplates.add('#'); |
| 2131 }); | 2115 }); |
| 2132 // Construct the application of parameters for functions and setters. | 2116 // Construct the application of parameters for functions and setters. |
| 2133 if (function.kind == ElementKind.FUNCTION) { | 2117 if (function.kind == ElementKind.FUNCTION) { |
| 2134 code = "$code(${argumentTemplates.join(', ')})"; | 2118 code = "$code(${argumentTemplates.join(', ')})"; |
| 2135 } else if (function.kind == ElementKind.SETTER) { | 2119 } else if (function.kind == ElementKind.SETTER) { |
| 2136 code = "$code = ${argumentTemplates.single}"; | 2120 code = "$code = ${argumentTemplates.single}"; |
| 2137 } else { | 2121 } else { |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2594 | 2578 |
| 2595 ir.Primitive buildSuperFieldGet(FieldElement target) { | 2579 ir.Primitive buildSuperFieldGet(FieldElement target) { |
| 2596 return addPrimitive(new ir.GetField(buildThis(), target)); | 2580 return addPrimitive(new ir.GetField(buildThis(), target)); |
| 2597 } | 2581 } |
| 2598 | 2582 |
| 2599 ir.Primitive buildSuperFieldSet(FieldElement target, ir.Primitive value) { | 2583 ir.Primitive buildSuperFieldSet(FieldElement target, ir.Primitive value) { |
| 2600 addPrimitive(new ir.SetField(buildThis(), target, value)); | 2584 addPrimitive(new ir.SetField(buildThis(), target, value)); |
| 2601 return value; | 2585 return value; |
| 2602 } | 2586 } |
| 2603 | 2587 |
| 2604 ir.Primitive buildInvokeDirectly(MethodElement target, | |
| 2605 ir.Primitive receiver, | |
| 2606 List<ir.Primitive> arguments, | |
| 2607 {SourceInformation sourceInformation}) { | |
| 2608 assert(isOpen); | |
| 2609 Selector selector = | |
| 2610 new Selector.call(target.memberName, new CallStructure(arguments.length)
); | |
| 2611 return addPrimitive(new ir.InvokeMethodDirectly( | |
| 2612 receiver, target, selector, arguments, sourceInformation)); | |
| 2613 } | |
| 2614 | |
| 2615 /// Loads parameters to a constructor body into the environment. | 2588 /// Loads parameters to a constructor body into the environment. |
| 2616 /// | 2589 /// |
| 2617 /// The header for a constructor body differs from other functions in that | 2590 /// The header for a constructor body differs from other functions in that |
| 2618 /// some parameters are already boxed, and the box is passed as an argument | 2591 /// some parameters are already boxed, and the box is passed as an argument |
| 2619 /// instead of being created in the header. | 2592 /// instead of being created in the header. |
| 2620 void buildConstructorBodyHeader(Iterable<Local> parameters, | 2593 void buildConstructorBodyHeader(Iterable<Local> parameters, |
| 2621 ClosureScope closureScope) { | 2594 ClosureScope closureScope) { |
| 2622 _createThisParameter(); | 2595 _createThisParameter(); |
| 2623 for (Local param in parameters) { | 2596 for (Local param in parameters) { |
| 2624 ir.Parameter parameter = _createLocalParameter(param); | 2597 ir.Parameter parameter = _createLocalParameter(param); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2746 /// Creates a type test or type cast of [value] against [type]. | 2719 /// Creates a type test or type cast of [value] against [type]. |
| 2747 ir.Primitive buildTypeOperator(ir.Primitive value, | 2720 ir.Primitive buildTypeOperator(ir.Primitive value, |
| 2748 DartType type, | 2721 DartType type, |
| 2749 {bool isTypeTest}) { | 2722 {bool isTypeTest}) { |
| 2750 assert(isOpen); | 2723 assert(isOpen); |
| 2751 assert(isTypeTest != null); | 2724 assert(isTypeTest != null); |
| 2752 | 2725 |
| 2753 type = program.unaliasType(type); | 2726 type = program.unaliasType(type); |
| 2754 | 2727 |
| 2755 if (type.isMalformed) { | 2728 if (type.isMalformed) { |
| 2756 FunctionElement helper = program.throwTypeErrorHelper; | |
| 2757 ErroneousElement element = type.element; | 2729 ErroneousElement element = type.element; |
| 2758 ir.Primitive message = buildStringConstant(element.message); | 2730 ir.Primitive message = buildStringConstant(element.message); |
| 2759 return buildStaticFunctionInvocation( | 2731 return buildStaticFunctionInvocation( |
| 2760 helper, | 2732 program.throwTypeErrorHelper, |
| 2761 CallStructure.ONE_ARG, | |
| 2762 <ir.Primitive>[message]); | 2733 <ir.Primitive>[message]); |
| 2763 } | 2734 } |
| 2764 | 2735 |
| 2765 List<ir.Primitive> typeArguments = const <ir.Primitive>[]; | 2736 List<ir.Primitive> typeArguments = const <ir.Primitive>[]; |
| 2766 if (type is GenericType && type.typeArguments.isNotEmpty) { | 2737 if (type is GenericType && type.typeArguments.isNotEmpty) { |
| 2767 typeArguments = type.typeArguments.map(buildTypeExpression).toList(); | 2738 typeArguments = type.typeArguments.map(buildTypeExpression).toList(); |
| 2768 } else if (type is TypeVariableType) { | 2739 } else if (type is TypeVariableType) { |
| 2769 typeArguments = <ir.Primitive>[buildTypeVariableAccess(type)]; | 2740 typeArguments = <ir.Primitive>[buildTypeVariableAccess(type)]; |
| 2770 } else if (type is FunctionType) { | 2741 } else if (type is FunctionType) { |
| 2771 typeArguments = <ir.Primitive>[buildTypeExpression(type)]; | 2742 typeArguments = <ir.Primitive>[buildTypeExpression(type)]; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2817 return buildConditional(condition, (_) => receiver, buildSend); | 2788 return buildConditional(condition, (_) => receiver, buildSend); |
| 2818 } | 2789 } |
| 2819 | 2790 |
| 2820 /// Creates a type test checking whether [value] is null. | 2791 /// Creates a type test checking whether [value] is null. |
| 2821 ir.Primitive _buildCheckNull(ir.Primitive value, | 2792 ir.Primitive _buildCheckNull(ir.Primitive value, |
| 2822 {SourceInformation sourceInformation}) { | 2793 {SourceInformation sourceInformation}) { |
| 2823 assert(isOpen); | 2794 assert(isOpen); |
| 2824 return buildIdentical(value, buildNullConstant(), | 2795 return buildIdentical(value, buildNullConstant(), |
| 2825 sourceInformation: sourceInformation); | 2796 sourceInformation: sourceInformation); |
| 2826 } | 2797 } |
| 2827 | |
| 2828 /// Convert the given value to a string. | |
| 2829 ir.Primitive buildStringify(ir.Primitive value) { | |
| 2830 return buildStaticFunctionInvocation( | |
| 2831 program.stringifyFunction, | |
| 2832 new CallStructure.unnamed(1), | |
| 2833 <ir.Primitive>[value]); | |
| 2834 } | |
| 2835 | |
| 2836 ir.Primitive buildAwait(ir.Primitive value) { | |
| 2837 return addPrimitive(new ir.Await(value)); | |
| 2838 } | |
| 2839 | |
| 2840 void buildYield(ir.Primitive value, bool hasStar) { | |
| 2841 addPrimitive(new ir.Yield(value, hasStar)); | |
| 2842 } | |
| 2843 | |
| 2844 ir.Primitive buildRefinement(ir.Primitive value, TypeMask type) { | |
| 2845 return addPrimitive(new ir.Refinement(value, type)); | |
| 2846 } | |
| 2847 } | 2798 } |
| 2848 | 2799 |
| 2849 /// Location of a variable relative to a given closure. | 2800 /// Location of a variable relative to a given closure. |
| 2850 class ClosureLocation { | 2801 class ClosureLocation { |
| 2851 /// If not `null`, this location is [box].[field]. | 2802 /// If not `null`, this location is [box].[field]. |
| 2852 /// The location of [box] can be obtained separately from an | 2803 /// The location of [box] can be obtained separately from an |
| 2853 /// enclosing [ClosureEnvironment] or [ClosureScope]. | 2804 /// enclosing [ClosureEnvironment] or [ClosureScope]. |
| 2854 /// If `null`, then the location is [field] on the enclosing function object. | 2805 /// If `null`, then the location is [field] on the enclosing function object. |
| 2855 final closure.BoxLocal box; | 2806 final closure.BoxLocal box; |
| 2856 | 2807 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2948 } | 2899 } |
| 2949 | 2900 |
| 2950 class SwitchCaseInfo { | 2901 class SwitchCaseInfo { |
| 2951 final List<ir.Primitive> constants = <ir.Primitive>[]; | 2902 final List<ir.Primitive> constants = <ir.Primitive>[]; |
| 2952 final SubbuildFunction buildBody; | 2903 final SubbuildFunction buildBody; |
| 2953 | 2904 |
| 2954 SwitchCaseInfo(this.buildBody); | 2905 SwitchCaseInfo(this.buildBody); |
| 2955 | 2906 |
| 2956 void addConstant(ir.Primitive constant) => constants.add(constant); | 2907 void addConstant(ir.Primitive constant) => constants.add(constant); |
| 2957 } | 2908 } |
| OLD | NEW |