Make resolution/codegen_world_builder into libraries

Change-Id: Ic8c00b2b3cf13a21e165486c1c825df75edd7d7b
Reviewed-on: https://dart-review.googlesource.com/c/84021
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Auto-Submit: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
Johnni Winther 2018-11-09 23:05:58 +00:00 committed by commit-bot@chromium.org
parent b484aada21
commit d062a41404
33 changed files with 202 additions and 175 deletions

View file

@ -15,6 +15,7 @@ import 'js_backend/js_backend.dart';
import 'js_backend/native_data.dart';
import 'ssa/ssa.dart';
import 'types/types.dart';
import 'universe/codegen_world_builder.dart';
import 'universe/world_builder.dart';
import 'world.dart';

View file

@ -42,8 +42,8 @@ import 'types/abstract_value_domain.dart' show AbstractValueStrategy;
import 'types/types.dart'
show GlobalTypeInferenceResults, GlobalTypeInferenceTask;
import 'universe/selector.dart' show Selector;
import 'universe/world_builder.dart'
show ResolutionWorldBuilder, CodegenWorldBuilder;
import 'universe/codegen_world_builder.dart';
import 'universe/resolution_world_builder.dart';
import 'universe/world_impact.dart'
show ImpactStrategy, WorldImpact, WorldImpactBuilderImpl;
import 'world.dart' show JClosedWorld, KClosedWorld;

View file

@ -23,7 +23,7 @@ import 'js_backend/js_backend.dart' show JavaScriptBackend;
import 'types/abstract_value_domain.dart';
import 'types/types.dart'
show GlobalTypeInferenceMemberResult, GlobalTypeInferenceResults;
import 'universe/world_builder.dart' show CodegenWorldBuilder;
import 'universe/codegen_world_builder.dart';
import 'universe/world_impact.dart'
show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
import 'world.dart' show JClosedWorld;

View file

@ -17,6 +17,8 @@ import 'elements/entities.dart';
import 'elements/types.dart';
import 'js_backend/enqueuer.dart';
import 'types/types.dart';
import 'universe/member_usage.dart';
import 'universe/resolution_world_builder.dart';
import 'universe/world_builder.dart';
import 'universe/use.dart'
show

View file

@ -22,6 +22,7 @@ import 'library_loader.dart';
import 'native/enqueue.dart' show NativeResolutionEnqueuer;
import 'native/resolver.dart';
import 'universe/class_hierarchy.dart';
import 'universe/resolution_world_builder.dart';
import 'universe/world_builder.dart';
import 'universe/world_impact.dart';

View file

@ -34,6 +34,7 @@ import '../types/types.dart';
import '../universe/call_structure.dart' show CallStructure;
import '../universe/class_hierarchy.dart'
show ClassHierarchyBuilder, ClassQueries;
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector;
import '../universe/use.dart' show StaticUse;
import '../universe/world_builder.dart';

View file

@ -12,7 +12,7 @@ import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
import '../js_emitter/code_emitter_task.dart';
import '../options.dart';
import '../universe/world_builder.dart';
import '../universe/codegen_world_builder.dart';
import 'allocator_analysis.dart' show JAllocatorAnalysis;
import 'constant_system_javascript.dart';
import 'js_backend.dart';

View file

@ -14,7 +14,8 @@ import '../elements/entities.dart';
import '../elements/types.dart';
import '../enqueue.dart';
import '../options.dart';
import '../universe/world_builder.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/member_usage.dart';
import '../universe/use.dart'
show
ConstantUse,

View file

@ -9,8 +9,8 @@ import '../elements/types.dart';
import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
import '../universe/selector.dart' show Selector;
import '../universe/world_builder.dart'
show CodegenWorldBuilder, SelectorConstraints;
import '../universe/codegen_world_builder.dart';
import '../universe/world_builder.dart' show SelectorConstraints;
import 'namer.dart';
import 'native_data.dart';

View file

@ -26,8 +26,8 @@ import '../js/js.dart' as jsAst;
import '../js_model/closure.dart';
import '../js_model/elements.dart' show JGeneratorBody;
import '../universe/call_structure.dart' show CallStructure;
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector, SelectorKind;
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../util/util.dart';
import '../world.dart' show JClosedWorld;
import 'backend.dart';

View file

@ -21,7 +21,9 @@ import '../js_emitter/js_emitter.dart' show Emitter;
import '../options.dart';
import '../serialization/serialization.dart';
import '../universe/class_hierarchy.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/feature.dart';
import '../universe/resolution_world_builder.dart';
import '../universe/selector.dart';
import '../universe/world_builder.dart';
import '../world.dart' show JClosedWorld, KClosedWorld;

