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

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

Issue 1385183002: Revert "Avoid eager enqueueing from resolution" (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: 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 1402 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart ('k') | pkg/compiler/lib/src/js_backend/js_backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698