| 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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 CustomElementsResolutionAnalysis customElementsResolutionAnalysis; | 390 CustomElementsResolutionAnalysis customElementsResolutionAnalysis; |
| 391 | 391 |
| 392 /// Codegen support for generating table of interceptors and | 392 /// Codegen support for generating table of interceptors and |
| 393 /// constructors for custom elements. | 393 /// constructors for custom elements. |
| 394 CustomElementsCodegenAnalysis customElementsCodegenAnalysis; | 394 CustomElementsCodegenAnalysis customElementsCodegenAnalysis; |
| 395 | 395 |
| 396 /// Resolution support for tree-shaking entries of `LookupMap`. | 396 /// Resolution support for tree-shaking entries of `LookupMap`. |
| 397 LookupMapLibraryAccess lookupMapLibraryAccess; | 397 LookupMapLibraryAccess lookupMapLibraryAccess; |
| 398 | 398 |
| 399 /// Codegen support for tree-shaking entries of `LookupMap`. | 399 /// Codegen support for tree-shaking entries of `LookupMap`. |
| 400 LookupMapAnalysis lookupMapAnalysis; | 400 LookupMapAnalysis _lookupMapAnalysis; |
| 401 | 401 |
| 402 /// Codegen support for typed JavaScript interop. | 402 /// Codegen support for typed JavaScript interop. |
| 403 JsInteropAnalysis jsInteropAnalysis; | 403 JsInteropAnalysis jsInteropAnalysis; |
| 404 | 404 |
| 405 /// Support for classifying `noSuchMethod` implementations. | 405 /// Support for classifying `noSuchMethod` implementations. |
| 406 NoSuchMethodRegistry noSuchMethodRegistry; | 406 NoSuchMethodRegistry noSuchMethodRegistry; |
| 407 | 407 |
| 408 /// Resolution and codegen support for computing reflectable elements. | 408 /// Resolution and codegen support for computing reflectable elements. |
| 409 MirrorsAnalysis mirrorsAnalysis; | 409 MirrorsAnalysis mirrorsAnalysis; |
| 410 | 410 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 compiler.resolution, | 530 compiler.resolution, |
| 531 constantSystem, | 531 constantSystem, |
| 532 commonElements, | 532 commonElements, |
| 533 backendClasses, | 533 backendClasses, |
| 534 helpers, | 534 helpers, |
| 535 nativeClassData); | 535 nativeClassData); |
| 536 jsInteropAnalysis = new JsInteropAnalysis(this); | 536 jsInteropAnalysis = new JsInteropAnalysis(this); |
| 537 mirrorsAnalysis = new MirrorsAnalysis(this, compiler.resolution); | 537 mirrorsAnalysis = new MirrorsAnalysis(this, compiler.resolution); |
| 538 lookupMapLibraryAccess = | 538 lookupMapLibraryAccess = |
| 539 new LookupMapLibraryAccess(reporter, compiler.elementEnvironment); | 539 new LookupMapLibraryAccess(reporter, compiler.elementEnvironment); |
| 540 lookupMapAnalysis = new LookupMapAnalysis(this, compiler.options, reporter, | |
| 541 compiler.elementEnvironment, commonElements, helpers, backendClasses); | |
| 542 | 540 |
| 543 noSuchMethodRegistry = new NoSuchMethodRegistry(this); | 541 noSuchMethodRegistry = new NoSuchMethodRegistry(this); |
| 544 kernelTask = new KernelTask(compiler); | 542 kernelTask = new KernelTask(compiler); |
| 545 impactTransformer = new JavaScriptImpactTransformer( | 543 impactTransformer = new JavaScriptImpactTransformer( |
| 546 compiler.options, | 544 compiler.options, |
| 547 compiler.resolution, | 545 compiler.resolution, |
| 548 compiler.elementEnvironment, | 546 compiler.elementEnvironment, |
| 549 commonElements, | 547 commonElements, |
| 550 impacts, | 548 impacts, |
| 551 nativeClassData, | 549 nativeClassData, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 568 ConstantSystem get constantSystem => constants.constantSystem; | 566 ConstantSystem get constantSystem => constants.constantSystem; |
| 569 | 567 |
| 570 DiagnosticReporter get reporter => compiler.reporter; | 568 DiagnosticReporter get reporter => compiler.reporter; |
| 571 | 569 |
| 572 CommonElements get commonElements => compiler.commonElements; | 570 CommonElements get commonElements => compiler.commonElements; |
| 573 | 571 |
| 574 Resolution get resolution => compiler.resolution; | 572 Resolution get resolution => compiler.resolution; |
| 575 | 573 |
| 576 Target get target => _target; | 574 Target get target => _target; |
| 577 | 575 |
| 576 /// Codegen support for tree-shaking entries of `LookupMap`. |
| 577 LookupMapAnalysis get lookupMapAnalysis { |
| 578 assert(invariant(NO_LOCATION_SPANNABLE, _lookupMapAnalysis != null, |
| 579 message: "LookupMapAnalysis has not been created yet.")); |
| 580 return _lookupMapAnalysis; |
| 581 } |
| 582 |
| 578 InterceptorData get interceptorData { | 583 InterceptorData get interceptorData { |
| 579 assert(invariant(NO_LOCATION_SPANNABLE, _interceptorData != null, | 584 assert(invariant(NO_LOCATION_SPANNABLE, _interceptorData != null, |
| 580 message: "InterceptorData has not been computed yet.")); | 585 message: "InterceptorData has not been computed yet.")); |
| 581 return _interceptorData; | 586 return _interceptorData; |
| 582 } | 587 } |
| 583 | 588 |
| 584 InterceptorDataBuilder get interceptorDataBuilder { | 589 InterceptorDataBuilder get interceptorDataBuilder { |
| 585 assert(invariant(NO_LOCATION_SPANNABLE, _interceptorData == null, | 590 assert(invariant(NO_LOCATION_SPANNABLE, _interceptorData == null, |
| 586 message: "InterceptorData has already been computed.")); | 591 message: "InterceptorData has already been computed.")); |
| 587 return _interceptorDataBuilder; | 592 return _interceptorDataBuilder; |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 typeVariableAnalysis, | 882 typeVariableAnalysis, |
| 878 _nativeResolutionEnqueuer), | 883 _nativeResolutionEnqueuer), |
| 879 new ElementResolutionWorldBuilder( | 884 new ElementResolutionWorldBuilder( |
| 880 this, compiler.resolution, const OpenWorldStrategy()), | 885 this, compiler.resolution, const OpenWorldStrategy()), |
| 881 new ResolutionWorkItemBuilder(compiler.resolution)); | 886 new ResolutionWorkItemBuilder(compiler.resolution)); |
| 882 } | 887 } |
| 883 | 888 |
| 884 /// Creates an [Enqueuer] for code generation specific to this backend. | 889 /// Creates an [Enqueuer] for code generation specific to this backend. |
| 885 CodegenEnqueuer createCodegenEnqueuer( | 890 CodegenEnqueuer createCodegenEnqueuer( |
| 886 CompilerTask task, Compiler compiler, ClosedWorld closedWorld) { | 891 CompilerTask task, Compiler compiler, ClosedWorld closedWorld) { |
| 892 _lookupMapAnalysis = new LookupMapAnalysis( |
| 893 reporter, |
| 894 constantSystem, |
| 895 constants, |
| 896 compiler.elementEnvironment, |
| 897 commonElements, |
| 898 helpers, |
| 899 backendClasses, |
| 900 lookupMapLibraryAccess); |
| 887 return new CodegenEnqueuer( | 901 return new CodegenEnqueuer( |
| 888 task, | 902 task, |
| 889 compiler.options, | 903 compiler.options, |
| 890 const TreeShakingEnqueuerStrategy(), | 904 const TreeShakingEnqueuerStrategy(), |
| 891 new CodegenWorldBuilderImpl( | 905 new CodegenWorldBuilderImpl( |
| 892 nativeClassData, closedWorld, constants, const TypeMaskStrategy()), | 906 nativeClassData, closedWorld, constants, const TypeMaskStrategy()), |
| 893 new CodegenWorkItemBuilder(this, compiler.options), | 907 new CodegenWorkItemBuilder(this, compiler.options), |
| 894 new CodegenEnqueuerListener( | 908 new CodegenEnqueuerListener( |
| 895 compiler.dumpInfoTask, | 909 compiler.dumpInfoTask, |
| 896 compiler.elementEnvironment, | 910 compiler.elementEnvironment, |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 | 1148 |
| 1135 List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record]; | 1149 List<jsAst.Expression> arguments = <jsAst.Expression>[use1, record]; |
| 1136 MethodElement helper = helpers.isJsIndexable; | 1150 MethodElement helper = helpers.isJsIndexable; |
| 1137 jsAst.Expression helperExpression = emitter.staticFunctionAccess(helper); | 1151 jsAst.Expression helperExpression = emitter.staticFunctionAccess(helper); |
| 1138 return new jsAst.Call(helperExpression, arguments); | 1152 return new jsAst.Call(helperExpression, arguments); |
| 1139 } | 1153 } |
| 1140 | 1154 |
| 1141 /// Called after the queue is closed. [onQueueEmpty] may be called multiple | 1155 /// Called after the queue is closed. [onQueueEmpty] may be called multiple |
| 1142 /// times, but [onQueueClosed] is only called once. | 1156 /// times, but [onQueueClosed] is only called once. |
| 1143 void onQueueClosed() { | 1157 void onQueueClosed() { |
| 1144 lookupMapAnalysis.onQueueClosed(); | |
| 1145 jsInteropAnalysis.onQueueClosed(); | 1158 jsInteropAnalysis.onQueueClosed(); |
| 1146 } | 1159 } |
| 1147 | 1160 |
| 1148 // TODO(johnniwinther): Create a CodegenPhase object for the backend to hold | 1161 // TODO(johnniwinther): Create a CodegenPhase object for the backend to hold |
| 1149 // data only available during code generation. | 1162 // data only available during code generation. |
| 1150 ClosedWorld _closedWorldCache; | 1163 ClosedWorld _closedWorldCache; |
| 1151 ClosedWorld get _closedWorld { | 1164 ClosedWorld get _closedWorld { |
| 1152 assert(invariant(NO_LOCATION_SPANNABLE, _closedWorldCache != null, | 1165 assert(invariant(NO_LOCATION_SPANNABLE, _closedWorldCache != null, |
| 1153 message: "ClosedWorld has not be set yet.")); | 1166 message: "ClosedWorld has not be set yet.")); |
| 1154 return _closedWorldCache; | 1167 return _closedWorldCache; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1176 checkedModeHelpers, | 1189 checkedModeHelpers, |
| 1177 nativeData, | 1190 nativeData, |
| 1178 rtiNeed, | 1191 rtiNeed, |
| 1179 nativeCodegenEnqueuer, | 1192 nativeCodegenEnqueuer, |
| 1180 namer, | 1193 namer, |
| 1181 mirrorsData, | 1194 mirrorsData, |
| 1182 oneShotInterceptorData, | 1195 oneShotInterceptorData, |
| 1183 lookupMapAnalysis, | 1196 lookupMapAnalysis, |
| 1184 customElementsCodegenAnalysis, | 1197 customElementsCodegenAnalysis, |
| 1185 rtiChecksBuilder); | 1198 rtiChecksBuilder); |
| 1186 lookupMapAnalysis.onCodegenStart(lookupMapLibraryAccess); | |
| 1187 return const WorldImpact(); | 1199 return const WorldImpact(); |
| 1188 } | 1200 } |
| 1189 | 1201 |
| 1190 /// Called when code generation has been completed. | 1202 /// Called when code generation has been completed. |
| 1191 void onCodegenEnd() { | 1203 void onCodegenEnd() { |
| 1192 sourceInformationStrategy.onComplete(); | 1204 sourceInformationStrategy.onComplete(); |
| 1193 tracer.close(); | 1205 tracer.close(); |
| 1194 } | 1206 } |
| 1195 | 1207 |
| 1196 // Does this element belong in the output | 1208 // Does this element belong in the output |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 return _backend.defaultSuperclass(element); | 1585 return _backend.defaultSuperclass(element); |
| 1574 } | 1586 } |
| 1575 | 1587 |
| 1576 @override | 1588 @override |
| 1577 bool isNativeClass(ClassEntity element) => | 1589 bool isNativeClass(ClassEntity element) => |
| 1578 _backend.nativeClassData.isNativeClass(element); | 1590 _backend.nativeClassData.isNativeClass(element); |
| 1579 | 1591 |
| 1580 @override | 1592 @override |
| 1581 bool isForeign(Element element) => _backend.isForeign(element); | 1593 bool isForeign(Element element) => _backend.isForeign(element); |
| 1582 } | 1594 } |
| OLD | NEW |