Chromium Code Reviews| 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 5116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5127 InterfaceType type = elements.getType(node); | 5127 InterfaceType type = elements.getType(node); |
| 5128 InterfaceType expectedType = | 5128 InterfaceType expectedType = |
| 5129 constructorDeclaration.computeEffectiveTargetType(type); | 5129 constructorDeclaration.computeEffectiveTargetType(type); |
| 5130 expectedType = localsHandler.substInContext(expectedType); | 5130 expectedType = localsHandler.substInContext(expectedType); |
| 5131 | 5131 |
| 5132 if (compiler.elementHasCompileTimeError(constructor)) { | 5132 if (compiler.elementHasCompileTimeError(constructor)) { |
| 5133 // TODO(ahe): Do something like [generateWrongArgumentCountError]. | 5133 // TODO(ahe): Do something like [generateWrongArgumentCountError]. |
| 5134 stack.add(graph.addConstantNull(compiler)); | 5134 stack.add(graph.addConstantNull(compiler)); |
| 5135 return; | 5135 return; |
| 5136 } | 5136 } |
| 5137 | |
| 5137 if (checkTypeVariableBounds(node, type)) return; | 5138 if (checkTypeVariableBounds(node, type)) return; |
|
sra1
2015/12/04 00:22:23
TODO (later): in checked mode, does the type varia
| |
| 5138 | 5139 |
| 5139 var inputs = <HInstruction>[]; | 5140 // Abstract class instantiation error takes precedence over argument |
| 5140 if (constructor.isGenerativeConstructor && | 5141 // mismatch. |
| 5141 backend.isNativeOrExtendsNative(constructor.enclosingClass) && | 5142 ClassElement cls = constructor.enclosingClass; |
| 5142 !backend.isJsInterop(constructor)) { | 5143 if (cls.isAbstract && constructor.isGenerativeConstructor) { |
| 5143 // Native class generative constructors take a pre-constructed object. | 5144 generateAbstractClassInstantiationError(send, cls.name); |
| 5144 inputs.add(graph.addConstantNull(compiler)); | 5145 return; |
| 5145 } | 5146 } |
| 5147 | |
| 5146 // TODO(5347): Try to avoid the need for calling [implementation] before | 5148 // TODO(5347): Try to avoid the need for calling [implementation] before |
| 5147 // calling [makeStaticArgumentList]. | 5149 // calling [makeStaticArgumentList]. |
| 5148 constructorImplementation = constructor.implementation; | 5150 constructorImplementation = constructor.implementation; |
| 5149 if (constructorImplementation.isMalformed || | 5151 if (constructorImplementation.isMalformed || |
| 5150 !callStructure.signatureApplies( | 5152 !callStructure.signatureApplies( |
| 5151 constructorImplementation.functionSignature)) { | 5153 constructorImplementation.functionSignature)) { |
| 5152 generateWrongArgumentCountError(send, constructor, send.arguments); | 5154 generateWrongArgumentCountError(send, constructor, send.arguments); |
| 5153 return; | 5155 return; |
| 5154 } | 5156 } |
| 5157 | |
| 5158 var inputs = <HInstruction>[]; | |
| 5159 if (constructor.isGenerativeConstructor && | |
| 5160 backend.isNativeOrExtendsNative(constructor.enclosingClass) && | |
| 5161 !backend.isJsInterop(constructor)) { | |
| 5162 // Native class generative constructors take a pre-constructed object. | |
| 5163 inputs.add(graph.addConstantNull(compiler)); | |
| 5164 } | |
| 5155 inputs.addAll(makeStaticArgumentList(callStructure, | 5165 inputs.addAll(makeStaticArgumentList(callStructure, |
| 5156 send.arguments, | 5166 send.arguments, |
| 5157 constructorImplementation)); | 5167 constructorImplementation)); |
| 5158 | 5168 |
| 5159 TypeMask elementType = computeType(constructor); | 5169 TypeMask elementType = computeType(constructor); |
| 5160 if (isFixedListConstructorCall) { | 5170 if (isFixedListConstructorCall) { |
| 5161 if (!inputs[0].isNumber(compiler)) { | 5171 if (!inputs[0].isNumber(compiler)) { |
| 5162 HTypeConversion conversion = new HTypeConversion( | 5172 HTypeConversion conversion = new HTypeConversion( |
| 5163 null, HTypeConversion.ARGUMENT_TYPE_CHECK, backend.numType, | 5173 null, HTypeConversion.ARGUMENT_TYPE_CHECK, backend.numType, |
| 5164 inputs[0], null); | 5174 inputs[0], null); |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 5191 // We need a finer grained side effect. | 5201 // We need a finer grained side effect. |
| 5192 add(new HForeignCode(code, backend.nullType, [stack.last], | 5202 add(new HForeignCode(code, backend.nullType, [stack.last], |
| 5193 throwBehavior: native.NativeThrowBehavior.MAY)); | 5203 throwBehavior: native.NativeThrowBehavior.MAY)); |
| 5194 } | 5204 } |
| 5195 } else if (isGrowableListConstructorCall) { | 5205 } else if (isGrowableListConstructorCall) { |
| 5196 push(buildLiteralList(<HInstruction>[])); | 5206 push(buildLiteralList(<HInstruction>[])); |
| 5197 stack.last.instructionType = elementType; | 5207 stack.last.instructionType = elementType; |
| 5198 } else { | 5208 } else { |
| 5199 SourceInformation sourceInformation = | 5209 SourceInformation sourceInformation = |
| 5200 sourceInformationBuilder.buildNew(send); | 5210 sourceInformationBuilder.buildNew(send); |
| 5201 ClassElement cls = constructor.enclosingClass; | |
| 5202 if (cls.isAbstract && constructor.isGenerativeConstructor) { | |
| 5203 generateAbstractClassInstantiationError(send, cls.name); | |
| 5204 return; | |
| 5205 } | |
| 5206 potentiallyAddTypeArguments(inputs, cls, expectedType); | 5211 potentiallyAddTypeArguments(inputs, cls, expectedType); |
| 5207 | |
| 5208 addInlinedInstantiation(expectedType); | 5212 addInlinedInstantiation(expectedType); |
| 5209 pushInvokeStatic(node, constructor, inputs, | 5213 pushInvokeStatic(node, constructor, inputs, |
| 5210 typeMask: elementType, | 5214 typeMask: elementType, |
| 5211 instanceType: expectedType, | 5215 instanceType: expectedType, |
| 5212 sourceInformation: sourceInformation); | 5216 sourceInformation: sourceInformation); |
| 5213 removeInlinedInstantiation(expectedType); | 5217 removeInlinedInstantiation(expectedType); |
| 5214 } | 5218 } |
| 5215 HInstruction newInstance = stack.last; | 5219 HInstruction newInstance = stack.last; |
| 5216 if (isFixedList) { | 5220 if (isFixedList) { |
| 5217 // Overwrite the element type, in case the allocation site has | 5221 // Overwrite the element type, in case the allocation site has |
| (...skipping 3955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9173 if (unaliased is TypedefType) throw 'unable to unalias $type'; | 9177 if (unaliased is TypedefType) throw 'unable to unalias $type'; |
| 9174 unaliased.accept(this, builder); | 9178 unaliased.accept(this, builder); |
| 9175 } | 9179 } |
| 9176 | 9180 |
| 9177 void visitDynamicType(DynamicType type, SsaBuilder builder) { | 9181 void visitDynamicType(DynamicType type, SsaBuilder builder) { |
| 9178 JavaScriptBackend backend = builder.compiler.backend; | 9182 JavaScriptBackend backend = builder.compiler.backend; |
| 9179 ClassElement cls = backend.helpers.DynamicRuntimeType; | 9183 ClassElement cls = backend.helpers.DynamicRuntimeType; |
| 9180 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); | 9184 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); |
| 9181 } | 9185 } |
| 9182 } | 9186 } |
| OLD | NEW |