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

Side by Side Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 2783623002: Extract SuperMemberData from JavaScriptBackend (Closed)
Patch Set: Created 3 years, 8 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 | « no previous file | pkg/compiler/lib/src/js_emitter/program_builder/program_builder.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 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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698