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

Side by Side Diff: pkg/compiler/lib/src/native/enqueue.dart

Issue 2869403002: Move ElementEnvironment.isSubtype to DartTypes (Closed)
Patch Set: Created 3 years, 7 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 '../common_elements.dart' show CommonElements, ElementEnvironment; 5 import '../common_elements.dart' show CommonElements, ElementEnvironment;
6 import '../elements/elements.dart'; 6 import '../elements/elements.dart';
7 import '../elements/entities.dart'; 7 import '../elements/entities.dart';
8 import '../elements/resolution_types.dart'; 8 import '../elements/resolution_types.dart';
9 import '../elements/types.dart'; 9 import '../elements/types.dart';
10 import '../js_backend/backend_usage.dart' show BackendUsageBuilder; 10 import '../js_backend/backend_usage.dart' show BackendUsageBuilder;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 final Set<ClassEntity> _registeredClasses = new Set<ClassEntity>(); 44 final Set<ClassEntity> _registeredClasses = new Set<ClassEntity>();
45 final Set<ClassEntity> _unusedClasses = new Set<ClassEntity>(); 45 final Set<ClassEntity> _unusedClasses = new Set<ClassEntity>();
46 46
47 bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty; 47 bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty;
48 48
49 /// Log message reported if all native types are used. 49 /// Log message reported if all native types are used.
50 String _allUsedMessage; 50 String _allUsedMessage;
51 51
52 final CompilerOptions _options; 52 final CompilerOptions _options;
53 final ElementEnvironment _elementEnvironment; 53 final ElementEnvironment _elementEnvironment;
54 final DartTypes _dartTypes;
54 final CommonElements _commonElements; 55 final CommonElements _commonElements;
55 56
56 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend. 57 /// Subclasses of [NativeEnqueuerBase] are constructed by the backend.
57 NativeEnqueuerBase( 58 NativeEnqueuerBase(this._options, this._elementEnvironment,
58 this._options, this._elementEnvironment, this._commonElements); 59 this._commonElements, this._dartTypes);
59 60
60 bool get enableLiveTypeAnalysis => _options.enableNativeLiveTypeAnalysis; 61 bool get enableLiveTypeAnalysis => _options.enableNativeLiveTypeAnalysis;
61 62
62 void onInstantiatedType(InterfaceType type) { 63 void onInstantiatedType(InterfaceType type) {
63 if (_unusedClasses.remove(type.element)) { 64 if (_unusedClasses.remove(type.element)) {
64 _registeredClasses.add(type.element); 65 _registeredClasses.add(type.element);
65 } 66 }
66 } 67 }
67 68
68 /// Register [classes] as natively instantiated in [impactBuilder]. 69 /// Register [classes] as natively instantiated in [impactBuilder].
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 } 103 }
103 if (type is InterfaceType) { 104 if (type is InterfaceType) {
104 if (type == _commonElements.numType) { 105 if (type == _commonElements.numType) {
105 registerInstantiation(_commonElements.doubleType); 106 registerInstantiation(_commonElements.doubleType);
106 registerInstantiation(_commonElements.intType); 107 registerInstantiation(_commonElements.intType);
107 } else if (type == _commonElements.intType || 108 } else if (type == _commonElements.intType ||
108 type == _commonElements.doubleType || 109 type == _commonElements.doubleType ||
109 type == _commonElements.stringType || 110 type == _commonElements.stringType ||
110 type == _commonElements.nullType || 111 type == _commonElements.nullType ||
111 type == _commonElements.boolType || 112 type == _commonElements.boolType ||
112 _elementEnvironment.isSubtype(type, 113 _dartTypes.isSubtype(type,
113 _elementEnvironment.getRawType(_commonElements.jsArrayClass))) { 114 _elementEnvironment.getRawType(_commonElements.jsArrayClass))) {
114 registerInstantiation(type); 115 registerInstantiation(type);
115 } 116 }
116 // TODO(johnniwinther): Improve spec string precision to handle type 117 // TODO(johnniwinther): Improve spec string precision to handle type
117 // arguments and implements relations that preserve generics. Currently 118 // arguments and implements relations that preserve generics. Currently
118 // we cannot distinguish between `List`, `List<dynamic>`, and 119 // we cannot distinguish between `List`, `List<dynamic>`, and
119 // `List<int>` and take all to mean `List<E>`; in effect not including 120 // `List<int>` and take all to mean `List<E>`; in effect not including
120 // any native subclasses of generic classes. 121 // any native subclasses of generic classes.
121 // TODO(johnniwinther,sra): Find and replace uses of `List` with the 122 // TODO(johnniwinther,sra): Find and replace uses of `List` with the
122 // actual implementation classes such as `JSArray` et al. 123 // actual implementation classes such as `JSArray` et al.
123 matchingClasses 124 matchingClasses
124 .addAll(_findUnusedClassesMatching((ClassEntity nativeClass) { 125 .addAll(_findUnusedClassesMatching((ClassEntity nativeClass) {
125 InterfaceType nativeType = 126 InterfaceType nativeType =
126 _elementEnvironment.getThisType(nativeClass); 127 _elementEnvironment.getThisType(nativeClass);
127 InterfaceType specType = 128 InterfaceType specType =
128 _elementEnvironment.getThisType(type.element); 129 _elementEnvironment.getThisType(type.element);
129 return _elementEnvironment.isSubtype(nativeType, specType); 130 return _dartTypes.isSubtype(nativeType, specType);
130 })); 131 }));
131 } else if (type.isDynamic) { 132 } else if (type.isDynamic) {
132 matchingClasses.addAll(_unusedClasses); 133 matchingClasses.addAll(_unusedClasses);
133 } else { 134 } else {
134 assert(type is VoidType); 135 assert(type is VoidType);
135 } 136 }
136 } 137 }
137 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { 138 if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) {
138 matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); 139 matchingClasses.addAll(_onFirstNativeClass(impactBuilder));
139 } 140 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 final BackendUsageBuilder _backendUsageBuilder; 189 final BackendUsageBuilder _backendUsageBuilder;
189 190
190 /// The set of all native classes. Each native class is in [nativeClasses] 191 /// The set of all native classes. Each native class is in [nativeClasses]
191 /// and exactly one of [unusedClasses] and [registeredClasses]. 192 /// and exactly one of [unusedClasses] and [registeredClasses].
192 final Set<ClassEntity> _nativeClasses = new Set<ClassEntity>(); 193 final Set<ClassEntity> _nativeClasses = new Set<ClassEntity>();
193 194
194 NativeResolutionEnqueuer( 195 NativeResolutionEnqueuer(
195 CompilerOptions options, 196 CompilerOptions options,
196 ElementEnvironment elementEnvironment, 197 ElementEnvironment elementEnvironment,
197 CommonElements commonElements, 198 CommonElements commonElements,
199 DartTypes dartTypes,
198 this._backendUsageBuilder, 200 this._backendUsageBuilder,
199 this._nativeClassFinder) 201 this._nativeClassFinder)
200 : super(options, elementEnvironment, commonElements); 202 : super(options, elementEnvironment, commonElements, dartTypes);
201 203
202 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses; 204 Iterable<ClassEntity> get nativeClassesForTesting => _nativeClasses;
203 205
204 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses; 206 Iterable<ClassEntity> get registeredClassesForTesting => _registeredClasses;
205 207
206 void _registerBackendUse(FunctionEntity element) { 208 void _registerBackendUse(FunctionEntity element) {
207 _backendUsageBuilder.registerBackendFunctionUse(element); 209 _backendUsageBuilder.registerBackendFunctionUse(element);
208 _backendUsageBuilder.registerGlobalFunctionDependency(element); 210 _backendUsageBuilder.registerGlobalFunctionDependency(element);
209 } 211 }
210 212
(...skipping 20 matching lines...) Expand all
231 final CodeEmitterTask _emitter; 233 final CodeEmitterTask _emitter;
232 final NativeResolutionEnqueuer _resolutionEnqueuer; 234 final NativeResolutionEnqueuer _resolutionEnqueuer;
233 final NativeData _nativeData; 235 final NativeData _nativeData;
234 236
235 final Set<ClassEntity> _doneAddSubtypes = new Set<ClassEntity>(); 237 final Set<ClassEntity> _doneAddSubtypes = new Set<ClassEntity>();
236 238
237 NativeCodegenEnqueuer( 239 NativeCodegenEnqueuer(
238 CompilerOptions options, 240 CompilerOptions options,
239 ElementEnvironment elementEnvironment, 241 ElementEnvironment elementEnvironment,
240 CommonElements commonElements, 242 CommonElements commonElements,
243 DartTypes dartTypes,
241 this._emitter, 244 this._emitter,
242 this._resolutionEnqueuer, 245 this._resolutionEnqueuer,
243 this._nativeData) 246 this._nativeData)
244 : super(options, elementEnvironment, commonElements); 247 : super(options, elementEnvironment, commonElements, dartTypes);
245 248
246 WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) { 249 WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) {
247 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); 250 WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
248 _unusedClasses.addAll(_resolutionEnqueuer._nativeClasses); 251 _unusedClasses.addAll(_resolutionEnqueuer._nativeClasses);
249 252
250 if (!enableLiveTypeAnalysis) { 253 if (!enableLiveTypeAnalysis) {
251 _registerTypeUses( 254 _registerTypeUses(
252 impactBuilder, _resolutionEnqueuer._nativeClasses, 'forced'); 255 impactBuilder, _resolutionEnqueuer._nativeClasses, 'forced');
253 } 256 }
254 257
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]); 308 emitter.directSubtypes.putIfAbsent(superclass, () => <ClassEntity>[]);
306 directSubtypes.add(cls); 309 directSubtypes.add(cls);
307 } 310 }
308 311
309 void logSummary(void log(String message)) { 312 void logSummary(void log(String message)) {
310 super.logSummary(log); 313 super.logSummary(log);
311 log('Compiled ${_registeredClasses.length} native classes, ' 314 log('Compiled ${_registeredClasses.length} native classes, '
312 '${_unusedClasses.length} native classes omitted.'); 315 '${_unusedClasses.length} native classes omitted.');
313 } 316 }
314 } 317 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/kernel_strategy.dart ('k') | pkg/compiler/lib/src/resolution/resolution_strategy.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698