| 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 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 const VERBOSE_OPTIMIZER_HINTS = false; | 7 const VERBOSE_OPTIMIZER_HINTS = false; |
| 8 | 8 |
| 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
| 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); | 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); |
| (...skipping 1153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 // we make sure they are always generated. | 1164 // we make sure they are always generated. |
| 1165 enqueue(enqueuer, findHelper('isJsIndexable'), registry); | 1165 enqueue(enqueuer, findHelper('isJsIndexable'), registry); |
| 1166 } | 1166 } |
| 1167 | 1167 |
| 1168 customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); | 1168 customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); |
| 1169 if (!enqueuer.isResolutionQueue) { | 1169 if (!enqueuer.isResolutionQueue) { |
| 1170 lookupMapAnalysis.registerInstantiatedClass(cls); | 1170 lookupMapAnalysis.registerInstantiatedClass(cls); |
| 1171 } | 1171 } |
| 1172 } | 1172 } |
| 1173 | 1173 |
| 1174 void registerInstantiatedType(InterfaceType type, Registry registry) { | 1174 void registerInstantiatedType(InterfaceType type, |
| 1175 Enqueuer enqueuer, |
| 1176 Registry registry, |
| 1177 {bool mirrorUsage: false}) { |
| 1175 lookupMapAnalysis.registerInstantiatedType(type, registry); | 1178 lookupMapAnalysis.registerInstantiatedType(type, registry); |
| 1179 super.registerInstantiatedType( |
| 1180 type, enqueuer, registry, mirrorUsage: mirrorUsage); |
| 1176 } | 1181 } |
| 1177 | 1182 |
| 1178 void registerUseInterceptor(Enqueuer enqueuer) { | 1183 void registerUseInterceptor(Enqueuer enqueuer) { |
| 1179 assert(!enqueuer.isResolutionQueue); | 1184 assert(!enqueuer.isResolutionQueue); |
| 1180 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; | 1185 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; |
| 1181 Registry registry = compiler.globalDependencies; | 1186 Registry registry = compiler.globalDependencies; |
| 1182 enqueue(enqueuer, getNativeInterceptorMethod, registry); | 1187 enqueue(enqueuer, getNativeInterceptorMethod, registry); |
| 1183 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); | 1188 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); |
| 1184 needToInitializeIsolateAffinityTag = true; | 1189 needToInitializeIsolateAffinityTag = true; |
| 1185 needToInitializeDispatchProperty = true; | 1190 needToInitializeDispatchProperty = true; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1240 } | 1245 } |
| 1241 } | 1246 } |
| 1242 | 1247 |
| 1243 void registerClosureWithFreeTypeVariables( | 1248 void registerClosureWithFreeTypeVariables( |
| 1244 Element closure, | 1249 Element closure, |
| 1245 Enqueuer enqueuer, | 1250 Enqueuer enqueuer, |
| 1246 Registry registry) { | 1251 Registry registry) { |
| 1247 if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) { | 1252 if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) { |
| 1248 registerComputeSignature(enqueuer, registry); | 1253 registerComputeSignature(enqueuer, registry); |
| 1249 } | 1254 } |
| 1255 super.registerClosureWithFreeTypeVariables(closure, enqueuer, registry); |
| 1250 } | 1256 } |
| 1251 | 1257 |
| 1252 /// Call during codegen if an instance of [closure] is being created. | 1258 /// Call during codegen if an instance of [closure] is being created. |
| 1253 void registerInstantiatedClosure(LocalFunctionElement closure, | 1259 void registerInstantiatedClosure(LocalFunctionElement closure, |
| 1254 CodegenRegistry registry) { | 1260 CodegenRegistry registry) { |
| 1255 if (methodNeedsRti(closure)) { | 1261 if (methodNeedsRti(closure)) { |
| 1256 registerComputeSignature(compiler.enqueuer.codegen, registry); | 1262 registerComputeSignature(compiler.enqueuer.codegen, registry); |
| 1257 } | 1263 } |
| 1258 } | 1264 } |
| 1259 | 1265 |
| 1260 void registerBoundClosure(Enqueuer enqueuer) { | 1266 void registerBoundClosure(Enqueuer enqueuer) { |
| 1261 boundClosureClass.ensureResolved(compiler); | 1267 boundClosureClass.ensureResolved(compiler); |
| 1262 enqueuer.registerInstantiatedType( | 1268 registerInstantiatedType( |
| 1263 boundClosureClass.rawType, | 1269 boundClosureClass.rawType, |
| 1270 enqueuer, |
| 1264 // Precise dependency is not important here. | 1271 // Precise dependency is not important here. |
| 1265 compiler.globalDependencies); | 1272 compiler.globalDependencies); |
| 1266 } | 1273 } |
| 1267 | 1274 |
| 1268 void registerGetOfStaticFunction(Enqueuer enqueuer) { | 1275 void registerGetOfStaticFunction(Enqueuer enqueuer) { |
| 1269 closureClass.ensureResolved(compiler); | 1276 closureClass.ensureResolved(compiler); |
| 1270 enqueuer.registerInstantiatedType( | 1277 registerInstantiatedType( |
| 1271 closureClass.rawType, compiler.globalDependencies); | 1278 closureClass.rawType, |
| 1279 enqueuer, |
| 1280 compiler.globalDependencies); |
| 1272 } | 1281 } |
| 1273 | 1282 |
| 1274 void registerComputeSignature(Enqueuer enqueuer, Registry registry) { | 1283 void registerComputeSignature(Enqueuer enqueuer, Registry registry) { |
| 1275 // Calls to [:computeSignature:] are generated by the emitter and we | 1284 // Calls to [:computeSignature:] are generated by the emitter and we |
| 1276 // therefore need to enqueue the used elements in the codegen enqueuer as | 1285 // therefore need to enqueue the used elements in the codegen enqueuer as |
| 1277 // well as in the resolution enqueuer. | 1286 // well as in the resolution enqueuer. |
| 1278 enqueue(enqueuer, getSetRuntimeTypeInfo(), registry); | 1287 enqueue(enqueuer, getSetRuntimeTypeInfo(), registry); |
| 1279 enqueue(enqueuer, getGetRuntimeTypeInfo(), registry); | 1288 enqueue(enqueuer, getGetRuntimeTypeInfo(), registry); |
| 1280 enqueue(enqueuer, getComputeSignature(), registry); | 1289 enqueue(enqueuer, getComputeSignature(), registry); |
| 1281 enqueue(enqueuer, getGetRuntimeTypeArguments(), registry); | 1290 enqueue(enqueuer, getGetRuntimeTypeArguments(), registry); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1447 /// | 1456 /// |
| 1448 /// This method calls [registerBackendUse]. | 1457 /// This method calls [registerBackendUse]. |
| 1449 void enqueueClass(Enqueuer enqueuer, ClassElement cls, Registry registry) { | 1458 void enqueueClass(Enqueuer enqueuer, ClassElement cls, Registry registry) { |
| 1450 if (cls == null) return; | 1459 if (cls == null) return; |
| 1451 registerBackendUse(cls); | 1460 registerBackendUse(cls); |
| 1452 helpersUsed.add(cls.declaration); | 1461 helpersUsed.add(cls.declaration); |
| 1453 if (cls.declaration != cls.implementation) { | 1462 if (cls.declaration != cls.implementation) { |
| 1454 helpersUsed.add(cls.implementation); | 1463 helpersUsed.add(cls.implementation); |
| 1455 } | 1464 } |
| 1456 cls.ensureResolved(compiler); | 1465 cls.ensureResolved(compiler); |
| 1457 enqueuer.registerInstantiatedType(cls.rawType, registry); | 1466 registerInstantiatedType(cls.rawType, enqueuer, registry); |
| 1458 } | 1467 } |
| 1459 | 1468 |
| 1460 WorldImpact codegen(CodegenWorkItem work) { | 1469 WorldImpact codegen(CodegenWorkItem work) { |
| 1461 Element element = work.element; | 1470 Element element = work.element; |
| 1462 if (compiler.elementHasCompileTimeError(element)) { | 1471 if (compiler.elementHasCompileTimeError(element)) { |
| 1463 generatedCode[element] = jsAst.js( | 1472 generatedCode[element] = jsAst.js( |
| 1464 "function () { throw new Error('Compile time error in $element') }"); | 1473 "function () { throw new Error('Compile time error in $element') }"); |
| 1465 return const WorldImpact(); | 1474 return const WorldImpact(); |
| 1466 } | 1475 } |
| 1467 var kind = element.kind; | 1476 var kind = element.kind; |
| (...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2752 Enqueuer enqueuer, | 2761 Enqueuer enqueuer, |
| 2753 Registry registry) { | 2762 Registry registry) { |
| 2754 if (element.asyncMarker == AsyncMarker.ASYNC) { | 2763 if (element.asyncMarker == AsyncMarker.ASYNC) { |
| 2755 enqueue(enqueuer, getAsyncHelper(), registry); | 2764 enqueue(enqueuer, getAsyncHelper(), registry); |
| 2756 enqueue(enqueuer, getSyncCompleterConstructor(), registry); | 2765 enqueue(enqueuer, getSyncCompleterConstructor(), registry); |
| 2757 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | 2766 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
| 2758 enqueue(enqueuer, getWrapBody(), registry); | 2767 enqueue(enqueuer, getWrapBody(), registry); |
| 2759 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { | 2768 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { |
| 2760 ClassElement clsSyncStarIterable = getSyncStarIterable(); | 2769 ClassElement clsSyncStarIterable = getSyncStarIterable(); |
| 2761 clsSyncStarIterable.ensureResolved(compiler); | 2770 clsSyncStarIterable.ensureResolved(compiler); |
| 2762 enqueuer.registerInstantiatedType(clsSyncStarIterable.rawType, registry); | 2771 registerInstantiatedType(clsSyncStarIterable.rawType, enqueuer, registry); |
| 2763 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); | 2772 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); |
| 2764 enqueue(enqueuer, getEndOfIteration(), registry); | 2773 enqueue(enqueuer, getEndOfIteration(), registry); |
| 2765 enqueue(enqueuer, getYieldStar(), registry); | 2774 enqueue(enqueuer, getYieldStar(), registry); |
| 2766 enqueue(enqueuer, getSyncStarUncaughtError(), registry); | 2775 enqueue(enqueuer, getSyncStarUncaughtError(), registry); |
| 2767 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { | 2776 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
| 2768 ClassElement clsASyncStarController = getASyncStarController(); | 2777 ClassElement clsASyncStarController = getASyncStarController(); |
| 2769 clsASyncStarController.ensureResolved(compiler); | 2778 clsASyncStarController.ensureResolved(compiler); |
| 2770 enqueuer.registerInstantiatedType( | 2779 registerInstantiatedType( |
| 2771 clsASyncStarController.rawType, registry); | 2780 clsASyncStarController.rawType, enqueuer, registry); |
| 2772 enqueue(enqueuer, getAsyncStarHelper(), registry); | 2781 enqueue(enqueuer, getAsyncStarHelper(), registry); |
| 2773 enqueue(enqueuer, getStreamOfController(), registry); | 2782 enqueue(enqueuer, getStreamOfController(), registry); |
| 2774 enqueue(enqueuer, getYieldSingle(), registry); | 2783 enqueue(enqueuer, getYieldSingle(), registry); |
| 2775 enqueue(enqueuer, getYieldStar(), registry); | 2784 enqueue(enqueuer, getYieldStar(), registry); |
| 2776 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); | 2785 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); |
| 2777 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | 2786 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
| 2778 enqueue(enqueuer, getWrapBody(), registry); | 2787 enqueue(enqueuer, getWrapBody(), registry); |
| 2779 } | 2788 } |
| 2780 } | 2789 } |
| 2781 | 2790 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3192 } | 3201 } |
| 3193 } | 3202 } |
| 3194 | 3203 |
| 3195 /// Records that [constant] is used by the element behind [registry]. | 3204 /// Records that [constant] is used by the element behind [registry]. |
| 3196 class Dependency { | 3205 class Dependency { |
| 3197 final ConstantValue constant; | 3206 final ConstantValue constant; |
| 3198 final Element annotatedElement; | 3207 final Element annotatedElement; |
| 3199 | 3208 |
| 3200 const Dependency(this.constant, this.annotatedElement); | 3209 const Dependency(this.constant, this.annotatedElement); |
| 3201 } | 3210 } |
| OLD | NEW |