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 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 reporter.reportErrorMessage( | 959 reporter.reportErrorMessage( |
960 node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); | 960 node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
961 } | 961 } |
962 // No native behavior for this call. | 962 // No native behavior for this call. |
963 return null; | 963 return null; |
964 } | 964 } |
965 | 965 |
966 bool isComplexNoSuchMethod(FunctionElement element) => | 966 bool isComplexNoSuchMethod(FunctionElement element) => |
967 noSuchMethodRegistry.isComplex(element); | 967 noSuchMethodRegistry.isComplex(element); |
968 | 968 |
969 CodegenEnqueuer get codegenEnqueuer => compiler.enqueuer.codegen; | |
970 | |
971 /// Creates an [Enqueuer] for code generation specific to this backend. | 969 /// Creates an [Enqueuer] for code generation specific to this backend. |
972 CodegenEnqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler) { | 970 CodegenEnqueuer createCodegenEnqueuer(CompilerTask task, Compiler compiler) { |
973 return new CodegenEnqueuer( | 971 return new CodegenEnqueuer( |
974 task, this, compiler.options, const TreeShakingEnqueuerStrategy()); | 972 task, this, compiler.options, const TreeShakingEnqueuerStrategy()); |
975 } | 973 } |
976 | 974 |
977 WorldImpact codegen(CodegenWorkItem work) { | 975 WorldImpact codegen(CodegenWorkItem work) { |
978 Element element = work.element; | 976 Element element = work.element; |
979 if (compiler.elementHasCompileTimeError(element)) { | 977 if (compiler.elementHasCompileTimeError(element)) { |
980 DiagnosticMessage message = | 978 DiagnosticMessage message = |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1124 element == commonElements.numClass || | 1122 element == commonElements.numClass || |
1125 element == commonElements.intClass || | 1123 element == commonElements.intClass || |
1126 element == commonElements.doubleClass || | 1124 element == commonElements.doubleClass || |
1127 element == helpers.jsArrayClass || | 1125 element == helpers.jsArrayClass || |
1128 element == helpers.jsMutableArrayClass || | 1126 element == helpers.jsMutableArrayClass || |
1129 element == helpers.jsExtendableArrayClass || | 1127 element == helpers.jsExtendableArrayClass || |
1130 element == helpers.jsFixedArrayClass || | 1128 element == helpers.jsFixedArrayClass || |
1131 element == helpers.jsUnmodifiableArrayClass; | 1129 element == helpers.jsUnmodifiableArrayClass; |
1132 } | 1130 } |
1133 | 1131 |
1134 bool mayGenerateInstanceofCheck(ResolutionDartType type) { | |
1135 // We can use an instanceof check for raw types that have no subclass that | |
1136 // is mixed-in or in an implements clause. | |
1137 | |
1138 if (!type.isRaw) return false; | |
1139 ClassElement classElement = type.element; | |
1140 if (interceptorData.isInterceptedClass(classElement)) return false; | |
1141 return _closedWorld.hasOnlySubclasses(classElement); | |
1142 } | |
1143 | |
1144 /// This method is called immediately after the [library] and its parts have | 1132 /// This method is called immediately after the [library] and its parts have |
1145 /// been scanned. | 1133 /// been scanned. |
1146 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { | 1134 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { |
1147 if (!compiler.serialization.isDeserialized(library)) { | 1135 if (!compiler.serialization.isDeserialized(library)) { |
1148 if (canLibraryUseNative(library)) { | 1136 if (canLibraryUseNative(library)) { |
1149 library.forEachLocalMember((Element element) { | 1137 library.forEachLocalMember((Element element) { |
1150 if (element.isClass) { | 1138 if (element.isClass) { |
1151 checkNativeAnnotation(compiler, element); | 1139 checkNativeAnnotation(compiler, element); |
1152 } | 1140 } |
1153 }); | 1141 }); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1244 message: "ClosedWorld has not be set yet.")); | 1232 message: "ClosedWorld has not be set yet.")); |
1245 return _closedWorldCache; | 1233 return _closedWorldCache; |
1246 } | 1234 } |
1247 | 1235 |
1248 void set _closedWorld(ClosedWorld value) { | 1236 void set _closedWorld(ClosedWorld value) { |
1249 _closedWorldCache = value; | 1237 _closedWorldCache = value; |
1250 } | 1238 } |
1251 | 1239 |
1252 /// Called when the compiler starts running the codegen enqueuer. The | 1240 /// Called when the compiler starts running the codegen enqueuer. The |
1253 /// [WorldImpact] of enabled backend features is returned. | 1241 /// [WorldImpact] of enabled backend features is returned. |
1254 WorldImpact onCodegenStart(ClosedWorld closedWorld) { | 1242 WorldImpact onCodegenStart( |
| 1243 ClosedWorld closedWorld, CodegenWorldBuilder codegenWorldBuilder) { |
1255 _closedWorld = closedWorld; | 1244 _closedWorld = closedWorld; |
1256 _namer = determineNamer(_closedWorld, compiler.codegenWorldBuilder); | 1245 _namer = determineNamer(closedWorld, codegenWorldBuilder); |
1257 tracer = new Tracer(_closedWorld, namer, compiler); | 1246 tracer = new Tracer(closedWorld, namer, compiler); |
1258 emitter.createEmitter(_namer, _closedWorld); | 1247 emitter.createEmitter(_namer, closedWorld); |
1259 _rtiEncoder = | 1248 _rtiEncoder = |
1260 _namer.rtiEncoder = new _RuntimeTypesEncoder(_namer, emitter, helpers); | 1249 _namer.rtiEncoder = new _RuntimeTypesEncoder(_namer, emitter, helpers); |
1261 | 1250 |
1262 lookupMapAnalysis.onCodegenStart(lookupMapLibraryAccess); | 1251 lookupMapAnalysis.onCodegenStart(lookupMapLibraryAccess); |
1263 return const WorldImpact(); | 1252 return const WorldImpact(); |
1264 } | 1253 } |
1265 | 1254 |
1266 /// Called when code generation has been completed. | 1255 /// Called when code generation has been completed. |
1267 void onCodegenEnd() { | 1256 void onCodegenEnd() { |
1268 sourceInformationStrategy.onComplete(); | 1257 sourceInformationStrategy.onComplete(); |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1654 return _backend.defaultSuperclass(element); | 1643 return _backend.defaultSuperclass(element); |
1655 } | 1644 } |
1656 | 1645 |
1657 @override | 1646 @override |
1658 bool isNativeClass(ClassEntity element) => | 1647 bool isNativeClass(ClassEntity element) => |
1659 _backend.nativeData.isNativeClass(element); | 1648 _backend.nativeData.isNativeClass(element); |
1660 | 1649 |
1661 @override | 1650 @override |
1662 bool isForeign(Element element) => _backend.isForeign(element); | 1651 bool isForeign(Element element) => _backend.isForeign(element); |
1663 } | 1652 } |
OLD | NEW |