| 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 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 | 450 |
| 451 Tracer tracer; | 451 Tracer tracer; |
| 452 | 452 |
| 453 JavaScriptBackend(this.compiler, | 453 JavaScriptBackend(this.compiler, |
| 454 {bool generateSourceMap: true, | 454 {bool generateSourceMap: true, |
| 455 bool useStartupEmitter: false, | 455 bool useStartupEmitter: false, |
| 456 bool useMultiSourceInfo: false, | 456 bool useMultiSourceInfo: false, |
| 457 bool useNewSourceInfo: false, | 457 bool useNewSourceInfo: false, |
| 458 bool useKernel: false}) | 458 bool useKernel: false}) |
| 459 : _rti = new RuntimeTypesImpl( | 459 : _rti = new RuntimeTypesImpl( |
| 460 compiler.elementEnvironment, compiler.frontEndStrategy.dartTypes), | 460 compiler.elementEnvironment, compiler.frontendStrategy.dartTypes), |
| 461 optimizerHints = new OptimizerHintsForTests( | 461 optimizerHints = new OptimizerHintsForTests( |
| 462 compiler.elementEnvironment, compiler.commonElements), | 462 compiler.elementEnvironment, compiler.commonElements), |
| 463 this.sourceInformationStrategy = | 463 this.sourceInformationStrategy = |
| 464 compiler.backendStrategy.sourceInformationStrategy, | 464 compiler.backendStrategy.sourceInformationStrategy, |
| 465 constantCompilerTask = new JavaScriptConstantTask(compiler), | 465 constantCompilerTask = new JavaScriptConstantTask(compiler), |
| 466 _nativeDataResolver = new NativeDataResolverImpl(compiler), | 466 _nativeDataResolver = new NativeDataResolverImpl(compiler), |
| 467 _rtiNeedBuilder = | 467 _rtiNeedBuilder = |
| 468 compiler.frontEndStrategy.createRuntimeTypesNeedBuilder() { | 468 compiler.frontendStrategy.createRuntimeTypesNeedBuilder() { |
| 469 _target = new JavaScriptBackendTarget(this); | 469 _target = new JavaScriptBackendTarget(this); |
| 470 impacts = new BackendImpacts(compiler.options, commonElements); | 470 impacts = new BackendImpacts(compiler.options, commonElements); |
| 471 _mirrorsData = compiler.frontEndStrategy.createMirrorsDataBuilder(); | 471 _mirrorsData = compiler.frontendStrategy.createMirrorsDataBuilder(); |
| 472 _backendUsageBuilder = new BackendUsageBuilderImpl(commonElements); | 472 _backendUsageBuilder = new BackendUsageBuilderImpl(commonElements); |
| 473 _checkedModeHelpers = new CheckedModeHelpers(commonElements); | 473 _checkedModeHelpers = new CheckedModeHelpers(commonElements); |
| 474 emitter = | 474 emitter = |
| 475 new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter); | 475 new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter); |
| 476 | 476 |
| 477 _typeVariableResolutionAnalysis = new TypeVariableResolutionAnalysis( | 477 _typeVariableResolutionAnalysis = new TypeVariableResolutionAnalysis( |
| 478 compiler.elementEnvironment, impacts, _backendUsageBuilder); | 478 compiler.elementEnvironment, impacts, _backendUsageBuilder); |
| 479 jsInteropAnalysis = new JsInteropAnalysis(this); | 479 jsInteropAnalysis = new JsInteropAnalysis(this); |
| 480 _mirrorsResolutionAnalysis = | 480 _mirrorsResolutionAnalysis = |
| 481 compiler.frontEndStrategy.createMirrorsResolutionAnalysis(this); | 481 compiler.frontendStrategy.createMirrorsResolutionAnalysis(this); |
| 482 lookupMapResolutionAnalysis = | 482 lookupMapResolutionAnalysis = |
| 483 new LookupMapResolutionAnalysis(reporter, compiler.elementEnvironment); | 483 new LookupMapResolutionAnalysis(reporter, compiler.elementEnvironment); |
| 484 | 484 |
| 485 noSuchMethodRegistry = new NoSuchMethodRegistry( | 485 noSuchMethodRegistry = new NoSuchMethodRegistry( |
| 486 commonElements, compiler.frontEndStrategy.createNoSuchMethodResolver()); | 486 commonElements, compiler.frontendStrategy.createNoSuchMethodResolver()); |
| 487 kernelTask = new KernelTask(compiler); | 487 kernelTask = new KernelTask(compiler); |
| 488 patchResolverTask = new PatchResolverTask(compiler); | 488 patchResolverTask = new PatchResolverTask(compiler); |
| 489 functionCompiler = new SsaFunctionCompiler( | 489 functionCompiler = new SsaFunctionCompiler( |
| 490 this, compiler.measurer, sourceInformationStrategy); | 490 this, compiler.measurer, sourceInformationStrategy); |
| 491 serialization = new JavaScriptBackendSerialization(this); | 491 serialization = new JavaScriptBackendSerialization(this); |
| 492 } | 492 } |
| 493 | 493 |
| 494 /// The [ConstantSystem] used to interpret compile-time constants for this | 494 /// The [ConstantSystem] used to interpret compile-time constants for this |
| 495 /// backend. | 495 /// backend. |
| 496 ConstantSystem get constantSystem => constants.constantSystem; | 496 ConstantSystem get constantSystem => constants.constantSystem; |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 730 .getThisType(commonElements.jsExtendableArrayClass); | 730 .getThisType(commonElements.jsExtendableArrayClass); |
| 731 | 731 |
| 732 validateInterceptorImplementsAllObjectMethods( | 732 validateInterceptorImplementsAllObjectMethods( |
| 733 commonElements.jsInterceptorClass); | 733 commonElements.jsInterceptorClass); |
| 734 // The null-interceptor must also implement *all* methods. | 734 // The null-interceptor must also implement *all* methods. |
| 735 validateInterceptorImplementsAllObjectMethods(commonElements.jsNullClass); | 735 validateInterceptorImplementsAllObjectMethods(commonElements.jsNullClass); |
| 736 } | 736 } |
| 737 | 737 |
| 738 /// Called when the resolution queue has been closed. | 738 /// Called when the resolution queue has been closed. |
| 739 void onResolutionEnd() { | 739 void onResolutionEnd() { |
| 740 compiler.frontEndStrategy.annotationProcesser | 740 compiler.frontendStrategy.annotationProcesser |
| 741 .processJsInteropAnnotations(nativeBasicData, nativeDataBuilder); | 741 .processJsInteropAnnotations(nativeBasicData, nativeDataBuilder); |
| 742 } | 742 } |
| 743 | 743 |
| 744 /// Called when the closed world from resolution has been computed. | 744 /// Called when the closed world from resolution has been computed. |
| 745 void onResolutionClosedWorld( | 745 void onResolutionClosedWorld( |
| 746 ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) { | 746 ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) { |
| 747 for (MemberEntity entity | 747 for (MemberEntity entity |
| 748 in compiler.enqueuer.resolution.processedEntities) { | 748 in compiler.enqueuer.resolution.processedEntities) { |
| 749 processAnnotations(entity, closedWorldRefiner); | 749 processAnnotations(entity, closedWorldRefiner); |
| 750 } | 750 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 } | 793 } |
| 794 | 794 |
| 795 ResolutionEnqueuer createResolutionEnqueuer( | 795 ResolutionEnqueuer createResolutionEnqueuer( |
| 796 CompilerTask task, Compiler compiler) { | 796 CompilerTask task, Compiler compiler) { |
| 797 _nativeBasicData = | 797 _nativeBasicData = |
| 798 nativeBasicDataBuilder.close(compiler.elementEnvironment); | 798 nativeBasicDataBuilder.close(compiler.elementEnvironment); |
| 799 _nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer( | 799 _nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer( |
| 800 compiler.options, | 800 compiler.options, |
| 801 compiler.elementEnvironment, | 801 compiler.elementEnvironment, |
| 802 commonElements, | 802 commonElements, |
| 803 compiler.frontEndStrategy.dartTypes, | 803 compiler.frontendStrategy.dartTypes, |
| 804 _backendUsageBuilder, | 804 _backendUsageBuilder, |
| 805 compiler.frontEndStrategy.createNativeClassFinder(nativeBasicData)); | 805 compiler.frontendStrategy.createNativeClassFinder(nativeBasicData)); |
| 806 _nativeDataBuilder = new NativeDataBuilderImpl(nativeBasicData); | 806 _nativeDataBuilder = new NativeDataBuilderImpl(nativeBasicData); |
| 807 _customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis( | 807 _customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis( |
| 808 constantSystem, | 808 constantSystem, |
| 809 compiler.elementEnvironment, | 809 compiler.elementEnvironment, |
| 810 commonElements, | 810 commonElements, |
| 811 nativeBasicData, | 811 nativeBasicData, |
| 812 _backendUsageBuilder); | 812 _backendUsageBuilder); |
| 813 impactTransformer = new JavaScriptImpactTransformer( | 813 impactTransformer = new JavaScriptImpactTransformer( |
| 814 compiler.options, | 814 compiler.options, |
| 815 compiler.elementEnvironment, | 815 compiler.elementEnvironment, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 842 rtiNeedBuilder, | 842 rtiNeedBuilder, |
| 843 mirrorsDataBuilder, | 843 mirrorsDataBuilder, |
| 844 noSuchMethodRegistry, | 844 noSuchMethodRegistry, |
| 845 customElementsResolutionAnalysis, | 845 customElementsResolutionAnalysis, |
| 846 lookupMapResolutionAnalysis, | 846 lookupMapResolutionAnalysis, |
| 847 mirrorsResolutionAnalysis, | 847 mirrorsResolutionAnalysis, |
| 848 typeVariableResolutionAnalysis, | 848 typeVariableResolutionAnalysis, |
| 849 _nativeResolutionEnqueuer, | 849 _nativeResolutionEnqueuer, |
| 850 compiler.deferredLoadTask, | 850 compiler.deferredLoadTask, |
| 851 kernelTask), | 851 kernelTask), |
| 852 compiler.frontEndStrategy.createResolutionWorldBuilder( | 852 compiler.frontendStrategy.createResolutionWorldBuilder( |
| 853 nativeBasicData, | 853 nativeBasicData, |
| 854 _nativeDataBuilder, | 854 _nativeDataBuilder, |
| 855 interceptorDataBuilder, | 855 interceptorDataBuilder, |
| 856 _backendUsageBuilder, | 856 _backendUsageBuilder, |
| 857 const OpenWorldStrategy()), | 857 const OpenWorldStrategy()), |
| 858 compiler.frontEndStrategy.createResolutionWorkItemBuilder( | 858 compiler.frontendStrategy.createResolutionWorkItemBuilder( |
| 859 nativeBasicData, _nativeDataBuilder, impactTransformer)); | 859 nativeBasicData, _nativeDataBuilder, impactTransformer)); |
| 860 } | 860 } |
| 861 | 861 |
| 862 /// Creates an [Enqueuer] for code generation specific to this backend. | 862 /// Creates an [Enqueuer] for code generation specific to this backend. |
| 863 CodegenEnqueuer createCodegenEnqueuer( | 863 CodegenEnqueuer createCodegenEnqueuer( |
| 864 CompilerTask task, Compiler compiler, ClosedWorld closedWorld) { | 864 CompilerTask task, Compiler compiler, ClosedWorld closedWorld) { |
| 865 _typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis( | 865 _typeVariableCodegenAnalysis = new TypeVariableCodegenAnalysis( |
| 866 compiler.elementEnvironment, this, commonElements, mirrorsData); | 866 compiler.elementEnvironment, this, commonElements, mirrorsData); |
| 867 _lookupMapAnalysis = new LookupMapAnalysis( | 867 _lookupMapAnalysis = new LookupMapAnalysis( |
| 868 reporter, | 868 reporter, |
| 869 constantSystem, | 869 constantSystem, |
| 870 constants, | 870 constants, |
| 871 compiler.elementEnvironment, | 871 compiler.elementEnvironment, |
| 872 commonElements, | 872 commonElements, |
| 873 lookupMapResolutionAnalysis); | 873 lookupMapResolutionAnalysis); |
| 874 _mirrorsCodegenAnalysis = mirrorsResolutionAnalysis.close(); | 874 _mirrorsCodegenAnalysis = mirrorsResolutionAnalysis.close(); |
| 875 _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis( | 875 _customElementsCodegenAnalysis = new CustomElementsCodegenAnalysis( |
| 876 constantSystem, | 876 constantSystem, |
| 877 commonElements, | 877 commonElements, |
| 878 compiler.elementEnvironment, | 878 compiler.elementEnvironment, |
| 879 nativeBasicData); | 879 nativeBasicData); |
| 880 _nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer( | 880 _nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer( |
| 881 compiler.options, | 881 compiler.options, |
| 882 compiler.elementEnvironment, | 882 compiler.elementEnvironment, |
| 883 commonElements, | 883 commonElements, |
| 884 compiler.frontEndStrategy.dartTypes, | 884 compiler.frontendStrategy.dartTypes, |
| 885 emitter, | 885 emitter, |
| 886 _nativeResolutionEnqueuer, | 886 _nativeResolutionEnqueuer, |
| 887 closedWorld.nativeData); | 887 closedWorld.nativeData); |
| 888 return new CodegenEnqueuer( | 888 return new CodegenEnqueuer( |
| 889 task, | 889 task, |
| 890 compiler.options, | 890 compiler.options, |
| 891 const TreeShakingEnqueuerStrategy(), | 891 const TreeShakingEnqueuerStrategy(), |
| 892 compiler.backendStrategy.createCodegenWorldBuilder( | 892 compiler.backendStrategy.createCodegenWorldBuilder( |
| 893 nativeBasicData, closedWorld, const TypeMaskStrategy()), | 893 nativeBasicData, closedWorld, const TypeMaskStrategy()), |
| 894 compiler.backendStrategy.createCodegenWorkItemBuilder(closedWorld), | 894 compiler.backendStrategy.createCodegenWorkItemBuilder(closedWorld), |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1022 element == commonElements.jsExtendableArrayClass || | 1022 element == commonElements.jsExtendableArrayClass || |
| 1023 element == commonElements.jsFixedArrayClass || | 1023 element == commonElements.jsFixedArrayClass || |
| 1024 element == commonElements.jsUnmodifiableArrayClass; | 1024 element == commonElements.jsUnmodifiableArrayClass; |
| 1025 } | 1025 } |
| 1026 | 1026 |
| 1027 /// This method is called immediately after the [library] and its parts have | 1027 /// This method is called immediately after the [library] and its parts have |
| 1028 /// been loaded. | 1028 /// been loaded. |
| 1029 void setAnnotations(LibraryEntity library) { | 1029 void setAnnotations(LibraryEntity library) { |
| 1030 if (!compiler.serialization.isDeserialized(library)) { | 1030 if (!compiler.serialization.isDeserialized(library)) { |
| 1031 AnnotationProcessor processor = | 1031 AnnotationProcessor processor = |
| 1032 compiler.frontEndStrategy.annotationProcesser; | 1032 compiler.frontendStrategy.annotationProcesser; |
| 1033 if (canLibraryUseNative(library)) { | 1033 if (canLibraryUseNative(library)) { |
| 1034 processor.extractNativeAnnotations(library, nativeBasicDataBuilder); | 1034 processor.extractNativeAnnotations(library, nativeBasicDataBuilder); |
| 1035 } | 1035 } |
| 1036 processor.extractJsInteropAnnotations(library, nativeBasicDataBuilder); | 1036 processor.extractJsInteropAnnotations(library, nativeBasicDataBuilder); |
| 1037 } | 1037 } |
| 1038 Uri uri = library.canonicalUri; | 1038 Uri uri = library.canonicalUri; |
| 1039 if (uri == Uris.dart_html) { | 1039 if (uri == Uris.dart_html) { |
| 1040 htmlLibraryIsLoaded = true; | 1040 htmlLibraryIsLoaded = true; |
| 1041 } else if (uri == LookupMapResolutionAnalysis.PACKAGE_LOOKUP_MAP) { | 1041 } else if (uri == LookupMapResolutionAnalysis.PACKAGE_LOOKUP_MAP) { |
| 1042 lookupMapResolutionAnalysis.init(library); | 1042 lookupMapResolutionAnalysis.init(library); |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 | 1397 |
| 1398 bool canUseAliasedSuperMember(MemberEntity member, Selector selector) { | 1398 bool canUseAliasedSuperMember(MemberEntity member, Selector selector) { |
| 1399 return !selector.isGetter; | 1399 return !selector.isGetter; |
| 1400 } | 1400 } |
| 1401 | 1401 |
| 1402 /// Returns `true` if [member] is called from a subclass via `super`. | 1402 /// Returns `true` if [member] is called from a subclass via `super`. |
| 1403 bool isAliasedSuperMember(MemberEntity member) { | 1403 bool isAliasedSuperMember(MemberEntity member) { |
| 1404 return _aliasedSuperMembers.contains(member); | 1404 return _aliasedSuperMembers.contains(member); |
| 1405 } | 1405 } |
| 1406 } | 1406 } |
| OLD | NEW |