Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Side by Side Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 1376863004: Avoid eager enqueueing from resolution (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Update minimal_resolution_test. Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698