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

Side by Side Diff: pkg/compiler/lib/src/world.dart

Issue 2981673002: Register created closure class with the world. (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
« no previous file with comments | « pkg/compiler/lib/src/kernel/env.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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.world; 5 library dart2js.world;
6 6
7 import 'closure.dart' show ClosureClassElement;
8 import 'common.dart'; 7 import 'common.dart';
9 import 'constants/constant_system.dart'; 8 import 'constants/constant_system.dart';
10 import 'common_elements.dart' show CommonElements, ElementEnvironment; 9 import 'common_elements.dart' show CommonElements, ElementEnvironment;
11 import 'elements/entities.dart'; 10 import 'elements/entities.dart';
12 import 'elements/elements.dart' 11 import 'elements/elements.dart'
13 show 12 show
14 ClassElement, 13 ClassElement,
15 Element, 14 Element,
16 MemberElement, 15 MemberElement,
17 MethodElement, 16 MethodElement,
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element); 368 bool getCurrentlyKnownMightBePassedToApply(FunctionEntity element);
370 369
371 /// Registers that [element] is called in a loop. 370 /// Registers that [element] is called in a loop.
372 // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'? 371 // TODO(johnniwinther): Is this 'potentially called' or 'known to be called'?
373 void addFunctionCalledInLoop(MemberEntity element); 372 void addFunctionCalledInLoop(MemberEntity element);
374 373
375 /// Registers that [element] is guaranteed not to throw an exception. 374 /// Registers that [element] is guaranteed not to throw an exception.
376 void registerCannotThrow(FunctionEntity element); 375 void registerCannotThrow(FunctionEntity element);
377 376
378 /// Adds the closure class [cls] to the inference world. The class is 377 /// Adds the closure class [cls] to the inference world. The class is
379 /// considered directly instantiated. 378 /// considered directly instantiated. If [fromInstanceMember] is true, this
380 void registerClosureClass(covariant ClassElement cls); 379 /// closure class represents a closure that is inside an instance member, thus
380 /// has access to `this`.
381 void registerClosureClass(covariant ClassEntity cls, bool fromInstanceMember);
381 } 382 }
382 383
383 abstract class OpenWorld implements World { 384 abstract class OpenWorld implements World {
384 /// Called to add [cls] to the set of known classes. 385 /// Called to add [cls] to the set of known classes.
385 /// 386 ///
386 /// This ensures that class hierarchy queries can be performed on [cls] and 387 /// This ensures that class hierarchy queries can be performed on [cls] and
387 /// classes that extend or implement it. 388 /// classes that extend or implement it.
388 void registerClass(covariant ClassEntity cls); 389 void registerClass(covariant ClassEntity cls);
389 390
390 void registerUsedElement(MemberEntity element); 391 void registerUsedElement(MemberEntity element);
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 StringBuffer sb = new StringBuffer(); 1172 StringBuffer sb = new StringBuffer();
1172 if (cls != null) { 1173 if (cls != null) {
1173 sb.write("Classes in the closed world related to $cls:\n"); 1174 sb.write("Classes in the closed world related to $cls:\n");
1174 } else { 1175 } else {
1175 sb.write("Instantiated classes in the closed world:\n"); 1176 sb.write("Instantiated classes in the closed world:\n");
1176 } 1177 }
1177 getClassHierarchyNode(commonElements.objectClass) 1178 getClassHierarchyNode(commonElements.objectClass)
1178 .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls); 1179 .printOn(sb, ' ', instantiatedOnly: cls == null, withRespectTo: cls);
1179 return sb.toString(); 1180 return sb.toString();
1180 } 1181 }
1182
1183 /// Should only be called by subclasses.
1184 void addClassHierarchyNode(ClassEntity cls, ClassHierarchyNode node) {
1185 _classHierarchyNodes[cls] = node;
1186 }
1187
1188 /// Should only be called by subclasses.
1189 void addClassSet(ClassEntity cls, ClassSet classSet) {
1190 _classSets[cls] = classSet;
1191 }
1181 } 1192 }
1182 1193
1183 class ClosedWorldImpl extends ClosedWorldBase with ClosedWorldRtiNeedMixin { 1194 class ClosedWorldImpl extends ClosedWorldBase with ClosedWorldRtiNeedMixin {
1184 ClosedWorldImpl( 1195 ClosedWorldImpl(
1185 {CompilerOptions options, 1196 {CompilerOptions options,
1186 ElementEnvironment elementEnvironment, 1197 ElementEnvironment elementEnvironment,
1187 DartTypes dartTypes, 1198 DartTypes dartTypes,
1188 CommonElements commonElements, 1199 CommonElements commonElements,
1189 ConstantSystem constantSystem, 1200 ConstantSystem constantSystem,
1190 NativeData nativeData, 1201 NativeData nativeData,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1290 MemberElement element = findMatchIn(cls, selector); 1301 MemberElement element = findMatchIn(cls, selector);
1291 if (element == null) return false; 1302 if (element == null) return false;
1292 1303
1293 if (element.isAbstract) { 1304 if (element.isAbstract) {
1294 ClassElement enclosingClass = element.enclosingClass; 1305 ClassElement enclosingClass = element.enclosingClass;
1295 return hasConcreteMatch(enclosingClass.superclass, selector); 1306 return hasConcreteMatch(enclosingClass.superclass, selector);
1296 } 1307 }
1297 return selector.appliesUntyped(element); 1308 return selector.appliesUntyped(element);
1298 } 1309 }
1299 1310
1300 void registerClosureClass(ClosureClassElement cls) { 1311 void registerClosureClass(ClassElement cls, bool _) {
1301 ClassHierarchyNode parentNode = getClassHierarchyNode(cls.superclass); 1312 ClassHierarchyNode parentNode = getClassHierarchyNode(cls.superclass);
1302 ClassHierarchyNode node = _classHierarchyNodes[cls] = 1313 ClassHierarchyNode node = _classHierarchyNodes[cls] =
1303 new ClassHierarchyNode(parentNode, cls, cls.hierarchyDepth); 1314 new ClassHierarchyNode(parentNode, cls, cls.hierarchyDepth);
1304 for (ResolutionInterfaceType type in cls.allSupertypes) { 1315 for (ResolutionInterfaceType type in cls.allSupertypes) {
1305 ClassSet subtypeSet = getClassSet(type.element); 1316 ClassSet subtypeSet = getClassSet(type.element);
1306 subtypeSet.addSubtype(node); 1317 subtypeSet.addSubtype(node);
1307 } 1318 }
1308 _classSets[cls] = new ClassSet(node); 1319 _classSets[cls] = new ClassSet(node);
1309 _updateSuperClassHierarchyNodeForClass(node); 1320 _updateSuperClassHierarchyNodeForClass(node);
1310 node.isDirectlyInstantiated = true; 1321 node.isDirectlyInstantiated = true;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1343 void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder, 1354 void computeRtiNeed(ResolutionWorldBuilder resolutionWorldBuilder,
1344 RuntimeTypesNeedBuilder rtiNeedBuilder, 1355 RuntimeTypesNeedBuilder rtiNeedBuilder,
1345 {bool enableTypeAssertions}) { 1356 {bool enableTypeAssertions}) {
1346 _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed( 1357 _rtiNeed = rtiNeedBuilder.computeRuntimeTypesNeed(
1347 resolutionWorldBuilder, this, 1358 resolutionWorldBuilder, this,
1348 enableTypeAssertions: enableTypeAssertions); 1359 enableTypeAssertions: enableTypeAssertions);
1349 } 1360 }
1350 1361
1351 RuntimeTypesNeed get rtiNeed => _rtiNeed; 1362 RuntimeTypesNeed get rtiNeed => _rtiNeed;
1352 } 1363 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/env.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698