OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../closure.dart'; | 7 import '../closure.dart'; |
8 import '../common.dart'; | 8 import '../common.dart'; |
9 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 9 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; |
10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 this.compiler = compiler; | 143 this.compiler = compiler; |
144 this.loopHandler = new KernelLoopHandler(this); | 144 this.loopHandler = new KernelLoopHandler(this); |
145 typeBuilder = new TypeBuilder(this); | 145 typeBuilder = new TypeBuilder(this); |
146 graph.element = targetElement; | 146 graph.element = targetElement; |
147 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? | 147 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? |
148 this.sourceInformationBuilder = | 148 this.sourceInformationBuilder = |
149 sourceInformationFactory.createBuilderForContext(resolvedAst); | 149 sourceInformationFactory.createBuilderForContext(resolvedAst); |
150 graph.sourceInformation = | 150 graph.sourceInformation = |
151 sourceInformationBuilder.buildVariableDeclaration(); | 151 sourceInformationBuilder.buildVariableDeclaration(); |
152 this.localsHandler = new LocalsHandler( | 152 this.localsHandler = new LocalsHandler( |
153 this, targetElement, null, backend.nativeData, backend.interceptorData); | 153 this, targetElement, null, nativeData, interceptorData); |
154 this.astAdapter = new KernelAstAdapter(kernel, compiler.backend, | 154 this.astAdapter = new KernelAstAdapter(kernel, compiler.backend, |
155 resolvedAst, kernel.nodeToAst, kernel.nodeToElement); | 155 resolvedAst, kernel.nodeToAst, kernel.nodeToElement); |
156 target = astAdapter.getInitialKernelNode(targetElement); | 156 target = astAdapter.getInitialKernelNode(targetElement); |
157 if (targetElement is ConstructorBodyElement) { | 157 if (targetElement is ConstructorBodyElement) { |
158 _targetIsConstructorBody = true; | 158 _targetIsConstructorBody = true; |
159 } | 159 } |
160 } | 160 } |
161 | 161 |
162 HGraph build() { | 162 HGraph build() { |
163 // TODO(het): no reason to do this here... | 163 // TODO(het): no reason to do this here... |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 return typeBuilder.potentiallyCheckOrTrustType(value, type, | 213 return typeBuilder.potentiallyCheckOrTrustType(value, type, |
214 kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK); | 214 kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK); |
215 } | 215 } |
216 HInstruction result = new HBoolify(value, commonMasks.boolType); | 216 HInstruction result = new HBoolify(value, commonMasks.boolType); |
217 add(result); | 217 add(result); |
218 return result; | 218 return result; |
219 } | 219 } |
220 | 220 |
221 void _addClassTypeVariablesIfNeeded(ir.Member constructor) { | 221 void _addClassTypeVariablesIfNeeded(ir.Member constructor) { |
222 var enclosing = constructor.enclosingClass; | 222 var enclosing = constructor.enclosingClass; |
223 if (backend.rtiNeed.classNeedsRti(astAdapter.getElement(enclosing))) { | 223 if (rtiNeed.classNeedsRti(astAdapter.getElement(enclosing))) { |
224 enclosing.typeParameters.forEach((ir.TypeParameter typeParameter) { | 224 enclosing.typeParameters.forEach((ir.TypeParameter typeParameter) { |
225 var typeParamElement = astAdapter.getElement(typeParameter); | 225 var typeParamElement = astAdapter.getElement(typeParameter); |
226 HParameterValue param = | 226 HParameterValue param = |
227 addParameter(typeParamElement, commonMasks.nonNullType); | 227 addParameter(typeParamElement, commonMasks.nonNullType); |
228 // This is a little bit wacky (and n^2) until we make the localsHandler | 228 // This is a little bit wacky (and n^2) until we make the localsHandler |
229 // take Kernel DartTypes instead of just the AST DartTypes. | 229 // take Kernel DartTypes instead of just the AST DartTypes. |
230 var typeVariableType = astAdapter | 230 var typeVariableType = astAdapter |
231 .getClass(enclosing) | 231 .getClass(enclosing) |
232 .typeVariables | 232 .typeVariables |
233 .firstWhere( | 233 .firstWhere( |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 signature.forEachRequiredParameter((_) { | 398 signature.forEachRequiredParameter((_) { |
399 arguments.positional[positionalIndex++].accept(this); | 399 arguments.positional[positionalIndex++].accept(this); |
400 builtArguments.add(pop()); | 400 builtArguments.add(pop()); |
401 }); | 401 }); |
402 if (!signature.optionalParametersAreNamed) { | 402 if (!signature.optionalParametersAreNamed) { |
403 signature.forEachOptionalParameter((ParameterElement element) { | 403 signature.forEachOptionalParameter((ParameterElement element) { |
404 if (positionalIndex < arguments.positional.length) { | 404 if (positionalIndex < arguments.positional.length) { |
405 arguments.positional[positionalIndex++].accept(this); | 405 arguments.positional[positionalIndex++].accept(this); |
406 builtArguments.add(pop()); | 406 builtArguments.add(pop()); |
407 } else { | 407 } else { |
408 var constantValue = | 408 var constantValue = constants.getConstantValue(element.constant); |
409 backend.constants.getConstantValue(element.constant); | |
410 assert(invariant(element, constantValue != null, | 409 assert(invariant(element, constantValue != null, |
411 message: 'No constant computed for $element')); | 410 message: 'No constant computed for $element')); |
412 builtArguments.add(graph.addConstant(constantValue, closedWorld)); | 411 builtArguments.add(graph.addConstant(constantValue, closedWorld)); |
413 } | 412 } |
414 }); | 413 }); |
415 } else { | 414 } else { |
416 signature.orderedOptionalParameters.forEach((ParameterElement element) { | 415 signature.orderedOptionalParameters.forEach((ParameterElement element) { |
417 var correspondingNamed = arguments.named.firstWhere( | 416 var correspondingNamed = arguments.named.firstWhere( |
418 (named) => named.name == element.name, | 417 (named) => named.name == element.name, |
419 orElse: () => null); | 418 orElse: () => null); |
420 if (correspondingNamed != null) { | 419 if (correspondingNamed != null) { |
421 correspondingNamed.value.accept(this); | 420 correspondingNamed.value.accept(this); |
422 builtArguments.add(pop()); | 421 builtArguments.add(pop()); |
423 } else { | 422 } else { |
424 var constantValue = | 423 var constantValue = constants.getConstantValue(element.constant); |
425 backend.constants.getConstantValue(element.constant); | |
426 assert(invariant(element, constantValue != null, | 424 assert(invariant(element, constantValue != null, |
427 message: 'No constant computed for $element')); | 425 message: 'No constant computed for $element')); |
428 builtArguments.add(graph.addConstant(constantValue, closedWorld)); | 426 builtArguments.add(graph.addConstant(constantValue, closedWorld)); |
429 } | 427 } |
430 }); | 428 }); |
431 } | 429 } |
432 | 430 |
433 return builtArguments; | 431 return builtArguments; |
434 } | 432 } |
435 | 433 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 new DartString.literal(prefixElement.deferredImport.uri.toString()), | 576 new DartString.literal(prefixElement.deferredImport.uri.toString()), |
579 closedWorld); | 577 closedWorld); |
580 _pushStaticInvocation(astAdapter.checkDeferredIsLoaded, | 578 _pushStaticInvocation(astAdapter.checkDeferredIsLoaded, |
581 [prefixConstant, uriConstant], astAdapter.checkDeferredIsLoadedType); | 579 [prefixConstant, uriConstant], astAdapter.checkDeferredIsLoadedType); |
582 } | 580 } |
583 | 581 |
584 @override | 582 @override |
585 void visitLoadLibrary(ir.LoadLibrary loadLibrary) { | 583 void visitLoadLibrary(ir.LoadLibrary loadLibrary) { |
586 // TODO(efortuna): Source information! | 584 // TODO(efortuna): Source information! |
587 push(new HInvokeStatic( | 585 push(new HInvokeStatic( |
588 backend.helpers.loadLibraryWrapper, | 586 helpers.loadLibraryWrapper, |
589 [ | 587 [ |
590 graph.addConstantString( | 588 graph.addConstantString( |
591 new DartString.literal(loadLibrary.import.name), closedWorld) | 589 new DartString.literal(loadLibrary.import.name), closedWorld) |
592 ], | 590 ], |
593 commonMasks.nonNullType, | 591 commonMasks.nonNullType, |
594 targetCanThrow: false)); | 592 targetCanThrow: false)); |
595 } | 593 } |
596 | 594 |
597 @override | 595 @override |
598 void visitBlock(ir.Block block) { | 596 void visitBlock(ir.Block block) { |
(...skipping 854 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 | 1451 |
1454 HInstruction buildCondition() => graph.addConstantBool(true, closedWorld); | 1452 HInstruction buildCondition() => graph.addConstantBool(true, closedWorld); |
1455 | 1453 |
1456 void buildSwitch() { | 1454 void buildSwitch() { |
1457 HInstruction buildExpression(ir.SwitchStatement notUsed) { | 1455 HInstruction buildExpression(ir.SwitchStatement notUsed) { |
1458 return localsHandler.readLocal(switchTarget); | 1456 return localsHandler.readLocal(switchTarget); |
1459 } | 1457 } |
1460 | 1458 |
1461 List<ConstantValue> getConstants( | 1459 List<ConstantValue> getConstants( |
1462 ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) { | 1460 ir.SwitchStatement parentSwitch, ir.SwitchCase switchCase) { |
1463 return <ConstantValue>[ | 1461 return <ConstantValue>[constantSystem.createInt(caseIndex[switchCase])]; |
1464 backend.constantSystem.createInt(caseIndex[switchCase]) | |
1465 ]; | |
1466 } | 1462 } |
1467 | 1463 |
1468 void buildSwitchCase(ir.SwitchCase switchCase) { | 1464 void buildSwitchCase(ir.SwitchCase switchCase) { |
1469 switchCase.body.accept(this); | 1465 switchCase.body.accept(this); |
1470 if (!isAborted()) { | 1466 if (!isAborted()) { |
1471 // Ensure that we break the loop if the case falls through. (This | 1467 // Ensure that we break the loop if the case falls through. (This |
1472 // is only possible for the last case.) | 1468 // is only possible for the last case.) |
1473 jumpTargets[switchTarget].generateBreak(); | 1469 jumpTargets[switchTarget].generateBreak(); |
1474 } | 1470 } |
1475 } | 1471 } |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1670 @override | 1666 @override |
1671 void visitNullLiteral(ir.NullLiteral nullLiteral) { | 1667 void visitNullLiteral(ir.NullLiteral nullLiteral) { |
1672 stack.add(graph.addConstantNull(closedWorld)); | 1668 stack.add(graph.addConstantNull(closedWorld)); |
1673 } | 1669 } |
1674 | 1670 |
1675 /// Set the runtime type information if necessary. | 1671 /// Set the runtime type information if necessary. |
1676 HInstruction setListRuntimeTypeInfoIfNeeded( | 1672 HInstruction setListRuntimeTypeInfoIfNeeded( |
1677 HInstruction object, ir.ListLiteral listLiteral) { | 1673 HInstruction object, ir.ListLiteral listLiteral) { |
1678 ResolutionInterfaceType type = localsHandler | 1674 ResolutionInterfaceType type = localsHandler |
1679 .substInContext(astAdapter.getDartTypeOfListLiteral(listLiteral)); | 1675 .substInContext(astAdapter.getDartTypeOfListLiteral(listLiteral)); |
1680 if (!backend.rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) { | 1676 if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) { |
1681 return object; | 1677 return object; |
1682 } | 1678 } |
1683 List<HInstruction> arguments = <HInstruction>[]; | 1679 List<HInstruction> arguments = <HInstruction>[]; |
1684 for (ResolutionDartType argument in type.typeArguments) { | 1680 for (ResolutionDartType argument in type.typeArguments) { |
1685 arguments.add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); | 1681 arguments.add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
1686 } | 1682 } |
1687 // TODO(15489): Register at codegen. | 1683 // TODO(15489): Register at codegen. |
1688 registry?.registerInstantiation(type); | 1684 registry?.registerInstantiation(type); |
1689 return callSetRuntimeTypeInfoWithTypeArguments(type, arguments, object); | 1685 return callSetRuntimeTypeInfoWithTypeArguments(type, arguments, object); |
1690 } | 1686 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1745 inputs.add(argList); | 1741 inputs.add(argList); |
1746 } | 1742 } |
1747 | 1743 |
1748 assert(constructor.kind == ir.ProcedureKind.Factory); | 1744 assert(constructor.kind == ir.ProcedureKind.Factory); |
1749 | 1745 |
1750 ResolutionInterfaceType type = localsHandler | 1746 ResolutionInterfaceType type = localsHandler |
1751 .substInContext(astAdapter.getDartTypeOfMapLiteral(mapLiteral)); | 1747 .substInContext(astAdapter.getDartTypeOfMapLiteral(mapLiteral)); |
1752 | 1748 |
1753 ir.Class cls = constructor.enclosingClass; | 1749 ir.Class cls = constructor.enclosingClass; |
1754 | 1750 |
1755 if (backend.rtiNeed.classNeedsRti(astAdapter.getClass(cls))) { | 1751 if (rtiNeed.classNeedsRti(astAdapter.getClass(cls))) { |
1756 List<HInstruction> typeInputs = <HInstruction>[]; | 1752 List<HInstruction> typeInputs = <HInstruction>[]; |
1757 type.typeArguments.forEach((ResolutionDartType argument) { | 1753 type.typeArguments.forEach((ResolutionDartType argument) { |
1758 typeInputs | 1754 typeInputs |
1759 .add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); | 1755 .add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
1760 }); | 1756 }); |
1761 | 1757 |
1762 // We lift this common call pattern into a helper function to save space | 1758 // We lift this common call pattern into a helper function to save space |
1763 // in the output. | 1759 // in the output. |
1764 if (typeInputs.every((HInstruction input) => input.isNull())) { | 1760 if (typeInputs.every((HInstruction input) => input.isNull())) { |
1765 if (constructorArgs.isEmpty) { | 1761 if (constructorArgs.isEmpty) { |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2190 return stringConstant.primitiveValue.slowToString(); | 2186 return stringConstant.primitiveValue.slowToString(); |
2191 } | 2187 } |
2192 | 2188 |
2193 void handleForeignJsCurrentIsolateContext(ir.StaticInvocation invocation) { | 2189 void handleForeignJsCurrentIsolateContext(ir.StaticInvocation invocation) { |
2194 if (_unexpectedForeignArguments(invocation, 0, 0)) { | 2190 if (_unexpectedForeignArguments(invocation, 0, 0)) { |
2195 // Result expected on stack. | 2191 // Result expected on stack. |
2196 stack.add(graph.addConstantNull(closedWorld)); | 2192 stack.add(graph.addConstantNull(closedWorld)); |
2197 return; | 2193 return; |
2198 } | 2194 } |
2199 | 2195 |
2200 if (!backend.backendUsage.isIsolateInUse) { | 2196 if (!backendUsage.isIsolateInUse) { |
2201 // If the isolate library is not used, we just generate code | 2197 // If the isolate library is not used, we just generate code |
2202 // to fetch the static state. | 2198 // to fetch the static state. |
2203 String name = backend.namer.staticStateHolder; | 2199 String name = namer.staticStateHolder; |
2204 push(new HForeignCode( | 2200 push(new HForeignCode( |
2205 js.js.parseForeignJS(name), commonMasks.dynamicType, <HInstruction>[], | 2201 js.js.parseForeignJS(name), commonMasks.dynamicType, <HInstruction>[], |
2206 nativeBehavior: native.NativeBehavior.DEPENDS_OTHER)); | 2202 nativeBehavior: native.NativeBehavior.DEPENDS_OTHER)); |
2207 } else { | 2203 } else { |
2208 // Call a helper method from the isolate library. The isolate library uses | 2204 // Call a helper method from the isolate library. The isolate library uses |
2209 // its own isolate structure that encapsulates the isolate structure used | 2205 // its own isolate structure that encapsulates the isolate structure used |
2210 // for binding to methods. | 2206 // for binding to methods. |
2211 ir.Procedure target = astAdapter.currentIsolate; | 2207 ir.Procedure target = astAdapter.currentIsolate; |
2212 if (target == null) { | 2208 if (target == null) { |
2213 reporter.internalError(astAdapter.getNode(invocation), | 2209 reporter.internalError(astAdapter.getNode(invocation), |
2214 'Isolate library and compiler mismatch.'); | 2210 'Isolate library and compiler mismatch.'); |
2215 } | 2211 } |
2216 _pushStaticInvocation(target, <HInstruction>[], commonMasks.dynamicType); | 2212 _pushStaticInvocation(target, <HInstruction>[], commonMasks.dynamicType); |
2217 } | 2213 } |
2218 } | 2214 } |
2219 | 2215 |
2220 void handleForeignJsCallInIsolate(ir.StaticInvocation invocation) { | 2216 void handleForeignJsCallInIsolate(ir.StaticInvocation invocation) { |
2221 if (_unexpectedForeignArguments(invocation, 2, 2)) { | 2217 if (_unexpectedForeignArguments(invocation, 2, 2)) { |
2222 // Result expected on stack. | 2218 // Result expected on stack. |
2223 stack.add(graph.addConstantNull(closedWorld)); | 2219 stack.add(graph.addConstantNull(closedWorld)); |
2224 return; | 2220 return; |
2225 } | 2221 } |
2226 | 2222 |
2227 List<HInstruction> inputs = _visitPositionalArguments(invocation.arguments); | 2223 List<HInstruction> inputs = _visitPositionalArguments(invocation.arguments); |
2228 | 2224 |
2229 if (!backend.backendUsage.isIsolateInUse) { | 2225 if (!backendUsage.isIsolateInUse) { |
2230 // If the isolate library is not used, we ignore the isolate argument and | 2226 // If the isolate library is not used, we ignore the isolate argument and |
2231 // just invoke the closure. | 2227 // just invoke the closure. |
2232 push(new HInvokeClosure(new Selector.callClosure(0), | 2228 push(new HInvokeClosure(new Selector.callClosure(0), |
2233 <HInstruction>[inputs[1]], commonMasks.dynamicType)); | 2229 <HInstruction>[inputs[1]], commonMasks.dynamicType)); |
2234 } else { | 2230 } else { |
2235 // Call a helper method from the isolate library. | 2231 // Call a helper method from the isolate library. |
2236 ir.Procedure callInIsolate = astAdapter.callInIsolate; | 2232 ir.Procedure callInIsolate = astAdapter.callInIsolate; |
2237 if (callInIsolate == null) { | 2233 if (callInIsolate == null) { |
2238 reporter.internalError(astAdapter.getNode(invocation), | 2234 reporter.internalError(astAdapter.getNode(invocation), |
2239 'Isolate library and compiler mismatch.'); | 2235 'Isolate library and compiler mismatch.'); |
(...skipping 22 matching lines...) Expand all Loading... |
2262 if (closure is ir.StaticGet) { | 2258 if (closure is ir.StaticGet) { |
2263 ir.Member staticTarget = closure.target; | 2259 ir.Member staticTarget = closure.target; |
2264 if (staticTarget is ir.Procedure) { | 2260 if (staticTarget is ir.Procedure) { |
2265 if (staticTarget.kind == ir.ProcedureKind.Method) { | 2261 if (staticTarget.kind == ir.ProcedureKind.Method) { |
2266 ir.FunctionNode function = staticTarget.function; | 2262 ir.FunctionNode function = staticTarget.function; |
2267 if (function != null && | 2263 if (function != null && |
2268 function.requiredParameterCount == | 2264 function.requiredParameterCount == |
2269 function.positionalParameters.length && | 2265 function.positionalParameters.length && |
2270 function.namedParameters.isEmpty) { | 2266 function.namedParameters.isEmpty) { |
2271 push(new HForeignCode( | 2267 push(new HForeignCode( |
2272 js.js.expressionTemplateYielding(backend.emitter | 2268 js.js.expressionTemplateYielding(emitter |
2273 .staticFunctionAccess(astAdapter.getMethod(staticTarget))), | 2269 .staticFunctionAccess(astAdapter.getMethod(staticTarget))), |
2274 commonMasks.dynamicType, | 2270 commonMasks.dynamicType, |
2275 <HInstruction>[], | 2271 <HInstruction>[], |
2276 nativeBehavior: native.NativeBehavior.PURE, | 2272 nativeBehavior: native.NativeBehavior.PURE, |
2277 foreignFunction: astAdapter.getMethod(staticTarget))); | 2273 foreignFunction: astAdapter.getMethod(staticTarget))); |
2278 return; | 2274 return; |
2279 } | 2275 } |
2280 problem = 'does not handle a closure with optional parameters'; | 2276 problem = 'does not handle a closure with optional parameters'; |
2281 } | 2277 } |
2282 } | 2278 } |
2283 } | 2279 } |
2284 | 2280 |
2285 reporter.reportErrorMessage(astAdapter.getNode(invocation), | 2281 reporter.reportErrorMessage(astAdapter.getNode(invocation), |
2286 MessageKind.GENERIC, {'text': "'$name' $problem."}); | 2282 MessageKind.GENERIC, {'text': "'$name' $problem."}); |
2287 stack.add(graph.addConstantNull(closedWorld)); // Result expected on stack. | 2283 stack.add(graph.addConstantNull(closedWorld)); // Result expected on stack. |
2288 return; | 2284 return; |
2289 } | 2285 } |
2290 | 2286 |
2291 void handleForeignJsSetStaticState(ir.StaticInvocation invocation) { | 2287 void handleForeignJsSetStaticState(ir.StaticInvocation invocation) { |
2292 if (_unexpectedForeignArguments(invocation, 1, 1)) { | 2288 if (_unexpectedForeignArguments(invocation, 1, 1)) { |
2293 // Result expected on stack. | 2289 // Result expected on stack. |
2294 stack.add(graph.addConstantNull(closedWorld)); | 2290 stack.add(graph.addConstantNull(closedWorld)); |
2295 return; | 2291 return; |
2296 } | 2292 } |
2297 | 2293 |
2298 List<HInstruction> inputs = _visitPositionalArguments(invocation.arguments); | 2294 List<HInstruction> inputs = _visitPositionalArguments(invocation.arguments); |
2299 | 2295 |
2300 String isolateName = backend.namer.staticStateHolder; | 2296 String isolateName = namer.staticStateHolder; |
2301 SideEffects sideEffects = new SideEffects.empty(); | 2297 SideEffects sideEffects = new SideEffects.empty(); |
2302 sideEffects.setAllSideEffects(); | 2298 sideEffects.setAllSideEffects(); |
2303 push(new HForeignCode(js.js.parseForeignJS("$isolateName = #"), | 2299 push(new HForeignCode(js.js.parseForeignJS("$isolateName = #"), |
2304 commonMasks.dynamicType, inputs, | 2300 commonMasks.dynamicType, inputs, |
2305 nativeBehavior: native.NativeBehavior.CHANGES_OTHER, | 2301 nativeBehavior: native.NativeBehavior.CHANGES_OTHER, |
2306 effects: sideEffects)); | 2302 effects: sideEffects)); |
2307 } | 2303 } |
2308 | 2304 |
2309 void handleForeignJsGetStaticState(ir.StaticInvocation invocation) { | 2305 void handleForeignJsGetStaticState(ir.StaticInvocation invocation) { |
2310 if (_unexpectedForeignArguments(invocation, 0, 0)) { | 2306 if (_unexpectedForeignArguments(invocation, 0, 0)) { |
2311 // Result expected on stack. | 2307 // Result expected on stack. |
2312 stack.add(graph.addConstantNull(closedWorld)); | 2308 stack.add(graph.addConstantNull(closedWorld)); |
2313 return; | 2309 return; |
2314 } | 2310 } |
2315 | 2311 |
2316 push(new HForeignCode(js.js.parseForeignJS(backend.namer.staticStateHolder), | 2312 push(new HForeignCode(js.js.parseForeignJS(namer.staticStateHolder), |
2317 commonMasks.dynamicType, <HInstruction>[], | 2313 commonMasks.dynamicType, <HInstruction>[], |
2318 nativeBehavior: native.NativeBehavior.DEPENDS_OTHER)); | 2314 nativeBehavior: native.NativeBehavior.DEPENDS_OTHER)); |
2319 } | 2315 } |
2320 | 2316 |
2321 void handleForeignJsGetName(ir.StaticInvocation invocation) { | 2317 void handleForeignJsGetName(ir.StaticInvocation invocation) { |
2322 if (_unexpectedForeignArguments(invocation, 1, 1)) { | 2318 if (_unexpectedForeignArguments(invocation, 1, 1)) { |
2323 // Result expected on stack. | 2319 // Result expected on stack. |
2324 stack.add(graph.addConstantNull(closedWorld)); | 2320 stack.add(graph.addConstantNull(closedWorld)); |
2325 return; | 2321 return; |
2326 } | 2322 } |
(...skipping 19 matching lines...) Expand all Loading... |
2346 | 2342 |
2347 void handleForeignJsEmbeddedGlobal(ir.StaticInvocation invocation) { | 2343 void handleForeignJsEmbeddedGlobal(ir.StaticInvocation invocation) { |
2348 if (_unexpectedForeignArguments(invocation, 2, 2)) { | 2344 if (_unexpectedForeignArguments(invocation, 2, 2)) { |
2349 // Result expected on stack. | 2345 // Result expected on stack. |
2350 stack.add(graph.addConstantNull(closedWorld)); | 2346 stack.add(graph.addConstantNull(closedWorld)); |
2351 return; | 2347 return; |
2352 } | 2348 } |
2353 String globalName = _foreignConstantStringArgument( | 2349 String globalName = _foreignConstantStringArgument( |
2354 invocation, 1, 'JS_EMBEDDED_GLOBAL', 'second '); | 2350 invocation, 1, 'JS_EMBEDDED_GLOBAL', 'second '); |
2355 js.Template expr = js.js.expressionTemplateYielding( | 2351 js.Template expr = js.js.expressionTemplateYielding( |
2356 backend.emitter.generateEmbeddedGlobalAccess(globalName)); | 2352 emitter.generateEmbeddedGlobalAccess(globalName)); |
2357 | 2353 |
2358 native.NativeBehavior nativeBehavior = | 2354 native.NativeBehavior nativeBehavior = |
2359 astAdapter.getNativeBehavior(invocation); | 2355 astAdapter.getNativeBehavior(invocation); |
2360 assert(invariant(astAdapter.getNode(invocation), nativeBehavior != null, | 2356 assert(invariant(astAdapter.getNode(invocation), nativeBehavior != null, |
2361 message: "No NativeBehavior for $invocation")); | 2357 message: "No NativeBehavior for $invocation")); |
2362 | 2358 |
2363 TypeMask ssaType = | 2359 TypeMask ssaType = |
2364 astAdapter.typeFromNativeBehavior(nativeBehavior, closedWorld); | 2360 astAdapter.typeFromNativeBehavior(nativeBehavior, closedWorld); |
2365 push(new HForeignCode(expr, ssaType, const <HInstruction>[], | 2361 push(new HForeignCode(expr, ssaType, const <HInstruction>[], |
2366 nativeBehavior: nativeBehavior)); | 2362 nativeBehavior: nativeBehavior)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2414 if (_unexpectedForeignArguments(invocation, 1, 1)) { | 2410 if (_unexpectedForeignArguments(invocation, 1, 1)) { |
2415 stack.add( | 2411 stack.add( |
2416 // Result expected on stack. | 2412 // Result expected on stack. |
2417 graph.addConstantBool(false, closedWorld)); | 2413 graph.addConstantBool(false, closedWorld)); |
2418 return; | 2414 return; |
2419 } | 2415 } |
2420 String name = _foreignConstantStringArgument(invocation, 0, 'JS_GET_FLAG'); | 2416 String name = _foreignConstantStringArgument(invocation, 0, 'JS_GET_FLAG'); |
2421 bool value = false; | 2417 bool value = false; |
2422 switch (name) { | 2418 switch (name) { |
2423 case 'MUST_RETAIN_METADATA': | 2419 case 'MUST_RETAIN_METADATA': |
2424 value = backend.mirrorsData.mustRetainMetadata; | 2420 value = mirrorsData.mustRetainMetadata; |
2425 break; | 2421 break; |
2426 case 'USE_CONTENT_SECURITY_POLICY': | 2422 case 'USE_CONTENT_SECURITY_POLICY': |
2427 value = options.useContentSecurityPolicy; | 2423 value = options.useContentSecurityPolicy; |
2428 break; | 2424 break; |
2429 default: | 2425 default: |
2430 reporter.reportErrorMessage( | 2426 reporter.reportErrorMessage( |
2431 astAdapter.getNode(invocation), | 2427 astAdapter.getNode(invocation), |
2432 MessageKind.GENERIC, | 2428 MessageKind.GENERIC, |
2433 {'text': 'Error: Unknown internal flag "$name".'}); | 2429 {'text': 'Error: Unknown internal flag "$name".'}); |
2434 } | 2430 } |
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2681 assert(noSuchMethod != null); | 2677 assert(noSuchMethod != null); |
2682 return noSuchMethod; | 2678 return noSuchMethod; |
2683 } | 2679 } |
2684 | 2680 |
2685 void _generateSuperNoSuchMethod(ir.Expression invocation, String publicName, | 2681 void _generateSuperNoSuchMethod(ir.Expression invocation, String publicName, |
2686 List<HInstruction> arguments) { | 2682 List<HInstruction> arguments) { |
2687 Selector selector = astAdapter.getSelector(invocation); | 2683 Selector selector = astAdapter.getSelector(invocation); |
2688 ir.Class cls = _containingClass(invocation).superclass; | 2684 ir.Class cls = _containingClass(invocation).superclass; |
2689 assert(cls != null); | 2685 assert(cls != null); |
2690 ir.Procedure noSuchMethod = _findNoSuchMethodInClass(cls); | 2686 ir.Procedure noSuchMethod = _findNoSuchMethodInClass(cls); |
2691 if (backend.backendUsage.isInvokeOnUsed && | 2687 if (backendUsage.isInvokeOnUsed && |
2692 _containingClass(noSuchMethod) != astAdapter.objectClass) { | 2688 _containingClass(noSuchMethod) != astAdapter.objectClass) { |
2693 // Register the call as dynamic if [noSuchMethod] on the super | 2689 // Register the call as dynamic if [noSuchMethod] on the super |
2694 // class is _not_ the default implementation from [Object] (it might be | 2690 // class is _not_ the default implementation from [Object] (it might be |
2695 // overridden in the super class, but it might have a different number of | 2691 // overridden in the super class, but it might have a different number of |
2696 // arguments), in case the [noSuchMethod] implementation calls | 2692 // arguments), in case the [noSuchMethod] implementation calls |
2697 // [JSInvocationMirror._invokeOn]. | 2693 // [JSInvocationMirror._invokeOn]. |
2698 // TODO(johnniwinther): Register this more precisely. | 2694 // TODO(johnniwinther): Register this more precisely. |
2699 registry?.registerDynamicUse(new DynamicUse(selector, null)); | 2695 registry?.registerDynamicUse(new DynamicUse(selector, null)); |
2700 } | 2696 } |
2701 | 2697 |
2702 ConstantValue nameConstant = | 2698 ConstantValue nameConstant = |
2703 backend.constantSystem.createString(new DartString.literal(publicName)); | 2699 constantSystem.createString(new DartString.literal(publicName)); |
2704 | 2700 |
2705 js.Name internalName = backend.namer.invocationName(selector); | 2701 js.Name internalName = namer.invocationName(selector); |
2706 | 2702 |
2707 var argumentsInstruction = | 2703 var argumentsInstruction = |
2708 new HLiteralList(arguments, commonMasks.extendableArrayType); | 2704 new HLiteralList(arguments, commonMasks.extendableArrayType); |
2709 add(argumentsInstruction); | 2705 add(argumentsInstruction); |
2710 | 2706 |
2711 var argumentNames = new List<HInstruction>(); | 2707 var argumentNames = new List<HInstruction>(); |
2712 for (String argumentName in selector.namedArguments) { | 2708 for (String argumentName in selector.namedArguments) { |
2713 ConstantValue argumentNameConstant = backend.constantSystem | 2709 ConstantValue argumentNameConstant = |
2714 .createString(new DartString.literal(argumentName)); | 2710 constantSystem.createString(new DartString.literal(argumentName)); |
2715 argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld)); | 2711 argumentNames.add(graph.addConstant(argumentNameConstant, closedWorld)); |
2716 } | 2712 } |
2717 var argumentNamesInstruction = | 2713 var argumentNamesInstruction = |
2718 new HLiteralList(argumentNames, commonMasks.extendableArrayType); | 2714 new HLiteralList(argumentNames, commonMasks.extendableArrayType); |
2719 add(argumentNamesInstruction); | 2715 add(argumentNamesInstruction); |
2720 | 2716 |
2721 ConstantValue kindConstant = | 2717 ConstantValue kindConstant = |
2722 backend.constantSystem.createInt(selector.invocationMirrorKind); | 2718 constantSystem.createInt(selector.invocationMirrorKind); |
2723 | 2719 |
2724 _pushStaticInvocation( | 2720 _pushStaticInvocation( |
2725 astAdapter.createInvocationMirror, | 2721 astAdapter.createInvocationMirror, |
2726 [ | 2722 [ |
2727 graph.addConstant(nameConstant, closedWorld), | 2723 graph.addConstant(nameConstant, closedWorld), |
2728 graph.addConstantStringFromName(internalName, closedWorld), | 2724 graph.addConstantStringFromName(internalName, closedWorld), |
2729 graph.addConstant(kindConstant, closedWorld), | 2725 graph.addConstant(kindConstant, closedWorld), |
2730 argumentsInstruction, | 2726 argumentsInstruction, |
2731 argumentNamesInstruction | 2727 argumentNamesInstruction |
2732 ], | 2728 ], |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2850 push( | 2846 push( |
2851 new HIs.variable(typeValue, expression, pop(), commonMasks.boolType)); | 2847 new HIs.variable(typeValue, expression, pop(), commonMasks.boolType)); |
2852 return; | 2848 return; |
2853 } | 2849 } |
2854 | 2850 |
2855 if (_isInterfaceWithNoDynamicTypes(type)) { | 2851 if (_isInterfaceWithNoDynamicTypes(type)) { |
2856 HInstruction representations = typeBuilder | 2852 HInstruction representations = typeBuilder |
2857 .buildTypeArgumentRepresentations(typeValue, sourceElement); | 2853 .buildTypeArgumentRepresentations(typeValue, sourceElement); |
2858 add(representations); | 2854 add(representations); |
2859 ClassElement element = typeValue.element; | 2855 ClassElement element = typeValue.element; |
2860 js.Name operator = backend.namer.operatorIs(element); | 2856 js.Name operator = namer.operatorIs(element); |
2861 HInstruction isFieldName = | 2857 HInstruction isFieldName = |
2862 graph.addConstantStringFromName(operator, closedWorld); | 2858 graph.addConstantStringFromName(operator, closedWorld); |
2863 HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) | 2859 HInstruction asFieldName = closedWorld.hasAnyStrictSubtype(element) |
2864 ? graph.addConstantStringFromName( | 2860 ? graph.addConstantStringFromName( |
2865 backend.namer.substitutionName(element), closedWorld) | 2861 namer.substitutionName(element), closedWorld) |
2866 : graph.addConstantNull(closedWorld); | 2862 : graph.addConstantNull(closedWorld); |
2867 List<HInstruction> inputs = <HInstruction>[ | 2863 List<HInstruction> inputs = <HInstruction>[ |
2868 expression, | 2864 expression, |
2869 isFieldName, | 2865 isFieldName, |
2870 representations, | 2866 representations, |
2871 asFieldName | 2867 asFieldName |
2872 ]; | 2868 ]; |
2873 _pushStaticInvocation( | 2869 _pushStaticInvocation( |
2874 astAdapter.checkSubtype, inputs, commonMasks.boolType); | 2870 astAdapter.checkSubtype, inputs, commonMasks.boolType); |
2875 push( | 2871 push( |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3227 enterBlock.setBlockFlow( | 3223 enterBlock.setBlockFlow( |
3228 new HTryBlockInformation( | 3224 new HTryBlockInformation( |
3229 kernelBuilder.wrapStatementGraph(bodyGraph), | 3225 kernelBuilder.wrapStatementGraph(bodyGraph), |
3230 exception, | 3226 exception, |
3231 kernelBuilder.wrapStatementGraph(catchGraph), | 3227 kernelBuilder.wrapStatementGraph(catchGraph), |
3232 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3228 kernelBuilder.wrapStatementGraph(finallyGraph)), |
3233 exitBlock); | 3229 exitBlock); |
3234 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3230 kernelBuilder.inTryStatement = previouslyInTryStatement; |
3235 } | 3231 } |
3236 } | 3232 } |
OLD | NEW |