OLD | NEW |
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 js_backend.backend; | 5 library js_backend.backend; |
6 | 6 |
7 import 'dart:async' show Future; | 7 import 'dart:async' show Future; |
8 | 8 |
9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; | 9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; |
10 | 10 |
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 assert(invariant(NO_LOCATION_SPANNABLE, _namer != null, | 348 assert(invariant(NO_LOCATION_SPANNABLE, _namer != null, |
349 message: "Namer has not been created yet.")); | 349 message: "Namer has not been created yet.")); |
350 return _namer; | 350 return _namer; |
351 } | 351 } |
352 | 352 |
353 /** | 353 /** |
354 * Set of classes whose `operator ==` methods handle `null` themselves. | 354 * Set of classes whose `operator ==` methods handle `null` themselves. |
355 */ | 355 */ |
356 final Set<ClassElement> specialOperatorEqClasses = new Set<ClassElement>(); | 356 final Set<ClassElement> specialOperatorEqClasses = new Set<ClassElement>(); |
357 | 357 |
358 /** | |
359 * A set of members that are called from subclasses via `super`. | |
360 */ | |
361 final Set<MethodElement> aliasedSuperMembers = new Setlet<MethodElement>(); | |
362 | |
363 List<CompilerTask> get tasks { | 358 List<CompilerTask> get tasks { |
364 List<CompilerTask> result = functionCompiler.tasks; | 359 List<CompilerTask> result = functionCompiler.tasks; |
365 result.add(emitter); | 360 result.add(emitter); |
366 result.add(patchResolverTask); | 361 result.add(patchResolverTask); |
367 result.add(kernelTask); | 362 result.add(kernelTask); |
368 return result; | 363 return result; |
369 } | 364 } |
370 | 365 |
371 final RuntimeTypesNeedBuilder _rtiNeedBuilder = | 366 final RuntimeTypesNeedBuilder _rtiNeedBuilder = |
372 new _RuntimeTypesNeedBuilder(); | 367 new _RuntimeTypesNeedBuilder(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 NativeDataBuilder get nativeDataBuilder => _nativeData; | 434 NativeDataBuilder get nativeDataBuilder => _nativeData; |
440 final NativeDataResolver _nativeDataResolver; | 435 final NativeDataResolver _nativeDataResolver; |
441 InterceptorDataBuilder _interceptorDataBuilder; | 436 InterceptorDataBuilder _interceptorDataBuilder; |
442 InterceptorData _interceptorData; | 437 InterceptorData _interceptorData; |
443 OneShotInterceptorData _oneShotInterceptorData; | 438 OneShotInterceptorData _oneShotInterceptorData; |
444 BackendUsage _backendUsage; | 439 BackendUsage _backendUsage; |
445 BackendUsageBuilder _backendUsageBuilder; | 440 BackendUsageBuilder _backendUsageBuilder; |
446 MirrorsDataImpl _mirrorsData; | 441 MirrorsDataImpl _mirrorsData; |
447 CheckedModeHelpers _checkedModeHelpers; | 442 CheckedModeHelpers _checkedModeHelpers; |
448 | 443 |
| 444 final SuperMemberData superMemberData = new SuperMemberData(); |
| 445 |
449 native.NativeResolutionEnqueuer _nativeResolutionEnqueuer; | 446 native.NativeResolutionEnqueuer _nativeResolutionEnqueuer; |
450 native.NativeCodegenEnqueuer _nativeCodegenEnqueuer; | 447 native.NativeCodegenEnqueuer _nativeCodegenEnqueuer; |
451 | 448 |
452 BackendHelpers helpers; | 449 BackendHelpers helpers; |
453 BackendImpacts impacts; | 450 BackendImpacts impacts; |
454 | 451 |
455 /// Common classes used by the backend. | 452 /// Common classes used by the backend. |
456 BackendClasses _backendClasses; | 453 BackendClasses _backendClasses; |
457 | 454 |
458 /// Backend access to the front-end. | 455 /// Backend access to the front-end. |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
739 /// One category of elements that do not apply is runtime helpers that the | 736 /// One category of elements that do not apply is runtime helpers that the |
740 /// backend calls, but the optimizations don't see those calls. | 737 /// backend calls, but the optimizations don't see those calls. |
741 bool canFunctionParametersBeUsedForGlobalOptimizations( | 738 bool canFunctionParametersBeUsedForGlobalOptimizations( |
742 FunctionElement element) { | 739 FunctionElement element) { |
743 if (element.isLocal) return true; | 740 if (element.isLocal) return true; |
744 MethodElement method = element; | 741 MethodElement method = element; |
745 return !backendUsage.isFunctionUsedByBackend(method) && | 742 return !backendUsage.isFunctionUsedByBackend(method) && |
746 !mirrorsData.invokedReflectively(method); | 743 !mirrorsData.invokedReflectively(method); |
747 } | 744 } |
748 | 745 |
749 /** | |
750 * Record that [method] is called from a subclass via `super`. | |
751 */ | |
752 bool maybeRegisterAliasedSuperMember( | |
753 MemberElement member, Selector selector) { | |
754 if (!canUseAliasedSuperMember(member, selector)) { | |
755 // Invoking a super getter isn't supported, this would require changes to | |
756 // compact field descriptors in the emitter. | |
757 return false; | |
758 } | |
759 aliasedSuperMembers.add(member); | |
760 return true; | |
761 } | |
762 | |
763 bool canUseAliasedSuperMember(Element member, Selector selector) { | |
764 return !selector.isGetter; | |
765 } | |
766 | |
767 /** | |
768 * Returns `true` if [member] is called from a subclass via `super`. | |
769 */ | |
770 bool isAliasedSuperMember(FunctionElement member) { | |
771 return aliasedSuperMembers.contains(member); | |
772 } | |
773 | |
774 /// Maps compile-time classes to their runtime class. The runtime class is | 746 /// Maps compile-time classes to their runtime class. The runtime class is |
775 /// always a superclass or the class itself. | 747 /// always a superclass or the class itself. |
776 ClassElement getRuntimeClass(ClassElement class_) { | 748 ClassElement getRuntimeClass(ClassElement class_) { |
777 if (class_.isSubclassOf(helpers.jsIntClass)) return helpers.jsIntClass; | 749 if (class_.isSubclassOf(helpers.jsIntClass)) return helpers.jsIntClass; |
778 if (class_.isSubclassOf(helpers.jsArrayClass)) return helpers.jsArrayClass; | 750 if (class_.isSubclassOf(helpers.jsArrayClass)) return helpers.jsArrayClass; |
779 return class_; | 751 return class_; |
780 } | 752 } |
781 | 753 |
782 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { | 754 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { |
783 return specialOperatorEqClasses.contains(operatorEqfunction.enclosingClass); | 755 return specialOperatorEqClasses.contains(operatorEqfunction.enclosingClass); |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 return _backend.defaultSuperclass(element); | 1586 return _backend.defaultSuperclass(element); |
1615 } | 1587 } |
1616 | 1588 |
1617 @override | 1589 @override |
1618 bool isNativeClass(ClassEntity element) => | 1590 bool isNativeClass(ClassEntity element) => |
1619 _backend.nativeBasicData.isNativeClass(element); | 1591 _backend.nativeBasicData.isNativeClass(element); |
1620 | 1592 |
1621 @override | 1593 @override |
1622 bool isForeign(Element element) => _backend.isForeign(element); | 1594 bool isForeign(Element element) => _backend.isForeign(element); |
1623 } | 1595 } |
| 1596 |
| 1597 class SuperMemberData { |
| 1598 /// A set of member that are called from subclasses via `super`. |
| 1599 final Set<MemberEntity> _aliasedSuperMembers = new Setlet<MemberEntity>(); |
| 1600 |
| 1601 /// Record that [member] is called from a subclass via `super`. |
| 1602 bool maybeRegisterAliasedSuperMember(MemberEntity member, Selector selector) { |
| 1603 if (!canUseAliasedSuperMember(member, selector)) { |
| 1604 // Invoking a super getter isn't supported, this would require changes to |
| 1605 // compact field descriptors in the emitter. |
| 1606 return false; |
| 1607 } |
| 1608 _aliasedSuperMembers.add(member); |
| 1609 return true; |
| 1610 } |
| 1611 |
| 1612 bool canUseAliasedSuperMember(MemberEntity member, Selector selector) { |
| 1613 return !selector.isGetter; |
| 1614 } |
| 1615 |
| 1616 /// Returns `true` if [member] is called from a subclass via `super`. |
| 1617 bool isAliasedSuperMember(MemberEntity member) { |
| 1618 return _aliasedSuperMembers.contains(member); |
| 1619 } |
| 1620 } |
OLD | NEW |