| 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 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 InterceptorData _interceptorData; | 437 InterceptorData _interceptorData; |
| 438 OneShotInterceptorData _oneShotInterceptorData; | 438 OneShotInterceptorData _oneShotInterceptorData; |
| 439 BackendUsage _backendUsage; | 439 BackendUsage _backendUsage; |
| 440 BackendUsageBuilder _backendUsageBuilder; | 440 BackendUsageBuilder _backendUsageBuilder; |
| 441 MirrorsData mirrorsData; | 441 MirrorsData mirrorsData; |
| 442 CheckedModeHelpers _checkedModeHelpers; | 442 CheckedModeHelpers _checkedModeHelpers; |
| 443 | 443 |
| 444 ResolutionEnqueuerListener _resolutionEnqueuerListener; | 444 ResolutionEnqueuerListener _resolutionEnqueuerListener; |
| 445 CodegenEnqueuerListener _codegenEnqueuerListener; | 445 CodegenEnqueuerListener _codegenEnqueuerListener; |
| 446 | 446 |
| 447 native.NativeResolutionEnqueuer _nativeResolutionEnqueuer; |
| 448 native.NativeCodegenEnqueuer _nativeCodegenEnqueuer; |
| 449 |
| 447 BackendHelpers helpers; | 450 BackendHelpers helpers; |
| 448 BackendImpacts impacts; | 451 BackendImpacts impacts; |
| 449 | 452 |
| 450 /// Common classes used by the backend. | 453 /// Common classes used by the backend. |
| 451 BackendClasses backendClasses; | 454 BackendClasses backendClasses; |
| 452 | 455 |
| 453 /// Backend access to the front-end. | 456 /// Backend access to the front-end. |
| 454 final JSFrontendAccess frontend; | 457 final JSFrontendAccess frontend; |
| 455 | 458 |
| 456 Target _target; | 459 Target _target; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 501 impacts = new BackendImpacts(compiler.options, commonElements, helpers); | 504 impacts = new BackendImpacts(compiler.options, commonElements, helpers); |
| 502 backendClasses = new JavaScriptBackendClasses( | 505 backendClasses = new JavaScriptBackendClasses( |
| 503 compiler.elementEnvironment, helpers, nativeData); | 506 compiler.elementEnvironment, helpers, nativeData); |
| 504 mirrorsData = new MirrorsData( | 507 mirrorsData = new MirrorsData( |
| 505 compiler, compiler.options, commonElements, helpers, constants); | 508 compiler, compiler.options, commonElements, helpers, constants); |
| 506 _backendUsageBuilder = new BackendUsageBuilderImpl( | 509 _backendUsageBuilder = new BackendUsageBuilderImpl( |
| 507 compiler.elementEnvironment, commonElements, helpers); | 510 compiler.elementEnvironment, commonElements, helpers); |
| 508 _checkedModeHelpers = new CheckedModeHelpers(commonElements, helpers); | 511 _checkedModeHelpers = new CheckedModeHelpers(commonElements, helpers); |
| 509 emitter = | 512 emitter = |
| 510 new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter); | 513 new CodeEmitterTask(compiler, generateSourceMap, useStartupEmitter); |
| 514 _nativeResolutionEnqueuer = new native.NativeResolutionEnqueuer(compiler); |
| 515 _nativeCodegenEnqueuer = new native.NativeCodegenEnqueuer( |
| 516 compiler, emitter, _nativeResolutionEnqueuer); |
| 517 |
| 511 typeVariableAnalysis = new TypeVariableAnalysis( | 518 typeVariableAnalysis = new TypeVariableAnalysis( |
| 512 compiler.elementEnvironment, impacts, backendUsageBuilder); | 519 compiler.elementEnvironment, impacts, backendUsageBuilder); |
| 513 typeVariableHandler = new TypeVariableHandler(this, helpers, mirrorsData); | 520 typeVariableHandler = new TypeVariableHandler(this, helpers, mirrorsData); |
| 514 customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis( | 521 customElementsResolutionAnalysis = new CustomElementsResolutionAnalysis( |
| 515 this, | 522 this, |
| 516 compiler.resolution, | 523 compiler.resolution, |
| 517 commonElements, | 524 commonElements, |
| 518 backendClasses, | 525 backendClasses, |
| 519 helpers, | 526 helpers, |
| 520 nativeData, | 527 nativeData, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 550 helpers, | 557 helpers, |
| 551 impacts, | 558 impacts, |
| 552 nativeData, | 559 nativeData, |
| 553 _interceptorDataBuilder, | 560 _interceptorDataBuilder, |
| 554 _backendUsageBuilder, | 561 _backendUsageBuilder, |
| 555 _rtiNeedBuilder, | 562 _rtiNeedBuilder, |
| 556 mirrorsData, | 563 mirrorsData, |
| 557 noSuchMethodRegistry, | 564 noSuchMethodRegistry, |
| 558 customElementsResolutionAnalysis, | 565 customElementsResolutionAnalysis, |
| 559 lookupMapLibraryAccess, | 566 lookupMapLibraryAccess, |
| 560 mirrorsAnalysis); | 567 mirrorsAnalysis, |
| 568 _nativeResolutionEnqueuer); |
| 561 _codegenEnqueuerListener = new CodegenEnqueuerListener( | 569 _codegenEnqueuerListener = new CodegenEnqueuerListener( |
| 562 this, | 570 this, |
| 563 compiler.elementEnvironment, | 571 compiler.elementEnvironment, |
| 564 commonElements, | 572 commonElements, |
| 565 helpers, | 573 helpers, |
| 566 impacts, | 574 impacts, |
| 567 mirrorsData, | 575 mirrorsData, |
| 568 customElementsCodegenAnalysis, | 576 customElementsCodegenAnalysis, |
| 569 typeVariableHandler, | 577 typeVariableHandler, |
| 570 lookupMapAnalysis, | 578 lookupMapAnalysis, |
| 571 mirrorsAnalysis); | 579 mirrorsAnalysis, |
| 580 _nativeCodegenEnqueuer); |
| 572 } | 581 } |
| 573 | 582 |
| 574 /// The [ConstantSystem] used to interpret compile-time constants for this | 583 /// The [ConstantSystem] used to interpret compile-time constants for this |
| 575 /// backend. | 584 /// backend. |
| 576 ConstantSystem get constantSystem => constants.constantSystem; | 585 ConstantSystem get constantSystem => constants.constantSystem; |
| 577 | 586 |
| 578 DiagnosticReporter get reporter => compiler.reporter; | 587 DiagnosticReporter get reporter => compiler.reporter; |
| 579 | 588 |
| 580 CommonElements get commonElements => compiler.commonElements; | 589 CommonElements get commonElements => compiler.commonElements; |
| 581 | 590 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 */ | 744 */ |
| 736 bool isAliasedSuperMember(FunctionElement member) { | 745 bool isAliasedSuperMember(FunctionElement member) { |
| 737 return aliasedSuperMembers.contains(member); | 746 return aliasedSuperMembers.contains(member); |
| 738 } | 747 } |
| 739 | 748 |
| 740 void resolveNativeElement(MemberElement element, NativeRegistry registry) { | 749 void resolveNativeElement(MemberElement element, NativeRegistry registry) { |
| 741 if (element.isFunction || | 750 if (element.isFunction || |
| 742 element.isConstructor || | 751 element.isConstructor || |
| 743 element.isGetter || | 752 element.isGetter || |
| 744 element.isSetter) { | 753 element.isSetter) { |
| 745 compiler.enqueuer.resolution.nativeEnqueuer | 754 _nativeResolutionEnqueuer.handleMethodAnnotations(element); |
| 746 .handleMethodAnnotations(element); | |
| 747 if (nativeData.isNativeMember(element)) { | 755 if (nativeData.isNativeMember(element)) { |
| 748 native.NativeBehavior behavior = | 756 native.NativeBehavior behavior = |
| 749 native.NativeBehavior.ofMethodElement(element, compiler); | 757 native.NativeBehavior.ofMethodElement(element, compiler); |
| 750 nativeDataBuilder.setNativeMethodBehavior(element, behavior); | 758 nativeDataBuilder.setNativeMethodBehavior(element, behavior); |
| 751 registry.registerNativeData(behavior); | 759 registry.registerNativeData(behavior); |
| 752 } | 760 } |
| 753 } else if (element.isField) { | 761 } else if (element.isField) { |
| 754 compiler.enqueuer.resolution.nativeEnqueuer | 762 _nativeResolutionEnqueuer.handleFieldAnnotations(element); |
| 755 .handleFieldAnnotations(element); | |
| 756 if (nativeData.isNativeMember(element)) { | 763 if (nativeData.isNativeMember(element)) { |
| 757 native.NativeBehavior fieldLoadBehavior = | 764 native.NativeBehavior fieldLoadBehavior = |
| 758 native.NativeBehavior.ofFieldElementLoad(element, compiler); | 765 native.NativeBehavior.ofFieldElementLoad(element, compiler); |
| 759 native.NativeBehavior fieldStoreBehavior = | 766 native.NativeBehavior fieldStoreBehavior = |
| 760 native.NativeBehavior.ofFieldElementStore(element, compiler); | 767 native.NativeBehavior.ofFieldElementStore(element, compiler); |
| 761 nativeDataBuilder.setNativeFieldLoadBehavior( | 768 nativeDataBuilder.setNativeFieldLoadBehavior( |
| 762 element, fieldLoadBehavior); | 769 element, fieldLoadBehavior); |
| 763 nativeDataBuilder.setNativeFieldStoreBehavior( | 770 nativeDataBuilder.setNativeFieldStoreBehavior( |
| 764 element, fieldStoreBehavior); | 771 element, fieldStoreBehavior); |
| 765 | 772 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 919 | 926 |
| 920 /// Returns the [WorldImpact] of enabling deferred loading. | 927 /// Returns the [WorldImpact] of enabling deferred loading. |
| 921 WorldImpact computeDeferredLoadingImpact() { | 928 WorldImpact computeDeferredLoadingImpact() { |
| 922 backendUsageBuilder.processBackendImpact(impacts.deferredLoading); | 929 backendUsageBuilder.processBackendImpact(impacts.deferredLoading); |
| 923 return impacts.deferredLoading.createImpact(compiler.elementEnvironment); | 930 return impacts.deferredLoading.createImpact(compiler.elementEnvironment); |
| 924 } | 931 } |
| 925 | 932 |
| 926 /// Called when resolving a call to a foreign function. | 933 /// Called when resolving a call to a foreign function. |
| 927 native.NativeBehavior resolveForeignCall(Send node, Element element, | 934 native.NativeBehavior resolveForeignCall(Send node, Element element, |
| 928 CallStructure callStructure, ForeignResolver resolver) { | 935 CallStructure callStructure, ForeignResolver resolver) { |
| 929 native.NativeResolutionEnqueuer nativeEnqueuer = | |
| 930 compiler.enqueuer.resolution.nativeEnqueuer; | |
| 931 if (element.name == BackendHelpers.JS) { | 936 if (element.name == BackendHelpers.JS) { |
| 932 return nativeEnqueuer.resolveJsCall(node, resolver); | 937 return _nativeResolutionEnqueuer.resolveJsCall(node, resolver); |
| 933 } else if (element.name == BackendHelpers.JS_EMBEDDED_GLOBAL) { | 938 } else if (element.name == BackendHelpers.JS_EMBEDDED_GLOBAL) { |
| 934 return nativeEnqueuer.resolveJsEmbeddedGlobalCall(node, resolver); | 939 return _nativeResolutionEnqueuer.resolveJsEmbeddedGlobalCall( |
| 940 node, resolver); |
| 935 } else if (element.name == BackendHelpers.JS_BUILTIN) { | 941 } else if (element.name == BackendHelpers.JS_BUILTIN) { |
| 936 return nativeEnqueuer.resolveJsBuiltinCall(node, resolver); | 942 return _nativeResolutionEnqueuer.resolveJsBuiltinCall(node, resolver); |
| 937 } else if (element.name == BackendHelpers.JS_INTERCEPTOR_CONSTANT) { | 943 } else if (element.name == BackendHelpers.JS_INTERCEPTOR_CONSTANT) { |
| 938 // The type constant that is an argument to JS_INTERCEPTOR_CONSTANT names | 944 // The type constant that is an argument to JS_INTERCEPTOR_CONSTANT names |
| 939 // a class that will be instantiated outside the program by attaching a | 945 // a class that will be instantiated outside the program by attaching a |
| 940 // native class dispatch record referencing the interceptor. | 946 // native class dispatch record referencing the interceptor. |
| 941 if (!node.argumentsNode.isEmpty) { | 947 if (!node.argumentsNode.isEmpty) { |
| 942 Node argument = node.argumentsNode.nodes.head; | 948 Node argument = node.argumentsNode.nodes.head; |
| 943 ConstantExpression constant = resolver.getConstant(argument); | 949 ConstantExpression constant = resolver.getConstant(argument); |
| 944 if (constant != null && constant.kind == ConstantExpressionKind.TYPE) { | 950 if (constant != null && constant.kind == ConstantExpressionKind.TYPE) { |
| 945 TypeConstantExpression typeConstant = constant; | 951 TypeConstantExpression typeConstant = constant; |
| 946 if (typeConstant.type is ResolutionInterfaceType) { | 952 if (typeConstant.type is ResolutionInterfaceType) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 function = function.withSourceInformation( | 1039 function = function.withSourceInformation( |
| 1034 sourceInformationStrategy.buildSourceMappedMarker()); | 1040 sourceInformationStrategy.buildSourceMappedMarker()); |
| 1035 } | 1041 } |
| 1036 generatedCode[element] = function; | 1042 generatedCode[element] = function; |
| 1037 WorldImpact worldImpact = | 1043 WorldImpact worldImpact = |
| 1038 impactTransformer.transformCodegenImpact(work.registry.worldImpact); | 1044 impactTransformer.transformCodegenImpact(work.registry.worldImpact); |
| 1039 compiler.dumpInfoTask.registerImpact(element, worldImpact); | 1045 compiler.dumpInfoTask.registerImpact(element, worldImpact); |
| 1040 return worldImpact; | 1046 return worldImpact; |
| 1041 } | 1047 } |
| 1042 | 1048 |
| 1043 native.NativeEnqueuer nativeResolutionEnqueuer() { | 1049 native.NativeEnqueuer get nativeResolutionEnqueuer => |
| 1044 return new native.NativeResolutionEnqueuer(compiler); | 1050 _nativeResolutionEnqueuer; |
| 1045 } | |
| 1046 | 1051 |
| 1047 native.NativeEnqueuer nativeCodegenEnqueuer() { | 1052 native.NativeEnqueuer get nativeCodegenEnqueuer => _nativeCodegenEnqueuer; |
| 1048 return new native.NativeCodegenEnqueuer(compiler, emitter); | |
| 1049 } | |
| 1050 | 1053 |
| 1051 ClassElement defaultSuperclass(ClassElement element) { | 1054 ClassElement defaultSuperclass(ClassElement element) { |
| 1052 if (nativeData.isJsInterop(element)) { | 1055 if (nativeData.isJsInterop(element)) { |
| 1053 return helpers.jsJavaScriptObjectClass; | 1056 return helpers.jsJavaScriptObjectClass; |
| 1054 } | 1057 } |
| 1055 // Native classes inherit from Interceptor. | 1058 // Native classes inherit from Interceptor. |
| 1056 return nativeData.isNativeClass(element) | 1059 return nativeData.isNativeClass(element) |
| 1057 ? helpers.jsInterceptorClass | 1060 ? helpers.jsInterceptorClass |
| 1058 : commonElements.objectClass; | 1061 : commonElements.objectClass; |
| 1059 } | 1062 } |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 return _backend.defaultSuperclass(element); | 1654 return _backend.defaultSuperclass(element); |
| 1652 } | 1655 } |
| 1653 | 1656 |
| 1654 @override | 1657 @override |
| 1655 bool isNativeClass(ClassEntity element) => | 1658 bool isNativeClass(ClassEntity element) => |
| 1656 _backend.nativeData.isNativeClass(element); | 1659 _backend.nativeData.isNativeClass(element); |
| 1657 | 1660 |
| 1658 @override | 1661 @override |
| 1659 bool isForeign(Element element) => _backend.isForeign(element); | 1662 bool isForeign(Element element) => _backend.isForeign(element); |
| 1660 } | 1663 } |
| OLD | NEW |