View file

@ -12,9 +12,9 @@ import '../js/js.dart' show js;
import '../js_backend/namer.dart' show Namer;
import '../js_backend/interceptor_data.dart' show InterceptorData;
import '../options.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector;
import '../universe/world_builder.dart'
show CodegenWorldBuilder, SelectorConstraints;
import '../universe/world_builder.dart' show SelectorConstraints;
import '../world.dart' show JClosedWorld;
import 'code_emitter_task.dart';

View file

@ -15,7 +15,7 @@ import '../elements/entities.dart';
import '../js/js.dart' as jsAst;
import '../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
import '../js_backend/inferred_data.dart';
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../universe/codegen_world_builder.dart';
import '../world.dart' show JClosedWorld;
import 'full_emitter/emitter.dart' as full_js_emitter;
import 'program_builder/program_builder.dart';

View file

@ -29,7 +29,7 @@ import '../../js_backend/js_backend.dart'
import '../../js_backend/native_data.dart';
import '../../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
import '../../universe/call_structure.dart' show CallStructure;
import '../../universe/world_builder.dart' show CodegenWorldBuilder;
import '../../universe/codegen_world_builder.dart';
import '../../util/uri_extras.dart' show relativize;
import '../../world.dart' show JClosedWorld;
import '../constant_ordering.dart' show ConstantOrdering;

View file

@ -12,9 +12,9 @@ import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
import '../js_backend/namer.dart' show Namer;
import '../universe/call_structure.dart' show CallStructure;
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector;
import '../universe/world_builder.dart'
show CodegenWorldBuilder, SelectorConstraints;
import '../universe/world_builder.dart' show SelectorConstraints;
import '../world.dart' show JClosedWorld;
import 'model.dart';

View file

@ -19,8 +19,8 @@ import '../js_backend/native_data.dart';
import '../js_backend/interceptor_data.dart';
import '../native/enqueue.dart';
import '../options.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector;
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../world.dart' show JClosedWorld;
import 'code_emitter_task.dart' show CodeEmitterTask, Emitter;

View file

@ -17,7 +17,7 @@ import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder;
import '../options.dart';
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../universe/codegen_world_builder.dart';
import 'code_emitter_task.dart' show Emitter;

View file

@ -13,7 +13,7 @@ import '../js/js.dart' show js;
import '../js_backend/interceptor_data.dart';
import '../js_backend/native_data.dart';
import '../native/enqueue.dart' show NativeCodegenEnqueuer;
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../universe/codegen_world_builder.dart';
import '../world.dart' show JClosedWorld;
import 'code_emitter_task.dart' show CodeEmitterTask;

View file

@ -15,9 +15,9 @@ import '../js_backend/native_data.dart';
import '../js_backend/interceptor_data.dart';
import '../js_backend/runtime_types.dart';
import '../universe/call_structure.dart' show CallStructure;
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart' show Selector;
import '../universe/world_builder.dart'
show CodegenWorldBuilder, SelectorConstraints;
import '../universe/world_builder.dart' show SelectorConstraints;
import '../world.dart' show JClosedWorld;
import 'model.dart';

View file

@ -33,9 +33,9 @@ import '../../js_backend/runtime_types.dart'
import '../../js_model/elements.dart' show JGeneratorBody, JSignatureMethod;
import '../../native/enqueue.dart' show NativeCodegenEnqueuer;
import '../../options.dart';
import '../../universe/codegen_world_builder.dart';
import '../../universe/selector.dart' show Selector;
import '../../universe/world_builder.dart'
show CodegenWorldBuilder, SelectorConstraints;
import '../../universe/world_builder.dart' show SelectorConstraints;
import '../../world.dart' show JClosedWorld;
import '../js_emitter.dart'
show

View file

