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

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

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month 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/ssa/ssa.dart ('k') | pkg/compiler/lib/src/universe/use.dart » ('j') | 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 universe; 5 library universe;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import '../common.dart'; 9 import '../common.dart';
10 import '../compiler.dart' show 10 import '../compiler.dart' show
11 Compiler; 11 Compiler;
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../dart_types.dart'; 13 import '../dart_types.dart';
14 import '../util/util.dart'; 14 import '../util/util.dart';
15 import '../world.dart' show 15 import '../world.dart' show
16 ClassWorld, 16 ClassWorld,
17 World; 17 World;
18 18
19 import 'selector.dart' show 19 import 'selector.dart' show
20 Selector; 20 Selector;
21 import 'use.dart' show
22 StaticUse,
23 StaticUseKind;
21 24
25 enum DynamicUseKind {
26 INVOKE,
27 GET,
28 SET,
29 }
30
31 // TODO(johnniwinther): Rename to `DynamicUse` and move to 'use.dart'.
22 class UniverseSelector { 32 class UniverseSelector {
23 final Selector selector; 33 final Selector selector;
24 final ReceiverConstraint mask; 34 final ReceiverConstraint mask;
25 35
26 UniverseSelector(this.selector, this.mask); 36 UniverseSelector(this.selector, this.mask);
27 37
28 bool appliesUnnamed(Element element, ClassWorld world) { 38 bool appliesUnnamed(Element element, ClassWorld world) {
29 return selector.appliesUnnamed(element, world) && 39 return selector.appliesUnnamed(element, world) &&
30 (mask == null || mask.canHit(element, selector, world)); 40 (mask == null || mask.canHit(element, selector, world));
31 } 41 }
32 42
43 DynamicUseKind get kind {
44 if (selector.isGetter) {
45 return DynamicUseKind.GET;
46 } else if (selector.isSetter) {
47 return DynamicUseKind.SET;
48 } else {
49 return DynamicUseKind.INVOKE;
50 }
51 }
52
33 int get hashCode => selector.hashCode * 13 + mask.hashCode * 17; 53 int get hashCode => selector.hashCode * 13 + mask.hashCode * 17;
34 54
35 bool operator ==(other) { 55 bool operator ==(other) {
36 if (identical(this, other)) return true; 56 if (identical(this, other)) return true;
37 if (other is! UniverseSelector) return false; 57 if (other is! UniverseSelector) return false;
38 return selector == other.selector && mask == other.mask; 58 return selector == other.selector && mask == other.mask;
39 } 59 }
40 60
41 String toString() => '$selector,$mask'; 61 String toString() => '$selector,$mask';
42 } 62 }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 } 336 }
317 337
318 bool hasInvokedGetter(Element member, World world) { 338 bool hasInvokedGetter(Element member, World world) {
319 return _hasMatchingSelector(_invokedGetters[member.name], member, world); 339 return _hasMatchingSelector(_invokedGetters[member.name], member, world);
320 } 340 }
321 341
322 bool hasInvokedSetter(Element member, World world) { 342 bool hasInvokedSetter(Element member, World world) {
323 return _hasMatchingSelector(_invokedSetters[member.name], member, world); 343 return _hasMatchingSelector(_invokedSetters[member.name], member, world);
324 } 344 }
325 345
326 bool registerInvocation(UniverseSelector selector) { 346 bool registerDynamicUse(UniverseSelector selector) {
327 return _registerNewSelector(selector, _invokedNames); 347 switch (selector.kind) {
328 } 348 case DynamicUseKind.INVOKE:
329 349 return _registerNewSelector(selector, _invokedNames);
330 bool registerInvokedGetter(UniverseSelector selector) { 350 case DynamicUseKind.GET:
331 return _registerNewSelector(selector, _invokedGetters); 351 return _registerNewSelector(selector, _invokedGetters);
332 } 352 case DynamicUseKind.SET:
333 353 return _registerNewSelector(selector, _invokedSetters);
334 bool registerInvokedSetter(UniverseSelector selector) { 354 }
335 return _registerNewSelector(selector, _invokedSetters);
336 } 355 }
337 356
338 bool _registerNewSelector( 357 bool _registerNewSelector(
339 UniverseSelector universeSelector, 358 UniverseSelector universeSelector,
340 Map<String, Map<Selector, SelectorConstraints>> selectorMap) { 359 Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
341 Selector selector = universeSelector.selector; 360 Selector selector = universeSelector.selector;
342 String name = selector.name; 361 String name = selector.name;
343 ReceiverConstraint mask = universeSelector.mask; 362 ReceiverConstraint mask = universeSelector.mask;
344 Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent( 363 Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
345 name, () => new Maplet<Selector, SelectorConstraints>()); 364 name, () => new Maplet<Selector, SelectorConstraints>());
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 DartType registerIsCheck(DartType type, Compiler compiler) { 403 DartType registerIsCheck(DartType type, Compiler compiler) {
385 type.computeUnaliased(compiler.resolution); 404 type.computeUnaliased(compiler.resolution);
386 type = type.unaliased; 405 type = type.unaliased;
387 // Even in checked mode, type annotations for return type and argument 406 // Even in checked mode, type annotations for return type and argument
388 // types do not imply type checks, so there should never be a check 407 // types do not imply type checks, so there should never be a check
389 // against the type variable of a typedef. 408 // against the type variable of a typedef.
390 isChecks.add(type); 409 isChecks.add(type);
391 return type; 410 return type;
392 } 411 }
393 412
394 void registerStaticFieldUse(FieldElement staticField) { 413 void registerStaticUse(StaticUse staticUse) {
395 assert(Elements.isStaticOrTopLevel(staticField) && staticField.isField); 414 Element element = staticUse.element;
396 assert(staticField.isDeclaration); 415 if (Elements.isStaticOrTopLevel(element) && element.isField) {
397 416 allReferencedStaticFields.add(element);
398 allReferencedStaticFields.add(staticField); 417 }
418 switch (staticUse.kind) {
419 case StaticUseKind.STATIC_TEAR_OFF:
420 staticFunctionsNeedingGetter.add(element);
421 break;
422 case StaticUseKind.FIELD_GET:
423 fieldGetters.add(element);
424 break;
425 case StaticUseKind.FIELD_SET:
426 fieldSetters.add(element);
427 break;
428 case StaticUseKind.SUPER_TEAR_OFF:
429 methodsNeedingSuperGetter.add(element);
430 break;
431 case StaticUseKind.GENERAL:
432 break;
433 }
399 } 434 }
400 435
401 void forgetElement(Element element, Compiler compiler) { 436 void forgetElement(Element element, Compiler compiler) {
402 allClosures.remove(element); 437 allClosures.remove(element);
403 slowDirectlyNestedClosures(element).forEach(compiler.forgetElement); 438 slowDirectlyNestedClosures(element).forEach(compiler.forgetElement);
404 closurizedMembers.remove(element); 439 closurizedMembers.remove(element);
405 fieldSetters.remove(element); 440 fieldSetters.remove(element);
406 fieldGetters.remove(element); 441 fieldGetters.remove(element);
407 _directlyInstantiatedClasses.remove(element); 442 _directlyInstantiatedClasses.remove(element);
408 _allInstantiatedClasses.remove(element); 443 _allInstantiatedClasses.remove(element);
(...skipping 10 matching lines...) Expand all
419 // TODO(ahe): Replace this method with something that is O(1), for example, 454 // TODO(ahe): Replace this method with something that is O(1), for example,
420 // by using a map. 455 // by using a map.
421 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) { 456 List<LocalFunctionElement> slowDirectlyNestedClosures(Element element) {
422 // Return new list to guard against concurrent modifications. 457 // Return new list to guard against concurrent modifications.
423 return new List<LocalFunctionElement>.from( 458 return new List<LocalFunctionElement>.from(
424 allClosures.where((LocalFunctionElement closure) { 459 allClosures.where((LocalFunctionElement closure) {
425 return closure.executableContext == element; 460 return closure.executableContext == element;
426 })); 461 }));
427 } 462 }
428 } 463 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/ssa.dart ('k') | pkg/compiler/lib/src/universe/use.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698