Chromium Code Reviews| Index: pkg/compiler/lib/src/native/enqueue.dart |
| diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart |
| index 44d3be38efe79babbd177b20d6c70f5f8b9f2a6c..eec9100ce5f6718a6513739aa055ebac6a3f3c36 100644 |
| --- a/pkg/compiler/lib/src/native/enqueue.dart |
| +++ b/pkg/compiler/lib/src/native/enqueue.dart |
| @@ -22,7 +22,8 @@ import '../tokens/token.dart' show BeginGroupToken, Token; |
| import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN; |
| import '../tree/tree.dart'; |
| import '../universe/use.dart' show StaticUse, TypeUse; |
| -import '../universe/world_impact.dart' show WorldImpactBuilder; |
| +import '../universe/world_impact.dart' |
| + show WorldImpact, WorldImpactBuilder, WorldImpactBuilderImpl; |
| import 'behavior.dart'; |
| /** |
| @@ -33,8 +34,8 @@ class NativeEnqueuer { |
| void onInstantiatedType(InterfaceType type) {} |
| /// Initial entry point to native enqueuer. |
| - void processNativeClasses( |
| - WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) {} |
| + WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) => |
| + const WorldImpact(); |
| /// Registers the [nativeBehavior]. Adds the liveness of its instantiated |
| /// types to the world. |
| @@ -68,31 +69,19 @@ class NativeEnqueuer { |
| abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$'); |
| - /** |
| - * The set of all native classes. Each native class is in [nativeClasses] and |
| - * exactly one of [unusedClasses], [pendingClasses] and [registeredClasses]. |
| - */ |
| - final Set<ClassElement> nativeClasses = new Set<ClassElement>(); |
| + /// The set of all native classes. Each native class is in [nativeClasses] |
| + /// and exactly one of [unusedClasses] and [registeredClasses]. |
| + final Set<ClassElement> _nativeClasses = new Set<ClassElement>(); |
| - final Set<ClassElement> registeredClasses = new Set<ClassElement>(); |
| - final Set<ClassElement> pendingClasses = new Set<ClassElement>(); |
| - final Set<ClassElement> unusedClasses = new Set<ClassElement>(); |
| + final Set<ClassElement> _registeredClasses = new Set<ClassElement>(); |
| + final Set<ClassElement> _unusedClasses = new Set<ClassElement>(); |
| final Set<LibraryElement> processedLibraries; |
| - bool get hasInstantiatedNativeClasses => !registeredClasses.isEmpty; |
| + bool get hasInstantiatedNativeClasses => !_registeredClasses.isEmpty; |
| final Set<ClassElement> nativeClassesAndSubclasses = new Set<ClassElement>(); |
| - final Map<ClassElement, Set<ClassElement>> nonNativeSubclasses = |
| - new Map<ClassElement, Set<ClassElement>>(); |
|
Johnni Winther
2016/11/15 15:21:56
Unused
|
| - |
| - /** |
| - * Records matched constraints ([SpecialType] or [DartType]). Once a type |
| - * constraint has been matched, there is no need to match it again. |
| - */ |
| - final Set matchedTypeConstraints = new Set(); |
|
Johnni Winther
2016/11/15 15:21:56
We cannot do this anymore, since we might not appl
|
| - |
| final Compiler compiler; |
| final bool enableLiveTypeAnalysis; |
| @@ -113,12 +102,18 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| CoreTypes get coreTypes => compiler.coreTypes; |
| void onInstantiatedType(InterfaceType type) { |
| - if (unusedClasses.remove(type.element)) { |
| - registeredClasses.add(type.element); |
| + if (_unusedClasses.remove(type.element)) { |
| + _registeredClasses.add(type.element); |
| } |
| } |
| - void processNativeClasses( |
| + WorldImpact processNativeClasses(Iterable<LibraryElement> libraries) { |
| + WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl(); |
| + _processNativeClasses(impactBuilder, libraries); |
| + return impactBuilder; |
| + } |
| + |
| + void _processNativeClasses( |
| WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) { |
| if (compiler.options.hasIncrementalSupport) { |
| // Since [Set.add] returns bool if an element was added, this restricts |
| @@ -132,7 +127,7 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| } |
| processSubclassesOfNativeClasses(libraries); |
| if (!enableLiveTypeAnalysis) { |
| - _registerTypeUses(impactBuilder, nativeClasses, 'forced'); |
| + _registerTypeUses(impactBuilder, _nativeClasses, 'forced'); |
| } |
| } |
| @@ -146,8 +141,8 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| } |
| void processNativeClass(ClassElement classElement) { |
| - nativeClasses.add(classElement); |
| - unusedClasses.add(classElement); |
| + _nativeClasses.add(classElement); |
| + _unusedClasses.add(classElement); |
| // Resolve class to ensure the class has valid inheritance info. |
| classElement.ensureResolved(resolution); |
| } |
| @@ -190,11 +185,6 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| ClassElement nativeSuperclass = nativeSuperclassOf(element); |
| if (nativeSuperclass != null) { |
| nativeClassesAndSubclasses.add(element); |
| - if (!backend.isNative(element)) { |
| - nonNativeSubclasses |
| - .putIfAbsent(nativeSuperclass, () => new Set<ClassElement>()) |
| - .add(element); |
| - } |
| Set<ClassElement> potentialSubclasses = potentialExtends[element.name]; |
| if (potentialSubclasses != null) { |
| potentialSubclasses.forEach(walkPotentialSubclasses); |
| @@ -202,10 +192,10 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| } |
| } |
| - nativeClasses.forEach(walkPotentialSubclasses); |
| + _nativeClasses.forEach(walkPotentialSubclasses); |
| - nativeClasses.addAll(nativeClassesAndSubclasses); |
| - unusedClasses.addAll(nativeClassesAndSubclasses); |
| + _nativeClasses.addAll(nativeClassesAndSubclasses); |
| + _unusedClasses.addAll(nativeClassesAndSubclasses); |
| } |
| /** |
| @@ -344,7 +334,7 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| void _registerTypeUses( |
| WorldImpactBuilder impactBuilder, Set<ClassElement> classes, cause) { |
| for (ClassElement cls in classes) { |
| - if (!unusedClasses.contains(cls)) { |
| + if (!_unusedClasses.contains(cls)) { |
| // No need to add [classElement] to [impactBuilder]: it has already been |
| // instantiated and we don't track origins of native instantiations |
| // precisely. |
| @@ -446,11 +436,9 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| impactBuilder.registerTypeUse(new TypeUse.nativeInstantiation(type)); |
| } |
| - int unusedBefore = unusedClasses.length; |
| + int unusedBefore = _unusedClasses.length; |
| Set<ClassElement> matchingClasses = new Set<ClassElement>(); |
| for (var type in behavior.typesInstantiated) { |
| - if (matchedTypeConstraints.contains(type)) continue; |
| - matchedTypeConstraints.add(type); |
| if (type is SpecialType) { |
| if (type == SpecialType.JsObject) { |
| registerInstantiation(compiler.coreTypes.objectType); |
| @@ -489,12 +477,12 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| return compiler.types.isSubtype(nativeType, specType); |
| })); |
| } else if (type.isDynamic) { |
| - matchingClasses.addAll(unusedClasses); |
| + matchingClasses.addAll(_unusedClasses); |
| } else { |
| assert(type is VoidType); |
| } |
| } |
| - if (matchingClasses.isNotEmpty && registeredClasses.isEmpty) { |
| + if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { |
| matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); |
| } |
| _registerTypeUses(impactBuilder, matchingClasses, cause); |
| @@ -508,7 +496,7 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer { |
| Iterable<ClassElement> _findUnusedClassesMatching( |
| bool predicate(classElement)) { |
| - return unusedClasses.where(predicate); |
| + return _unusedClasses.where(predicate); |
| } |
| Iterable<ClassElement> _onFirstNativeClass(WorldImpactBuilder impactBuilder) { |
| @@ -564,8 +552,8 @@ class NativeResolutionEnqueuer extends NativeEnqueuerBase { |
| } |
| void logSummary(log(message)) { |
| - log('Resolved ${registeredClasses.length} native elements used, ' |
| - '${unusedClasses.length} native elements dead.'); |
| + log('Resolved ${_registeredClasses.length} native elements used, ' |
| + '${_unusedClasses.length} native elements dead.'); |
| } |
| /** |
| @@ -620,19 +608,19 @@ class NativeCodegenEnqueuer extends NativeEnqueuerBase { |
| NativeCodegenEnqueuer(Compiler compiler, this.emitter) |
| : super(compiler, compiler.options.enableNativeLiveTypeAnalysis); |
| - void processNativeClasses( |
| + void _processNativeClasses( |
| WorldImpactBuilder impactBuilder, Iterable<LibraryElement> libraries) { |
| - super.processNativeClasses(impactBuilder, libraries); |
| + super._processNativeClasses(impactBuilder, libraries); |
| // HACK HACK - add all the resolved classes. |
| NativeEnqueuerBase enqueuer = compiler.enqueuer.resolution.nativeEnqueuer; |
| Set<ClassElement> matchingClasses = new Set<ClassElement>(); |
| - for (final classElement in enqueuer.registeredClasses) { |
| - if (unusedClasses.contains(classElement)) { |
| + for (final classElement in enqueuer._registeredClasses) { |
| + if (_unusedClasses.contains(classElement)) { |
| matchingClasses.add(classElement); |
| } |
| } |
| - if (matchingClasses.isNotEmpty && registeredClasses.isEmpty) { |
| + if (matchingClasses.isNotEmpty && _registeredClasses.isEmpty) { |
| matchingClasses.addAll(_onFirstNativeClass(impactBuilder)); |
| } |
| _registerTypeUses(impactBuilder, matchingClasses, 'was resolved'); |
| @@ -679,7 +667,7 @@ class NativeCodegenEnqueuer extends NativeEnqueuerBase { |
| } |
| void logSummary(log(message)) { |
| - log('Compiled ${registeredClasses.length} native classes, ' |
| - '${unusedClasses.length} native classes omitted.'); |
| + log('Compiled ${_registeredClasses.length} native classes, ' |
| + '${_unusedClasses.length} native classes omitted.'); |
| } |
| } |