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