| 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:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../compiler.dart'; | 9 import '../compiler.dart'; |
| 10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
| 11 import '../constants/values.dart'; | 11 import '../constants/values.dart'; |
| 12 import '../core_types.dart'; | 12 import '../core_types.dart'; |
| 13 import '../elements/resolution_types.dart'; | 13 import '../elements/resolution_types.dart'; |
| 14 import '../elements/elements.dart'; | 14 import '../elements/elements.dart'; |
| 15 import '../elements/entities.dart'; | 15 import '../elements/entities.dart'; |
| 16 import '../elements/modelx.dart'; | 16 import '../elements/modelx.dart'; |
| 17 import '../elements/types.dart'; | 17 import '../elements/types.dart'; |
| 18 import '../js/js.dart' as js; | 18 import '../js/js.dart' as js; |
| 19 import '../js_backend/js_backend.dart'; | 19 import '../js_backend/js_backend.dart'; |
| 20 import '../kernel/element_adapter.dart'; | 20 import '../kernel/element_adapter.dart'; |
| 21 import '../kernel/kernel.dart'; | 21 import '../kernel/kernel.dart'; |
| 22 import '../kernel/kernel_debug.dart'; | 22 import '../kernel/kernel_debug.dart'; |
| 23 import '../native/native.dart' as native; | 23 import '../native/native.dart' as native; |
| 24 import '../resolution/tree_elements.dart'; | 24 import '../resolution/tree_elements.dart'; |
| 25 import '../tree/tree.dart' as ast; | 25 import '../tree/tree.dart' as ast; |
| 26 import '../types/masks.dart'; | 26 import '../types/masks.dart'; |
| 27 import '../types/types.dart'; | 27 import '../types/types.dart'; |
| 28 import '../universe/call_structure.dart'; | |
| 29 import '../universe/selector.dart'; | 28 import '../universe/selector.dart'; |
| 30 import '../universe/side_effects.dart'; | 29 import '../universe/side_effects.dart'; |
| 31 import '../world.dart'; | 30 import '../world.dart'; |
| 32 import 'graph_builder.dart'; | 31 import 'graph_builder.dart'; |
| 33 import 'jump_handler.dart' show SwitchCaseJumpHandler; | 32 import 'jump_handler.dart' show SwitchCaseJumpHandler; |
| 34 import 'locals_handler.dart'; | 33 import 'locals_handler.dart'; |
| 35 import 'types.dart'; | 34 import 'types.dart'; |
| 36 | 35 |
| 37 /// A helper class that abstracts all accesses of the AST from Kernel nodes. | 36 /// A helper class that abstracts all accesses of the AST from Kernel nodes. |
| 38 /// | 37 /// |
| (...skipping 12 matching lines...) Expand all Loading... |
| 51 final Map<ir.TreeNode, KernelJumpTarget> _jumpTargets = | 50 final Map<ir.TreeNode, KernelJumpTarget> _jumpTargets = |
| 52 <ir.TreeNode, KernelJumpTarget>{}; | 51 <ir.TreeNode, KernelJumpTarget>{}; |
| 53 DartTypeConverter _typeConverter; | 52 DartTypeConverter _typeConverter; |
| 54 ResolvedAst _resolvedAst; | 53 ResolvedAst _resolvedAst; |
| 55 | 54 |
| 56 /// Sometimes for resolution the resolved AST element needs to change (for | 55 /// Sometimes for resolution the resolved AST element needs to change (for |
| 57 /// example, if we're inlining, or if we're in a constructor, but then also | 56 /// example, if we're inlining, or if we're in a constructor, but then also |
| 58 /// constructing the field values). We keep track of this with a stack. | 57 /// constructing the field values). We keep track of this with a stack. |
| 59 final List<ResolvedAst> _resolvedAstStack = <ResolvedAst>[]; | 58 final List<ResolvedAst> _resolvedAstStack = <ResolvedAst>[]; |
| 60 | 59 |
| 60 final native.BehaviorBuilder nativeBehaviorBuilder; |
| 61 |
| 61 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, | 62 KernelAstAdapter(this.kernel, this._backend, this._resolvedAst, |
| 62 this._nodeToAst, this._nodeToElement) { | 63 this._nodeToAst, this._nodeToElement) |
| 64 : nativeBehaviorBuilder = |
| 65 new native.ResolverBehaviorBuilder(_backend.compiler) { |
| 63 KernelJumpTarget.index = 0; | 66 KernelJumpTarget.index = 0; |
| 64 // TODO(het): Maybe just use all of the kernel maps directly? | 67 // TODO(het): Maybe just use all of the kernel maps directly? |
| 65 for (FieldElement fieldElement in kernel.fields.keys) { | 68 for (FieldElement fieldElement in kernel.fields.keys) { |
| 66 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; | 69 _nodeToElement[kernel.fields[fieldElement]] = fieldElement; |
| 67 } | 70 } |
| 68 for (FunctionElement functionElement in kernel.functions.keys) { | 71 for (FunctionElement functionElement in kernel.functions.keys) { |
| 69 _nodeToElement[kernel.functions[functionElement]] = functionElement; | 72 _nodeToElement[kernel.functions[functionElement]] = functionElement; |
| 70 } | 73 } |
| 71 for (ClassElement classElement in kernel.classes.keys) { | 74 for (ClassElement classElement in kernel.classes.keys) { |
| 72 _nodeToElement[kernel.classes[classElement]] = classElement; | 75 _nodeToElement[kernel.classes[classElement]] = classElement; |
| 73 } | 76 } |
| 74 for (LibraryElement libraryElement in kernel.libraries.keys) { | 77 for (LibraryElement libraryElement in kernel.libraries.keys) { |
| 75 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; | 78 _nodeToElement[kernel.libraries[libraryElement]] = libraryElement; |
| 76 } | 79 } |
| 77 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { | 80 for (LocalFunctionElement localFunction in kernel.localFunctions.keys) { |
| 78 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; | 81 _nodeToElement[kernel.localFunctions[localFunction]] = localFunction; |
| 79 } | 82 } |
| 80 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { | 83 for (TypeVariableElement typeVariable in kernel.typeParameters.keys) { |
| 81 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; | 84 _nodeToElement[kernel.typeParameters[typeVariable]] = typeVariable; |
| 82 } | 85 } |
| 83 _typeConverter = new DartTypeConverter(this); | 86 _typeConverter = new DartTypeConverter(this); |
| 84 } | 87 } |
| 85 | 88 |
| 89 @override |
| 86 CommonElements get commonElements => _compiler.commonElements; | 90 CommonElements get commonElements => _compiler.commonElements; |
| 87 | 91 |
| 92 @override |
| 93 ElementEnvironment get elementEnvironment => _compiler.elementEnvironment; |
| 94 |
| 88 /// Push the existing resolved AST on the stack and shift the current resolved | 95 /// Push the existing resolved AST on the stack and shift the current resolved |
| 89 /// AST to the AST that this kernel node points to. | 96 /// AST to the AST that this kernel node points to. |
| 90 void pushResolvedAst(ir.Node node) { | 97 void pushResolvedAst(ir.Node node) { |
| 91 _resolvedAstStack.add(_resolvedAst); | 98 _resolvedAstStack.add(_resolvedAst); |
| 92 _resolvedAst = (getElement(node) as AstElement).resolvedAst; | 99 _resolvedAst = (getElement(node) as AstElement).resolvedAst; |
| 93 } | 100 } |
| 94 | 101 |
| 95 /// Pop the resolved AST stack to reset it to the previous resolved AST node. | 102 /// Pop the resolved AST stack to reset it to the previous resolved AST node. |
| 96 void popResolvedAstStack() { | 103 void popResolvedAstStack() { |
| 97 assert(_resolvedAstStack.isNotEmpty); | 104 assert(_resolvedAstStack.isNotEmpty); |
| (...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 ResolutionInterfaceType getInterfaceType(ir.InterfaceType type) => | 567 ResolutionInterfaceType getInterfaceType(ir.InterfaceType type) => |
| 561 getDartType(type); | 568 getDartType(type); |
| 562 | 569 |
| 563 ResolutionInterfaceType createInterfaceType( | 570 ResolutionInterfaceType createInterfaceType( |
| 564 ir.Class cls, List<ir.DartType> typeArguments) { | 571 ir.Class cls, List<ir.DartType> typeArguments) { |
| 565 return new ResolutionInterfaceType( | 572 return new ResolutionInterfaceType( |
| 566 getClass(cls), getDartTypes(typeArguments)); | 573 getClass(cls), getDartTypes(typeArguments)); |
| 567 } | 574 } |
| 568 | 575 |
| 569 @override | 576 @override |
| 570 LibraryEntity lookupLibrary(Uri uri) { | 577 InterfaceType getThisType(ir.Class cls) { |
| 571 return _compiler.libraryLoader.lookupLibrary(uri); | 578 return getClass(cls).thisType; |
| 572 } | |
| 573 | |
| 574 @override | |
| 575 ClassElement lookupClass(LibraryElement library, String name) { | |
| 576 Element element = library.find(name); | |
| 577 if (element != null && element.isClass) { | |
| 578 return element; | |
| 579 } | |
| 580 return null; | |
| 581 } | |
| 582 | |
| 583 @override | |
| 584 InterfaceType getRawType(ClassElement cls) { | |
| 585 return cls.rawType; | |
| 586 } | |
| 587 | |
| 588 @override | |
| 589 InterfaceType getThisType(ClassElement cls) { | |
| 590 return cls.thisType; | |
| 591 } | |
| 592 | |
| 593 native.BehaviorBuilder get nativeBehaviorBuilder => | |
| 594 new native.ResolverBehaviorBuilder(_compiler); | |
| 595 | |
| 596 /// Computes the native behavior for reading the native [field]. | |
| 597 // TODO(johnniwinther): Cache this for later use. | |
| 598 native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) { | |
| 599 ResolutionDartType type = getDartType(field.type); | |
| 600 List<ConstantExpression> metadata = getMetadata(field.annotations); | |
| 601 // TODO(johnniwinther): Provide the correct value for [isJsInterop]. | |
| 602 return nativeBehaviorBuilder.buildFieldLoadBehavior( | |
| 603 type, metadata, typeLookup(resolveAsRaw: false), | |
| 604 isJsInterop: false); | |
| 605 } | |
| 606 | |
| 607 /// Computes the native behavior for writing to the native [field]. | |
| 608 // TODO(johnniwinther): Cache this for later use. | |
| 609 native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) { | |
| 610 DartType type = getDartType(field.type); | |
| 611 return nativeBehaviorBuilder.buildFieldStoreBehavior(type); | |
| 612 } | |
| 613 | |
| 614 /// Computes the native behavior for calling [procedure]. | |
| 615 // TODO(johnniwinther): Cache this for later use. | |
| 616 native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) { | |
| 617 DartType type = getFunctionType(procedure.function); | |
| 618 List<ConstantExpression> metadata = getMetadata(procedure.annotations); | |
| 619 // TODO(johnniwinther): Provide the correct value for [isJsInterop]. | |
| 620 return nativeBehaviorBuilder.buildMethodBehavior( | |
| 621 type, metadata, typeLookup(resolveAsRaw: false), | |
| 622 isJsInterop: false); | |
| 623 } | 579 } |
| 624 | 580 |
| 625 MemberEntity getConstructorBodyEntity(ir.Constructor constructor) { | 581 MemberEntity getConstructorBodyEntity(ir.Constructor constructor) { |
| 626 AstElement element = getElement(constructor); | 582 AstElement element = getElement(constructor); |
| 627 MemberEntity constructorBody = | 583 MemberEntity constructorBody = |
| 628 ConstructorBodyElementX.createFromResolvedAst(element.resolvedAst); | 584 ConstructorBodyElementX.createFromResolvedAst(element.resolvedAst); |
| 629 assert(constructorBody != null); | 585 assert(constructorBody != null); |
| 630 return constructorBody; | 586 return constructorBody; |
| 631 } | 587 } |
| 632 } | 588 } |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 JumpTarget continueTarget = | 784 JumpTarget continueTarget = |
| 829 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); | 785 astAdapter.getJumpTarget(switchCase, isContinueTarget: true); |
| 830 assert(continueTarget is KernelJumpTarget); | 786 assert(continueTarget is KernelJumpTarget); |
| 831 targetIndexMap[continueTarget] = switchIndex; | 787 targetIndexMap[continueTarget] = switchIndex; |
| 832 assert(builder.jumpTargets[continueTarget] == null); | 788 assert(builder.jumpTargets[continueTarget] == null); |
| 833 builder.jumpTargets[continueTarget] = this; | 789 builder.jumpTargets[continueTarget] = this; |
| 834 switchIndex++; | 790 switchIndex++; |
| 835 } | 791 } |
| 836 } | 792 } |
| 837 } | 793 } |
| OLD | NEW |