| 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 '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../common/backend_api.dart' | 8 import '../common/backend_api.dart' |
| 9 show ForeignResolver, NativeRegistry, ImpactTransformer; | 9 show ForeignResolver, NativeRegistry, ImpactTransformer; |
| 10 import '../common/codegen.dart' show CodegenWorkItem; | 10 import '../common/codegen.dart' show CodegenWorkItem; |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 | 609 |
| 610 Namer determineNamer( | 610 Namer determineNamer( |
| 611 ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) { | 611 ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) { |
| 612 return compiler.options.enableMinification | 612 return compiler.options.enableMinification |
| 613 ? compiler.options.useFrequencyNamer | 613 ? compiler.options.useFrequencyNamer |
| 614 ? new FrequencyBasedNamer(closedWorld, codegenWorldBuilder) | 614 ? new FrequencyBasedNamer(closedWorld, codegenWorldBuilder) |
| 615 : new MinifyNamer(closedWorld, codegenWorldBuilder) | 615 : new MinifyNamer(closedWorld, codegenWorldBuilder) |
| 616 : new Namer(closedWorld, codegenWorldBuilder); | 616 : new Namer(closedWorld, codegenWorldBuilder); |
| 617 } | 617 } |
| 618 | 618 |
| 619 /// Returns true if global optimizations such as type inferencing can apply to | |
| 620 /// the field [element]. | |
| 621 /// | |
| 622 /// One category of elements that do not apply is runtime helpers that the | |
| 623 /// backend calls, but the optimizations don't see those calls. | |
| 624 bool canFieldBeUsedForGlobalOptimizations( | |
| 625 FieldEntity element, ClosedWorld closedWorld) { | |
| 626 if (closedWorld.backendUsage.isFieldUsedByBackend(element)) { | |
| 627 return false; | |
| 628 } | |
| 629 if ((element.isTopLevel || element.isStatic) && !element.isAssignable) { | |
| 630 return true; | |
| 631 } | |
| 632 return !mirrorsData.isMemberAccessibleByReflection(element); | |
| 633 } | |
| 634 | |
| 635 /// Returns true if global optimizations such as type inferencing can apply to | |
| 636 /// the parameter [element]. | |
| 637 /// | |
| 638 /// One category of elements that do not apply is runtime helpers that the | |
| 639 /// backend calls, but the optimizations don't see those calls. | |
| 640 bool canFunctionParametersBeUsedForGlobalOptimizations( | |
| 641 FunctionEntity function, ClosedWorld closedWorld) { | |
| 642 return !closedWorld.backendUsage.isFunctionUsedByBackend(function) && | |
| 643 !mirrorsData.isMemberAccessibleByReflection(function); | |
| 644 } | |
| 645 | |
| 646 void validateInterceptorImplementsAllObjectMethods( | 619 void validateInterceptorImplementsAllObjectMethods( |
| 647 ClassEntity interceptorClass) { | 620 ClassEntity interceptorClass) { |
| 648 if (interceptorClass == null) return; | 621 if (interceptorClass == null) return; |
| 649 ClassEntity objectClass = frontendStrategy.commonElements.objectClass; | 622 ClassEntity objectClass = frontendStrategy.commonElements.objectClass; |
| 650 frontendStrategy.elementEnvironment.forEachClassMember(objectClass, | 623 frontendStrategy.elementEnvironment.forEachClassMember(objectClass, |
| 651 (_, MemberEntity member) { | 624 (_, MemberEntity member) { |
| 652 if (member.isConstructor) return; | 625 if (member.isConstructor) return; |
| 653 MemberEntity interceptorMember = frontendStrategy.elementEnvironment | 626 MemberEntity interceptorMember = frontendStrategy.elementEnvironment |
| 654 .lookupClassMember(interceptorClass, member.name); | 627 .lookupClassMember(interceptorClass, member.name); |
| 655 // Interceptors must override all Object methods due to calling convention | 628 // Interceptors must override all Object methods due to calling convention |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 } | 985 } |
| 1013 | 986 |
| 1014 /// Called when the compiler starts running the codegen enqueuer. The | 987 /// Called when the compiler starts running the codegen enqueuer. The |
| 1015 /// [WorldImpact] of enabled backend features is returned. | 988 /// [WorldImpact] of enabled backend features is returned. |
| 1016 WorldImpact onCodegenStart(ClosedWorld closedWorld, | 989 WorldImpact onCodegenStart(ClosedWorld closedWorld, |
| 1017 CodegenWorldBuilder codegenWorldBuilder, Sorter sorter) { | 990 CodegenWorldBuilder codegenWorldBuilder, Sorter sorter) { |
| 1018 functionCompiler.onCodegenStart(); | 991 functionCompiler.onCodegenStart(); |
| 1019 _oneShotInterceptorData = new OneShotInterceptorData( | 992 _oneShotInterceptorData = new OneShotInterceptorData( |
| 1020 closedWorld.interceptorData, closedWorld.commonElements); | 993 closedWorld.interceptorData, closedWorld.commonElements); |
| 1021 _namer = determineNamer(closedWorld, codegenWorldBuilder); | 994 _namer = determineNamer(closedWorld, codegenWorldBuilder); |
| 1022 tracer = new Tracer(closedWorld, namer, compiler); | 995 tracer = new Tracer(closedWorld, namer, compiler.outputProvider); |
| 1023 _rtiEncoder = _namer.rtiEncoder = new RuntimeTypesEncoderImpl( | 996 _rtiEncoder = _namer.rtiEncoder = new RuntimeTypesEncoderImpl( |
| 1024 namer, closedWorld.elementEnvironment, closedWorld.commonElements); | 997 namer, closedWorld.elementEnvironment, closedWorld.commonElements); |
| 1025 emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter); | 998 emitter.createEmitter(namer, closedWorld, codegenWorldBuilder, sorter); |
| 1026 // TODO(johnniwinther): Share the impact object created in | 999 // TODO(johnniwinther): Share the impact object created in |
| 1027 // createCodegenEnqueuer. | 1000 // createCodegenEnqueuer. |
| 1028 BackendImpacts impacts = | 1001 BackendImpacts impacts = |
| 1029 new BackendImpacts(compiler.options, closedWorld.commonElements); | 1002 new BackendImpacts(compiler.options, closedWorld.commonElements); |
| 1030 _rti = new RuntimeTypesImpl( | 1003 _rti = new RuntimeTypesImpl( |
| 1031 closedWorld.elementEnvironment, closedWorld.dartTypes); | 1004 closedWorld.elementEnvironment, closedWorld.dartTypes); |
| 1032 _codegenImpactTransformer = new CodegenImpactTransformer( | 1005 _codegenImpactTransformer = new CodegenImpactTransformer( |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1355 | 1328 |
| 1356 bool canUseAliasedSuperMember(MemberEntity member, Selector selector) { | 1329 bool canUseAliasedSuperMember(MemberEntity member, Selector selector) { |
| 1357 return !selector.isGetter; | 1330 return !selector.isGetter; |
| 1358 } | 1331 } |
| 1359 | 1332 |
| 1360 /// Returns `true` if [member] is called from a subclass via `super`. | 1333 /// Returns `true` if [member] is called from a subclass via `super`. |
| 1361 bool isAliasedSuperMember(MemberEntity member) { | 1334 bool isAliasedSuperMember(MemberEntity member) { |
| 1362 return _aliasedSuperMembers.contains(member); | 1335 return _aliasedSuperMembers.contains(member); |
| 1363 } | 1336 } |
| 1364 } | 1337 } |
| OLD | NEW |