Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Side by Side Diff: pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart

Issue 2679913006: Add KernelNativeBehaviorComputer (Closed)
Patch Set: Rebased Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/world_builder.dart ('k') | tests/compiler/dart2js/kernel/impact_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698