| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 class SsaFunctionCompiler implements FunctionCompiler { | 7 class SsaFunctionCompiler implements FunctionCompiler { |
| 8 final SsaCodeGeneratorTask generator; | 8 final SsaCodeGeneratorTask generator; |
| 9 final SsaBuilderTask builder; | 9 final SsaBuilderTask builder; |
| 10 final SsaOptimizerTask optimizer; | 10 final SsaOptimizerTask optimizer; |
| (...skipping 1283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 Selector selector, | 1294 Selector selector, |
| 1295 TypeMask mask, | 1295 TypeMask mask, |
| 1296 List<HInstruction> providedArguments, | 1296 List<HInstruction> providedArguments, |
| 1297 ast.Node currentNode, | 1297 ast.Node currentNode, |
| 1298 {InterfaceType instanceType}) { | 1298 {InterfaceType instanceType}) { |
| 1299 // TODO(johnniwinther): Register this on the [registry]. Currently the | 1299 // TODO(johnniwinther): Register this on the [registry]. Currently the |
| 1300 // [CodegenRegistry] calls the enqueuer, but [element] should _not_ be | 1300 // [CodegenRegistry] calls the enqueuer, but [element] should _not_ be |
| 1301 // enqueued. | 1301 // enqueued. |
| 1302 backend.registerStaticUse(element, compiler.enqueuer.codegen); | 1302 backend.registerStaticUse(element, compiler.enqueuer.codegen); |
| 1303 | 1303 |
| 1304 if (element.isJsInterop && !element.isFactoryConstructor) { |
| 1305 // We only inline factory JavaScript interop constructors. |
| 1306 return false; |
| 1307 } |
| 1308 |
| 1304 // Ensure that [element] is an implementation element. | 1309 // Ensure that [element] is an implementation element. |
| 1305 element = element.implementation; | 1310 element = element.implementation; |
| 1306 | 1311 |
| 1307 if (compiler.elementHasCompileTimeError(element)) return false; | 1312 if (compiler.elementHasCompileTimeError(element)) return false; |
| 1308 | 1313 |
| 1309 FunctionElement function = element; | 1314 FunctionElement function = element; |
| 1310 bool insideLoop = loopNesting > 0 || graph.calledInLoop; | 1315 bool insideLoop = loopNesting > 0 || graph.calledInLoop; |
| 1311 | 1316 |
| 1312 // Bail out early if the inlining decision is in the cache and we can't | 1317 // Bail out early if the inlining decision is in the cache and we can't |
| 1313 // inline (no need to check the hard constraints). | 1318 // inline (no need to check the hard constraints). |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1324 Elements.isStaticOrTopLevel(element) || | 1329 Elements.isStaticOrTopLevel(element) || |
| 1325 element.isGenerativeConstructorBody, | 1330 element.isGenerativeConstructorBody, |
| 1326 message: "Missing selector for inlining of $element.")); | 1331 message: "Missing selector for inlining of $element.")); |
| 1327 if (selector != null) { | 1332 if (selector != null) { |
| 1328 if (!selector.applies(function, compiler.world)) return false; | 1333 if (!selector.applies(function, compiler.world)) return false; |
| 1329 if (mask != null && !mask.canHit(function, selector, compiler.world)) { | 1334 if (mask != null && !mask.canHit(function, selector, compiler.world)) { |
| 1330 return false; | 1335 return false; |
| 1331 } | 1336 } |
| 1332 } | 1337 } |
| 1333 | 1338 |
| 1339 if (element.isJsInterop) return false; |
| 1340 |
| 1334 // Don't inline operator== methods if the parameter can be null. | 1341 // Don't inline operator== methods if the parameter can be null. |
| 1335 if (element.name == '==') { | 1342 if (element.name == '==') { |
| 1336 if (element.enclosingClass != compiler.objectClass | 1343 if (element.enclosingClass != compiler.objectClass |
| 1337 && providedArguments[1].canBeNull()) { | 1344 && providedArguments[1].canBeNull()) { |
| 1338 return false; | 1345 return false; |
| 1339 } | 1346 } |
| 1340 } | 1347 } |
| 1341 | 1348 |
| 1342 // Generative constructors of native classes should not be called directly | 1349 // Generative constructors of native classes should not be called directly |
| 1343 // and have an extra argument that causes problems with inlining. | 1350 // and have an extra argument that causes problems with inlining. |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 sourceInformationBuilder = | 1510 sourceInformationBuilder = |
| 1504 sourceInformationBuilder.forContext(element.implementation); | 1511 sourceInformationBuilder.forContext(element.implementation); |
| 1505 sourceElementStack.add(element.declaration); | 1512 sourceElementStack.add(element.declaration); |
| 1506 var result = f(); | 1513 var result = f(); |
| 1507 sourceInformationBuilder = oldSourceInformationBuilder; | 1514 sourceInformationBuilder = oldSourceInformationBuilder; |
| 1508 sourceElementStack.removeLast(); | 1515 sourceElementStack.removeLast(); |
| 1509 return result; | 1516 return result; |
| 1510 }); | 1517 }); |
| 1511 } | 1518 } |
| 1512 | 1519 |
| 1520 /** |
| 1521 * Return null so it is simple to remove the optional parameters completely |
| 1522 * from interop methods to match JavaScript semantics for ommitted arguments. |
| 1523 */ |
| 1524 HInstruction handleConstantForOptionalParameterJsInterop(Element parameter) => |
| 1525 null; |
| 1526 |
| 1513 HInstruction handleConstantForOptionalParameter(Element parameter) { | 1527 HInstruction handleConstantForOptionalParameter(Element parameter) { |
| 1514 ConstantValue constantValue = | 1528 ConstantValue constantValue = |
| 1515 backend.constants.getConstantValueForVariable(parameter); | 1529 backend.constants.getConstantValueForVariable(parameter); |
| 1516 assert(invariant(parameter, constantValue != null, | 1530 assert(invariant(parameter, constantValue != null, |
| 1517 message: 'No constant computed for $parameter')); | 1531 message: 'No constant computed for $parameter')); |
| 1518 return graph.addConstant(constantValue, compiler); | 1532 return graph.addConstant(constantValue, compiler); |
| 1519 } | 1533 } |
| 1520 | 1534 |
| 1521 Element get currentNonClosureClass { | 1535 Element get currentNonClosureClass { |
| 1522 ClassElement cls = sourceElement.enclosingClass; | 1536 ClassElement cls = sourceElement.enclosingClass; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1597 /** | 1611 /** |
| 1598 * Documentation wanted -- johnniwinther | 1612 * Documentation wanted -- johnniwinther |
| 1599 * | 1613 * |
| 1600 * Invariant: [functionElement] must be an implementation element. | 1614 * Invariant: [functionElement] must be an implementation element. |
| 1601 */ | 1615 */ |
| 1602 HGraph buildMethod(FunctionElement functionElement) { | 1616 HGraph buildMethod(FunctionElement functionElement) { |
| 1603 assert(invariant(functionElement, functionElement.isImplementation)); | 1617 assert(invariant(functionElement, functionElement.isImplementation)); |
| 1604 graph.calledInLoop = compiler.world.isCalledInLoop(functionElement); | 1618 graph.calledInLoop = compiler.world.isCalledInLoop(functionElement); |
| 1605 ast.FunctionExpression function = functionElement.node; | 1619 ast.FunctionExpression function = functionElement.node; |
| 1606 assert(function != null); | 1620 assert(function != null); |
| 1607 assert(!function.modifiers.isExternal); | |
| 1608 assert(elements.getFunctionDefinition(function) != null); | 1621 assert(elements.getFunctionDefinition(function) != null); |
| 1609 openFunction(functionElement, function); | 1622 openFunction(functionElement, function); |
| 1610 String name = functionElement.name; | 1623 String name = functionElement.name; |
| 1624 if (functionElement.isJsInterop) { |
| 1625 push(invokeJsInteropFunction(functionElement, parameters.values.toList(), |
| 1626 sourceInformationBuilder.buildGeneric(function))); |
| 1627 var value = pop(); |
| 1628 closeAndGotoExit(new HReturn(value, |
| 1629 sourceInformationBuilder.buildReturn(functionElement.node))); |
| 1630 return closeFunction(); |
| 1631 } |
| 1632 |
| 1611 // If [functionElement] is `operator==` we explicitely add a null check at | 1633 // If [functionElement] is `operator==` we explicitely add a null check at |
| 1612 // the beginning of the method. This is to avoid having call sites do the | 1634 // the beginning of the method. This is to avoid having call sites do the |
| 1613 // null check. | 1635 // null check. |
| 1614 if (name == '==') { | 1636 if (name == '==') { |
| 1615 if (!backend.operatorEqHandlesNullArgument(functionElement)) { | 1637 if (!backend.operatorEqHandlesNullArgument(functionElement)) { |
| 1616 handleIf( | 1638 handleIf( |
| 1617 function, | 1639 function, |
| 1618 visitCondition: () { | 1640 visitCondition: () { |
| 1619 HParameterValue parameter = parameters.values.first; | 1641 HParameterValue parameter = parameters.values.first; |
| 1620 push(new HIdentity( | 1642 push(new HIdentity( |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1805 returnType = state.oldReturnType; | 1827 returnType = state.oldReturnType; |
| 1806 assert(stack.isEmpty); | 1828 assert(stack.isEmpty); |
| 1807 stack = state.oldStack; | 1829 stack = state.oldStack; |
| 1808 } | 1830 } |
| 1809 | 1831 |
| 1810 /** | 1832 /** |
| 1811 * Run this builder on the body of the [function] to be inlined. | 1833 * Run this builder on the body of the [function] to be inlined. |
| 1812 */ | 1834 */ |
| 1813 void visitInlinedFunction(FunctionElement function) { | 1835 void visitInlinedFunction(FunctionElement function) { |
| 1814 potentiallyCheckInlinedParameterTypes(function); | 1836 potentiallyCheckInlinedParameterTypes(function); |
| 1837 |
| 1815 if (function.isGenerativeConstructor) { | 1838 if (function.isGenerativeConstructor) { |
| 1816 buildFactory(function); | 1839 buildFactory(function); |
| 1817 } else { | 1840 } else { |
| 1818 ast.FunctionExpression functionNode = function.node; | 1841 ast.FunctionExpression functionNode = function.node; |
| 1819 functionNode.body.accept(this); | 1842 functionNode.body.accept(this); |
| 1820 } | 1843 } |
| 1821 } | 1844 } |
| 1822 | 1845 |
| 1823 | 1846 |
| 1824 addInlinedInstantiation(DartType type) { | 1847 addInlinedInstantiation(DartType type) { |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2108 * current constructor and super constructors or constructors redirected | 2131 * current constructor and super constructors or constructors redirected |
| 2109 * to, starting from the current constructor. | 2132 * to, starting from the current constructor. |
| 2110 * - Call the constructor bodies, starting from the constructor(s) in the | 2133 * - Call the constructor bodies, starting from the constructor(s) in the |
| 2111 * super class(es). | 2134 * super class(es). |
| 2112 */ | 2135 */ |
| 2113 HGraph buildFactory(ConstructorElement functionElement) { | 2136 HGraph buildFactory(ConstructorElement functionElement) { |
| 2114 functionElement = functionElement.implementation; | 2137 functionElement = functionElement.implementation; |
| 2115 ClassElement classElement = | 2138 ClassElement classElement = |
| 2116 functionElement.enclosingClass.implementation; | 2139 functionElement.enclosingClass.implementation; |
| 2117 bool isNativeUpgradeFactory = | 2140 bool isNativeUpgradeFactory = |
| 2118 Elements.isNativeOrExtendsNative(classElement); | 2141 Elements.isNativeOrExtendsNative(classElement) |
| 2142 && !classElement.isJsInterop; |
| 2119 ast.FunctionExpression function = functionElement.node; | 2143 ast.FunctionExpression function = functionElement.node; |
| 2120 // Note that constructors (like any other static function) do not need | 2144 // Note that constructors (like any other static function) do not need |
| 2121 // to deal with optional arguments. It is the callers job to provide all | 2145 // to deal with optional arguments. It is the callers job to provide all |
| 2122 // arguments as if they were positional. | 2146 // arguments as if they were positional. |
| 2123 | 2147 |
| 2124 if (inliningStack.isEmpty) { | 2148 if (inliningStack.isEmpty) { |
| 2125 // The initializer list could contain closures. | 2149 // The initializer list could contain closures. |
| 2126 openFunction(functionElement, function); | 2150 openFunction(functionElement, function); |
| 2127 } | 2151 } |
| 2128 | 2152 |
| (...skipping 1789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3918 | 3942 |
| 3919 HInstruction compileArgument(ast.Node argument) { | 3943 HInstruction compileArgument(ast.Node argument) { |
| 3920 visit(argument); | 3944 visit(argument); |
| 3921 return pop(); | 3945 return pop(); |
| 3922 } | 3946 } |
| 3923 | 3947 |
| 3924 return callStructure.makeArgumentsList( | 3948 return callStructure.makeArgumentsList( |
| 3925 arguments, | 3949 arguments, |
| 3926 element, | 3950 element, |
| 3927 compileArgument, | 3951 compileArgument, |
| 3928 handleConstantForOptionalParameter); | 3952 element.isJsInterop ? |
| 3953 handleConstantForOptionalParameterJsInterop : |
| 3954 handleConstantForOptionalParameter); |
| 3929 } | 3955 } |
| 3930 | 3956 |
| 3931 void addGenericSendArgumentsToList(Link<ast.Node> link, List<HInstruction> lis
t) { | 3957 void addGenericSendArgumentsToList(Link<ast.Node> link, List<HInstruction> lis
t) { |
| 3932 for (; !link.isEmpty; link = link.tail) { | 3958 for (; !link.isEmpty; link = link.tail) { |
| 3933 visit(link.head); | 3959 visit(link.head); |
| 3934 list.add(pop()); | 3960 list.add(pop()); |
| 3935 } | 3961 } |
| 3936 } | 3962 } |
| 3937 | 3963 |
| 3938 /// Generate a dynamic method, getter or setter invocation. | 3964 /// Generate a dynamic method, getter or setter invocation. |
| (...skipping 1126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5065 | 5091 |
| 5066 if (compiler.elementHasCompileTimeError(constructor)) { | 5092 if (compiler.elementHasCompileTimeError(constructor)) { |
| 5067 // TODO(ahe): Do something like [generateWrongArgumentCountError]. | 5093 // TODO(ahe): Do something like [generateWrongArgumentCountError]. |
| 5068 stack.add(graph.addConstantNull(compiler)); | 5094 stack.add(graph.addConstantNull(compiler)); |
| 5069 return; | 5095 return; |
| 5070 } | 5096 } |
| 5071 if (checkTypeVariableBounds(node, type)) return; | 5097 if (checkTypeVariableBounds(node, type)) return; |
| 5072 | 5098 |
| 5073 var inputs = <HInstruction>[]; | 5099 var inputs = <HInstruction>[]; |
| 5074 if (constructor.isGenerativeConstructor && | 5100 if (constructor.isGenerativeConstructor && |
| 5075 Elements.isNativeOrExtendsNative(constructor.enclosingClass)) { | 5101 Elements.isNativeOrExtendsNative(constructor.enclosingClass) && |
| 5102 !constructor.isJsInterop) { |
| 5076 // Native class generative constructors take a pre-constructed object. | 5103 // Native class generative constructors take a pre-constructed object. |
| 5077 inputs.add(graph.addConstantNull(compiler)); | 5104 inputs.add(graph.addConstantNull(compiler)); |
| 5078 } | 5105 } |
| 5079 // TODO(5347): Try to avoid the need for calling [implementation] before | 5106 // TODO(5347): Try to avoid the need for calling [implementation] before |
| 5080 // calling [makeStaticArgumentList]. | 5107 // calling [makeStaticArgumentList]. |
| 5081 constructorImplementation = constructor.implementation; | 5108 constructorImplementation = constructor.implementation; |
| 5082 if (constructorImplementation.isErroneous || | 5109 if (constructorImplementation.isErroneous || |
| 5083 !callStructure.signatureApplies( | 5110 !callStructure.signatureApplies( |
| 5084 constructorImplementation.functionSignature)) { | 5111 constructorImplementation.functionSignature)) { |
| 5085 generateWrongArgumentCountError(send, constructor, send.arguments); | 5112 generateWrongArgumentCountError(send, constructor, send.arguments); |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5781 push( | 5808 push( |
| 5782 new HInvokeDynamicSetter(selector, mask, null, inputs, type) | 5809 new HInvokeDynamicSetter(selector, mask, null, inputs, type) |
| 5783 ..sourceInformation = sourceInformation); | 5810 ..sourceInformation = sourceInformation); |
| 5784 } else { | 5811 } else { |
| 5785 push( | 5812 push( |
| 5786 new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted) | 5813 new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted) |
| 5787 ..sourceInformation = sourceInformation); | 5814 ..sourceInformation = sourceInformation); |
| 5788 } | 5815 } |
| 5789 } | 5816 } |
| 5790 | 5817 |
| 5818 HForeignCode invokeJsInteropFunction(Element element, |
| 5819 List<HInstruction> arguments, |
| 5820 SourceInformation sourceInformation) { |
| 5821 assert(element.isJsInterop); |
| 5822 nativeEmitter.nativeMethods.add(element); |
| 5823 String templateString; |
| 5824 |
| 5825 if (element.isFactoryConstructor) { |
| 5826 // Treat factory constructors as syntactic sugar for creating object |
| 5827 // literals. |
| 5828 ConstructorElement constructor = element; |
| 5829 FunctionSignature params = constructor.functionSignature; |
| 5830 int i = 0; |
| 5831 int positions = 0; |
| 5832 var filteredArguments = <HInstruction>[]; |
| 5833 var parameterNameMap = new Map<String, js.Expression>(); |
| 5834 params.orderedForEachParameter((ParameterElement parameter) { |
| 5835 // TODO(jacobr): throw if parameter names do not match names of property |
| 5836 // names in the class. |
| 5837 assert (parameter.isNamed); |
| 5838 if (!parameter.isNamed) { |
| 5839 compiler.reportErrorMessage( |
| 5840 parameter, MessageKind.GENERIC, |
| 5841 {'text': 'All arguments to external constructors of JavaScript ' |
| 5842 'interop classes must be named as these constructors ' |
| 5843 'are syntactic sugar for object literals.'}); |
| 5844 } |
| 5845 HInstruction argument = arguments[i]; |
| 5846 if (argument != null) { |
| 5847 filteredArguments.add(argument); |
| 5848 parameterNameMap[parameter.name] = |
| 5849 new js.InterpolatedExpression(positions++); |
| 5850 } |
| 5851 i++; |
| 5852 }); |
| 5853 var codeTemplate = new js.Template(null, |
| 5854 js.objectLiteral(parameterNameMap)); |
| 5855 |
| 5856 var nativeBehavior = new native.NativeBehavior() |
| 5857 ..codeTemplate = codeTemplate; |
| 5858 return new HForeignCode( |
| 5859 codeTemplate, |
| 5860 backend.dynamicType, filteredArguments, |
| 5861 nativeBehavior: nativeBehavior) |
| 5862 ..sourceInformation = sourceInformation; |
| 5863 } |
| 5864 var target = new HForeignCode(js.js.parseForeignJS( |
| 5865 "${backend.namer.fixedBackendPath(element)}." |
| 5866 "${element.fixedBackendName}"), |
| 5867 backend.dynamicType, |
| 5868 <HInstruction>[]); |
| 5869 add(target); |
| 5870 // Strip off trailing arguments that were not specified. |
| 5871 // we could assert that the trailing arguments are all null. |
| 5872 // TODO(jacobr): rewrite named arguments to an object literal matching |
| 5873 // the factory constructor case. |
| 5874 arguments = arguments.where((arg) => arg != null).toList(); |
| 5875 var inputs = <HInstruction>[target]..addAll(arguments); |
| 5876 |
| 5877 js.Template codeTemplate; |
| 5878 if (element.isGetter) { |
| 5879 codeTemplate = js.js.parseForeignJS("#"); |
| 5880 } else if (element.isSetter) { |
| 5881 codeTemplate = js.js.parseForeignJS("# = #"); |
| 5882 } else { |
| 5883 var argsStub = <String>[]; |
| 5884 for (int i = 0; i < arguments.length; i++) { |
| 5885 argsStub.add('#'); |
| 5886 } |
| 5887 if (element.isConstructor) { |
| 5888 codeTemplate = js.js.parseForeignJS("new #(${argsStub.join(",")})"); |
| 5889 } else { |
| 5890 codeTemplate = js.js.parseForeignJS("#(${argsStub.join(",")})"); |
| 5891 } |
| 5892 } |
| 5893 |
| 5894 var nativeBehavior = new native.NativeBehavior() |
| 5895 ..codeTemplate = codeTemplate |
| 5896 ..typesReturned.add( |
| 5897 backend.jsJavaScriptObjectClass.thisType) |
| 5898 ..typesInstantiated.add( |
| 5899 backend.jsJavaScriptObjectClass.thisType) |
| 5900 ..sideEffects.setAllSideEffects(); |
| 5901 return new HForeignCode( |
| 5902 codeTemplate, |
| 5903 backend.dynamicType, inputs, |
| 5904 nativeBehavior: nativeBehavior) |
| 5905 ..sourceInformation = sourceInformation; |
| 5906 } |
| 5907 |
| 5791 void pushInvokeStatic(ast.Node location, | 5908 void pushInvokeStatic(ast.Node location, |
| 5792 Element element, | 5909 Element element, |
| 5793 List<HInstruction> arguments, | 5910 List<HInstruction> arguments, |
| 5794 {TypeMask typeMask, | 5911 {TypeMask typeMask, |
| 5795 InterfaceType instanceType, | 5912 InterfaceType instanceType, |
| 5796 SourceInformation sourceInformation}) { | 5913 SourceInformation sourceInformation}) { |
| 5797 // TODO(johnniwinther): Use [sourceInformation] instead of [location]. | 5914 // TODO(johnniwinther): Use [sourceInformation] instead of [location]. |
| 5798 if (tryInlineMethod(element, null, null, arguments, location, | 5915 if (tryInlineMethod(element, null, null, arguments, location, |
| 5799 instanceType: instanceType)) { | 5916 instanceType: instanceType)) { |
| 5800 return; | 5917 return; |
| 5801 } | 5918 } |
| 5802 | 5919 |
| 5803 if (typeMask == null) { | 5920 if (typeMask == null) { |
| 5804 typeMask = | 5921 typeMask = |
| 5805 TypeMaskFactory.inferredReturnTypeForElement(element, compiler); | 5922 TypeMaskFactory.inferredReturnTypeForElement(element, compiler); |
| 5806 } | 5923 } |
| 5807 bool targetCanThrow = !compiler.world.getCannotThrow(element); | 5924 bool targetCanThrow = !compiler.world.getCannotThrow(element); |
| 5808 // TODO(5346): Try to avoid the need for calling [declaration] before | 5925 // TODO(5346): Try to avoid the need for calling [declaration] before |
| 5809 // creating an [HInvokeStatic]. | 5926 var instruction; |
| 5810 HInvokeStatic instruction = new HInvokeStatic( | 5927 if (element.isJsInterop) { |
| 5811 element.declaration, arguments, typeMask, | 5928 instruction = invokeJsInteropFunction(element, arguments, |
| 5812 targetCanThrow: targetCanThrow) | 5929 sourceInformation); |
| 5813 ..sourceInformation = sourceInformation; | 5930 } else { |
| 5814 if (!currentInlinedInstantiations.isEmpty) { | 5931 // creating an [HInvokeStatic]. |
| 5815 instruction.instantiatedTypes = new List<DartType>.from( | 5932 instruction = new HInvokeStatic( |
| 5816 currentInlinedInstantiations); | 5933 element.declaration, arguments, typeMask, |
| 5934 targetCanThrow: targetCanThrow) |
| 5935 ..sourceInformation = sourceInformation; |
| 5936 if (!currentInlinedInstantiations.isEmpty) { |
| 5937 instruction.instantiatedTypes = new List<DartType>.from( |
| 5938 currentInlinedInstantiations); |
| 5939 } |
| 5940 instruction.sideEffects = compiler.world.getSideEffectsOfElement(element); |
| 5817 } | 5941 } |
| 5818 instruction.sideEffects = compiler.world.getSideEffectsOfElement(element); | |
| 5819 if (location == null) { | 5942 if (location == null) { |
| 5820 push(instruction); | 5943 push(instruction); |
| 5821 } else { | 5944 } else { |
| 5822 pushWithPosition(instruction, location); | 5945 pushWithPosition(instruction, location); |
| 5823 } | 5946 } |
| 5824 } | 5947 } |
| 5825 | 5948 |
| 5826 HInstruction buildInvokeSuper(Selector selector, | 5949 HInstruction buildInvokeSuper(Selector selector, |
| 5827 Element element, | 5950 Element element, |
| 5828 List<HInstruction> arguments, | 5951 List<HInstruction> arguments, |
| (...skipping 3162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8991 if (unaliased is TypedefType) throw 'unable to unalias $type'; | 9114 if (unaliased is TypedefType) throw 'unable to unalias $type'; |
| 8992 unaliased.accept(this, builder); | 9115 unaliased.accept(this, builder); |
| 8993 } | 9116 } |
| 8994 | 9117 |
| 8995 void visitDynamicType(DynamicType type, SsaBuilder builder) { | 9118 void visitDynamicType(DynamicType type, SsaBuilder builder) { |
| 8996 JavaScriptBackend backend = builder.compiler.backend; | 9119 JavaScriptBackend backend = builder.compiler.backend; |
| 8997 ClassElement cls = backend.findHelper('DynamicRuntimeType'); | 9120 ClassElement cls = backend.findHelper('DynamicRuntimeType'); |
| 8998 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); | 9121 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); |
| 8999 } | 9122 } |
| 9000 } | 9123 } |
| OLD | NEW |