| 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; | 9 import '../common/codegen.dart' show CodegenRegistry; |
| 10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 this._typeInferenceMap, | 110 this._typeInferenceMap, |
| 111 this.localsMap, | 111 this.localsMap, |
| 112 this.closedWorld, | 112 this.closedWorld, |
| 113 this._worldBuilder, | 113 this._worldBuilder, |
| 114 this.registry, | 114 this.registry, |
| 115 this.closureDataLookup, | 115 this.closureDataLookup, |
| 116 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? | 116 // TODO(het): Should sourceInformationBuilder be in GraphBuilder? |
| 117 this.sourceInformationBuilder, | 117 this.sourceInformationBuilder, |
| 118 this.functionNode) { | 118 this.functionNode) { |
| 119 this.loopHandler = new KernelLoopHandler(this); | 119 this.loopHandler = new KernelLoopHandler(this); |
| 120 typeBuilder = new KernelTypeBuilder(_elementMap, this); | 120 typeBuilder = new TypeBuilder(this); |
| 121 graph.element = targetElement; | 121 graph.element = targetElement; |
| 122 graph.sourceInformation = | 122 graph.sourceInformation = |
| 123 sourceInformationBuilder.buildVariableDeclaration(); | 123 sourceInformationBuilder.buildVariableDeclaration(); |
| 124 this.localsHandler = new LocalsHandler(this, targetElement, targetElement, | 124 this.localsHandler = new LocalsHandler(this, targetElement, targetElement, |
| 125 contextClass, null, nativeData, interceptorData); | 125 contextClass, null, nativeData, interceptorData); |
| 126 _targetStack.add(targetElement); | 126 _targetStack.add(targetElement); |
| 127 } | 127 } |
| 128 | 128 |
| 129 CommonElements get _commonElements => _elementMap.commonElements; | 129 CommonElements get _commonElements => _elementMap.commonElements; |
| 130 | 130 |
| (...skipping 1807 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1938 registry?.registerConstSymbol(symbolLiteral.value); | 1938 registry?.registerConstSymbol(symbolLiteral.value); |
| 1939 } | 1939 } |
| 1940 | 1940 |
| 1941 @override | 1941 @override |
| 1942 void visitNullLiteral(ir.NullLiteral nullLiteral) { | 1942 void visitNullLiteral(ir.NullLiteral nullLiteral) { |
| 1943 stack.add(graph.addConstantNull(closedWorld)); | 1943 stack.add(graph.addConstantNull(closedWorld)); |
| 1944 } | 1944 } |
| 1945 | 1945 |
| 1946 /// Set the runtime type information if necessary. | 1946 /// Set the runtime type information if necessary. |
| 1947 HInstruction _setListRuntimeTypeInfoIfNeeded( | 1947 HInstruction _setListRuntimeTypeInfoIfNeeded( |
| 1948 HInstruction object, ir.ListLiteral listLiteral) { | 1948 HInstruction object, InterfaceType type) { |
| 1949 InterfaceType type = localsHandler.substInContext(_commonElements | |
| 1950 .listType(_elementMap.getDartType(listLiteral.typeArgument))); | |
| 1951 if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) { | 1949 if (!rtiNeed.classNeedsRti(type.element) || type.treatAsRaw) { |
| 1952 return object; | 1950 return object; |
| 1953 } | 1951 } |
| 1954 List<HInstruction> arguments = <HInstruction>[]; | 1952 List<HInstruction> arguments = <HInstruction>[]; |
| 1955 for (DartType argument in type.typeArguments) { | 1953 for (DartType argument in type.typeArguments) { |
| 1956 arguments.add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); | 1954 arguments.add(typeBuilder.analyzeTypeArgument(argument, sourceElement)); |
| 1957 } | 1955 } |
| 1958 // TODO(15489): Register at codegen. | 1956 // TODO(15489): Register at codegen. |
| 1959 registry?.registerInstantiation(type); | 1957 registry?.registerInstantiation(type); |
| 1960 return callSetRuntimeTypeInfoWithTypeArguments(type, arguments, object); | 1958 return callSetRuntimeTypeInfoWithTypeArguments(type, arguments, object); |
| 1961 } | 1959 } |
| 1962 | 1960 |
| 1963 @override | 1961 @override |
| 1964 void visitListLiteral(ir.ListLiteral listLiteral) { | 1962 void visitListLiteral(ir.ListLiteral listLiteral) { |
| 1965 HInstruction listInstruction; | 1963 HInstruction listInstruction; |
| 1966 if (listLiteral.isConst) { | 1964 if (listLiteral.isConst) { |
| 1967 listInstruction = graph.addConstant( | 1965 listInstruction = graph.addConstant( |
| 1968 _elementMap.getConstantValue(listLiteral), closedWorld); | 1966 _elementMap.getConstantValue(listLiteral), closedWorld); |
| 1969 } else { | 1967 } else { |
| 1970 List<HInstruction> elements = <HInstruction>[]; | 1968 List<HInstruction> elements = <HInstruction>[]; |
| 1971 for (ir.Expression element in listLiteral.expressions) { | 1969 for (ir.Expression element in listLiteral.expressions) { |
| 1972 element.accept(this); | 1970 element.accept(this); |
| 1973 elements.add(pop()); | 1971 elements.add(pop()); |
| 1974 } | 1972 } |
| 1975 listInstruction = | 1973 listInstruction = |
| 1976 new HLiteralList(elements, commonMasks.extendableArrayType); | 1974 new HLiteralList(elements, commonMasks.extendableArrayType); |
| 1977 add(listInstruction); | 1975 add(listInstruction); |
| 1978 listInstruction = | 1976 InterfaceType type = localsHandler.substInContext(_commonElements |
| 1979 _setListRuntimeTypeInfoIfNeeded(listInstruction, listLiteral); | 1977 .listType(_elementMap.getDartType(listLiteral.typeArgument))); |
| 1978 listInstruction = _setListRuntimeTypeInfoIfNeeded(listInstruction, type); |
| 1980 } | 1979 } |
| 1981 | 1980 |
| 1982 TypeMask type = _typeInferenceMap.typeOfListLiteral( | 1981 TypeMask type = _typeInferenceMap.typeOfListLiteral( |
| 1983 targetElement, listLiteral, closedWorld); | 1982 targetElement, listLiteral, closedWorld); |
| 1984 if (!type.containsAll(closedWorld)) { | 1983 if (!type.containsAll(closedWorld)) { |
| 1985 listInstruction.instructionType = type; | 1984 listInstruction.instructionType = type; |
| 1986 } | 1985 } |
| 1987 stack.add(listInstruction); | 1986 stack.add(listInstruction); |
| 1988 } | 1987 } |
| 1989 | 1988 |
| (...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2352 return; | 2351 return; |
| 2353 } | 2352 } |
| 2354 FunctionEntity function = _elementMap.getMember(target); | 2353 FunctionEntity function = _elementMap.getMember(target); |
| 2355 TypeMask typeMask = _typeInferenceMap.getReturnTypeOf(function); | 2354 TypeMask typeMask = _typeInferenceMap.getReturnTypeOf(function); |
| 2356 | 2355 |
| 2357 // TODO(sra): For JS interop external functions, use a different function to | 2356 // TODO(sra): For JS interop external functions, use a different function to |
| 2358 // build arguments. | 2357 // build arguments. |
| 2359 List<HInstruction> arguments = | 2358 List<HInstruction> arguments = |
| 2360 _visitArgumentsForStaticTarget(target.function, invocation.arguments); | 2359 _visitArgumentsForStaticTarget(target.function, invocation.arguments); |
| 2361 | 2360 |
| 2361 // TODO(johnniwinther): Move factory calls to a helper function? |
| 2362 if (function is ConstructorEntity && function.isFactoryConstructor) { | 2362 if (function is ConstructorEntity && function.isFactoryConstructor) { |
| 2363 if (function.isExternal && function.isFromEnvironmentConstructor) { | 2363 if (function.isExternal && function.isFromEnvironmentConstructor) { |
| 2364 if (invocation.isConst) { | 2364 if (invocation.isConst) { |
| 2365 // Just like all const constructors (see visitConstructorInvocation). | 2365 // Just like all const constructors (see visitConstructorInvocation). |
| 2366 stack.add(graph.addConstant( | 2366 stack.add(graph.addConstant( |
| 2367 _elementMap.getConstantValue(invocation), closedWorld)); | 2367 _elementMap.getConstantValue(invocation), closedWorld)); |
| 2368 } else { | 2368 } else { |
| 2369 generateUnsupportedError( | 2369 generateUnsupportedError( |
| 2370 invocation, | 2370 invocation, |
| 2371 '${function.enclosingClass.name}.${function.name} ' | 2371 '${function.enclosingClass.name}.${function.name} ' |
| 2372 'can only be used as a const constructor'); | 2372 'can only be used as a const constructor'); |
| 2373 } | 2373 } |
| 2374 return; | 2374 return; |
| 2375 } | 2375 } |
| 2376 | 2376 |
| 2377 // Factory constructors take type parameters; other static methods ignore | 2377 // Factory constructors take type parameters; other static methods ignore |
| 2378 // them. | 2378 // them. |
| 2379 |
| 2379 if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) { | 2380 if (closedWorld.rtiNeed.classNeedsRti(function.enclosingClass)) { |
| 2380 _addTypeArguments(arguments, invocation.arguments); | 2381 _addTypeArguments(arguments, invocation.arguments); |
| 2381 } | 2382 } |
| 2383 |
| 2384 _pushStaticInvocation(function, arguments, typeMask); |
| 2385 |
| 2386 bool isFixedListConstructorCall = false; |
| 2387 bool isGrowableListConstructorCall = false; |
| 2388 if (commonElements.isUnnamedListConstructor(function) && |
| 2389 invocation.arguments.named.isEmpty) { |
| 2390 isFixedListConstructorCall = |
| 2391 invocation.arguments.positional.length == 1; |
| 2392 isGrowableListConstructorCall = invocation.arguments.positional.isEmpty; |
| 2393 } |
| 2394 bool isJSArrayTypedConstructor = |
| 2395 function == commonElements.jsArrayTypedConstructor; |
| 2396 if (rtiNeed.classNeedsRti(commonElements.listClass) && |
| 2397 (isFixedListConstructorCall || |
| 2398 isGrowableListConstructorCall || |
| 2399 isJSArrayTypedConstructor)) { |
| 2400 InterfaceType type = _elementMap.createInterfaceType( |
| 2401 target.enclosingClass, invocation.arguments.types); |
| 2402 stack.add(_setListRuntimeTypeInfoIfNeeded(pop(), type)); |
| 2403 } |
| 2404 } else { |
| 2405 _pushStaticInvocation(function, arguments, typeMask); |
| 2382 } | 2406 } |
| 2383 | |
| 2384 _pushStaticInvocation(function, arguments, typeMask); | |
| 2385 } | 2407 } |
| 2386 | 2408 |
| 2387 void handleInvokeStaticForeign( | 2409 void handleInvokeStaticForeign( |
| 2388 ir.StaticInvocation invocation, ir.Procedure target) { | 2410 ir.StaticInvocation invocation, ir.Procedure target) { |
| 2389 String name = target.name.name; | 2411 String name = target.name.name; |
| 2390 if (name == 'JS') { | 2412 if (name == 'JS') { |
| 2391 handleForeignJs(invocation); | 2413 handleForeignJs(invocation); |
| 2392 } else if (name == 'JS_CURRENT_ISOLATE_CONTEXT') { | 2414 } else if (name == 'JS_CURRENT_ISOLATE_CONTEXT') { |
| 2393 handleForeignJsCurrentIsolateContext(invocation); | 2415 handleForeignJsCurrentIsolateContext(invocation); |
| 2394 } else if (name == 'JS_CALL_IN_ISOLATE') { | 2416 } else if (name == 'JS_CALL_IN_ISOLATE') { |
| (...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3495 enterBlock.setBlockFlow( | 3517 enterBlock.setBlockFlow( |
| 3496 new HTryBlockInformation( | 3518 new HTryBlockInformation( |
| 3497 kernelBuilder.wrapStatementGraph(bodyGraph), | 3519 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 3498 exception, | 3520 exception, |
| 3499 kernelBuilder.wrapStatementGraph(catchGraph), | 3521 kernelBuilder.wrapStatementGraph(catchGraph), |
| 3500 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3522 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 3501 exitBlock); | 3523 exitBlock); |
| 3502 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3524 kernelBuilder.inTryStatement = previouslyInTryStatement; |
| 3503 } | 3525 } |
| 3504 } | 3526 } |
| 3505 | |
| 3506 class KernelTypeBuilder extends TypeBuilder { | |
| 3507 KernelToElementMapForBuilding _elementMap; | |
| 3508 | |
| 3509 KernelTypeBuilder(this._elementMap, GraphBuilder builder) : super(builder); | |
| 3510 | |
| 3511 @override | |
| 3512 InterfaceType getThisType(ClassEntity cls) { | |
| 3513 return _elementMap.elementEnvironment.getThisType(cls); | |
| 3514 } | |
| 3515 } | |
| OLD | NEW |