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 1402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1413 Element element = find(isolateHelperLibrary, name); | 1413 Element element = find(isolateHelperLibrary, name); |
1414 enqueuer.addToWorkList(element); | 1414 enqueuer.addToWorkList(element); |
1415 compiler.globalDependencies.registerDependency(element); | 1415 compiler.globalDependencies.registerDependency(element); |
1416 helpersUsed.add(element.declaration); | 1416 helpersUsed.add(element.declaration); |
1417 } | 1417 } |
1418 } else { | 1418 } else { |
1419 enqueuer.addToWorkList(find(isolateHelperLibrary, START_ROOT_ISOLATE)); | 1419 enqueuer.addToWorkList(find(isolateHelperLibrary, START_ROOT_ISOLATE)); |
1420 } | 1420 } |
1421 } | 1421 } |
1422 | 1422 |
1423 void registerRequiredType(DartType type) { | 1423 void registerRequiredType(DartType type, Element enclosingElement) { |
1424 // If [argument] has type variables or is a type variable, this method | 1424 // If [argument] has type variables or is a type variable, this method |
1425 // registers a RTI dependency between the class where the type variable is | 1425 // registers a RTI dependency between the class where the type variable is |
1426 // defined (that is the enclosing class of the current element being | 1426 // defined (that is the enclosing class of the current element being |
1427 // resolved) and the class of [type]. If the class of [type] requires RTI, | 1427 // resolved) and the class of [type]. If the class of [type] requires RTI, |
1428 // then the class of the type variable does too. | 1428 // then the class of the type variable does too. |
1429 ClassElement contextClass = Types.getClassContext(type); | 1429 ClassElement contextClass = Types.getClassContext(type); |
1430 if (contextClass != null) { | 1430 if (contextClass != null) { |
| 1431 assert(contextClass == enclosingElement.enclosingClass.declaration); |
1431 rti.registerRtiDependency(type.element, contextClass); | 1432 rti.registerRtiDependency(type.element, contextClass); |
1432 } | 1433 } |
1433 } | 1434 } |
1434 | 1435 |
1435 bool classNeedsRti(ClassElement cls) { | 1436 bool classNeedsRti(ClassElement cls) { |
1436 return rti.classesNeedingRti.contains(cls.declaration) || | 1437 return rti.classesNeedingRti.contains(cls.declaration) || |
1437 compiler.enabledRuntimeType; | 1438 compiler.enabledRuntimeType; |
1438 } | 1439 } |
1439 | 1440 |
1440 bool isComplexNoSuchMethod(FunctionElement element) => | 1441 bool isComplexNoSuchMethod(FunctionElement element) => |
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2419 for (ClassElement cls in resolution.universe.directlyInstantiatedClasses) { | 2420 for (ClassElement cls in resolution.universe.directlyInstantiatedClasses) { |
2420 // Do not process internal classes. | 2421 // Do not process internal classes. |
2421 if (cls.library.isInternalLibrary || cls.isInjected) continue; | 2422 if (cls.library.isInternalLibrary || cls.isInjected) continue; |
2422 if (referencedFromMirrorSystem(cls)) { | 2423 if (referencedFromMirrorSystem(cls)) { |
2423 Set<Name> memberNames = new Set<Name>(); | 2424 Set<Name> memberNames = new Set<Name>(); |
2424 // 1) the class (should be resolved) | 2425 // 1) the class (should be resolved) |
2425 assert(invariant(cls, cls.isResolved)); | 2426 assert(invariant(cls, cls.isResolved)); |
2426 reflectableMembers.add(cls); | 2427 reflectableMembers.add(cls); |
2427 // 2) its constructors (if resolved) | 2428 // 2) its constructors (if resolved) |
2428 cls.constructors.forEach((Element constructor) { | 2429 cls.constructors.forEach((Element constructor) { |
2429 if (resolution.hasBeenProcessed(constructor)) { | 2430 if (resolution.hasBeenResolved(constructor)) { |
2430 reflectableMembers.add(constructor); | 2431 reflectableMembers.add(constructor); |
2431 } | 2432 } |
2432 }); | 2433 }); |
2433 // 3) all members, including fields via getter/setters (if resolved) | 2434 // 3) all members, including fields via getter/setters (if resolved) |
2434 cls.forEachClassMember((Member member) { | 2435 cls.forEachClassMember((Member member) { |
2435 if (resolution.hasBeenProcessed(member.element)) { | 2436 if (resolution.hasBeenResolved(member.element)) { |
2436 memberNames.add(member.name); | 2437 memberNames.add(member.name); |
2437 reflectableMembers.add(member.element); | 2438 reflectableMembers.add(member.element); |
2438 } | 2439 } |
2439 }); | 2440 }); |
2440 // 4) all overriding members of subclasses/subtypes (should be resolved) | 2441 // 4) all overriding members of subclasses/subtypes (should be resolved) |
2441 if (compiler.world.hasAnyStrictSubtype(cls)) { | 2442 if (compiler.world.hasAnyStrictSubtype(cls)) { |
2442 for (ClassElement subcls in compiler.world.strictSubtypesOf(cls)) { | 2443 for (ClassElement subcls in compiler.world.strictSubtypesOf(cls)) { |
2443 subcls.forEachClassMember((Member member) { | 2444 subcls.forEachClassMember((Member member) { |
2444 if (memberNames.contains(member.name)) { | 2445 if (memberNames.contains(member.name)) { |
2445 // TODO(20993): find out why this assertion fails. | 2446 // TODO(20993): find out why this assertion fails. |
2446 // assert(invariant(member.element, | 2447 // assert(invariant(member.element, |
2447 // resolution.hasBeenProcessed(member.element))); | 2448 // resolution.hasBeenResolved(member.element))); |
2448 if (resolution.hasBeenProcessed(member.element)) { | 2449 if (resolution.hasBeenResolved(member.element)) { |
2449 reflectableMembers.add(member.element); | 2450 reflectableMembers.add(member.element); |
2450 } | 2451 } |
2451 } | 2452 } |
2452 }); | 2453 }); |
2453 } | 2454 } |
2454 } | 2455 } |
2455 // 5) all its closures | 2456 // 5) all its closures |
2456 List<LocalFunctionElement> closures = closureMap[cls]; | 2457 List<LocalFunctionElement> closures = closureMap[cls]; |
2457 if (closures != null) { | 2458 if (closures != null) { |
2458 reflectableMembers.addAll(closures); | 2459 reflectableMembers.addAll(closures); |
2459 foundClosure = true; | 2460 foundClosure = true; |
2460 } | 2461 } |
2461 } else { | 2462 } else { |
2462 // check members themselves | 2463 // check members themselves |
2463 cls.constructors.forEach((ConstructorElement element) { | 2464 cls.constructors.forEach((ConstructorElement element) { |
2464 if (!resolution.hasBeenProcessed(element)) return; | 2465 if (!resolution.hasBeenResolved(element)) return; |
2465 if (referencedFromMirrorSystem(element, false)) { | 2466 if (referencedFromMirrorSystem(element, false)) { |
2466 reflectableMembers.add(element); | 2467 reflectableMembers.add(element); |
2467 } | 2468 } |
2468 }); | 2469 }); |
2469 cls.forEachClassMember((Member member) { | 2470 cls.forEachClassMember((Member member) { |
2470 if (!resolution.hasBeenProcessed(member.element)) return; | 2471 if (!resolution.hasBeenResolved(member.element)) return; |
2471 if (referencedFromMirrorSystem(member.element, false)) { | 2472 if (referencedFromMirrorSystem(member.element, false)) { |
2472 reflectableMembers.add(member.element); | 2473 reflectableMembers.add(member.element); |
2473 } | 2474 } |
2474 }); | 2475 }); |
2475 // Also add in closures. Those might be reflectable is their enclosing | 2476 // Also add in closures. Those might be reflectable is their enclosing |
2476 // member is. | 2477 // member is. |
2477 List<LocalFunctionElement> closures = closureMap[cls]; | 2478 List<LocalFunctionElement> closures = closureMap[cls]; |
2478 if (closures != null) { | 2479 if (closures != null) { |
2479 for (LocalFunctionElement closure in closures) { | 2480 for (LocalFunctionElement closure in closures) { |
2480 if (referencedFromMirrorSystem(closure.memberContext, false)) { | 2481 if (referencedFromMirrorSystem(closure.memberContext, false)) { |
2481 reflectableMembers.add(closure); | 2482 reflectableMembers.add(closure); |
2482 foundClosure = true; | 2483 foundClosure = true; |
2483 } | 2484 } |
2484 } | 2485 } |
2485 } | 2486 } |
2486 } | 2487 } |
2487 } | 2488 } |
2488 // We also need top-level non-class elements like static functions and | 2489 // We also need top-level non-class elements like static functions and |
2489 // global fields. We use the resolution queue to decide which elements are | 2490 // global fields. We use the resolution queue to decide which elements are |
2490 // part of the live world. | 2491 // part of the live world. |
2491 for (LibraryElement lib in compiler.libraryLoader.libraries) { | 2492 for (LibraryElement lib in compiler.libraryLoader.libraries) { |
2492 if (lib.isInternalLibrary) continue; | 2493 if (lib.isInternalLibrary) continue; |
2493 lib.forEachLocalMember((Element member) { | 2494 lib.forEachLocalMember((Element member) { |
2494 if (!member.isClass && | 2495 if (!member.isClass && |
2495 resolution.hasBeenProcessed(member) && | 2496 resolution.hasBeenResolved(member) && |
2496 referencedFromMirrorSystem(member)) { | 2497 referencedFromMirrorSystem(member)) { |
2497 reflectableMembers.add(member); | 2498 reflectableMembers.add(member); |
2498 } | 2499 } |
2499 }); | 2500 }); |
2500 } | 2501 } |
2501 // And closures inside top-level elements that do not have a surrounding | 2502 // And closures inside top-level elements that do not have a surrounding |
2502 // class. These will be in the [:null:] bucket of the [closureMap]. | 2503 // class. These will be in the [:null:] bucket of the [closureMap]. |
2503 if (closureMap.containsKey(null)) { | 2504 if (closureMap.containsKey(null)) { |
2504 for (Element closure in closureMap[null]) { | 2505 for (Element closure in closureMap[null]) { |
2505 if (referencedFromMirrorSystem(closure)) { | 2506 if (referencedFromMirrorSystem(closure)) { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2644 // necessary, but the backend relies on them being resolved. | 2645 // necessary, but the backend relies on them being resolved. |
2645 enqueuer.enqueueReflectiveStaticFields(_findStaticFieldTargets()); | 2646 enqueuer.enqueueReflectiveStaticFields(_findStaticFieldTargets()); |
2646 } | 2647 } |
2647 | 2648 |
2648 if (mustPreserveNames) reporter.log('Preserving names.'); | 2649 if (mustPreserveNames) reporter.log('Preserving names.'); |
2649 | 2650 |
2650 if (mustRetainMetadata) { | 2651 if (mustRetainMetadata) { |
2651 reporter.log('Retaining metadata.'); | 2652 reporter.log('Retaining metadata.'); |
2652 | 2653 |
2653 compiler.libraryLoader.libraries.forEach(retainMetadataOf); | 2654 compiler.libraryLoader.libraries.forEach(retainMetadataOf); |
2654 if (enqueuer.isResolutionQueue) { | 2655 if (!enqueuer.isResolutionQueue) { |
2655 for (Dependency dependency in metadataConstants) { | 2656 for (Dependency dependency in metadataConstants) { |
2656 registerCompileTimeConstant( | 2657 registerCompileTimeConstant( |
2657 dependency.constant, | 2658 dependency.constant, |
2658 new EagerRegistry(compiler, | |
2659 dependency.annotatedElement.analyzableElement.treeElements), | |
2660 addForEmission: false); | |
2661 } | |
2662 } else { | |
2663 for (Dependency dependency in metadataConstants) { | |
2664 registerCompileTimeConstant( | |
2665 dependency.constant, | |
2666 new CodegenRegistry(compiler, | 2659 new CodegenRegistry(compiler, |
2667 dependency.annotatedElement.analyzableElement.treeElements), | 2660 dependency.annotatedElement.analyzableElement.treeElements), |
2668 addForEmission: false); | 2661 addForEmission: false); |
2669 } | 2662 } |
2670 metadataConstants.clear(); | 2663 metadataConstants.clear(); |
2671 } | 2664 } |
2672 } | 2665 } |
2673 return true; | 2666 return true; |
2674 } | 2667 } |
2675 | 2668 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2799 : "out"; | 2792 : "out"; |
2800 String outName = outPath.substring(outPath.lastIndexOf('/') + 1); | 2793 String outName = outPath.substring(outPath.lastIndexOf('/') + 1); |
2801 String extension = addExtension ? ".part.js" : ""; | 2794 String extension = addExtension ? ".part.js" : ""; |
2802 return "${outName}_$name$extension"; | 2795 return "${outName}_$name$extension"; |
2803 } | 2796 } |
2804 | 2797 |
2805 void registerAsyncMarker(FunctionElement element, | 2798 void registerAsyncMarker(FunctionElement element, |
2806 Enqueuer enqueuer, | 2799 Enqueuer enqueuer, |
2807 Registry registry) { | 2800 Registry registry) { |
2808 if (element.asyncMarker == AsyncMarker.ASYNC) { | 2801 if (element.asyncMarker == AsyncMarker.ASYNC) { |
2809 _registerAsync(enqueuer, registry); | 2802 enqueue(enqueuer, getAsyncHelper(), registry); |
| 2803 enqueue(enqueuer, getSyncCompleterConstructor(), registry); |
| 2804 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
| 2805 enqueue(enqueuer, getWrapBody(), registry); |
2810 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { | 2806 } else if (element.asyncMarker == AsyncMarker.SYNC_STAR) { |
2811 _registerSyncStar(enqueuer, registry); | 2807 ClassElement clsSyncStarIterable = getSyncStarIterable(); |
| 2808 clsSyncStarIterable.ensureResolved(resolution); |
| 2809 registerInstantiatedType(clsSyncStarIterable.rawType, enqueuer, registry); |
| 2810 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); |
| 2811 enqueue(enqueuer, getEndOfIteration(), registry); |
| 2812 enqueue(enqueuer, getYieldStar(), registry); |
| 2813 enqueue(enqueuer, getSyncStarUncaughtError(), registry); |
2812 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { | 2814 } else if (element.asyncMarker == AsyncMarker.ASYNC_STAR) { |
2813 _registerAsyncStar(enqueuer, registry); | 2815 ClassElement clsASyncStarController = getASyncStarController(); |
| 2816 clsASyncStarController.ensureResolved(resolution); |
| 2817 registerInstantiatedType( |
| 2818 clsASyncStarController.rawType, enqueuer, registry); |
| 2819 enqueue(enqueuer, getAsyncStarHelper(), registry); |
| 2820 enqueue(enqueuer, getStreamOfController(), registry); |
| 2821 enqueue(enqueuer, getYieldSingle(), registry); |
| 2822 enqueue(enqueuer, getYieldStar(), registry); |
| 2823 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); |
| 2824 enqueue(enqueuer, getStreamIteratorConstructor(), registry); |
| 2825 enqueue(enqueuer, getWrapBody(), registry); |
2814 } | 2826 } |
2815 } | 2827 } |
2816 | 2828 |
2817 void _registerAsync(Enqueuer enqueuer, | |
2818 Registry registry) { | |
2819 enqueue(enqueuer, getAsyncHelper(), registry); | |
2820 enqueue(enqueuer, getSyncCompleterConstructor(), registry); | |
2821 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | |
2822 enqueue(enqueuer, getWrapBody(), registry); | |
2823 } | |
2824 | |
2825 void _registerSyncStar(Enqueuer enqueuer, | |
2826 Registry registry) { | |
2827 ClassElement clsSyncStarIterable = getSyncStarIterable(); | |
2828 clsSyncStarIterable.ensureResolved(compiler.resolution); | |
2829 registerInstantiatedType(clsSyncStarIterable.rawType, enqueuer, registry); | |
2830 enqueue(enqueuer, getSyncStarIterableConstructor(), registry); | |
2831 enqueue(enqueuer, getEndOfIteration(), registry); | |
2832 enqueue(enqueuer, getYieldStar(), registry); | |
2833 enqueue(enqueuer, getSyncStarUncaughtError(), registry); | |
2834 } | |
2835 | |
2836 void _registerAsyncStar(Enqueuer enqueuer, | |
2837 Registry registry) { | |
2838 ClassElement clsASyncStarController = getASyncStarController(); | |
2839 clsASyncStarController.ensureResolved(compiler.resolution); | |
2840 registerInstantiatedType( | |
2841 clsASyncStarController.rawType, enqueuer, registry); | |
2842 enqueue(enqueuer, getAsyncStarHelper(), registry); | |
2843 enqueue(enqueuer, getStreamOfController(), registry); | |
2844 enqueue(enqueuer, getYieldSingle(), registry); | |
2845 enqueue(enqueuer, getYieldStar(), registry); | |
2846 enqueue(enqueuer, getASyncStarControllerConstructor(), registry); | |
2847 enqueue(enqueuer, getStreamIteratorConstructor(), registry); | |
2848 enqueue(enqueuer, getWrapBody(), registry); | |
2849 } | |
2850 | |
2851 @override | 2829 @override |
2852 bool enableDeferredLoadingIfSupported(Spannable node, Registry registry) { | 2830 bool enableDeferredLoadingIfSupported(Spannable node, Registry registry) { |
2853 registerCheckDeferredIsLoaded(registry); | 2831 registerCheckDeferredIsLoaded(registry); |
2854 return true; | 2832 return true; |
2855 } | 2833 } |
2856 | 2834 |
2857 @override | 2835 @override |
2858 bool enableCodegenWithErrorsIfSupported(Spannable node) { | 2836 bool enableCodegenWithErrorsIfSupported(Spannable node) { |
2859 if (compiler.useCpsIr) { | 2837 if (compiler.useCpsIr) { |
2860 reporter.reportHintMessage( | 2838 reporter.reportHintMessage( |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2999 return false; | 2977 return false; |
3000 }); | 2978 }); |
3001 } | 2979 } |
3002 } | 2980 } |
3003 | 2981 |
3004 class JavaScriptResolutionCallbacks extends ResolutionCallbacks { | 2982 class JavaScriptResolutionCallbacks extends ResolutionCallbacks { |
3005 final JavaScriptBackend backend; | 2983 final JavaScriptBackend backend; |
3006 | 2984 |
3007 JavaScriptResolutionCallbacks(this.backend); | 2985 JavaScriptResolutionCallbacks(this.backend); |
3008 | 2986 |
3009 WorldImpact transformImpact(ResolutionWorldImpact worldImpact) { | |
3010 TransformedWorldImpact transformed = | |
3011 new TransformedWorldImpact(worldImpact); | |
3012 for (Feature feature in worldImpact.features) { | |
3013 switch (feature) { | |
3014 case Feature.ABSTRACT_CLASS_INSTANTIATION: | |
3015 onAbstractClassInstantiation(transformed); | |
3016 break; | |
3017 case Feature.ASSERT: | |
3018 onAssert(false, transformed); | |
3019 break; | |
3020 case Feature.ASSERT_WITH_MESSAGE: | |
3021 onAssert(true, transformed); | |
3022 break; | |
3023 case Feature.ASYNC: | |
3024 backend._registerAsync( | |
3025 backend.compiler.enqueuer.resolution, transformed); | |
3026 break; | |
3027 case Feature.ASYNC_FOR_IN: | |
3028 onAsyncForIn(null, transformed); | |
3029 break; | |
3030 case Feature.ASYNC_STAR: | |
3031 backend._registerAsyncStar( | |
3032 backend.compiler.enqueuer.resolution, transformed); | |
3033 break; | |
3034 case Feature.CATCH_STATEMENT: | |
3035 onCatchStatement(transformed); | |
3036 break; | |
3037 case Feature.COMPILE_TIME_ERROR: | |
3038 onCompileTimeError(transformed, null); | |
3039 break; | |
3040 case Feature.FALL_THROUGH_ERROR: | |
3041 onFallThroughError(transformed); | |
3042 break; | |
3043 case Feature.INC_DEC_OPERATION: | |
3044 onIncDecOperation(transformed); | |
3045 break; | |
3046 case Feature.LAZY_FIELD: | |
3047 onLazyField(transformed); | |
3048 break; | |
3049 case Feature.NEW_SYMBOL: | |
3050 backend.registerNewSymbol(transformed); | |
3051 break; | |
3052 case Feature.STACK_TRACE_IN_CATCH: | |
3053 onStackTraceInCatch(transformed); | |
3054 break; | |
3055 case Feature.STRING_INTERPOLATION: | |
3056 onStringInterpolation(transformed); | |
3057 break; | |
3058 case Feature.SUPER_NO_SUCH_METHOD: | |
3059 onSuperNoSuchMethod(transformed); | |
3060 break; | |
3061 case Feature.SYMBOL_CONSTRUCTOR: | |
3062 onSymbolConstructor(transformed); | |
3063 break; | |
3064 case Feature.SYNC_FOR_IN: | |
3065 onSyncForIn(transformed); | |
3066 break; | |
3067 case Feature.SYNC_STAR: | |
3068 backend._registerSyncStar( | |
3069 backend.compiler.enqueuer.resolution, transformed); | |
3070 break; | |
3071 case Feature.THROW_EXPRESSION: | |
3072 onThrowExpression(transformed); | |
3073 break; | |
3074 case Feature.THROW_NO_SUCH_METHOD: | |
3075 onThrowNoSuchMethod(transformed); | |
3076 break; | |
3077 case Feature.THROW_RUNTIME_ERROR: | |
3078 onThrowRuntimeError(transformed); | |
3079 break; | |
3080 case Feature.TYPE_VARIABLE_BOUNDS_CHECK: | |
3081 onTypeVariableBoundCheck(transformed); | |
3082 break; | |
3083 } | |
3084 } | |
3085 for (DartType type in worldImpact.isChecks) { | |
3086 onIsCheck(type, transformed); | |
3087 } | |
3088 for (DartType type in worldImpact.asCasts) { | |
3089 onIsCheck(type, transformed); | |
3090 onAsCheck(type, transformed); | |
3091 } | |
3092 if (backend.compiler.enableTypeAssertions) { | |
3093 for (DartType type in worldImpact.checkedModeChecks) { | |
3094 onIsCheck(type, transformed); | |
3095 } | |
3096 } | |
3097 for (DartType requiredType in worldImpact.requiredTypes) { | |
3098 backend.registerRequiredType(requiredType); | |
3099 } | |
3100 for (MapLiteralUse mapLiteralUse in worldImpact.mapLiterals) { | |
3101 // TODO(johnniwinther): Use the [isEmpty] property when factory | |
3102 // constructors are registered directly. | |
3103 onMapLiteral(transformed, mapLiteralUse.type, mapLiteralUse.isConstant); | |
3104 } | |
3105 for (ListLiteralUse listLiteralUse in worldImpact.listLiterals) { | |
3106 // TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when | |
3107 // factory constructors are registered directly. | |
3108 transformed.registerInstantiation(listLiteralUse.type); | |
3109 } | |
3110 for (DartType typeLiteral in worldImpact.typeLiterals) { | |
3111 onTypeLiteral(typeLiteral, transformed); | |
3112 transformed.registerInstantiation(backend.compiler.coreTypes.typeType); | |
3113 if (typeLiteral.isTypeVariable) { | |
3114 onTypeVariableExpression(transformed, typeLiteral.element); | |
3115 } | |
3116 } | |
3117 for (String constSymbolName in worldImpact.constSymbolNames) { | |
3118 backend.registerConstSymbol(constSymbolName, transformed); | |
3119 } | |
3120 for (LocalFunctionElement closure in worldImpact.closures) { | |
3121 if (closure.computeType(backend.resolution).containsTypeVariables) { | |
3122 backend.registerClosureWithFreeTypeVariables( | |
3123 closure, backend.compiler.enqueuer.resolution, transformed); | |
3124 } | |
3125 } | |
3126 // TODO(johnniwinther): Remove this when dependency tracking is done on | |
3127 // the world impact itself. | |
3128 for (InterfaceType instantiatedType in worldImpact.instantiatedTypes) { | |
3129 transformed.registerInstantiation(instantiatedType); | |
3130 } | |
3131 | |
3132 return transformed; | |
3133 } | |
3134 | |
3135 void registerBackendStaticInvocation(Element element, Registry registry) { | 2987 void registerBackendStaticInvocation(Element element, Registry registry) { |
3136 registry.registerStaticInvocation(backend.registerBackendUse(element)); | 2988 registry.registerStaticInvocation(backend.registerBackendUse(element)); |
3137 } | 2989 } |
3138 | 2990 |
3139 void registerBackendInstantiation(ClassElement element, Registry registry) { | 2991 void registerBackendInstantiation(ClassElement element, Registry registry) { |
3140 backend.registerBackendUse(element); | 2992 backend.registerBackendUse(element); |
3141 element.ensureResolved(backend.resolution); | 2993 element.ensureResolved(backend.resolution); |
3142 registry.registerInstantiation(element.rawType); | 2994 registry.registerInstantiation(element.rawType); |
3143 } | 2995 } |
3144 | 2996 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3330 Identifiers.noSuchMethod_), | 3182 Identifiers.noSuchMethod_), |
3331 registry); | 3183 registry); |
3332 needsInt(registry, | 3184 needsInt(registry, |
3333 'Needed to encode the invocation kind of super.noSuchMethod.'); | 3185 'Needed to encode the invocation kind of super.noSuchMethod.'); |
3334 needsList(registry, | 3186 needsList(registry, |
3335 'Needed to encode the arguments of super.noSuchMethod.'); | 3187 'Needed to encode the arguments of super.noSuchMethod.'); |
3336 needsString(registry, | 3188 needsString(registry, |
3337 'Needed to encode the name of super.noSuchMethod.'); | 3189 'Needed to encode the name of super.noSuchMethod.'); |
3338 } | 3190 } |
3339 | 3191 |
3340 void onMapLiteral(Registry registry, | 3192 void onMapLiteral(ResolutionRegistry registry, |
3341 DartType type, | 3193 DartType type, |
3342 bool isConstant) { | 3194 bool isConstant) { |
3343 assert(registry.isForResolution); | 3195 assert(registry.isForResolution); |
3344 void enqueue(String name) { | 3196 void enqueue(String name) { |
3345 Element e = backend.find(backend.jsHelperLibrary, name); | 3197 Element e = backend.find(backend.jsHelperLibrary, name); |
3346 registerBackendInstantiation(e, registry); | 3198 registerBackendInstantiation(e, registry); |
3347 } | 3199 } |
3348 | 3200 |
3349 if (isConstant) { | 3201 if (isConstant) { |
3350 enqueue(JavaScriptMapConstant.DART_CLASS); | 3202 enqueue(JavaScriptMapConstant.DART_CLASS); |
3351 enqueue(JavaScriptMapConstant.DART_PROTO_CLASS); | 3203 enqueue(JavaScriptMapConstant.DART_PROTO_CLASS); |
3352 enqueue(JavaScriptMapConstant.DART_STRING_CLASS); | 3204 enqueue(JavaScriptMapConstant.DART_STRING_CLASS); |
3353 enqueue(JavaScriptMapConstant.DART_GENERAL_CLASS); | 3205 enqueue(JavaScriptMapConstant.DART_GENERAL_CLASS); |
3354 } else { | 3206 } else { |
3355 registry.registerInstantiation(type); | 3207 registry.registerInstantiatedType(type); |
3356 } | 3208 } |
3357 } | 3209 } |
3358 | 3210 |
3359 /// Called when resolving the `Symbol` constructor. | 3211 /// Called when resolving the `Symbol` constructor. |
3360 void onSymbolConstructor(Registry registry) { | 3212 void onSymbolConstructor(Registry registry) { |
3361 assert(registry.isForResolution); | 3213 assert(registry.isForResolution); |
3362 // Make sure that _internals.Symbol.validated is registered. | 3214 // Make sure that _internals.Symbol.validated is registered. |
3363 assert(backend.compiler.symbolValidatedConstructor != null); | 3215 assert(backend.compiler.symbolValidatedConstructor != null); |
3364 registerBackendStaticInvocation( | 3216 registerBackendStaticInvocation( |
3365 backend.compiler.symbolValidatedConstructor, registry); | 3217 backend.compiler.symbolValidatedConstructor, registry); |
(...skipping 23 matching lines...) Expand all Loading... |
3389 } | 3241 } |
3390 } | 3242 } |
3391 | 3243 |
3392 /// Records that [constant] is used by the element behind [registry]. | 3244 /// Records that [constant] is used by the element behind [registry]. |
3393 class Dependency { | 3245 class Dependency { |
3394 final ConstantValue constant; | 3246 final ConstantValue constant; |
3395 final Element annotatedElement; | 3247 final Element annotatedElement; |
3396 | 3248 |
3397 const Dependency(this.constant, this.annotatedElement); | 3249 const Dependency(this.constant, this.annotatedElement); |
3398 } | 3250 } |
OLD | NEW |