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

Side by Side Diff: pkg/compiler/lib/src/kernel/world_builder.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) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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 '../common/backend_api.dart';
8 import '../common/names.dart'; 9 import '../common/names.dart';
10 import '../compile_time_constants.dart';
11 import '../constants/constant_system.dart';
12 import '../constants/constructors.dart';
13 import '../constants/evaluation.dart';
14 import '../constants/expressions.dart';
15 import '../constants/values.dart';
9 import '../core_types.dart'; 16 import '../core_types.dart';
10 import '../elements/elements.dart'; 17 import '../elements/elements.dart';
11 import '../elements/entities.dart'; 18 import '../elements/entities.dart';
12 import '../elements/types.dart'; 19 import '../elements/types.dart';
20 import '../js_backend/backend_helpers.dart';
21 import '../js_backend/constant_system_javascript.dart';
13 import '../native/native.dart' as native; 22 import '../native/native.dart' as native;
14 import 'element_adapter.dart'; 23 import 'element_adapter.dart';
15 import 'elements.dart'; 24 import 'elements.dart';
16 25
17 /// World builder used for creating elements and types corresponding to Kernel 26 /// World builder used for creating elements and types corresponding to Kernel
18 /// IR nodes. 27 /// IR nodes.
19 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. 28 // TODO(johnniwinther): Implement [ResolutionWorldBuilder].
20 class KernelWorldBuilder extends KernelElementAdapterMixin { 29 class KernelWorldBuilder extends KernelElementAdapterMixin {
21 CommonElements _commonElements; 30 CommonElements _commonElements;
31 native.BehaviorBuilder _nativeBehaviorBuilder;
22 final DiagnosticReporter reporter; 32 final DiagnosticReporter reporter;
23 33 ElementEnvironment _elementEnvironment;
24 DartTypeConverter _typeConverter; 34 DartTypeConverter _typeConverter;
25 35
26 /// Library environment. Used for fast lookup. 36 /// Library environment. Used for fast lookup.
27 KEnv _env; 37 KEnv _env;
28 38
29 /// List of library environments by `KLibrary.libraryIndex`. This is used for 39 /// List of library environments by `KLibrary.libraryIndex`. This is used for
30 /// fast lookup into library classes and members. 40 /// fast lookup into library classes and members.
31 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; 41 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[];
32 42
33 /// List of class environments by `KClass.classIndex`. This is used for 43 /// List of class environments by `KClass.classIndex`. This is used for
34 /// fast lookup into class members. 44 /// fast lookup into class members.
35 List<KClassEnv> _classEnvs = <KClassEnv>[]; 45 List<KClassEnv> _classEnvs = <KClassEnv>[];
36 46
37 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; 47 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{};
38 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; 48 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{};
39 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = 49 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
40 <ir.TypeParameter, KTypeVariable>{}; 50 <ir.TypeParameter, KTypeVariable>{};
51
41 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; 52 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
53 // TODO(johnniwinther): Change this to a list of 'KConstructorData' class
54 // holding the [ConstantConstructor] if we need more data for constructors.
55 List<ir.Member> _constructorList = <ir.Member>[];
56 Map<KConstructor, ConstantConstructor> _constructorConstantMap =
57 <KConstructor, ConstantConstructor>{};
58
42 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; 59 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
43 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; 60 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
44 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = 61 Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
45 <ir.TreeNode, KLocalFunction>{}; 62 <ir.TreeNode, KLocalFunction>{};
46 63
47 KernelWorldBuilder(this.reporter, ir.Program program) 64 KernelWorldBuilder(this.reporter, ir.Program program)
48 : _env = new KEnv(program) { 65 : _env = new KEnv(program) {
49 _commonElements = 66 _elementEnvironment = new KernelElementEnvironment(this);
50 new KernelCommonElements(new KernelElementEnvironment(this)); 67 _commonElements = new KernelCommonElements(_elementEnvironment);
68 BackendHelpers helpers =
69 new BackendHelpers(_elementEnvironment, null, _commonElements);
70 ConstantEnvironment constants = new KernelConstantEnvironment(this);
71 _nativeBehaviorBuilder =
72 new KernelBehaviorBuilder(_commonElements, helpers, constants);
51 _typeConverter = new DartTypeConverter(this); 73 _typeConverter = new DartTypeConverter(this);
52 } 74 }
53 75
54 CommonElements get commonElements => _commonElements; 76 CommonElements get commonElements => _commonElements;
55 77
78 ElementEnvironment get elementEnvironment => _elementEnvironment;
79
80 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder;
81
56 LibraryEntity lookupLibrary(Uri uri) { 82 LibraryEntity lookupLibrary(Uri uri) {
57 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); 83 KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
58 return _getLibrary(libraryEnv.library, libraryEnv); 84 return _getLibrary(libraryEnv.library, libraryEnv);
59 } 85 }
60 86
61 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { 87 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) {
62 return _libraryMap.putIfAbsent(node, () { 88 return _libraryMap.putIfAbsent(node, () {
63 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri)); 89 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri));
64 String name = node.name; 90 String name = node.name;
65 if (name == null) { 91 if (name == null) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 return new KTypeVariable(_getMethod(procedure), node.name, index); 158 return new KTypeVariable(_getMethod(procedure), node.name, index);
133 } 159 }
134 } 160 }
135 } 161 }
136 throw new UnsupportedError('Unsupported type parameter type node $node.'); 162 throw new UnsupportedError('Unsupported type parameter type node $node.');
137 }); 163 });
138 } 164 }
139 165
140 KConstructor _getConstructor(ir.Member node) { 166 KConstructor _getConstructor(ir.Member node) {
141 return _constructorMap.putIfAbsent(node, () { 167 return _constructorMap.putIfAbsent(node, () {
168 int constructorIndex = _constructorList.length;
169 KConstructor constructor;
142 if (node is ir.Constructor) { 170 if (node is ir.Constructor) {
143 return new KGenerativeConstructor( 171 constructor = new KGenerativeConstructor(constructorIndex,
144 _getClass(node.enclosingClass), getName(node.name)); 172 _getClass(node.enclosingClass), getName(node.name));
145 } else { 173 } else {
146 return new KFactoryConstructor( 174 constructor = new KFactoryConstructor(constructorIndex,
147 _getClass(node.enclosingClass), getName(node.name)); 175 _getClass(node.enclosingClass), getName(node.name));
148 } 176 }
177 _constructorList.add(node);
178 return constructor;
149 }); 179 });
150 } 180 }
151 181
152 KFunction _getMethod(ir.Procedure node) { 182 KFunction _getMethod(ir.Procedure node) {
153 return _methodMap.putIfAbsent(node, () { 183 return _methodMap.putIfAbsent(node, () {
154 KClass enclosingClass = 184 KClass enclosingClass =
155 node.enclosingClass != null ? _getClass(node.enclosingClass) : null; 185 node.enclosingClass != null ? _getClass(node.enclosingClass) : null;
156 Name name = getName(node.name); 186 Name name = getName(node.name);
157 bool isStatic = node.isStatic; 187 bool isStatic = node.isStatic;
158 switch (node.kind) { 188 switch (node.kind) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 List<DartType> getDartTypes(List<ir.DartType> types) { 255 List<DartType> getDartTypes(List<ir.DartType> types) {
226 // TODO(johnniwinther): Add the type argument to the list literal when we 256 // TODO(johnniwinther): Add the type argument to the list literal when we
227 // no longer use resolution types. 257 // no longer use resolution types.
228 List<DartType> list = /*<DartType>*/ []; 258 List<DartType> list = /*<DartType>*/ [];
229 types.forEach((ir.DartType type) { 259 types.forEach((ir.DartType type) {
230 list.add(getDartType(type)); 260 list.add(getDartType(type));
231 }); 261 });
232 return list; 262 return list;
233 } 263 }
234 264
235 @override 265 InterfaceType _getThisType(KClass cls) {
236 InterfaceType getThisType(ClassEntity cls) {
237 throw new UnimplementedError('KernelWorldBuilder.getThisType');
238 }
239
240 @override
241 InterfaceType getRawType(KClass cls) {
242 KClassEnv env = _classEnvs[cls.classIndex]; 266 KClassEnv env = _classEnvs[cls.classIndex];
243 ir.Class node = env.cls; 267 ir.Class node = env.cls;
244 // TODO(johnniwinther): Add the type argument to the list literal when we 268 // TODO(johnniwinther): Add the type argument to the list literal when we
269 // no longer use resolution types.
270 return new InterfaceType(
271 cls,
272 new List/*<DartType>*/ .generate(node.typeParameters.length,
273 (int index) {
274 return new TypeVariableType(
275 _getTypeVariable(node.typeParameters[index]));
276 }));
277 }
278
279 InterfaceType _getRawType(KClass cls) {
280 KClassEnv env = _classEnvs[cls.classIndex];
281 ir.Class node = env.cls;
282 // TODO(johnniwinther): Add the type argument to the list literal when we
245 // no longer use resolution types. 283 // no longer use resolution types.
246 return new InterfaceType( 284 return new InterfaceType(
247 cls, 285 cls,
248 new List/*<DartType>*/ .filled( 286 new List/*<DartType>*/ .filled(
249 node.typeParameters.length, const DynamicType())); 287 node.typeParameters.length, const DynamicType()));
250 } 288 }
251 289
252 @override 290 @override
253 native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure) { 291 FunctionType getFunctionType(ir.FunctionNode node) {
254 throw new UnimplementedError( 292 DartType returnType = getDartType(node.returnType);
255 'KernelWorldBuilder.getNativeBehaviorForMethod'); 293 List<DartType> parameterTypes = /*<DartType>*/ [];
256 } 294 List<DartType> optionalParameterTypes = /*<DartType>*/ [];
257 295 for (ir.VariableDeclaration variable in node.positionalParameters) {
258 @override 296 if (parameterTypes.length == node.requiredParameterCount) {
259 native.NativeBehavior getNativeBehaviorForFieldStore(ir.Field field) { 297 optionalParameterTypes.add(getDartType(variable.type));
260 throw new UnimplementedError( 298 } else {
261 'KernelWorldBuilder.getNativeBehaviorForFieldStore'); 299 parameterTypes.add(getDartType(variable.type));
262 } 300 }
263 301 }
264 @override 302 List<String> namedParameters = <String>[];
265 native.NativeBehavior getNativeBehaviorForFieldLoad(ir.Field field) { 303 List<DartType> namedParameterTypes = /*<DartType>*/ [];
266 throw new UnimplementedError( 304 List<ir.VariableDeclaration> sortedNamedParameters =
267 'KernelWorldBuilder.getNativeBehaviorForFieldLoad'); 305 node.namedParameters.toList()..sort((a, b) => a.name.compareTo(b.name));
306 for (ir.VariableDeclaration variable in sortedNamedParameters) {
307 namedParameters.add(variable.name);
308 namedParameterTypes.add(getDartType(variable.type));
309 }
310 return new FunctionType(returnType, parameterTypes, optionalParameterTypes,
311 namedParameters, namedParameterTypes);
268 } 312 }
269 313
270 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); 314 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node);
271 315
272 @override 316 @override
273 Local getLocalFunction(ir.TreeNode node) => _getLocal(node); 317 Local getLocalFunction(ir.TreeNode node) => _getLocal(node);
274 318
275 @override 319 @override
276 ClassEntity getClass(ir.Class node) => _getClass(node); 320 ClassEntity getClass(ir.Class node) => _getClass(node);
277 321
(...skipping 17 matching lines...) Expand all
295 return _getConstructor(node); 339 return _getConstructor(node);
296 } else { 340 } else {
297 return _getMethod(node); 341 return _getMethod(node);
298 } 342 }
299 } 343 }
300 throw new UnsupportedError("Unexpected member: $node"); 344 throw new UnsupportedError("Unexpected member: $node");
301 } 345 }
302 346
303 @override 347 @override
304 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node); 348 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node);
349
350 ConstantConstructor _getConstructorConstant(KConstructor constructor) {
351 return _constructorConstantMap.putIfAbsent(constructor, () {
352 ir.Member node = _constructorList[constructor.constructorIndex];
353 if (node is ir.Constructor && node.isConst) {
354 return new Constantifier(this).computeConstantConstructor(node);
355 }
356 throw new SpannableAssertionFailure(constructor,
357 "Unexpected constructor $constructor in KernelWorldBuilder._getConstru ctorConstant");
358 });
359 }
305 } 360 }
306 361
307 /// Environment for fast lookup of program libraries. 362 /// Environment for fast lookup of program libraries.
308 class KEnv { 363 class KEnv {
309 final ir.Program program; 364 final ir.Program program;
310 365
311 Map<Uri, KLibraryEnv> _libraryMap; 366 Map<Uri, KLibraryEnv> _libraryMap;
312 367
313 KEnv(this.program); 368 KEnv(this.program);
314 369
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 } 436 }
382 } 437 }
383 for (ir.Member member in cls.constructors) { 438 for (ir.Member member in cls.constructors) {
384 _constructorMap[member.name.name] = member; 439 _constructorMap[member.name.name] = member;
385 } 440 }
386 } 441 }
387 } 442 }
388 443
389 /// Return the [ir.Member] for the member [name] in [library]. 444 /// Return the [ir.Member] for the member [name] in [library].
390 ir.Member lookupMember(String name, {bool setter: false}) { 445 ir.Member lookupMember(String name, {bool setter: false}) {
446 _ensureMaps();
391 return _memberMap[name]; 447 return _memberMap[name];
392 } 448 }
393 449
394 /// Return the [ir.Member] for the member [name] in [library]. 450 /// Return the [ir.Member] for the member [name] in [library].
395 ir.Member lookupConstructor(String name, {bool setter: false}) { 451 ir.Member lookupConstructor(String name, {bool setter: false}) {
452 _ensureMaps();
396 return _constructorMap[name]; 453 return _constructorMap[name];
397 } 454 }
398 } 455 }
399 456
400 class KernelElementEnvironment implements ElementEnvironment { 457 class KernelElementEnvironment implements ElementEnvironment {
401 final KernelWorldBuilder worldBuilder; 458 final KernelWorldBuilder worldBuilder;
402 459
403 KernelElementEnvironment(this.worldBuilder); 460 KernelElementEnvironment(this.worldBuilder);
404 461
405 @override 462 @override
406 InterfaceType getThisType(ClassEntity cls) { 463 InterfaceType getThisType(ClassEntity cls) {
407 return worldBuilder.getThisType(cls); 464 return worldBuilder._getThisType(cls);
408 } 465 }
409 466
410 @override 467 @override
411 InterfaceType getRawType(ClassEntity cls) { 468 InterfaceType getRawType(ClassEntity cls) {
412 return worldBuilder.getRawType(cls); 469 return worldBuilder._getRawType(cls);
413 } 470 }
414 471
415 @override 472 @override
416 InterfaceType createInterfaceType( 473 InterfaceType createInterfaceType(
417 ClassEntity cls, List<DartType> typeArguments) { 474 ClassEntity cls, List<DartType> typeArguments) {
418 return new InterfaceType(cls, typeArguments); 475 return new InterfaceType(cls, typeArguments);
419 } 476 }
420 477
421 @override 478 @override
422 ConstructorEntity lookupConstructor(ClassEntity cls, String name, 479 ConstructorEntity lookupConstructor(ClassEntity cls, String name,
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 DartType visitInvalidType(ir.InvalidType node) { 635 DartType visitInvalidType(ir.InvalidType node) {
579 if (topLevel) { 636 if (topLevel) {
580 throw new UnimplementedError( 637 throw new UnimplementedError(
581 "Outermost invalid types not currently supported"); 638 "Outermost invalid types not currently supported");
582 } 639 }
583 // Nested invalid types are treated as `dynamic`. 640 // Nested invalid types are treated as `dynamic`.
584 return const DynamicType(); 641 return const DynamicType();
585 } 642 }
586 } 643 }
587 644
645 /// [native.BehaviorBuilder] for kernel based elements.
646 class KernelBehaviorBuilder extends native.BehaviorBuilder {
647 final CommonElements commonElements;
648 final BackendHelpers helpers;
649 final ConstantEnvironment constants;
650
651 KernelBehaviorBuilder(this.commonElements, this.helpers, this.constants);
652
653 @override
654 bool get trustJSInteropTypeAnnotations {
655 throw new UnimplementedError(
656 "KernelNativeBehaviorComputer.trustJSInteropTypeAnnotations");
657 }
658
659 @override
660 DiagnosticReporter get reporter {
661 throw new UnimplementedError("KernelNativeBehaviorComputer.reporter");
662 }
663
664 @override
665 BackendClasses get backendClasses {
666 throw new UnimplementedError("KernelNativeBehaviorComputer.backendClasses");
667 }
668 }
669
670 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
671 /// [_EvaluationEnvironment] for the evaluation.
672 class KernelConstantEnvironment implements ConstantEnvironment {
673 KernelWorldBuilder _worldBuilder;
674 Map<ConstantExpression, ConstantValue> _valueMap =
675 <ConstantExpression, ConstantValue>{};
676
677 KernelConstantEnvironment(this._worldBuilder);
678
679 @override
680 ConstantSystem get constantSystem => const JavaScriptConstantSystem();
681
682 @override
683 ConstantValue getConstantValueForVariable(VariableElement element) {
684 throw new UnimplementedError(
685 "KernelConstantEnvironment.getConstantValueForVariable");
686 }
687
688 @override
689 ConstantValue getConstantValue(ConstantExpression expression) {
690 return _valueMap.putIfAbsent(expression, () {
691 return expression.evaluate(
692 new _EvaluationEnvironment(_worldBuilder), constantSystem);
693 });
694 }
695
696 @override
697 bool hasConstantValue(ConstantExpression expression) {
698 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue");
699 }
700 }
701
702 /// Evaluation environment used for computing [ConstantValue]s for
703 /// kernel based [ConstantExpression]s.
704 class _EvaluationEnvironment implements Environment {
705 final KernelWorldBuilder _worldBuilder;
706
707 _EvaluationEnvironment(this._worldBuilder);
708
709 @override
710 CommonElements get commonElements {
711 throw new UnimplementedError("_EvaluationEnvironment.commonElements");
712 }
713
714 @override
715 BackendClasses get backendClasses {
716 throw new UnimplementedError("_EvaluationEnvironment.backendClasses");
717 }
718
719 @override
720 InterfaceType substByContext(InterfaceType base, InterfaceType target) {
721 if (base.typeArguments.isNotEmpty) {
722 throw new UnimplementedError("_EvaluationEnvironment.substByContext");
723 }
724 return base;
725 }
726
727 @override
728 ConstantConstructor getConstructorConstant(ConstructorEntity constructor) {
729 return _worldBuilder._getConstructorConstant(constructor);
730 }
731
732 @override
733 ConstantExpression getFieldConstant(FieldEntity field) {
734 throw new UnimplementedError("_EvaluationEnvironment.getFieldConstant");
735 }
736
737 @override
738 ConstantExpression getLocalConstant(Local local) {
739 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
740 }
741
742 @override
743 String readFromEnvironment(String name) {
744 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment");
745 }
746 }
747
588 // Interface for testing equivalence of Kernel-based entities. 748 // Interface for testing equivalence of Kernel-based entities.
589 class WorldDeconstructionForTesting { 749 class WorldDeconstructionForTesting {
590 final KernelWorldBuilder builder; 750 final KernelWorldBuilder builder;
591 751
592 WorldDeconstructionForTesting(this.builder); 752 WorldDeconstructionForTesting(this.builder);
593 753
594 Uri getLibraryUri(KLibrary library) { 754 Uri getLibraryUri(KLibrary library) {
595 return builder._libraryEnvs[library.libraryIndex].library.importUri; 755 return builder._libraryEnvs[library.libraryIndex].library.importUri;
596 } 756 }
597 757
(...skipping 14 matching lines...) Expand all
612 } 772 }
613 return builder._getLibrary(library); 773 return builder._getLibrary(library);
614 } 774 }
615 775
616 KLibrary getLibraryForFunction(KFunction function) => 776 KLibrary getLibraryForFunction(KFunction function) =>
617 _getLibrary(function, builder._methodMap); 777 _getLibrary(function, builder._methodMap);
618 778
619 KLibrary getLibraryForField(KField field) => 779 KLibrary getLibraryForField(KField field) =>
620 _getLibrary(field, builder._fieldMap); 780 _getLibrary(field, builder._fieldMap);
621 } 781 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/elements.dart ('k') | pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698