Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 '../common.dart'; | 5 import '../common.dart'; |
| 6 import '../common_elements.dart'; | 6 import '../common_elements.dart'; |
| 7 import '../elements/elements.dart' show Element; | 7 import '../elements/elements.dart' show Element; |
| 8 import '../elements/entities.dart'; | 8 import '../elements/entities.dart'; |
| 9 import '../elements/types.dart'; | 9 import '../elements/types.dart'; |
| 10 import '../util/util.dart' show Setlet; | 10 import '../util/util.dart' show Setlet; |
| 11 import 'backend_helpers.dart'; | |
| 12 import 'backend_impact.dart'; | 11 import 'backend_impact.dart'; |
| 13 | 12 |
| 14 abstract class BackendUsage { | 13 abstract class BackendUsage { |
| 15 bool needToInitializeIsolateAffinityTag; | 14 bool needToInitializeIsolateAffinityTag; |
| 16 bool needToInitializeDispatchProperty; | 15 bool needToInitializeDispatchProperty; |
| 17 | 16 |
| 18 /// Returns `true` if [element] is a function called by the backend. | 17 /// Returns `true` if [element] is a function called by the backend. |
| 19 bool isFunctionUsedByBackend(FunctionEntity element); | 18 bool isFunctionUsedByBackend(FunctionEntity element); |
| 20 | 19 |
| 21 /// Returns `true` if [element] is an instance field of a class instantiated | 20 /// Returns `true` if [element] is an instance field of a class instantiated |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 bool isFunctionApplyUsed; | 80 bool isFunctionApplyUsed; |
| 82 | 81 |
| 83 /// `true` if `noSuchMethod` is used. | 82 /// `true` if `noSuchMethod` is used. |
| 84 bool isNoSuchMethodUsed; | 83 bool isNoSuchMethodUsed; |
| 85 | 84 |
| 86 BackendUsage close(); | 85 BackendUsage close(); |
| 87 } | 86 } |
| 88 | 87 |
| 89 class BackendUsageBuilderImpl implements BackendUsageBuilder { | 88 class BackendUsageBuilderImpl implements BackendUsageBuilder { |
| 90 final CommonElements _commonElements; | 89 final CommonElements _commonElements; |
| 91 final BackendHelpers _helpers; | |
| 92 // TODO(johnniwinther): Remove the need for these. | 90 // TODO(johnniwinther): Remove the need for these. |
| 93 Setlet<FunctionEntity> _globalFunctionDependencies; | 91 Setlet<FunctionEntity> _globalFunctionDependencies; |
| 94 Setlet<ClassEntity> _globalClassDependencies; | 92 Setlet<ClassEntity> _globalClassDependencies; |
| 95 | 93 |
| 96 /// List of methods that the backend may use. | 94 /// List of methods that the backend may use. |
| 97 final Set<FunctionEntity> _helperFunctionsUsed = new Set<FunctionEntity>(); | 95 final Set<FunctionEntity> _helperFunctionsUsed = new Set<FunctionEntity>(); |
| 98 | 96 |
| 99 /// List of classes that the backend may use. | 97 /// List of classes that the backend may use. |
| 100 final Set<ClassEntity> _helperClassesUsed = new Set<ClassEntity>(); | 98 final Set<ClassEntity> _helperClassesUsed = new Set<ClassEntity>(); |
| 101 | 99 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 113 | 111 |
| 114 /// `true` if the `dart:isolate` library is in use. | 112 /// `true` if the `dart:isolate` library is in use. |
| 115 bool isIsolateInUse = false; | 113 bool isIsolateInUse = false; |
| 116 | 114 |
| 117 /// `true` if `Function.apply` is used. | 115 /// `true` if `Function.apply` is used. |
| 118 bool isFunctionApplyUsed = false; | 116 bool isFunctionApplyUsed = false; |
| 119 | 117 |
| 120 /// `true` if `noSuchMethod` is used. | 118 /// `true` if `noSuchMethod` is used. |
| 121 bool isNoSuchMethodUsed = false; | 119 bool isNoSuchMethodUsed = false; |
| 122 | 120 |
| 123 BackendUsageBuilderImpl(this._commonElements, this._helpers); | 121 BackendUsageBuilderImpl(this._commonElements); |
| 124 | 122 |
| 125 @override | 123 @override |
| 126 void registerBackendFunctionUse(FunctionEntity element) { | 124 void registerBackendFunctionUse(FunctionEntity element) { |
| 127 assert(invariant(element, _isValidBackendUse(element), | 125 assert(invariant(element, _isValidBackendUse(element), |
| 128 message: "Backend use of $element is not allowed.")); | 126 message: "Backend use of $element is not allowed.")); |
| 129 _helperFunctionsUsed.add(element); | 127 _helperFunctionsUsed.add(element); |
| 130 } | 128 } |
| 131 | 129 |
| 132 @override | 130 @override |
| 133 void registerBackendClassUse(ClassEntity element) { | 131 void registerBackendClassUse(ClassEntity element) { |
| 134 assert(invariant(element, _isValidBackendUse(element), | 132 assert(invariant(element, _isValidBackendUse(element), |
| 135 message: "Backend use of $element is not allowed.")); | 133 message: "Backend use of $element is not allowed.")); |
| 136 _helperClassesUsed.add(element); | 134 _helperClassesUsed.add(element); |
| 137 } | 135 } |
| 138 | 136 |
| 139 bool _isValidBackendUse(Entity element) { | 137 bool _isValidBackendUse(Entity element) { |
| 140 if (_isValidEntity(element)) return true; | 138 if (_isValidEntity(element)) return true; |
| 141 if (element is Element) { | 139 if (element is Element) { |
| 142 assert(invariant(element, element.isDeclaration, | 140 assert(invariant(element, element.isDeclaration, |
| 143 message: "Backend use $element must be the declaration.")); | 141 message: "Backend use $element must be the declaration.")); |
| 144 if (element.implementationLibrary.isPatch || | 142 if (element.implementationLibrary.isPatch || |
| 145 // Needed to detect deserialized injected elements, that is | 143 // Needed to detect deserialized injected elements, that is |
| 146 // element declared in patch files. | 144 // element declared in patch files. |
| 147 (element.library.isPlatformLibrary && | 145 (element.library.isPlatformLibrary && |
| 148 element.sourcePosition.uri.path | 146 element.sourcePosition.uri.path |
| 149 .contains('_internal/js_runtime/lib/')) || | 147 .contains('_internal/js_runtime/lib/')) || |
| 150 element.library == _helpers.jsHelperLibrary || | 148 element.library == _commonElements.jsHelperLibrary || |
| 151 element.library == _helpers.interceptorsLibrary || | 149 element.library == _commonElements.interceptorsLibrary || |
| 152 element.library == _helpers.isolateHelperLibrary) { | 150 element.library == _commonElements.isolateHelperLibrary) { |
| 153 // TODO(johnniwinther): We should be more precise about these. | 151 // TODO(johnniwinther): We should be more precise about these. |
| 154 return true; | 152 return true; |
| 155 } else { | 153 } else { |
| 154 print('mah source position path ${element.sourcePosition.uri.path}'); | |
|
Johnni Winther
2017/04/11 09:16:00
Remove?
Emily Fortuna
2017/04/11 21:31:35
ooops, yes, thank you!
| |
| 156 return false; | 155 return false; |
| 157 } | 156 } |
| 158 } | 157 } |
| 159 // TODO(johnniwinther): Support remaining checks on [Entity]s. | 158 // TODO(johnniwinther): Support remaining checks on [Entity]s. |
| 160 return true; | 159 return true; |
| 161 } | 160 } |
| 162 | 161 |
| 163 bool _isValidEntity(Entity element) { | 162 bool _isValidEntity(Entity element) { |
| 164 if (element is ConstructorEntity && | 163 if (element is ConstructorEntity && |
| 165 (element == _helpers.streamIteratorConstructor || | 164 (element == _commonElements.streamIteratorConstructor || |
| 166 _commonElements.isSymbolConstructor(element) || | 165 _commonElements.isSymbolConstructor(element) || |
| 167 _helpers.isSymbolValidatedConstructor(element) || | 166 _commonElements.isSymbolValidatedConstructor(element) || |
| 168 element == _helpers.syncCompleterConstructor)) { | 167 element == _commonElements.syncCompleterConstructor)) { |
| 169 // TODO(johnniwinther): These are valid but we could be more precise. | 168 // TODO(johnniwinther): These are valid but we could be more precise. |
| 170 return true; | 169 return true; |
| 171 } else if (element == _commonElements.symbolClass || | 170 } else if (element == _commonElements.symbolClass || |
| 172 element == _helpers.objectNoSuchMethod) { | 171 element == _commonElements.objectNoSuchMethod) { |
| 173 // TODO(johnniwinther): These are valid but we could be more precise. | 172 // TODO(johnniwinther): These are valid but we could be more precise. |
| 174 return true; | 173 return true; |
| 175 } else if (element == _commonElements.listClass || | 174 } else if (element == _commonElements.listClass || |
| 176 element == _helpers.mapLiteralClass || | 175 element == _commonElements.mapLiteralClass || |
| 177 element == _commonElements.functionClass || | 176 element == _commonElements.functionClass || |
| 178 element == _commonElements.stringClass) { | 177 element == _commonElements.stringClass) { |
| 179 // TODO(johnniwinther): Avoid these. | 178 // TODO(johnniwinther): Avoid these. |
| 180 return true; | 179 return true; |
| 181 } else if (element == _helpers.genericNoSuchMethod || | 180 } else if (element == _commonElements.genericNoSuchMethod || |
| 182 element == _helpers.unresolvedConstructorError || | 181 element == _commonElements.unresolvedConstructorError || |
| 183 element == _helpers.malformedTypeError) { | 182 element == _commonElements.malformedTypeError) { |
| 184 return true; | 183 return true; |
| 185 } | 184 } |
| 186 return false; | 185 return false; |
| 187 } | 186 } |
| 188 | 187 |
| 189 void _processBackendStaticUse(FunctionEntity element, | 188 void _processBackendStaticUse(FunctionEntity element, |
| 190 {bool isGlobal: false}) { | 189 {bool isGlobal: false}) { |
| 191 registerBackendFunctionUse(element); | 190 registerBackendFunctionUse(element); |
| 192 if (isGlobal) { | 191 if (isGlobal) { |
| 193 registerGlobalFunctionDependency(element); | 192 registerGlobalFunctionDependency(element); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 228 _needToInitializeDispatchProperty = true; | 227 _needToInitializeDispatchProperty = true; |
| 229 break; | 228 break; |
| 230 case BackendFeature.needToInitializeIsolateAffinityTag: | 229 case BackendFeature.needToInitializeIsolateAffinityTag: |
| 231 _needToInitializeIsolateAffinityTag = true; | 230 _needToInitializeIsolateAffinityTag = true; |
| 232 break; | 231 break; |
| 233 } | 232 } |
| 234 } | 233 } |
| 235 } | 234 } |
| 236 | 235 |
| 237 void registerUsedMember(MemberEntity member) { | 236 void registerUsedMember(MemberEntity member) { |
| 238 if (member == _helpers.getIsolateAffinityTagMarker) { | 237 if (member == _commonElements.getIsolateAffinityTagMarker) { |
| 239 _needToInitializeIsolateAffinityTag = true; | 238 _needToInitializeIsolateAffinityTag = true; |
| 240 } else if (member == _helpers.requiresPreambleMarker) { | 239 } else if (member == _commonElements.requiresPreambleMarker) { |
| 241 requiresPreamble = true; | 240 requiresPreamble = true; |
| 242 } else if (member == _helpers.invokeOnMethod) { | 241 } else if (member == _commonElements.invokeOnMethod) { |
| 243 isInvokeOnUsed = true; | 242 isInvokeOnUsed = true; |
| 244 } else if (_commonElements.isFunctionApplyMethod(member)) { | 243 } else if (_commonElements.isFunctionApplyMethod(member)) { |
| 245 isFunctionApplyUsed = true; | 244 isFunctionApplyUsed = true; |
| 246 } | 245 } |
| 247 } | 246 } |
| 248 | 247 |
| 249 void registerGlobalFunctionDependency(FunctionEntity element) { | 248 void registerGlobalFunctionDependency(FunctionEntity element) { |
| 250 assert(element != null); | 249 assert(element != null); |
| 251 if (_globalFunctionDependencies == null) { | 250 if (_globalFunctionDependencies == null) { |
| 252 _globalFunctionDependencies = new Setlet<FunctionEntity>(); | 251 _globalFunctionDependencies = new Setlet<FunctionEntity>(); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 return _helperClassesUsed.contains(element.enclosingClass); | 338 return _helperClassesUsed.contains(element.enclosingClass); |
| 340 } | 339 } |
| 341 | 340 |
| 342 @override | 341 @override |
| 343 Iterable<FunctionEntity> get globalFunctionDependencies => | 342 Iterable<FunctionEntity> get globalFunctionDependencies => |
| 344 _globalFunctionDependencies; | 343 _globalFunctionDependencies; |
| 345 | 344 |
| 346 @override | 345 @override |
| 347 Iterable<ClassEntity> get globalClassDependencies => _globalClassDependencies; | 346 Iterable<ClassEntity> get globalClassDependencies => _globalClassDependencies; |
| 348 } | 347 } |
| OLD | NEW |