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

Side by Side Diff: pkg/compiler/lib/src/enqueue.dart

Issue 2558763003: Move hasRuntimeTypeSupport, hasIsolateSupport, and hasFunctionApplySupport to JavaScriptBackend. (Closed)
Patch Set: Updated cf. comment Created 4 years 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
« no previous file with comments | « pkg/compiler/lib/src/compiler.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 library dart2js.enqueue; 5 library dart2js.enqueue;
6 6
7 import 'dart:collection' show Queue; 7 import 'dart:collection' show Queue;
8 8
9 import 'cache_strategy.dart'; 9 import 'cache_strategy.dart';
10 import 'common/backend_api.dart' show Backend; 10 import 'common/backend_api.dart' show Backend;
11 import 'common/names.dart' show Identifiers; 11 import 'common/names.dart' show Identifiers;
12 import 'common/resolution.dart' show Resolution, ResolutionWorkItem; 12 import 'common/resolution.dart' show Resolution, ResolutionWorkItem;
13 import 'common/tasks.dart' show CompilerTask; 13 import 'common/tasks.dart' show CompilerTask;
14 import 'common/work.dart' show WorkItem; 14 import 'common/work.dart' show WorkItem;
15 import 'common.dart'; 15 import 'common.dart';
16 import 'compiler.dart' show Compiler, GlobalDependencyRegistry; 16 import 'compiler.dart' show Compiler, GlobalDependencyRegistry;
17 import 'core_types.dart' show CommonElements;
18 import 'options.dart'; 17 import 'options.dart';
19 import 'dart_types.dart' show DartType, InterfaceType; 18 import 'dart_types.dart' show DartType, InterfaceType;
20 import 'elements/elements.dart' 19 import 'elements/elements.dart'
21 show 20 show
22 AnalyzableElement, 21 AnalyzableElement,
23 AstElement, 22 AstElement,
24 ClassElement, 23 ClassElement,
25 ConstructorElement, 24 ConstructorElement,
26 Element, 25 Element,
27 Entity, 26 Entity,
28 LibraryElement,
29 LocalFunctionElement,
30 MemberElement; 27 MemberElement;
31 import 'elements/entities.dart'; 28 import 'elements/entities.dart';
32 import 'native/native.dart' as native; 29 import 'native/native.dart' as native;
33 import 'types/types.dart' show TypeMaskStrategy; 30 import 'types/types.dart' show TypeMaskStrategy;
34 import 'universe/world_builder.dart'; 31 import 'universe/world_builder.dart';
35 import 'universe/use.dart' 32 import 'universe/use.dart'
36 show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind; 33 show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
37 import 'universe/world_impact.dart' 34 import 'universe/world_impact.dart'
38 show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor; 35 show ImpactStrategy, ImpactUseCase, WorldImpact, WorldImpactVisitor;
39 import 'util/enumset.dart'; 36 import 'util/enumset.dart';
(...skipping 12 matching lines...) Expand all
52 super(compiler.measurer) { 49 super(compiler.measurer) {
53 _resolution = new ResolutionEnqueuer( 50 _resolution = new ResolutionEnqueuer(
54 this, 51 this,
55 compiler.options, 52 compiler.options,
56 compiler.resolution, 53 compiler.resolution,
57 compiler.options.analyzeOnly && compiler.options.analyzeMain 54 compiler.options.analyzeOnly && compiler.options.analyzeMain
58 ? const DirectEnqueuerStrategy() 55 ? const DirectEnqueuerStrategy()
59 : const TreeShakingEnqueuerStrategy(), 56 : const TreeShakingEnqueuerStrategy(),
60 compiler.globalDependencies, 57 compiler.globalDependencies,
61 compiler.backend, 58 compiler.backend,
62 compiler.coreClasses,
63 compiler.cacheStrategy); 59 compiler.cacheStrategy);
64 _codegen = compiler.backend.createCodegenEnqueuer(this, compiler); 60 _codegen = compiler.backend.createCodegenEnqueuer(this, compiler);
65 } 61 }
66 62
67 ResolutionEnqueuer get resolution => _resolution; 63 ResolutionEnqueuer get resolution => _resolution;
68 Enqueuer get codegen => _codegen; 64 Enqueuer get codegen => _codegen;
69 65
70 void forgetEntity(Entity entity) { 66 void forgetEntity(Entity entity) {
71 resolution.forgetEntity(entity, compiler); 67 resolution.forgetEntity(entity, compiler);
72 codegen.forgetEntity(entity, compiler); 68 codegen.forgetEntity(entity, compiler);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 class ResolutionEnqueuer extends EnqueuerImpl { 125 class ResolutionEnqueuer extends EnqueuerImpl {
130 static const ImpactUseCase IMPACT_USE = 126 static const ImpactUseCase IMPACT_USE =
131 const ImpactUseCase('ResolutionEnqueuer'); 127 const ImpactUseCase('ResolutionEnqueuer');
132 128
133 final CompilerTask task; 129 final CompilerTask task;
134 final String name; 130 final String name;
135 final Resolution _resolution; 131 final Resolution _resolution;
136 final CompilerOptions _options; 132 final CompilerOptions _options;
137 final Backend backend; 133 final Backend backend;
138 final GlobalDependencyRegistry _globalDependencies; 134 final GlobalDependencyRegistry _globalDependencies;
139 final CommonElements _commonElements;
140 final native.NativeEnqueuer nativeEnqueuer; 135 final native.NativeEnqueuer nativeEnqueuer;
141 136
142 final EnqueuerStrategy strategy; 137 final EnqueuerStrategy strategy;
143 Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>(); 138 Set<ClassEntity> _recentClasses = new Setlet<ClassEntity>();
144 final ResolutionWorldBuilderImpl _universe; 139 final ResolutionWorldBuilderImpl _universe;
145 140
146 bool queueIsClosed = false; 141 bool queueIsClosed = false;
147 142
148 WorldImpactVisitor _impactVisitor; 143 WorldImpactVisitor _impactVisitor;
149 144
150 /// All declaration elements that have been processed by the resolver. 145 /// All declaration elements that have been processed by the resolver.
151 final Set<AstElement> _processedElements = new Set<AstElement>(); 146 final Set<Entity> _processedElements = new Set<Entity>();
152 147
153 final Queue<WorkItem> _queue = new Queue<WorkItem>(); 148 final Queue<WorkItem> _queue = new Queue<WorkItem>();
154 149
155 /// Queue of deferred resolution actions to execute when the resolution queue 150 /// Queue of deferred resolution actions to execute when the resolution queue
156 /// has been emptied. 151 /// has been emptied.
157 final Queue<_DeferredAction> _deferredQueue = new Queue<_DeferredAction>(); 152 final Queue<_DeferredAction> _deferredQueue = new Queue<_DeferredAction>();
158 153
159 ResolutionEnqueuer( 154 ResolutionEnqueuer(
160 this.task, 155 this.task,
161 this._options, 156 this._options,
162 Resolution resolution, 157 Resolution resolution,
163 this.strategy, 158 this.strategy,
164 this._globalDependencies, 159 this._globalDependencies,
165 Backend backend, 160 Backend backend,
166 this._commonElements,
167 CacheStrategy cacheStrategy, 161 CacheStrategy cacheStrategy,
168 [this.name = 'resolution enqueuer']) 162 [this.name = 'resolution enqueuer'])
169 : this.backend = backend, 163 : this.backend = backend,
170 this._resolution = resolution, 164 this._resolution = resolution,
171 this.nativeEnqueuer = backend.nativeResolutionEnqueuer(), 165 this.nativeEnqueuer = backend.nativeResolutionEnqueuer(),
172 _universe = new ResolutionWorldBuilderImpl( 166 _universe = new ResolutionWorldBuilderImpl(
173 backend, resolution, cacheStrategy, const TypeMaskStrategy()) { 167 backend, resolution, cacheStrategy, const TypeMaskStrategy()) {
174 _impactVisitor = new EnqueuerImplImpactVisitor(this); 168 _impactVisitor = new EnqueuerImplImpactVisitor(this);
175 } 169 }
176 170
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 if (queueIsClosed) { 408 if (queueIsClosed) {
415 throw new SpannableAssertionFailure( 409 throw new SpannableAssertionFailure(
416 element, "Resolution work list is closed. Trying to add $element."); 410 element, "Resolution work list is closed. Trying to add $element.");
417 } 411 }
418 412
419 applyImpact(backend.registerUsedElement(element, forResolution: true)); 413 applyImpact(backend.registerUsedElement(element, forResolution: true));
420 _openWorld.registerUsedElement(element); 414 _openWorld.registerUsedElement(element);
421 415
422 ResolutionWorkItem workItem = _resolution.createWorkItem(element); 416 ResolutionWorkItem workItem = _resolution.createWorkItem(element);
423 _queue.add(workItem); 417 _queue.add(workItem);
424
425 // Enable isolate support if we start using something from the isolate
426 // library, or timers for the async library. We exclude constant fields,
427 // which are ending here because their initializing expression is compiled.
428 LibraryElement library = element.library;
429 if (!universe.hasIsolateSupport && (!element.isField || !element.isConst)) {
430 String uri = library.canonicalUri.toString();
431 if (uri == 'dart:isolate') {
432 _enableIsolateSupport();
433 } else if (uri == 'dart:async') {
434 if (element.name == '_createTimer' ||
435 element.name == '_createPeriodicTimer') {
436 // The [:Timer:] class uses the event queue of the isolate
437 // library, so we make sure that event queue is generated.
438 _enableIsolateSupport();
439 }
440 }
441 }
442
443 if (element.isGetter && element.name == Identifiers.runtimeType_) {
444 // Enable runtime type support if we discover a getter called runtimeType.
445 // We have to enable runtime type before hitting the codegen, so
446 // that constructors know whether they need to generate code for
447 // runtime type.
448 _universe.hasRuntimeTypeSupport = true;
449 // TODO(ahe): Record precise dependency here.
450 applyImpact(backend.registerRuntimeType());
451 } else if (_commonElements.isFunctionApplyMethod(element)) {
452 _universe.hasFunctionApplySupport = true;
453 }
454 } 418 }
455 419
456 void _registerNoSuchMethod(Element element) { 420 void _registerNoSuchMethod(Element element) {
457 backend.registerNoSuchMethod(element); 421 backend.registerNoSuchMethod(element);
458 } 422 }
459 423
460 void _enableIsolateSupport() {
461 _universe.hasIsolateSupport = true;
462 applyImpact(backend.enableIsolateSupport(forResolution: true));
463 }
464
465 /// Adds an action to the deferred task queue. 424 /// Adds an action to the deferred task queue.
466 /// The action is performed the next time the resolution queue has been 425 /// The action is performed the next time the resolution queue has been
467 /// emptied. 426 /// emptied.
468 /// 427 ///
469 /// The queue is processed in FIFO order. 428 /// The queue is processed in FIFO order.
470 void addDeferredAction(Entity entity, void action()) { 429 void addDeferredAction(Entity entity, void action()) {
471 if (queueIsClosed) { 430 if (queueIsClosed) {
472 throw new SpannableAssertionFailure( 431 throw new SpannableAssertionFailure(
473 entity, 432 entity,
474 "Resolution work list is closed. " 433 "Resolution work list is closed. "
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 } 553 }
595 554
596 typedef void _DeferredActionFunction(); 555 typedef void _DeferredActionFunction();
597 556
598 class _DeferredAction { 557 class _DeferredAction {
599 final Element element; 558 final Element element;
600 final _DeferredActionFunction action; 559 final _DeferredActionFunction action;
601 560
602 _DeferredAction(this.element, this.action); 561 _DeferredAction(this.element, this.action);
603 } 562 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/compiler.dart ('k') | pkg/compiler/lib/src/js_backend/backend.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698