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

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

Issue 1126163002: Improve resolution/codegen separation invariant. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comment Created 5 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/compiler/lib/src/enqueue.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 part of dart2js; 5 part of dart2js;
6 6
7 /** 7 /**
8 * If true, print a warning for each method that was resolved, but not 8 * If true, print a warning for each method that was resolved, but not
9 * compiled. 9 * compiled.
10 */ 10 */
11 const bool REPORT_EXCESS_RESOLUTION = false; 11 const bool REPORT_EXCESS_RESOLUTION = false;
12 12
13 /** 13 /**
14 * Contains backend-specific data that is used throughout the compilation of 14 * Contains backend-specific data that is used throughout the compilation of
15 * one work item. 15 * one work item.
16 */ 16 */
17 class ItemCompilationContext { 17 class ItemCompilationContext {
18 } 18 }
19 19
20 abstract class WorkItem { 20 abstract class WorkItem {
21 final ItemCompilationContext compilationContext; 21 final ItemCompilationContext compilationContext;
22 /** 22 /**
23 * Documentation wanted -- johnniwinther 23 * Documentation wanted -- johnniwinther
24 * 24 *
25 * Invariant: [element] must be a declaration element. 25 * Invariant: [element] must be a declaration element.
26 */ 26 */
27 final AstElement element; 27 final AstElement element;
28
28 TreeElements get resolutionTree; 29 TreeElements get resolutionTree;
29 30
30 WorkItem(this.element, this.compilationContext) { 31 WorkItem(this.element, this.compilationContext) {
31 assert(invariant(element, element.isDeclaration)); 32 assert(invariant(element, element.isDeclaration));
32 } 33 }
33 34
34 void run(Compiler compiler, Enqueuer world); 35 void run(Compiler compiler, Enqueuer world);
35 } 36 }
36 37
37 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. 38 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 180
180 void registerAsyncMarker(FunctionElement element) { 181 void registerAsyncMarker(FunctionElement element) {
181 backend.registerAsyncMarker(element, world, this); 182 backend.registerAsyncMarker(element, world, this);
182 } 183 }
183 184
184 } 185 }
185 186
186 /// [WorkItem] used exclusively by the [CodegenEnqueuer]. 187 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
187 class CodegenWorkItem extends WorkItem { 188 class CodegenWorkItem extends WorkItem {
188 Registry registry; 189 Registry registry;
189 final TreeElements resolutionTree;
190 190
191 CodegenWorkItem(AstElement element, 191 factory CodegenWorkItem(
192 ItemCompilationContext compilationContext) 192 Compiler compiler,
193 : this.resolutionTree = element.resolvedAst.elements, 193 AstElement element,
194 super(element, compilationContext) { 194 ItemCompilationContext compilationContext) {
195 assert(invariant(element, resolutionTree != null, 195 // If this assertion fails, the resolution callbacks of the backend may be
196 // missing call of form registry.registerXXX. Alternatively, the code
197 // generation could spuriously be adding dependencies on things we know we
198 // don't need.
199 assert(invariant(element,
200 compiler.enqueuer.resolution.hasBeenResolved(element),
201 message: "$element has not been resolved."));
202 assert(invariant(element, element.resolvedAst.elements != null,
196 message: 'Resolution tree is null for $element in codegen work item')); 203 message: 'Resolution tree is null for $element in codegen work item'));
204 return new CodegenWorkItem.internal(element, compilationContext);
197 } 205 }
198 206
207 CodegenWorkItem.internal(
208 AstElement element,
209 ItemCompilationContext compilationContext)
210 : super(element, compilationContext);
211
212 TreeElements get resolutionTree => element.resolvedAst.elements;
213
199 void run(Compiler compiler, CodegenEnqueuer world) { 214 void run(Compiler compiler, CodegenEnqueuer world) {
200 if (world.isProcessed(element)) return; 215 if (world.isProcessed(element)) return;
201 216
202 registry = new CodegenRegistry(compiler, resolutionTree); 217 registry = new CodegenRegistry(compiler, resolutionTree);
203 compiler.codegen(this, world); 218 compiler.codegen(this, world);
204 } 219 }
205 } 220 }
206 221
207 typedef void DeferredAction(); 222 typedef void DeferredAction();
208 223
(...skipping 2224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2433 return futureClass.computeType(compiler).createInstantiation([elementType]); 2448 return futureClass.computeType(compiler).createInstantiation([elementType]);
2434 } 2449 }
2435 2450
2436 @override 2451 @override
2437 InterfaceType streamType([DartType elementType = const DynamicType()]) { 2452 InterfaceType streamType([DartType elementType = const DynamicType()]) {
2438 return streamClass.computeType(compiler).createInstantiation([elementType]); 2453 return streamClass.computeType(compiler).createInstantiation([elementType]);
2439 } 2454 }
2440 } 2455 }
2441 2456
2442 typedef void InternalErrorFunction(Spannable location, String message); 2457 typedef void InternalErrorFunction(Spannable location, String message);
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/enqueue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698