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 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 void registerClosureWithFreeTypeVariables( | 1174 void registerClosureWithFreeTypeVariables( |
1175 Element closure, | 1175 Element closure, |
1176 Enqueuer enqueuer, | 1176 Enqueuer enqueuer, |
1177 Registry registry) { | 1177 Registry registry) { |
1178 if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) { | 1178 if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) { |
1179 registerComputeSignature(enqueuer, registry); | 1179 registerComputeSignature(enqueuer, registry); |
1180 } | 1180 } |
1181 } | 1181 } |
1182 | 1182 |
1183 void registerBoundClosure(Enqueuer enqueuer) { | 1183 void registerBoundClosure(Enqueuer enqueuer) { |
1184 enqueuer.registerInstantiatedClass( | 1184 boundClosureClass.ensureResolved(compiler); |
1185 boundClosureClass, | 1185 enqueuer.registerInstantiatedType( |
| 1186 boundClosureClass.rawType, |
1186 // Precise dependency is not important here. | 1187 // Precise dependency is not important here. |
1187 compiler.globalDependencies); | 1188 compiler.globalDependencies); |
1188 } | 1189 } |
1189 | 1190 |
1190 void registerGetOfStaticFunction(Enqueuer enqueuer) { | 1191 void registerGetOfStaticFunction(Enqueuer enqueuer) { |
1191 enqueuer.registerInstantiatedClass(closureClass, | 1192 closureClass.ensureResolved(compiler); |
1192 compiler.globalDependencies); | 1193 enqueuer.registerInstantiatedType( |
| 1194 closureClass.rawType, compiler.globalDependencies); |
1193 } | 1195 } |
1194 | 1196 |
1195 void registerComputeSignature(Enqueuer enqueuer, Registry registry) { | 1197 void registerComputeSignature(Enqueuer enqueuer, Registry registry) { |
1196 // Calls to [:computeSignature:] are generated by the emitter and we | 1198 // Calls to [:computeSignature:] are generated by the emitter and we |
1197 // therefore need to enqueue the used elements in the codegen enqueuer as | 1199 // therefore need to enqueue the used elements in the codegen enqueuer as |
1198 // well as in the resolution enqueuer. | 1200 // well as in the resolution enqueuer. |
1199 enqueue(enqueuer, getSetRuntimeTypeInfo(), registry); | 1201 enqueue(enqueuer, getSetRuntimeTypeInfo(), registry); |
1200 enqueue(enqueuer, getGetRuntimeTypeInfo(), registry); | 1202 enqueue(enqueuer, getGetRuntimeTypeInfo(), registry); |
1201 enqueue(enqueuer, getComputeSignature(), registry); | 1203 enqueue(enqueuer, getComputeSignature(), registry); |
1202 enqueue(enqueuer, getGetRuntimeTypeArguments(), registry); | 1204 enqueue(enqueuer, getGetRuntimeTypeArguments(), registry); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1364 /// This method calls [registerBackendUse]. | 1366 /// This method calls [registerBackendUse]. |
1365 void enqueueInResolution(Element e, Registry registry) { | 1367 void enqueueInResolution(Element e, Registry registry) { |
1366 if (e == null) return; | 1368 if (e == null) return; |
1367 ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution; | 1369 ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution; |
1368 enqueue(enqueuer, e, registry); | 1370 enqueue(enqueuer, e, registry); |
1369 } | 1371 } |
1370 | 1372 |
1371 /// Register instantiation of [cls] in [enqueuer]. | 1373 /// Register instantiation of [cls] in [enqueuer]. |
1372 /// | 1374 /// |
1373 /// This method calls [registerBackendUse]. | 1375 /// This method calls [registerBackendUse]. |
1374 void enqueueClass(Enqueuer enqueuer, Element cls, Registry registry) { | 1376 void enqueueClass(Enqueuer enqueuer, ClassElement cls, Registry registry) { |
1375 if (cls == null) return; | 1377 if (cls == null) return; |
1376 registerBackendUse(cls); | 1378 registerBackendUse(cls); |
1377 helpersUsed.add(cls.declaration); | 1379 helpersUsed.add(cls.declaration); |
1378 if (cls.declaration != cls.implementation) { | 1380 if (cls.declaration != cls.implementation) { |
1379 helpersUsed.add(cls.implementation); | 1381 helpersUsed.add(cls.implementation); |
1380 } | 1382 } |
1381 enqueuer.registerInstantiatedClass(cls, registry); | 1383 cls.ensureResolved(compiler); |
| 1384 enqueuer.registerInstantiatedType(cls.rawType, registry); |
1382 } | 1385 } |
1383 | 1386 |
1384 void codegen(CodegenWorkItem work) { | 1387 WorldImpact codegen(CodegenWorkItem work) { |
1385 Element element = work.element; | 1388 Element element = work.element; |
1386 if (compiler.elementHasCompileTimeError(element)) { | 1389 if (compiler.elementHasCompileTimeError(element)) { |
1387 generatedCode[element] = jsAst.js( | 1390 generatedCode[element] = jsAst.js( |
1388 "function () { throw new Error('Compile time error in $element') }"); | 1391 "function () { throw new Error('Compile time error in $element') }"); |
1389 return; | 1392 return const WorldImpact(); |
1390 } | 1393 } |
1391 var kind = element.kind; | 1394 var kind = element.kind; |
1392 if (kind == ElementKind.TYPEDEF) return; | 1395 if (kind == ElementKind.TYPEDEF) { |
| 1396 return const WorldImpact(); |
| 1397 } |
1393 if (element.isConstructor && element.enclosingClass == jsNullClass) { | 1398 if (element.isConstructor && element.enclosingClass == jsNullClass) { |
1394 // Work around a problem compiling JSNull's constructor. | 1399 // Work around a problem compiling JSNull's constructor. |
1395 return; | 1400 return const WorldImpact(); |
1396 } | 1401 } |
1397 if (kind.category == ElementCategory.VARIABLE) { | 1402 if (kind.category == ElementCategory.VARIABLE) { |
1398 ConstantExpression initialValue = | 1403 ConstantExpression initialValue = |
1399 constants.getConstantForVariable(element); | 1404 constants.getConstantForVariable(element); |
1400 if (initialValue != null) { | 1405 if (initialValue != null) { |
1401 registerCompileTimeConstant(initialValue.value, work.registry); | 1406 registerCompileTimeConstant(initialValue.value, work.registry); |
1402 constants.addCompileTimeConstantForEmission(initialValue.value); | 1407 constants.addCompileTimeConstantForEmission(initialValue.value); |
1403 // We don't need to generate code for static or top-level | 1408 // We don't need to generate code for static or top-level |
1404 // variables. For instance variables, we may need to generate | 1409 // variables. For instance variables, we may need to generate |
1405 // the checked setter. | 1410 // the checked setter. |
1406 if (Elements.isStaticOrTopLevel(element)) return; | 1411 if (Elements.isStaticOrTopLevel(element)) { |
| 1412 return const WorldImpact(); |
| 1413 } |
1407 } else { | 1414 } else { |
1408 // If the constant-handler was not able to produce a result we have to | 1415 // If the constant-handler was not able to produce a result we have to |
1409 // go through the builder (below) to generate the lazy initializer for | 1416 // go through the builder (below) to generate the lazy initializer for |
1410 // the static variable. | 1417 // the static variable. |
1411 // We also need to register the use of the cyclic-error helper. | 1418 // We also need to register the use of the cyclic-error helper. |
1412 compiler.enqueuer.codegen.registerStaticUse(getCyclicThrowHelper()); | 1419 compiler.enqueuer.codegen.registerStaticUse(getCyclicThrowHelper()); |
1413 } | 1420 } |
1414 } | 1421 } |
1415 generatedCode[element] = functionCompiler.compile(work); | 1422 generatedCode[element] = functionCompiler.compile(work); |
| 1423 return const WorldImpact(); |
1416 } | 1424 } |
1417 | 1425 |
1418 native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) { | 1426 native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) { |
1419 return new native.NativeResolutionEnqueuer(world, compiler); | 1427 return new native.NativeResolutionEnqueuer(world, compiler); |
1420 } | 1428 } |
1421 | 1429 |
1422 native.NativeEnqueuer nativeCodegenEnqueuer(Enqueuer world) { | 1430 native.NativeEnqueuer nativeCodegenEnqueuer(Enqueuer world) { |
1423 return new native.NativeCodegenEnqueuer(world, compiler, emitter); | 1431 return new native.NativeCodegenEnqueuer(world, compiler, emitter); |
1424 } | 1432 } |
1425 | 1433 |
(...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2630 } | 2638 } |
2631 | 2639 |
2632 void registerAsyncMarker(FunctionElement element, | 2640 void registerAsyncMarker(FunctionElement element, |
2633 Enqueuer enqueuer, | 2641 Enqueuer enqueuer, |
2634 Registry registry) { | 2642 Registry registry) { |
2635 if (element.asyncMarker == AsyncMarker.ASYNC) { | 2643 if (element.asyncMarker == AsyncMarker.ASYNC) { |
2636 enqueue(enqueuer, getAsyncHelper(), registry); | 2644 enqueue(enqueuer, getAsyncHelper(), registry); |
2637 enqueue(enqueuer, getCompleterConstructor(), registry); | 2645 enqueue(enqueuer, getCompleterConstructor(), registry); |
2638 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | 2646 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
2639 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { | 2647 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { |
2640 enqueuer.registerInstantiatedClass(getSyncStarIterable(), registry); | 2648 ClassElement clsSyncStarIterable = getSyncStarIterable(); |
| 2649 clsSyncStarIterable.ensureResolved(compiler); |
| 2650 enqueuer.registerInstantiatedType(clsSyncStarIterable.rawType, registry); |
2641 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); | 2651 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); |
2642 enqueue(enqueuer, getEndOfIteration(), registry); | 2652 enqueue(enqueuer, getEndOfIteration(), registry); |
2643 enqueue(enqueuer, getYieldStar(), registry); | 2653 enqueue(enqueuer, getYieldStar(), registry); |
2644 enqueue(enqueuer, getSyncStarUncaughtError(), registry); | 2654 enqueue(enqueuer, getSyncStarUncaughtError(), registry); |
2645 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { | 2655 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
2646 enqueuer.registerInstantiatedClass(getASyncStarController(), registry); | 2656 ClassElement clsASyncStarController = getASyncStarController(); |
| 2657 clsASyncStarController.ensureResolved(compiler); |
| 2658 enqueuer.registerInstantiatedType( |
| 2659 clsASyncStarController.rawType, registry); |
2647 enqueue(enqueuer, getAsyncStarHelper(), registry); | 2660 enqueue(enqueuer, getAsyncStarHelper(), registry); |
2648 enqueue(enqueuer, getStreamOfController(), registry); | 2661 enqueue(enqueuer, getStreamOfController(), registry); |
2649 enqueue(enqueuer, getYieldSingle(), registry); | 2662 enqueue(enqueuer, getYieldSingle(), registry); |
2650 enqueue(enqueuer, getYieldStar(), registry); | 2663 enqueue(enqueuer, getYieldStar(), registry); |
2651 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); | 2664 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); |
2652 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | 2665 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
2653 } | 2666 } |
2654 } | 2667 } |
2655 } | 2668 } |
2656 | 2669 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2929 } | 2942 } |
2930 } | 2943 } |
2931 | 2944 |
2932 /// Records that [constant] is used by the element behind [registry]. | 2945 /// Records that [constant] is used by the element behind [registry]. |
2933 class Dependency { | 2946 class Dependency { |
2934 final ConstantValue constant; | 2947 final ConstantValue constant; |
2935 final Element annotatedElement; | 2948 final Element annotatedElement; |
2936 | 2949 |
2937 const Dependency(this.constant, this.annotatedElement); | 2950 const Dependency(this.constant, this.annotatedElement); |
2938 } | 2951 } |
OLD | NEW |