@ -13,7 +13,7 @@ import '../js_backend/runtime_types.dart'
RuntimeTypesChecksBuilder,
RuntimeTypesSubstitutions;
import '../options.dart';
import '../universe/world_builder.dart';
import '../universe/codegen_world_builder.dart';
class TypeTestRegistry {
final ElementEnvironment _elementEnvironment;

View file

@ -47,7 +47,6 @@ import '../serialization/serialization.dart';
import '../ssa/type_builder.dart';
import '../universe/call_structure.dart';
import '../universe/selector.dart';
import '../universe/world_builder.dart';
import 'closure.dart';
import 'elements.dart';

View file

@ -31,6 +31,7 @@ import '../ssa/ssa.dart';
import '../ssa/types.dart';
import '../types/abstract_value_domain.dart';
import '../types/types.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/selector.dart';
import '../universe/world_builder.dart';
import '../universe/world_impact.dart';

View file

@ -29,6 +29,7 @@ import '../native/enqueue.dart' show NativeResolutionEnqueuer;
import '../native/resolver.dart';
import '../options.dart';
import '../universe/class_hierarchy.dart';
import '../universe/resolution_world_builder.dart';
import '../universe/world_builder.dart';
import '../universe/world_impact.dart';
import 'deferred_load.dart';

View file

@ -17,7 +17,7 @@ import '../js_backend/runtime_types.dart';
import '../options.dart';
import '../universe/class_hierarchy.dart';
import '../universe/class_set.dart';
import '../universe/world_builder.dart';
import '../universe/resolution_world_builder.dart';
import '../world.dart';
import 'element_map_impl.dart';

View file

@ -36,12 +36,12 @@ import '../native/native.dart' as native;
import '../types/abstract_value_domain.dart';
import '../types/types.dart';
import '../universe/call_structure.dart';
import '../universe/codegen_world_builder.dart';
import '../universe/feature.dart';
import '../universe/selector.dart';
import '../universe/side_effects.dart' show SideEffects;
import '../universe/target_checks.dart' show TargetChecks;
import '../universe/use.dart' show ConstantUse, StaticUse;
import '../universe/world_builder.dart' show CodegenWorldBuilder;
import '../world.dart';
import 'graph_builder.dart';
import 'jump_handler.dart';

View file

@ -2,7 +2,30 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of world_builder;
import 'dart:collection';
import '../common/names.dart' show Identifiers;
import '../common_elements.dart';
import '../constants/values.dart';
import '../elements/entities.dart';
import '../elements/types.dart';
import '../js_backend/native_data.dart' show NativeBasicData;
import '../js_model/locals.dart';
import '../js_model/element_map_impl.dart';
import '../util/enumset.dart';
import '../util/util.dart';
import '../world.dart' show JClosedWorld;
import 'member_usage.dart';
import 'selector.dart' show Selector;
import 'use.dart'
show
ConstantUse,
ConstantUseKind,
DynamicUse,
DynamicUseKind,
StaticUse,
StaticUseKind;
import 'world_builder.dart';
/// World builder specific to codegen.
///
@ -131,34 +154,34 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
<String, Map<Selector, SelectorConstraints>>{};
final Map<ClassEntity, _ClassUsage> _processedClasses =
<ClassEntity, _ClassUsage>{};
final Map<ClassEntity, ClassUsage> _processedClasses =
<ClassEntity, ClassUsage>{};
Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
/// Map of registered usage of static members of live classes.
final Map<Entity, _StaticMemberUsage> _staticMemberUsage =
<Entity, _StaticMemberUsage>{};
final Map<Entity, StaticMemberUsage> _staticMemberUsage =
<Entity, StaticMemberUsage>{};
Map<Entity, _StaticMemberUsage> get staticMemberUsageForTesting =>
Map<Entity, StaticMemberUsage> get staticMemberUsageForTesting =>
_staticMemberUsage;
/// Map of registered usage of instance members of live classes.
final Map<MemberEntity, _MemberUsage> _instanceMemberUsage =
<MemberEntity, _MemberUsage>{};
final Map<MemberEntity, MemberUsage> _instanceMemberUsage =
<MemberEntity, MemberUsage>{};
Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting =>
Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting =>
_instanceMemberUsage;
/// Map containing instance members of live classes that are not yet live
/// themselves.
final Map<String, Set<_MemberUsage>> _instanceMembersByName =
<String, Set<_MemberUsage>>{};
final Map<String, Set<MemberUsage>> _instanceMembersByName =
<String, Set<MemberUsage>>{};
/// Map containing instance methods of live classes that are not yet
/// closurized.
final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
<String, Set<_MemberUsage>>{};
final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
<String, Set<MemberUsage>>{};
final Set<DartType> isChecks = new Set<DartType>();
@ -263,9 +286,9 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
Selector selector = dynamicUse.selector;
String methodName = selector.name;
void _process(Map<String, Set<_MemberUsage>> memberMap,
EnumSet<MemberUse> action(_MemberUsage usage)) {
_processSet(memberMap, methodName, (_MemberUsage usage) {
void _process(Map<String, Set<MemberUsage>> memberMap,
EnumSet<MemberUse> action(MemberUsage usage)) {
_processSet(memberMap, methodName, (MemberUsage usage) {
if (selectorConstraintsStrategy.appliedUnnamed(
dynamicUse, usage.entity, _world)) {
memberUsed(usage.entity, action(usage));
@ -387,13 +410,13 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
Entity element = staticUse.element;
_registerStaticUse(staticUse);
_StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
StaticMemberUsage usage = _staticMemberUsage.putIfAbsent(element, () {
if (element is MemberEntity &&
(element.isStatic || element.isTopLevel) &&
element.isFunction) {
return new _StaticFunctionUsage(element);
return new StaticFunctionUsage(element);
} else {
return new _GeneralStaticMemberUsage(element);
return new GeneralStaticMemberUsage(element);
}
});
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
@ -431,7 +454,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
break;
case StaticUseKind.DIRECT_INVOKE:
MemberEntity member = staticUse.element;
_MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
MemberUsage instanceUsage = _getMemberUsage(member, memberUsed);
memberUsed(instanceUsage.entity, instanceUsage.invoke());
_instanceMembersByName[instanceUsage.entity.name]
?.remove(instanceUsage);
@ -469,7 +492,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
_getMemberUsage(member, memberUsed);
}
_MemberUsage _getMemberUsage(
MemberUsage _getMemberUsage(
covariant MemberEntity member, MemberUsedCallback memberUsed) {
// TODO(johnniwinther): Change [TypeMask] to not apply to a superclass
// member unless the class has been instantiated. Similar to
@ -478,7 +501,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
String memberName = member.name;
ClassEntity cls = member.enclosingClass;
bool isNative = _nativeBasicData.isNativeClass(cls);
_MemberUsage usage = new _MemberUsage(member, isNative: isNative);
MemberUsage usage = new MemberUsage(member, isNative: isNative);
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
useSet.addAll(usage.appliedUse);
if (!usage.hasRead && hasInvokedGetter(member, _world)) {
@ -495,14 +518,14 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
// Store the member in [instanceFunctionsByName] to catch
// getters on the function.
_instanceFunctionsByName
.putIfAbsent(usage.entity.name, () => new Set<_MemberUsage>())
.putIfAbsent(usage.entity.name, () => new Set<MemberUsage>())
.add(usage);
}
if (usage.pendingUse.contains(MemberUse.NORMAL)) {
// The element is not yet used. Add it to the list of instance
// members to still be processed.
_instanceMembersByName
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
.putIfAbsent(memberName, () => new Set<MemberUsage>())
.add(usage);
}
memberUsed(member, useSet);
@ -510,24 +533,24 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
});
}
void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
bool f(_MemberUsage e)) {
Set<_MemberUsage> members = map[memberName];
void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
bool f(MemberUsage e)) {
Set<MemberUsage> members = map[memberName];
if (members == null) return;
// [f] might add elements to [: map[memberName] :] during the loop below
// so we create a new list for [: map[memberName] :] and prepend the
// [remaining] members after the loop.
map[memberName] = new Set<_MemberUsage>();
Set<_MemberUsage> remaining = new Set<_MemberUsage>();
for (_MemberUsage member in members) {
map[memberName] = new Set<MemberUsage>();
Set<MemberUsage> remaining = new Set<MemberUsage>();
for (MemberUsage member in members) {
if (!f(member)) remaining.add(member);
}
map[memberName].addAll(remaining);
}
/// Return the canonical [_ClassUsage] for [cls].
_ClassUsage _getClassUsage(ClassEntity cls) {
return _processedClasses.putIfAbsent(cls, () => new _ClassUsage(cls));
/// Return the canonical [ClassUsage] for [cls].
ClassUsage _getClassUsage(ClassEntity cls) {
return _processedClasses.putIfAbsent(cls, () => new ClassUsage(cls));
}
void _processInstantiatedClass(ClassEntity cls, ClassUsedCallback classUsed) {
@ -535,7 +558,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
// already instantiated and we therefore have to process its superclass as
// well.
bool processClass(ClassEntity superclass) {
_ClassUsage usage = _getClassUsage(superclass);
ClassUsage usage = _getClassUsage(superclass);
if (!usage.isInstantiated) {
classUsed(usage.cls, usage.instantiate());
return true;
@ -596,7 +619,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
Iterable<FunctionEntity> get genericInstanceMethods {
List<FunctionEntity> functions = <FunctionEntity>[];
void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
if (member.isInstanceMember &&
member is FunctionEntity &&
memberUsage.hasUse &&
@ -613,7 +636,7 @@ class CodegenWorldBuilderImpl extends WorldBuilderBase
Iterable<FunctionEntity> get userNoSuchMethods {
List<FunctionEntity> functions = <FunctionEntity>[];
void processMemberUse(MemberEntity member, _MemberUsage memberUsage) {
void processMemberUse(MemberEntity member, MemberUsage memberUsage) {
if (member.isInstanceMember &&
member is FunctionEntity &&
memberUsage.hasUse &&

View file

@ -2,7 +2,10 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of world_builder;
import '../common.dart';
import '../elements/entities.dart';
import '../js_model/elements.dart' show JSignatureMethod;
import '../util/enumset.dart';
abstract class AbstractUsage<T> {
final EnumSet<T> _pendingUse = new EnumSet<T>();
@ -31,27 +34,27 @@ abstract class AbstractUsage<T> {
}
/// Registry for the observed use of a member [entity] in the open world.
abstract class _MemberUsage extends AbstractUsage<MemberUse> {
abstract class MemberUsage extends AbstractUsage<MemberUse> {
final MemberEntity entity;
_MemberUsage.internal(this.entity);
MemberUsage.internal(this.entity);
factory _MemberUsage(MemberEntity member, {bool isNative: false}) {
factory MemberUsage(MemberEntity member, {bool isNative: false}) {
if (member.isField) {
if (member.isAssignable) {
return new _FieldUsage(member, isNative: isNative);
return new FieldUsage(member, isNative: isNative);
} else {
return new _FinalFieldUsage(member, isNative: isNative);
return new FinalFieldUsage(member, isNative: isNative);
}
} else if (member.isGetter) {
return new _GetterUsage(member);
return new GetterUsage(member);
} else if (member.isSetter) {
return new _SetterUsage(member);
return new SetterUsage(member);
} else if (member.isConstructor) {
return new _ConstructorUsage(member);
return new ConstructorUsage(member);
} else {
assert(member.isFunction, failedAt(member, "Unexpected member: $member"));
return new _FunctionUsage(member);
return new FunctionUsage(member);
}
}
@ -106,18 +109,18 @@ abstract class _MemberUsage extends AbstractUsage<MemberUse> {
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! _MemberUsage) return false;
if (other is! MemberUsage) return false;
return entity == other.entity;
}
String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
}
class _FieldUsage extends _MemberUsage {
class FieldUsage extends MemberUsage {
bool hasRead = false;
bool hasWrite = false;
_FieldUsage(FieldEntity field, {bool isNative: false})
FieldUsage(FieldEntity field, {bool isNative: false})
: super.internal(field) {
if (!isNative) {
// All field initializers must be resolved as they could
@ -164,10 +167,10 @@ class _FieldUsage extends _MemberUsage {
}
}
class _FinalFieldUsage extends _MemberUsage {
class FinalFieldUsage extends MemberUsage {
bool hasRead = false;
_FinalFieldUsage(FieldEntity field, {bool isNative: false})
FinalFieldUsage(FieldEntity field, {bool isNative: false})
: super.internal(field) {
if (!isNative) {
// All field initializers must be resolved as they could
@ -199,11 +202,11 @@ class _FinalFieldUsage extends _MemberUsage {
EnumSet<MemberUse> fullyUse() => read();
}
class _FunctionUsage extends _MemberUsage {
class FunctionUsage extends MemberUsage {
bool hasInvoke = false;
bool hasRead = false;
_FunctionUsage(FunctionEntity function) : super.internal(function) {
FunctionUsage(FunctionEntity function) : super.internal(function) {
if (function is JSignatureMethod) {
// We mark signature methods as "always used" to prevent them from being
// optimized away.
@ -253,10 +256,10 @@ class _FunctionUsage extends _MemberUsage {
bool get fullyUsed => hasInvoke && hasRead;
}
class _GetterUsage extends _MemberUsage {
class GetterUsage extends MemberUsage {
bool hasRead = false;
_GetterUsage(FunctionEntity getter) : super.internal(getter);
GetterUsage(FunctionEntity getter) : super.internal(getter);
@override
bool get fullyUsed => hasRead;
@ -277,10 +280,10 @@ class _GetterUsage extends _MemberUsage {
EnumSet<MemberUse> fullyUse() => read();
}
class _SetterUsage extends _MemberUsage {
class SetterUsage extends MemberUsage {
bool hasWrite = false;
_SetterUsage(FunctionEntity setter) : super.internal(setter);
SetterUsage(FunctionEntity setter) : super.internal(setter);
@override
bool get fullyUsed => hasWrite;
@ -298,11 +301,10 @@ class _SetterUsage extends _MemberUsage {
EnumSet<MemberUse> fullyUse() => write();
}
class _ConstructorUsage extends _MemberUsage {
class ConstructorUsage extends MemberUsage {
bool hasInvoke = false;
_ConstructorUsage(ConstructorEntity constructor)
: super.internal(constructor);
ConstructorUsage(ConstructorEntity constructor) : super.internal(constructor);
EnumSet<MemberUse> get _originalUse => MemberUses.NORMAL_ONLY;
@ -345,13 +347,13 @@ typedef void MemberUsedCallback(MemberEntity member, EnumSet<MemberUse> useSet);
/// Registry for the observed use of a class [entity] in the open world.
// TODO(johnniwinther): Merge this with [InstantiationInfo].
class _ClassUsage extends AbstractUsage<ClassUse> {
class ClassUsage extends AbstractUsage<ClassUse> {
bool isInstantiated = false;
bool isImplemented = false;
final ClassEntity cls;
_ClassUsage(this.cls);
ClassUsage(this.cls);
EnumSet<ClassUse> instantiate() {
if (isInstantiated) {
@ -390,15 +392,15 @@ class ClassUses {
typedef void ClassUsedCallback(ClassEntity cls, EnumSet<ClassUse> useSet);
// TODO(johnniwinther): Merge this with [_MemberUsage].
abstract class _StaticMemberUsage extends AbstractUsage<MemberUse>
implements _MemberUsage {
// TODO(johnniwinther): Merge this with [MemberUsage].
abstract class StaticMemberUsage extends AbstractUsage<MemberUse>
implements MemberUsage {
final MemberEntity entity;
bool hasNormalUse = false;
bool get hasClosurization => false;
_StaticMemberUsage.internal(this.entity);
StaticMemberUsage.internal(this.entity);
EnumSet<MemberUse> normalUse() {
if (hasNormalUse) {
@ -426,8 +428,8 @@ abstract class _StaticMemberUsage extends AbstractUsage<MemberUse>
String toString() => '$entity:${appliedUse.iterable(MemberUse.values)}';
}
class _GeneralStaticMemberUsage extends _StaticMemberUsage {
_GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
class GeneralStaticMemberUsage extends StaticMemberUsage {
GeneralStaticMemberUsage(MemberEntity entity) : super.internal(entity);
EnumSet<MemberUse> tearOff() => normalUse();
@ -444,10 +446,10 @@ class _GeneralStaticMemberUsage extends _StaticMemberUsage {
bool get hasRead => hasNormalUse;
}
class _StaticFunctionUsage extends _StaticMemberUsage {
class StaticFunctionUsage extends StaticMemberUsage {
bool hasClosurization = false;
_StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
StaticFunctionUsage(MemberEntity entity) : super.internal(entity);
EnumSet<MemberUse> tearOff() {
if (hasClosurization) {

View file

@ -2,7 +2,35 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of world_builder;
import '../common.dart';
import '../common/names.dart' show Identifiers, Names;
import '../common_elements.dart';
import '../constants/values.dart';
import '../elements/entities.dart';
import '../elements/types.dart';
import '../js_backend/annotations.dart';
import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
import '../js_backend/backend_usage.dart'
show BackendUsage, BackendUsageBuilder;
import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
import '../js_backend/no_such_method_registry.dart';
import '../js_backend/runtime_types.dart';
import '../kernel/element_map_impl.dart';
import '../kernel/kelements.dart';
import '../kernel/kernel_world.dart';
import '../native/enqueue.dart' show NativeResolutionEnqueuer;
import '../options.dart';
import '../universe/class_set.dart';
import '../util/enumset.dart';
import '../util/util.dart';
import '../world.dart' show KClosedWorld, OpenWorld;
import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
import 'member_usage.dart';
import 'selector.dart' show Selector;
import 'use.dart'
show ConstantUse, DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
import 'world_builder.dart';
abstract class ResolutionWorldBuilder implements WorldBuilder, OpenWorld {
/// Calls [f] for all local functions in the program together with the member
@ -296,18 +324,18 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
<String, Map<Selector, SelectorConstraints>>{};
final Map<ClassEntity, _ClassUsage> _processedClasses =
<ClassEntity, _ClassUsage>{};
final Map<ClassEntity, ClassUsage> _processedClasses =
<ClassEntity, ClassUsage>{};
Map<ClassEntity, _ClassUsage> get classUsageForTesting => _processedClasses;
Map<ClassEntity, ClassUsage> get classUsageForTesting => _processedClasses;
/// Map of registered usage of static members of live classes.
final Map<MemberEntity, _MemberUsage> _memberUsage =
<MemberEntity, _MemberUsage>{};
final Map<MemberEntity, MemberUsage> _memberUsage =
<MemberEntity, MemberUsage>{};
Map<MemberEntity, _MemberUsage> get staticMemberUsageForTesting {
Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
_memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
Map<MemberEntity, MemberUsage> get staticMemberUsageForTesting {
Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
_memberUsage.forEach((MemberEntity member, MemberUsage usage) {
if (!member.isInstanceMember) {
map[member] = usage;
}
@ -315,9 +343,9 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
return map;
}
Map<MemberEntity, _MemberUsage> get instanceMemberUsageForTesting {
Map<MemberEntity, _MemberUsage> map = <MemberEntity, _MemberUsage>{};
_memberUsage.forEach((MemberEntity member, _MemberUsage usage) {
Map<MemberEntity, MemberUsage> get instanceMemberUsageForTesting {
Map<MemberEntity, MemberUsage> map = <MemberEntity, MemberUsage>{};
_memberUsage.forEach((MemberEntity member, MemberUsage usage) {
if (member.isInstanceMember) {
map[member] = usage;
}
@ -327,13 +355,13 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
/// Map containing instance members of live classes that are not yet live
/// themselves.
final Map<String, Set<_MemberUsage>> _instanceMembersByName =
<String, Set<_MemberUsage>>{};
final Map<String, Set<MemberUsage>> _instanceMembersByName =
<String, Set<MemberUsage>>{};
/// Map containing instance methods of live classes that are not yet
/// closurized.
final Map<String, Set<_MemberUsage>> _instanceFunctionsByName =
<String, Set<_MemberUsage>>{};
final Map<String, Set<MemberUsage>> _instanceFunctionsByName =
<String, Set<MemberUsage>>{};
/// Fields set.
final Set<FieldEntity> fieldSetters = new Set<FieldEntity>();
@ -589,9 +617,9 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
Selector selector = dynamicUse.selector;
String methodName = selector.name;
void _process(Map<String, Set<_MemberUsage>> memberMap,
EnumSet<MemberUse> action(_MemberUsage usage)) {
_processSet(memberMap, methodName, (_MemberUsage usage) {
void _process(Map<String, Set<MemberUsage>> memberMap,
EnumSet<MemberUse> action(MemberUsage usage)) {
_processSet(memberMap, methodName, (MemberUsage usage) {
if (_selectorConstraintsStrategy.appliedUnnamed(
dynamicUse, usage.entity, this)) {
memberUsed(usage.entity, action(usage));
@ -669,8 +697,8 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
MemberEntity element = staticUse.element;
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
_MemberUsage usage = _memberUsage.putIfAbsent(element, () {
_MemberUsage usage = new _MemberUsage(element);
MemberUsage usage = _memberUsage.putIfAbsent(element, () {
MemberUsage usage = new MemberUsage(element);
useSet.addAll(usage.appliedUse);
return usage;
});
@ -738,14 +766,14 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
}
}
/// Called to create a [_ClassUsage] for [cls].
/// Called to create a [ClassUsage] for [cls].
///
/// Subclasses override this to ensure needed invariants on [cls].
_ClassUsage _createClassUsage(covariant ClassEntity cls) =>
new _ClassUsage(cls);
ClassUsage _createClassUsage(covariant ClassEntity cls) =>
new ClassUsage(cls);
/// Return the canonical [_ClassUsage] for [cls].
_ClassUsage _getClassUsage(ClassEntity cls) {
/// Return the canonical [ClassUsage] for [cls].
ClassUsage _getClassUsage(ClassEntity cls) {
return _processedClasses.putIfAbsent(cls, () {
return _createClassUsage(cls);
});
@ -757,7 +785,7 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
// already instantiated and we therefore have to process its superclass as
// well.
bool processClass(ClassEntity superclass) {
_ClassUsage usage = _getClassUsage(superclass);
ClassUsage usage = _getClassUsage(superclass);
if (!usage.isInstantiated) {
classUsed(usage.cls, usage.instantiate());
return true;
@ -779,19 +807,19 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
});
}
/// Call [updateUsage] on all [_MemberUsage]s in the set in [map] for
/// Call [updateUsage] on all [MemberUsage]s in the set in [map] for
/// [memberName]. If [updateUsage] returns `true` the usage is removed from
/// the set.
void _processSet(Map<String, Set<_MemberUsage>> map, String memberName,
bool updateUsage(_MemberUsage e)) {
Set<_MemberUsage> members = map[memberName];
void _processSet(Map<String, Set<MemberUsage>> map, String memberName,
bool updateUsage(MemberUsage e)) {
Set<MemberUsage> members = map[memberName];
if (members == null) return;
// [f] might add elements to [: map[memberName] :] during the loop below
// so we create a new list for [: map[memberName] :] and prepend the
// [remaining] members after the loop.
map[memberName] = new Set<_MemberUsage>();
Set<_MemberUsage> remaining = new Set<_MemberUsage>();
for (_MemberUsage usage in members) {
map[memberName] = new Set<MemberUsage>();
Set<MemberUsage> remaining = new Set<MemberUsage>();
for (MemberUsage usage in members) {
if (!updateUsage(usage)) remaining.add(usage);
}
map[memberName].addAll(remaining);
@ -809,11 +837,11 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
// Note: this assumes that there are no non-native fields on native
// classes, which may not be the case when a native class is subclassed.
bool newUsage = false;
_MemberUsage usage = _memberUsage.putIfAbsent(member, () {
MemberUsage usage = _memberUsage.putIfAbsent(member, () {
newUsage = true;
bool isNative = _nativeBasicData.isNativeClass(cls);
EnumSet<MemberUse> useSet = new EnumSet<MemberUse>();
_MemberUsage usage = new _MemberUsage(member, isNative: isNative);
MemberUsage usage = new MemberUsage(member, isNative: isNative);
useSet.addAll(usage.appliedUse);
if (member.isField && isNative) {
registerUsedElement(member);
@ -838,14 +866,14 @@ class ResolutionWorldBuilderImpl extends WorldBuilderBase
// The element is not yet used. Add it to the list of instance
// members to still be processed.
_instanceMembersByName
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
.putIfAbsent(memberName, () => new Set<MemberUsage>())
.add(usage);
}
if (usage.pendingUse.contains(MemberUse.CLOSURIZE_INSTANCE)) {
// Store the member in [instanceFunctionsByName] to catch
// getters on the function.
_instanceFunctionsByName
.putIfAbsent(memberName, () => new Set<_MemberUsage>())
.putIfAbsent(memberName, () => new Set<MemberUsage>())
.add(usage);
}
memberUsed(usage.entity, useSet);

View file

@ -4,48 +4,13 @@
library world_builder;
import 'dart:collection';
import '../common.dart';
import '../common/names.dart' show Identifiers, Names;
import '../common_elements.dart';
import '../constants/values.dart';
import '../elements/entities.dart';
import '../elements/types.dart';
import '../js_backend/annotations.dart';
import '../js_backend/allocator_analysis.dart' show KAllocatorAnalysis;
import '../js_backend/backend_usage.dart'
show BackendUsage, BackendUsageBuilder;
import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
import '../js_backend/no_such_method_registry.dart';
import '../js_backend/runtime_types.dart';
import '../js_model/locals.dart';
import '../js_model/element_map_impl.dart';
import '../js_model/elements.dart' show JSignatureMethod;
import '../kernel/element_map_impl.dart';
import '../kernel/kelements.dart';
import '../kernel/kernel_world.dart';
import '../native/enqueue.dart' show NativeResolutionEnqueuer;
import '../options.dart';
import '../universe/class_set.dart';
import '../util/enumset.dart';
import '../util/util.dart';
import '../world.dart' show World, JClosedWorld, KClosedWorld, OpenWorld;
import 'class_hierarchy.dart' show ClassHierarchyBuilder, ClassQueries;
import '../js_backend/native_data.dart' show NativeBasicData;
import '../world.dart' show World, JClosedWorld, OpenWorld;
import 'selector.dart' show Selector;
import 'use.dart'
show
ConstantUse,
ConstantUseKind,
DynamicUse,
DynamicUseKind,
StaticUse,
StaticUseKind;
part 'codegen_world_builder.dart';
part 'member_usage.dart';
part 'resolution_world_builder.dart';
import 'use.dart' show DynamicUse, StaticUse;
/// The combined constraints on receivers all the dynamic call sites of the same
/// selector.

View file

@ -12,7 +12,7 @@ import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/js_model/element_map.dart';
import 'package:compiler/src/js_model/js_world.dart';
import 'package:compiler/src/js_model/locals.dart';
import 'package:compiler/src/universe/world_builder.dart';
import 'package:compiler/src/universe/codegen_world_builder.dart';
import 'package:expect/expect.dart';
import '../equivalence/id_equivalence.dart';
import '../equivalence/id_equivalence_helper.dart';

View file

@ -5,7 +5,7 @@
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/universe/call_structure.dart';
import 'package:compiler/src/universe/world_builder.dart';
import 'package:compiler/src/universe/codegen_world_builder.dart';
import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';

View file

@ -18,8 +18,8 @@ import 'package:compiler/src/js_model/element_map.dart';
import 'package:compiler/src/kernel/element_map.dart';
import 'package:compiler/src/kernel/kernel_strategy.dart';
import 'package:compiler/src/universe/feature.dart';
import 'package:compiler/src/universe/resolution_world_builder.dart';
import 'package:compiler/src/universe/selector.dart';
import 'package:compiler/src/universe/world_builder.dart';
import 'package:kernel/ast.dart' as ir;
import '../equivalence/check_helpers.dart';
import '../equivalence/id_equivalence.dart';