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

Unified Diff: pkg/compiler/lib/src/js_model/js_strategy.dart

Issue 2978613002: Convert data objects eagerly from K to J (Closed)
Patch Set: Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/js_model/elements.dart ('k') | pkg/compiler/lib/src/kernel/element_map_impl.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/js_model/js_strategy.dart
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index a1aaef41b053c77dc5169f5c6737880660d1fe38..94215a63b5411dff60d47ba7fad2c12a71baa0f1 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -9,8 +9,10 @@ import '../common.dart';
import '../common/tasks.dart';
import '../common_elements.dart';
import '../compiler.dart';
-import '../elements/elements.dart' show TypedefElement;
+import '../constants/constant_system.dart';
+import '../elements/elements.dart' show ClassElement, TypedefElement;
import '../elements/entities.dart';
+import '../elements/types.dart';
import '../enqueue.dart';
import '../io/source_information.dart';
import '../js_emitter/sorter.dart';
@@ -25,6 +27,7 @@ import '../kernel/element_map.dart';
import '../kernel/element_map_impl.dart';
import '../kernel/kernel_backend_strategy.dart';
import '../kernel/kernel_strategy.dart';
+import '../native/behavior.dart';
import '../ssa/ssa.dart';
import '../universe/class_set.dart';
import '../universe/world_builder.dart';
@@ -53,36 +56,168 @@ class JsBackendStrategy implements KernelBackendStrategy {
GlobalLocalsMap get globalLocalsMapForTesting => _globalLocalsMap;
+ BackendUsage _convertBackendUsage(
+ JsToFrontendMap map, BackendUsageImpl backendUsage) {
+ Set<FunctionEntity> globalFunctionDependencies =
+ map.toBackendFunctionSet(backendUsage.globalFunctionDependencies);
+ Set<ClassEntity> globalClassDependencies =
+ map.toBackendClassSet(backendUsage.globalClassDependencies);
+ Set<FunctionEntity> helperFunctionsUsed =
+ map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
+ Set<ClassEntity> helperClassesUsed =
+ map.toBackendClassSet(backendUsage.helperClassesUsed);
+
+ return new BackendUsageImpl(
+ globalFunctionDependencies: globalFunctionDependencies,
+ globalClassDependencies: globalClassDependencies,
+ helperFunctionsUsed: helperFunctionsUsed,
+ helperClassesUsed: helperClassesUsed,
+ needToInitializeIsolateAffinityTag:
+ backendUsage.needToInitializeIsolateAffinityTag,
+ needToInitializeDispatchProperty:
+ backendUsage.needToInitializeDispatchProperty,
+ requiresPreamble: backendUsage.requiresPreamble,
+ isInvokeOnUsed: backendUsage.isInvokeOnUsed,
+ isRuntimeTypeUsed: backendUsage.isRuntimeTypeUsed,
+ isIsolateInUse: backendUsage.isIsolateInUse,
+ isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
+ isMirrorsUsed: backendUsage.isMirrorsUsed,
+ isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
+ }
+
+ NativeBasicData _convertNativeBasicData(
+ JsToFrontendMap map, NativeBasicDataImpl nativeBasicData) {
+ Map<ClassEntity, NativeClassTag> nativeClassTagInfo =
+ <ClassEntity, NativeClassTag>{};
+ nativeBasicData.nativeClassTagInfo
+ .forEach((ClassEntity cls, NativeClassTag tag) {
+ nativeClassTagInfo[map.toBackendClass(cls)] = tag;
+ });
+ Set<LibraryEntity> jsInteropLibraries =
+ map.toBackendLibrarySet(nativeBasicData.jsInteropLibraries);
+ Set<ClassEntity> jsInteropClasses =
+ map.toBackendClassSet(nativeBasicData.jsInteropClasses);
+ return new NativeBasicDataImpl(_elementEnvironment, nativeClassTagInfo,
+ jsInteropLibraries, jsInteropClasses);
+ }
+
+ NativeData _convertNativeData(
+ JsToFrontendMap map, NativeDataImpl nativeData) {
+ convertNativeBehaviorType(type) {
+ if (type is DartType) return map.toBackendType(type);
+ assert(type is SpecialType);
+ return type;
+ }
+
+ NativeBehavior convertNativeBehavior(NativeBehavior behavior) {
+ NativeBehavior newBehavior = new NativeBehavior();
+
+ for (dynamic type in behavior.typesReturned) {
+ newBehavior.typesReturned.add(convertNativeBehaviorType(type));
+ }
+ for (dynamic type in behavior.typesInstantiated) {
+ newBehavior.typesInstantiated.add(convertNativeBehaviorType(type));
+ }
+
+ newBehavior.codeTemplateText = behavior.codeTemplateText;
+ newBehavior.codeTemplate = behavior.codeTemplate;
+ newBehavior.throwBehavior = behavior.throwBehavior;
+ newBehavior.isAllocation = behavior.isAllocation;
+ newBehavior.useGvn = behavior.useGvn;
+ return newBehavior;
+ }
+
+ NativeBasicData nativeBasicData = _convertNativeBasicData(map, nativeData);
+
+ Map<MemberEntity, String> nativeMemberName =
+ map.toBackendMemberMap(nativeData.nativeMemberName, identity);
+ Map<FunctionEntity, NativeBehavior> nativeMethodBehavior =
+ <FunctionEntity, NativeBehavior>{};
+ nativeData.nativeMethodBehavior
+ .forEach((FunctionEntity method, NativeBehavior behavior) {
+ nativeMethodBehavior[map.toBackendMember(method)] =
+ convertNativeBehavior(behavior);
+ });
+ Map<MemberEntity, NativeBehavior> nativeFieldLoadBehavior =
+ map.toBackendMemberMap(
+ nativeData.nativeFieldLoadBehavior, convertNativeBehavior);
+ Map<MemberEntity, NativeBehavior> nativeFieldStoreBehavior =
+ map.toBackendMemberMap(
+ nativeData.nativeFieldStoreBehavior, convertNativeBehavior);
+ Map<LibraryEntity, String> jsInteropLibraryNames =
+ map.toBackendLibraryMap(nativeData.jsInteropLibraryNames, identity);
+ Set<ClassEntity> anonymousJsInteropClasses =
+ map.toBackendClassSet(nativeData.anonymousJsInteropClasses);
+ Map<ClassEntity, String> jsInteropClassNames =
+ map.toBackendClassMap(nativeData.jsInteropClassNames, identity);
+ Map<MemberEntity, String> jsInteropMemberNames =
+ map.toBackendMemberMap(nativeData.jsInteropMemberNames, identity);
+
+ return new NativeDataImpl(
+ nativeBasicData,
+ nativeMemberName,
+ nativeMethodBehavior,
+ nativeFieldLoadBehavior,
+ nativeFieldStoreBehavior,
+ jsInteropLibraryNames,
+ anonymousJsInteropClasses,
+ jsInteropClassNames,
+ jsInteropMemberNames);
+ }
+
+ InterceptorData _convertInterceptorData(JsToFrontendMap map,
+ NativeData nativeData, InterceptorDataImpl interceptorData) {
+ Map<String, Set<MemberEntity>> interceptedMembers =
+ <String, Set<MemberEntity>>{};
+ interceptorData.interceptedMembers
+ .forEach((String name, Set<MemberEntity> members) {
+ interceptedMembers[name] = map.toBackendMemberSet(members);
+ });
+ return new InterceptorDataImpl(
+ nativeData,
+ _commonElements,
+ interceptedMembers,
+ map.toBackendClassSet(interceptorData.interceptedClasses),
+ map.toBackendClassSet(
+ interceptorData.classesMixedIntoInterceptedClasses));
+ }
+
+ RuntimeTypesNeed _convertRuntimeTypesNeed(JsToFrontendMap map,
+ BackendUsage backendUsage, RuntimeTypesNeedImpl rtiNeed) {
+ Set<ClassEntity> classesNeedingRti =
+ map.toBackendClassSet(rtiNeed.classesNeedingRti);
+ Set<FunctionEntity> methodsNeedingRti =
+ map.toBackendFunctionSet(rtiNeed.methodsNeedingRti);
+ // TODO(johnniwinther): Do we need these?
+ Set<Local> localFunctionsNeedingRti = rtiNeed.localFunctionsNeedingRti;
+ Set<ClassEntity> classesUsingTypeVariableExpression =
+ map.toBackendClassSet(rtiNeed.classesUsingTypeVariableExpression);
+ return new RuntimeTypesNeedImpl(
+ _elementEnvironment,
+ backendUsage,
+ classesNeedingRti,
+ methodsNeedingRti,
+ localFunctionsNeedingRti,
+ classesUsingTypeVariableExpression);
+ }
+
@override
ClosedWorldRefiner createClosedWorldRefiner(
covariant ClosedWorldBase closedWorld) {
KernelFrontEndStrategy strategy = _compiler.frontendStrategy;
- KernelToElementMapForImpact elementMap = strategy.elementMap;
_elementMap = new JsKernelToElementMap(
- _compiler.reporter, _compiler.environment, elementMap);
+ _compiler.reporter, _compiler.environment, strategy.elementMap);
_elementEnvironment = _elementMap.elementEnvironment;
_commonElements = _elementMap.commonElements;
- JsToFrontendMap _map = _elementMap.jsToFrontendMap;
- BackendUsage backendUsage =
- new JsBackendUsage(_map, closedWorld.backendUsage);
+ JsToFrontendMap map = new JsToFrontendMapImpl(_elementMap);
_closureDataLookup = new KernelClosureConversionTask(
- _compiler.measurer, _elementMap, _map, _globalLocalsMap);
- NativeData nativeData = new JsNativeData(_map, closedWorld.nativeData);
- InterceptorDataImpl interceptorDataImpl = closedWorld.interceptorData;
- Map<String, Set<MemberEntity>> interceptedMembers =
- <String, Set<MemberEntity>>{};
- interceptorDataImpl.interceptedMembers
- .forEach((String name, Set<MemberEntity> members) {
- interceptedMembers[name] = members.map(_map.toBackendMember).toSet();
- });
- InterceptorData interceptorData = new InterceptorDataImpl(
- nativeData,
- _commonElements,
- interceptedMembers,
- interceptorDataImpl.interceptedClasses.map(_map.toBackendClass).toSet(),
- interceptorDataImpl.classesMixedIntoInterceptedClasses
- .map(_map.toBackendClass)
- .toSet());
+ _compiler.measurer, _elementMap, map, _globalLocalsMap);
+
+ BackendUsage backendUsage =
+ _convertBackendUsage(map, closedWorld.backendUsage);
+ NativeData nativeData = _convertNativeData(map, closedWorld.nativeData);
+ InterceptorData interceptorData =
+ _convertInterceptorData(map, nativeData, closedWorld.interceptorData);
Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
<ClassEntity, ClassHierarchyNode>{};
@@ -90,7 +225,7 @@ class JsBackendStrategy implements KernelBackendStrategy {
Set<ClassEntity> implementedClasses = new Set<ClassEntity>();
ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) {
- ClassEntity cls = _map.toBackendClass(node.cls);
+ ClassEntity cls = map.toBackendClass(node.cls);
if (closedWorld.isImplemented(node.cls)) {
implementedClasses.add(cls);
}
@@ -107,7 +242,7 @@ class JsBackendStrategy implements KernelBackendStrategy {
}
ClassSet convertClassSet(ClassSet classSet) {
- ClassEntity cls = _map.toBackendClass(classSet.cls);
+ ClassEntity cls = map.toBackendClass(classSet.cls);
return classSets.putIfAbsent(cls, () {
ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node);
ClassSet newClassSet = new ClassSet(newNode);
@@ -125,32 +260,24 @@ class JsBackendStrategy implements KernelBackendStrategy {
convertClassSet(closedWorld.getClassSet(cls));
}, ClassHierarchyNode.ALL);
- List<MemberEntity> liveInstanceMembers =
- closedWorld.liveInstanceMembers.map(_map.toBackendMember).toList();
+ Set<MemberEntity> liveInstanceMembers =
+ map.toBackendMemberSet(closedWorld.liveInstanceMembers);
Map<ClassEntity, Set<ClassEntity>> mixinUses =
- <ClassEntity, Set<ClassEntity>>{};
- closedWorld.mixinUses.forEach((ClassEntity cls, Set<ClassEntity> uses) {
- mixinUses[_map.toBackendClass(cls)] =
- uses.map(_map.toBackendClass).toSet();
- });
+ map.toBackendClassMap(closedWorld.mixinUses, map.toBackendClassSet);
Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
- <ClassEntity, Set<ClassEntity>>{};
- closedWorld.typesImplementedBySubclasses
- .forEach((ClassEntity cls, Set<ClassEntity> uses) {
- typesImplementedBySubclasses[_map.toBackendClass(cls)] =
- uses.map(_map.toBackendClass).toSet();
- });
+ map.toBackendClassMap(
+ closedWorld.typesImplementedBySubclasses, map.toBackendClassSet);
Iterable<MemberEntity> assignedInstanceMembers =
- closedWorld.assignedInstanceMembers.map(_map.toBackendMember).toList();
+ map.toBackendMemberSet(closedWorld.assignedInstanceMembers);
Iterable<ClassEntity> liveNativeClasses =
- closedWorld.liveNativeClasses.map(_map.toBackendClass).toList();
+ map.toBackendClassSet(closedWorld.liveNativeClasses);
RuntimeTypesNeed rtiNeed =
- new JsRuntimeTypesNeed(_map, closedWorld.rtiNeed);
+ _convertRuntimeTypesNeed(map, backendUsage, closedWorld.rtiNeed);
return new JsClosedWorld(_elementMap,
elementEnvironment: _elementEnvironment,
@@ -216,34 +343,48 @@ class JsBackendStrategy implements KernelBackendStrategy {
}
}
-class JsRuntimeTypesNeed implements RuntimeTypesNeed {
- final JsToFrontendMap _map;
- final RuntimeTypesNeed _rtiNeed;
-
- JsRuntimeTypesNeed(this._map, this._rtiNeed);
-
- @override
- bool classNeedsRti(ClassEntity cls) {
- return _rtiNeed.classNeedsRti(_map.toFrontendClass(cls));
- }
-
- @override
- bool classUsesTypeVariableExpression(ClassEntity cls) {
- return _rtiNeed.classUsesTypeVariableExpression(_map.toFrontendClass(cls));
- }
-
- @override
- bool localFunctionNeedsRti(Local function) {
- throw new UnimplementedError('JsRuntimeTypesNeed.localFunctionNeedsRti');
- }
-
- @override
- bool methodNeedsRti(FunctionEntity function) {
- return _rtiNeed.methodNeedsRti(_map.toFrontendMember(function));
- }
+class JsClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin {
+ final JsKernelToElementMap elementMap;
+ final RuntimeTypesNeed rtiNeed;
+
+ JsClosedWorld(this.elementMap,
+ {ElementEnvironment elementEnvironment,
+ DartTypes dartTypes,
+ CommonElements commonElements,
+ ConstantSystem constantSystem,
+ NativeData nativeData,
+ InterceptorData interceptorData,
+ BackendUsage backendUsage,
+ this.rtiNeed,
+ Set<ClassEntity> implementedClasses,
+ Iterable<ClassEntity> liveNativeClasses,
+ Iterable<MemberEntity> liveInstanceMembers,
+ Iterable<MemberEntity> assignedInstanceMembers,
+ Set<TypedefElement> allTypedefs,
+ Map<ClassEntity, Set<ClassEntity>> mixinUses,
+ Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses,
+ Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
+ Map<ClassEntity, ClassSet> classSets})
+ : super(
+ elementEnvironment,
+ dartTypes,
+ commonElements,
+ constantSystem,
+ nativeData,
+ interceptorData,
+ backendUsage,
+ implementedClasses,
+ liveNativeClasses,
+ liveInstanceMembers,
+ assignedInstanceMembers,
+ allTypedefs,
+ mixinUses,
+ typesImplementedBySubclasses,
+ classHierarchyNodes,
+ classSets);
@override
- bool classNeedsRtiField(ClassEntity cls) {
- return _rtiNeed.classNeedsRtiField(_map.toFrontendClass(cls));
+ void registerClosureClass(ClassElement cls) {
+ throw new UnimplementedError('JsClosedWorld.registerClosureClass');
}
}
« no previous file with comments | « pkg/compiler/lib/src/js_model/elements.dart ('k') | pkg/compiler/lib/src/kernel/element_map_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698