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

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

Issue 2338093002: Build entire program with kernel for conversion to ssa. (Closed)
Patch Set: some tweaks Created 4 years, 3 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:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../compiler.dart'; 8 import '../compiler.dart';
9 import '../constants/values.dart'; 9 import '../constants/values.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 16 matching lines...) Expand all
27 final ResolvedAst _resolvedAst; 27 final ResolvedAst _resolvedAst;
28 final Map<ir.Node, ast.Node> _nodeToAst; 28 final Map<ir.Node, ast.Node> _nodeToAst;
29 final Map<ir.Node, Element> _nodeToElement; 29 final Map<ir.Node, Element> _nodeToElement;
30 DartTypeConverter _typeConverter; 30 DartTypeConverter _typeConverter;
31 31
32 KernelAstAdapter( 32 KernelAstAdapter(
33 this._backend, 33 this._backend,
34 this._resolvedAst, 34 this._resolvedAst,
35 this._nodeToAst, 35 this._nodeToAst,
36 this._nodeToElement, 36 this._nodeToElement,
37 Map<FieldElement, ir.Field> fields,
37 Map<FunctionElement, ir.Member> functions, 38 Map<FunctionElement, ir.Member> functions,
38 Map<ClassElement, ir.Class> classes, 39 Map<ClassElement, ir.Class> classes,
39 Map<LibraryElement, ir.Library> libraries) { 40 Map<LibraryElement, ir.Library> libraries) {
41 // TODO(het): Maybe just use all of the kernel maps directly?
42 for (FieldElement fieldElement in fields.keys) {
43 _nodeToElement[fields[fieldElement]] = fieldElement;
44 }
40 for (FunctionElement functionElement in functions.keys) { 45 for (FunctionElement functionElement in functions.keys) {
41 _nodeToElement[functions[functionElement]] = functionElement; 46 _nodeToElement[functions[functionElement]] = functionElement;
42 } 47 }
43 for (ClassElement classElement in classes.keys) { 48 for (ClassElement classElement in classes.keys) {
44 _nodeToElement[classes[classElement]] = classElement; 49 _nodeToElement[classes[classElement]] = classElement;
45 } 50 }
46 for (LibraryElement libraryElement in libraries.keys) { 51 for (LibraryElement libraryElement in libraries.keys) {
47 _nodeToElement[libraries[libraryElement]] = libraryElement; 52 _nodeToElement[libraries[libraryElement]] = libraryElement;
48 } 53 }
49 _typeConverter = new DartTypeConverter(this); 54 _typeConverter = new DartTypeConverter(this);
(...skipping 16 matching lines...) Expand all
66 assert(result != null); 71 assert(result != null);
67 return result; 72 return result;
68 } 73 }
69 74
70 ast.Node getNode(ir.Node node) { 75 ast.Node getNode(ir.Node node) {
71 ast.Node result = _nodeToAst[node]; 76 ast.Node result = _nodeToAst[node];
72 assert(result != null); 77 assert(result != null);
73 return result; 78 return result;
74 } 79 }
75 80
76 bool getCanThrow(ir.Procedure procedure) { 81 bool getCanThrow(ir.Node procedure) {
77 FunctionElement function = getElement(procedure); 82 return !_compiler.world.getCannotThrow(getElement(procedure));
78 return !_compiler.world.getCannotThrow(function);
79 } 83 }
80 84
81 TypeMask returnTypeOf(ir.Procedure node) { 85 TypeMask returnTypeOf(ir.Member node) {
82 return TypeMaskFactory.inferredReturnTypeForElement( 86 return TypeMaskFactory.inferredReturnTypeForElement(
83 getElement(node), _compiler); 87 getElement(node), _compiler);
84 } 88 }
85 89
86 SideEffects getSideEffects(ir.Node node) { 90 SideEffects getSideEffects(ir.Node node) {
87 return _compiler.world.getSideEffectsOfElement(getElement(node)); 91 return _compiler.world.getSideEffectsOfElement(getElement(node));
88 } 92 }
89 93
90 CallStructure getCallStructure(ir.Arguments arguments) { 94 CallStructure getCallStructure(ir.Arguments arguments) {
91 int argumentCount = arguments.positional.length + arguments.named.length; 95 int argumentCount = arguments.positional.length + arguments.named.length;
92 List<String> namedArguments = arguments.named.map((e) => e.name).toList(); 96 List<String> namedArguments = arguments.named.map((e) => e.name).toList();
93 return new CallStructure(argumentCount, namedArguments); 97 return new CallStructure(argumentCount, namedArguments);
94 } 98 }
95 99
96 // TODO(het): Create the selector directly from the invocation 100 // TODO(het): Create the selector directly from the invocation
97 Selector getSelector(ir.MethodInvocation invocation) { 101 Selector getSelector(ir.InvocationExpression invocation) {
98 SelectorKind kind = Elements.isOperatorName(invocation.name.name) 102 SelectorKind kind = Elements.isOperatorName(invocation.name.name)
99 ? SelectorKind.OPERATOR 103 ? SelectorKind.OPERATOR
100 : SelectorKind.CALL; 104 : SelectorKind.CALL;
105 if (invocation.name.name == '[]' || invocation.name.name == '[]=') {
106 kind = SelectorKind.INDEX;
107 }
101 108
102 ir.Name irName = invocation.name; 109 ir.Name irName = invocation.name;
103 Name name = new Name( 110 Name name = new Name(
104 irName.name, irName.isPrivate ? getElement(irName.library) : null); 111 irName.name, irName.isPrivate ? getElement(irName.library) : null);
105 CallStructure callStructure = getCallStructure(invocation.arguments); 112 CallStructure callStructure = getCallStructure(invocation.arguments);
106 113
107 return new Selector(kind, name, callStructure); 114 return new Selector(kind, name, callStructure);
108 } 115 }
109 116
117 Selector getGetterSelector(ir.PropertyGet getter) {
118 ir.Name irName = getter.name;
119 Name name = new Name(
120 irName.name, irName.isPrivate ? getElement(irName.library) : null);
121 return new Selector.getter(name);
122 }
123
110 TypeMask typeOfInvocation(ir.MethodInvocation invocation) { 124 TypeMask typeOfInvocation(ir.MethodInvocation invocation) {
111 return _compiler.globalInference.results 125 return _compiler.globalInference.results
112 .typeOfSend(getNode(invocation), _elements); 126 .typeOfSend(getNode(invocation), _elements);
113 } 127 }
114 128
129 TypeMask typeOfGet(ir.PropertyGet getter) {
130 return _compiler.globalInference.results
131 .typeOfSend(getNode(getter), _elements);
132 }
133
134 TypeMask inferredTypeOf(ir.Member node) {
135 return TypeMaskFactory.inferredTypeForElement(getElement(node), _compiler);
136 }
137
115 TypeMask selectorTypeOf(ir.MethodInvocation invocation) { 138 TypeMask selectorTypeOf(ir.MethodInvocation invocation) {
116 return TypeMaskFactory.inferredTypeForSelector( 139 return TypeMaskFactory.inferredTypeForSelector(
117 getSelector(invocation), typeOfInvocation(invocation), _compiler); 140 getSelector(invocation), typeOfInvocation(invocation), _compiler);
118 } 141 }
119 142
120 bool isIntercepted(ir.MethodInvocation invocation) { 143 TypeMask selectorGetterTypeOf(ir.PropertyGet getter) {
121 return _backend.isInterceptedSelector(getSelector(invocation)); 144 return TypeMaskFactory.inferredTypeForSelector(
145 getGetterSelector(getter), typeOfGet(getter), _compiler);
146 }
147
148 bool isIntercepted(ir.Node node) {
149 Selector selector;
150 if (node is ir.PropertyGet) {
151 selector = getGetterSelector(node);
152 } else {
153 selector = getSelector(node);
154 }
155 return _backend.isInterceptedSelector(selector);
122 } 156 }
123 157
124 DartType getDartType(ir.DartType type) { 158 DartType getDartType(ir.DartType type) {
125 return type.accept(_typeConverter); 159 return type.accept(_typeConverter);
126 } 160 }
127 } 161 }
128 162
129 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { 163 class DartTypeConverter extends ir.DartTypeVisitor<DartType> {
130 final KernelAstAdapter astAdapter; 164 final KernelAstAdapter astAdapter;
131 165
(...skipping 28 matching lines...) Expand all
160 @override 194 @override
161 DartType visitDynamicType(ir.DynamicType node) { 195 DartType visitDynamicType(ir.DynamicType node) {
162 return const DynamicType(); 196 return const DynamicType();
163 } 197 }
164 198
165 @override 199 @override
166 DartType visitInvalidType(ir.InvalidType node) { 200 DartType visitInvalidType(ir.InvalidType node) {
167 throw new UnimplementedError("Invalid types not currently supported"); 201 throw new UnimplementedError("Invalid types not currently supported");
168 } 202 }
169 } 203 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/builder_kernel.dart ('k') | pkg/compiler/lib/src/ssa/kernel_impact.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698