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

Side by Side 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 unified diff | Download patch
OLDNEW
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 library dart2js.js_model.strategy; 5 library dart2js.js_model.strategy;
6 6
7 import '../closure.dart' show ClosureConversionTask; 7 import '../closure.dart' show ClosureConversionTask;
8 import '../common.dart'; 8 import '../common.dart';
9 import '../common/tasks.dart'; 9 import '../common/tasks.dart';
10 import '../common_elements.dart'; 10 import '../common_elements.dart';
11 import '../compiler.dart'; 11 import '../compiler.dart';
12 import '../elements/elements.dart' show TypedefElement; 12 import '../constants/constant_system.dart';
13 import '../elements/elements.dart' show ClassElement, TypedefElement;
13 import '../elements/entities.dart'; 14 import '../elements/entities.dart';
15 import '../elements/types.dart';
14 import '../enqueue.dart'; 16 import '../enqueue.dart';
15 import '../io/source_information.dart'; 17 import '../io/source_information.dart';
16 import '../js_emitter/sorter.dart'; 18 import '../js_emitter/sorter.dart';
17 import '../js/js_source_mapping.dart'; 19 import '../js/js_source_mapping.dart';
18 import '../js_backend/backend.dart'; 20 import '../js_backend/backend.dart';
19 import '../js_backend/backend_usage.dart'; 21 import '../js_backend/backend_usage.dart';
20 import '../js_backend/constant_system_javascript.dart'; 22 import '../js_backend/constant_system_javascript.dart';
21 import '../js_backend/interceptor_data.dart'; 23 import '../js_backend/interceptor_data.dart';
22 import '../js_backend/native_data.dart'; 24 import '../js_backend/native_data.dart';
23 import '../js_backend/runtime_types.dart'; 25 import '../js_backend/runtime_types.dart';
24 import '../kernel/element_map.dart'; 26 import '../kernel/element_map.dart';
25 import '../kernel/element_map_impl.dart'; 27 import '../kernel/element_map_impl.dart';
26 import '../kernel/kernel_backend_strategy.dart'; 28 import '../kernel/kernel_backend_strategy.dart';
27 import '../kernel/kernel_strategy.dart'; 29 import '../kernel/kernel_strategy.dart';
30 import '../native/behavior.dart';
28 import '../ssa/ssa.dart'; 31 import '../ssa/ssa.dart';
29 import '../universe/class_set.dart'; 32 import '../universe/class_set.dart';
30 import '../universe/world_builder.dart'; 33 import '../universe/world_builder.dart';
31 import '../util/emptyset.dart'; 34 import '../util/emptyset.dart';
32 import '../world.dart'; 35 import '../world.dart';
33 import 'closure.dart'; 36 import 'closure.dart';
34 import 'elements.dart'; 37 import 'elements.dart';
35 import 'locals.dart'; 38 import 'locals.dart';
36 39
37 class JsBackendStrategy implements KernelBackendStrategy { 40 class JsBackendStrategy implements KernelBackendStrategy {
38 final Compiler _compiler; 41 final Compiler _compiler;
39 ElementEnvironment _elementEnvironment; 42 ElementEnvironment _elementEnvironment;
40 CommonElements _commonElements; 43 CommonElements _commonElements;
41 JsKernelToElementMap _elementMap; 44 JsKernelToElementMap _elementMap;
42 ClosureConversionTask _closureDataLookup; 45 ClosureConversionTask _closureDataLookup;
43 final GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap(); 46 final GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap();
44 Sorter _sorter; 47 Sorter _sorter;
45 48
46 JsBackendStrategy(this._compiler); 49 JsBackendStrategy(this._compiler);
47 50
48 KernelToElementMapForBuilding get elementMap { 51 KernelToElementMapForBuilding get elementMap {
49 assert(_elementMap != null, 52 assert(_elementMap != null,
50 "JsBackendStrategy.elementMap has not been created yet."); 53 "JsBackendStrategy.elementMap has not been created yet.");
51 return _elementMap; 54 return _elementMap;
52 } 55 }
53 56
54 GlobalLocalsMap get globalLocalsMapForTesting => _globalLocalsMap; 57 GlobalLocalsMap get globalLocalsMapForTesting => _globalLocalsMap;
55 58
59 BackendUsage _convertBackendUsage(
60 JsToFrontendMap map, BackendUsageImpl backendUsage) {
61 Set<FunctionEntity> globalFunctionDependencies =
62 map.toBackendFunctionSet(backendUsage.globalFunctionDependencies);
63 Set<ClassEntity> globalClassDependencies =
64 map.toBackendClassSet(backendUsage.globalClassDependencies);
65 Set<FunctionEntity> helperFunctionsUsed =
66 map.toBackendFunctionSet(backendUsage.helperFunctionsUsed);
67 Set<ClassEntity> helperClassesUsed =
68 map.toBackendClassSet(backendUsage.helperClassesUsed);
69
70 return new BackendUsageImpl(
71 globalFunctionDependencies: globalFunctionDependencies,
72 globalClassDependencies: globalClassDependencies,
73 helperFunctionsUsed: helperFunctionsUsed,
74 helperClassesUsed: helperClassesUsed,
75 needToInitializeIsolateAffinityTag:
76 backendUsage.needToInitializeIsolateAffinityTag,
77 needToInitializeDispatchProperty:
78 backendUsage.needToInitializeDispatchProperty,
79 requiresPreamble: backendUsage.requiresPreamble,
80 isInvokeOnUsed: backendUsage.isInvokeOnUsed,
81 isRuntimeTypeUsed: backendUsage.isRuntimeTypeUsed,
82 isIsolateInUse: backendUsage.isIsolateInUse,
83 isFunctionApplyUsed: backendUsage.isFunctionApplyUsed,
84 isMirrorsUsed: backendUsage.isMirrorsUsed,
85 isNoSuchMethodUsed: backendUsage.isNoSuchMethodUsed);
86 }
87
88 NativeBasicData _convertNativeBasicData(
89 JsToFrontendMap map, NativeBasicDataImpl nativeBasicData) {
90 Map<ClassEntity, NativeClassTag> nativeClassTagInfo =
91 <ClassEntity, NativeClassTag>{};
92 nativeBasicData.nativeClassTagInfo
93 .forEach((ClassEntity cls, NativeClassTag tag) {
94 nativeClassTagInfo[map.toBackendClass(cls)] = tag;
95 });
96 Set<LibraryEntity> jsInteropLibraries =
97 map.toBackendLibrarySet(nativeBasicData.jsInteropLibraries);
98 Set<ClassEntity> jsInteropClasses =
99 map.toBackendClassSet(nativeBasicData.jsInteropClasses);
100 return new NativeBasicDataImpl(_elementEnvironment, nativeClassTagInfo,
101 jsInteropLibraries, jsInteropClasses);
102 }
103
104 NativeData _convertNativeData(
105 JsToFrontendMap map, NativeDataImpl nativeData) {
106 convertNativeBehaviorType(type) {
107 if (type is DartType) return map.toBackendType(type);
108 assert(type is SpecialType);
109 return type;
110 }
111
112 NativeBehavior convertNativeBehavior(NativeBehavior behavior) {
113 NativeBehavior newBehavior = new NativeBehavior();
114
115 for (dynamic type in behavior.typesReturned) {
116 newBehavior.typesReturned.add(convertNativeBehaviorType(type));
117 }
118 for (dynamic type in behavior.typesInstantiated) {
119 newBehavior.typesInstantiated.add(convertNativeBehaviorType(type));
120 }
121
122 newBehavior.codeTemplateText = behavior.codeTemplateText;
123 newBehavior.codeTemplate = behavior.codeTemplate;
124 newBehavior.throwBehavior = behavior.throwBehavior;
125 newBehavior.isAllocation = behavior.isAllocation;
126 newBehavior.useGvn = behavior.useGvn;
127 return newBehavior;
128 }
129
130 NativeBasicData nativeBasicData = _convertNativeBasicData(map, nativeData);
131
132 Map<MemberEntity, String> nativeMemberName =
133 map.toBackendMemberMap(nativeData.nativeMemberName, identity);
134 Map<FunctionEntity, NativeBehavior> nativeMethodBehavior =
135 <FunctionEntity, NativeBehavior>{};
136 nativeData.nativeMethodBehavior
137 .forEach((FunctionEntity method, NativeBehavior behavior) {
138 nativeMethodBehavior[map.toBackendMember(method)] =
139 convertNativeBehavior(behavior);
140 });
141 Map<MemberEntity, NativeBehavior> nativeFieldLoadBehavior =
142 map.toBackendMemberMap(
143 nativeData.nativeFieldLoadBehavior, convertNativeBehavior);
144 Map<MemberEntity, NativeBehavior> nativeFieldStoreBehavior =
145 map.toBackendMemberMap(
146 nativeData.nativeFieldStoreBehavior, convertNativeBehavior);
147 Map<LibraryEntity, String> jsInteropLibraryNames =
148 map.toBackendLibraryMap(nativeData.jsInteropLibraryNames, identity);
149 Set<ClassEntity> anonymousJsInteropClasses =
150 map.toBackendClassSet(nativeData.anonymousJsInteropClasses);
151 Map<ClassEntity, String> jsInteropClassNames =
152 map.toBackendClassMap(nativeData.jsInteropClassNames, identity);
153 Map<MemberEntity, String> jsInteropMemberNames =
154 map.toBackendMemberMap(nativeData.jsInteropMemberNames, identity);
155
156 return new NativeDataImpl(
157 nativeBasicData,
158 nativeMemberName,
159 nativeMethodBehavior,
160 nativeFieldLoadBehavior,
161 nativeFieldStoreBehavior,
162 jsInteropLibraryNames,
163 anonymousJsInteropClasses,
164 jsInteropClassNames,
165 jsInteropMemberNames);
166 }
167
168 InterceptorData _convertInterceptorData(JsToFrontendMap map,
169 NativeData nativeData, InterceptorDataImpl interceptorData) {
170 Map<String, Set<MemberEntity>> interceptedMembers =
171 <String, Set<MemberEntity>>{};
172 interceptorData.interceptedMembers
173 .forEach((String name, Set<MemberEntity> members) {
174 interceptedMembers[name] = map.toBackendMemberSet(members);
175 });
176 return new InterceptorDataImpl(
177 nativeData,
178 _commonElements,
179 interceptedMembers,
180 map.toBackendClassSet(interceptorData.interceptedClasses),
181 map.toBackendClassSet(
182 interceptorData.classesMixedIntoInterceptedClasses));
183 }
184
185 RuntimeTypesNeed _convertRuntimeTypesNeed(JsToFrontendMap map,
186 BackendUsage backendUsage, RuntimeTypesNeedImpl rtiNeed) {
187 Set<ClassEntity> classesNeedingRti =
188 map.toBackendClassSet(rtiNeed.classesNeedingRti);
189 Set<FunctionEntity> methodsNeedingRti =
190 map.toBackendFunctionSet(rtiNeed.methodsNeedingRti);
191 // TODO(johnniwinther): Do we need these?
192 Set<Local> localFunctionsNeedingRti = rtiNeed.localFunctionsNeedingRti;
193 Set<ClassEntity> classesUsingTypeVariableExpression =
194 map.toBackendClassSet(rtiNeed.classesUsingTypeVariableExpression);
195 return new RuntimeTypesNeedImpl(
196 _elementEnvironment,
197 backendUsage,
198 classesNeedingRti,
199 methodsNeedingRti,
200 localFunctionsNeedingRti,
201 classesUsingTypeVariableExpression);
202 }
203
56 @override 204 @override
57 ClosedWorldRefiner createClosedWorldRefiner( 205 ClosedWorldRefiner createClosedWorldRefiner(
58 covariant ClosedWorldBase closedWorld) { 206 covariant ClosedWorldBase closedWorld) {
59 KernelFrontEndStrategy strategy = _compiler.frontendStrategy; 207 KernelFrontEndStrategy strategy = _compiler.frontendStrategy;
60 KernelToElementMapForImpact elementMap = strategy.elementMap;
61 _elementMap = new JsKernelToElementMap( 208 _elementMap = new JsKernelToElementMap(
62 _compiler.reporter, _compiler.environment, elementMap); 209 _compiler.reporter, _compiler.environment, strategy.elementMap);
63 _elementEnvironment = _elementMap.elementEnvironment; 210 _elementEnvironment = _elementMap.elementEnvironment;
64 _commonElements = _elementMap.commonElements; 211 _commonElements = _elementMap.commonElements;
65 JsToFrontendMap _map = _elementMap.jsToFrontendMap; 212 JsToFrontendMap map = new JsToFrontendMapImpl(_elementMap);
213 _closureDataLookup = new KernelClosureConversionTask(
214 _compiler.measurer, _elementMap, map, _globalLocalsMap);
215
66 BackendUsage backendUsage = 216 BackendUsage backendUsage =
67 new JsBackendUsage(_map, closedWorld.backendUsage); 217 _convertBackendUsage(map, closedWorld.backendUsage);
68 _closureDataLookup = new KernelClosureConversionTask( 218 NativeData nativeData = _convertNativeData(map, closedWorld.nativeData);
69 _compiler.measurer, _elementMap, _map, _globalLocalsMap); 219 InterceptorData interceptorData =
70 NativeData nativeData = new JsNativeData(_map, closedWorld.nativeData); 220 _convertInterceptorData(map, nativeData, closedWorld.interceptorData);
71 InterceptorDataImpl interceptorDataImpl = closedWorld.interceptorData;
72 Map<String, Set<MemberEntity>> interceptedMembers =
73 <String, Set<MemberEntity>>{};
74 interceptorDataImpl.interceptedMembers
75 .forEach((String name, Set<MemberEntity> members) {
76 interceptedMembers[name] = members.map(_map.toBackendMember).toSet();
77 });
78 InterceptorData interceptorData = new InterceptorDataImpl(
79 nativeData,
80 _commonElements,
81 interceptedMembers,
82 interceptorDataImpl.interceptedClasses.map(_map.toBackendClass).toSet(),
83 interceptorDataImpl.classesMixedIntoInterceptedClasses
84 .map(_map.toBackendClass)
85 .toSet());
86 221
87 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes = 222 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes =
88 <ClassEntity, ClassHierarchyNode>{}; 223 <ClassEntity, ClassHierarchyNode>{};
89 Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{}; 224 Map<ClassEntity, ClassSet> classSets = <ClassEntity, ClassSet>{};
90 Set<ClassEntity> implementedClasses = new Set<ClassEntity>(); 225 Set<ClassEntity> implementedClasses = new Set<ClassEntity>();
91 226
92 ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) { 227 ClassHierarchyNode convertClassHierarchyNode(ClassHierarchyNode node) {
93 ClassEntity cls = _map.toBackendClass(node.cls); 228 ClassEntity cls = map.toBackendClass(node.cls);
94 if (closedWorld.isImplemented(node.cls)) { 229 if (closedWorld.isImplemented(node.cls)) {
95 implementedClasses.add(cls); 230 implementedClasses.add(cls);
96 } 231 }
97 ClassHierarchyNode newNode = classHierarchyNodes.putIfAbsent(cls, () { 232 ClassHierarchyNode newNode = classHierarchyNodes.putIfAbsent(cls, () {
98 ClassHierarchyNode parentNode; 233 ClassHierarchyNode parentNode;
99 if (node.parentNode != null) { 234 if (node.parentNode != null) {
100 parentNode = convertClassHierarchyNode(node.parentNode); 235 parentNode = convertClassHierarchyNode(node.parentNode);
101 } 236 }
102 return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth); 237 return new ClassHierarchyNode(parentNode, cls, node.hierarchyDepth);
103 }); 238 });
104 newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated; 239 newNode.isAbstractlyInstantiated = node.isAbstractlyInstantiated;
105 newNode.isDirectlyInstantiated = node.isDirectlyInstantiated; 240 newNode.isDirectlyInstantiated = node.isDirectlyInstantiated;
106 return newNode; 241 return newNode;
107 } 242 }
108 243
109 ClassSet convertClassSet(ClassSet classSet) { 244 ClassSet convertClassSet(ClassSet classSet) {
110 ClassEntity cls = _map.toBackendClass(classSet.cls); 245 ClassEntity cls = map.toBackendClass(classSet.cls);
111 return classSets.putIfAbsent(cls, () { 246 return classSets.putIfAbsent(cls, () {
112 ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node); 247 ClassHierarchyNode newNode = convertClassHierarchyNode(classSet.node);
113 ClassSet newClassSet = new ClassSet(newNode); 248 ClassSet newClassSet = new ClassSet(newNode);
114 for (ClassHierarchyNode subtype in classSet.subtypeNodes) { 249 for (ClassHierarchyNode subtype in classSet.subtypeNodes) {
115 ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype); 250 ClassHierarchyNode newSubtype = convertClassHierarchyNode(subtype);
116 newClassSet.addSubtype(newSubtype); 251 newClassSet.addSubtype(newSubtype);
117 } 252 }
118 return newClassSet; 253 return newClassSet;
119 }); 254 });
120 } 255 }
121 256
122 closedWorld 257 closedWorld
123 .getClassHierarchyNode(closedWorld.commonElements.objectClass) 258 .getClassHierarchyNode(closedWorld.commonElements.objectClass)
124 .forEachSubclass((ClassEntity cls) { 259 .forEachSubclass((ClassEntity cls) {
125 convertClassSet(closedWorld.getClassSet(cls)); 260 convertClassSet(closedWorld.getClassSet(cls));
126 }, ClassHierarchyNode.ALL); 261 }, ClassHierarchyNode.ALL);
127 262
128 List<MemberEntity> liveInstanceMembers = 263 Set<MemberEntity> liveInstanceMembers =
129 closedWorld.liveInstanceMembers.map(_map.toBackendMember).toList(); 264 map.toBackendMemberSet(closedWorld.liveInstanceMembers);
130 265
131 Map<ClassEntity, Set<ClassEntity>> mixinUses = 266 Map<ClassEntity, Set<ClassEntity>> mixinUses =
132 <ClassEntity, Set<ClassEntity>>{}; 267 map.toBackendClassMap(closedWorld.mixinUses, map.toBackendClassSet);
133 closedWorld.mixinUses.forEach((ClassEntity cls, Set<ClassEntity> uses) {
134 mixinUses[_map.toBackendClass(cls)] =
135 uses.map(_map.toBackendClass).toSet();
136 });
137 268
138 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses = 269 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses =
139 <ClassEntity, Set<ClassEntity>>{}; 270 map.toBackendClassMap(
140 closedWorld.typesImplementedBySubclasses 271 closedWorld.typesImplementedBySubclasses, map.toBackendClassSet);
141 .forEach((ClassEntity cls, Set<ClassEntity> uses) {
142 typesImplementedBySubclasses[_map.toBackendClass(cls)] =
143 uses.map(_map.toBackendClass).toSet();
144 });
145 272
146 Iterable<MemberEntity> assignedInstanceMembers = 273 Iterable<MemberEntity> assignedInstanceMembers =
147 closedWorld.assignedInstanceMembers.map(_map.toBackendMember).toList(); 274 map.toBackendMemberSet(closedWorld.assignedInstanceMembers);
148 275
149 Iterable<ClassEntity> liveNativeClasses = 276 Iterable<ClassEntity> liveNativeClasses =
150 closedWorld.liveNativeClasses.map(_map.toBackendClass).toList(); 277 map.toBackendClassSet(closedWorld.liveNativeClasses);
151 278
152 RuntimeTypesNeed rtiNeed = 279 RuntimeTypesNeed rtiNeed =
153 new JsRuntimeTypesNeed(_map, closedWorld.rtiNeed); 280 _convertRuntimeTypesNeed(map, backendUsage, closedWorld.rtiNeed);
154 281
155 return new JsClosedWorld(_elementMap, 282 return new JsClosedWorld(_elementMap,
156 elementEnvironment: _elementEnvironment, 283 elementEnvironment: _elementEnvironment,
157 dartTypes: _elementMap.types, 284 dartTypes: _elementMap.types,
158 commonElements: _commonElements, 285 commonElements: _commonElements,
159 constantSystem: const JavaScriptConstantSystem(), 286 constantSystem: const JavaScriptConstantSystem(),
160 backendUsage: backendUsage, 287 backendUsage: backendUsage,
161 nativeData: nativeData, 288 nativeData: nativeData,
162 interceptorData: interceptorData, 289 interceptorData: interceptorData,
163 rtiNeed: rtiNeed, 290 rtiNeed: rtiNeed,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 closedWorld, 336 closedWorld,
210 selectorConstraintsStrategy); 337 selectorConstraintsStrategy);
211 } 338 }
212 339
213 @override 340 @override
214 SourceSpan spanFromSpannable(Spannable spannable, Entity currentElement) { 341 SourceSpan spanFromSpannable(Spannable spannable, Entity currentElement) {
215 return _elementMap.getSourceSpan(spannable, currentElement); 342 return _elementMap.getSourceSpan(spannable, currentElement);
216 } 343 }
217 } 344 }
218 345
219 class JsRuntimeTypesNeed implements RuntimeTypesNeed { 346 class JsClosedWorld extends ClosedWorldBase with KernelClosedWorldMixin {
220 final JsToFrontendMap _map; 347 final JsKernelToElementMap elementMap;
221 final RuntimeTypesNeed _rtiNeed; 348 final RuntimeTypesNeed rtiNeed;
222 349
223 JsRuntimeTypesNeed(this._map, this._rtiNeed); 350 JsClosedWorld(this.elementMap,
351 {ElementEnvironment elementEnvironment,
352 DartTypes dartTypes,
353 CommonElements commonElements,
354 ConstantSystem constantSystem,
355 NativeData nativeData,
356 InterceptorData interceptorData,
357 BackendUsage backendUsage,
358 this.rtiNeed,
359 Set<ClassEntity> implementedClasses,
360 Iterable<ClassEntity> liveNativeClasses,
361 Iterable<MemberEntity> liveInstanceMembers,
362 Iterable<MemberEntity> assignedInstanceMembers,
363 Set<TypedefElement> allTypedefs,
364 Map<ClassEntity, Set<ClassEntity>> mixinUses,
365 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses,
366 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes,
367 Map<ClassEntity, ClassSet> classSets})
368 : super(
369 elementEnvironment,
370 dartTypes,
371 commonElements,
372 constantSystem,
373 nativeData,
374 interceptorData,
375 backendUsage,
376 implementedClasses,
377 liveNativeClasses,
378 liveInstanceMembers,
379 assignedInstanceMembers,
380 allTypedefs,
381 mixinUses,
382 typesImplementedBySubclasses,
383 classHierarchyNodes,
384 classSets);
224 385
225 @override 386 @override
226 bool classNeedsRti(ClassEntity cls) { 387 void registerClosureClass(ClassElement cls) {
227 return _rtiNeed.classNeedsRti(_map.toFrontendClass(cls)); 388 throw new UnimplementedError('JsClosedWorld.registerClosureClass');
228 }
229
230 @override
231 bool classUsesTypeVariableExpression(ClassEntity cls) {
232 return _rtiNeed.classUsesTypeVariableExpression(_map.toFrontendClass(cls));
233 }
234
235 @override
236 bool localFunctionNeedsRti(Local function) {
237 throw new UnimplementedError('JsRuntimeTypesNeed.localFunctionNeedsRti');
238 }
239
240 @override
241 bool methodNeedsRti(FunctionEntity function) {
242 return _rtiNeed.methodNeedsRti(_map.toFrontendMember(function));
243 }
244
245 @override
246 bool classNeedsRtiField(ClassEntity cls) {
247 return _rtiNeed.classNeedsRtiField(_map.toFrontendClass(cls));
248 } 389 }
249 } 390 }
OLDNEW
« 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