| 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 |