Chromium Code Reviews| Index: lib/compiler/implementation/enqueue.dart |
| diff --git a/lib/compiler/implementation/enqueue.dart b/lib/compiler/implementation/enqueue.dart |
| index 6d6f40c6400de2472407741849db1a1d7fbd78ca..b1167db82b972fbfcbded65e1d5f70d962a59e21 100644 |
| --- a/lib/compiler/implementation/enqueue.dart |
| +++ b/lib/compiler/implementation/enqueue.dart |
| @@ -9,9 +9,9 @@ class EnqueueTask extends CompilerTask { |
| String get name => 'Enqueue'; |
| EnqueueTask(Compiler compiler) |
| - : codegen = new Enqueuer(compiler, |
| + : codegen = new Enqueuer('codegen enqueuer', compiler, |
|
ahe
2012/09/18 11:25:54
Nice.
|
| compiler.backend.createItemCompilationContext), |
| - resolution = new Enqueuer(compiler, |
| + resolution = new Enqueuer('resolution enqueuer', compiler, |
| compiler.backend.createItemCompilationContext), |
| super(compiler) { |
| codegen.task = this; |
| @@ -49,19 +49,21 @@ class RecompilationQueue { |
| } |
| class Enqueuer { |
| + final String name; |
| final Compiler compiler; // TODO(ahe): Remove this dependency. |
| final Function itemCompilationContextCreator; |
| final Map<String, Link<Element>> instanceMembersByName; |
| final Set<ClassElement> seenClasses; |
| final Universe universe; |
| final Queue<WorkItem> queue; |
| + // Invariant: Key elements are declarations. |
| final Map<Element, TreeElements> resolvedElements; |
| final RecompilationQueue recompilationCandidates; |
| bool queueIsClosed = false; |
| EnqueueTask task; |
| - Enqueuer(this.compiler, |
| + Enqueuer(this.name, this.compiler, |
| ItemCompilationContext itemCompilationContextCreator()) |
| : this.itemCompilationContextCreator = itemCompilationContextCreator, |
| instanceMembersByName = new Map<String, Link<Element>>(), |
| @@ -81,17 +83,27 @@ class Enqueuer { |
| element = cls.methodElement; |
| } |
| Element owner = element.getOutermostEnclosingMemberOrTopLevel(); |
| - return compiler.enqueuer.resolution.resolvedElements[owner]; |
| + return compiler.enqueuer.resolution.resolvedElements[owner.declaration]; |
| } |
| - String lookupCode(Element element) => |
| - universe.generatedCode[element].toString(); |
| + /** |
| + * Invariant: [element] must be the declaration element. |
|
ahe
2012/09/18 11:25:54
Not documentation.
Johnni Winther
2012/09/20 08:12:23
Done.
|
| + */ |
| + String lookupCode(Element element) { |
| + assert(element.isDeclaration); |
| + return universe.generatedCode[element].toString(); |
|
ahe
2012/09/18 11:25:54
Why are you calling toString here?
Johnni Winther
2012/09/20 08:12:23
I have no idea. It was there before this CL.
|
| + } |
| + /** |
| + * Invariant: [element] must be the declaration element. |
|
ahe
2012/09/18 11:25:54
Not documentation.
Johnni Winther
2012/09/20 08:12:23
Done.
|
| + */ |
| void addToWorkList(Element element, [TreeElements elements]) { |
| + assert(element.isDeclaration); |
| if (element.isForeign()) return; |
| if (compiler.phase == Compiler.PHASE_RECOMPILING) return; |
| if (queueIsClosed) { |
| if (isResolutionQueue && getCachedElements(element) !== null) return; |
| + print('$element: isMember=${element.isMember()} isInstanceMember=${element.isInstanceMember()}'); |
|
ngeoffray
2012/09/17 12:46:24
Remove debugging code.
Johnni Winther
2012/09/20 08:12:23
Done.
|
| compiler.internalErrorOnElement(element, "Work list is closed."); |
| } |
| if (!isResolutionQueue && |
| @@ -116,7 +128,11 @@ class Enqueuer { |
| } |
| } |
| + /** |
| + * Invariant: [element] must be the declaration element. |
| + */ |
| void eagerRecompile(Element element) { |
| + assert(element.isDeclaration); |
| universe.generatedCode.remove(element); |
| universe.generatedBailoutCode.remove(element); |
| addToWorkList(element); |
| @@ -125,7 +141,7 @@ class Enqueuer { |
| void registerRecompilationCandidate(Element element, |
| [TreeElements elements]) { |
| if (queueIsClosed) { |
| - compiler.internalErrorOnElement(element, "Work list is closed."); |
| + compiler.internalErrorOnElement(element, "$name work list is closed."); |
| } |
| recompilationCandidates.add(element, elements); |
| } |
| @@ -160,6 +176,7 @@ class Enqueuer { |
| } |
| void processInstantiatedClassMember(Element member) { |
| + assert(member.isDeclaration); |
| if (universe.generatedCode.containsKey(member)) return; |
| if (resolvedElements[member] !== null) return; |
| if (!member.isInstanceMember()) return; |
| @@ -295,8 +312,13 @@ class Enqueuer { |
| }); |
| } |
| + /** |
| + * Invariant: [element] must be the declaration element. |
|
ahe
2012/09/18 11:25:54
Not documentation.
Johnni Winther
2012/09/20 08:12:23
Done.
|
| + */ |
| void registerStaticUse(Element element) { |
| - if (element !== null) addToWorkList(element); |
| + if (element == null) return; |
| + assert(element.isDeclaration); |
| + addToWorkList(element); |
| } |
| void registerGetOfStaticFunction(FunctionElement element) { |
| @@ -352,4 +374,6 @@ class Enqueuer { |
| f(queue.removeLast()); // TODO(kasperl): Why isn't this removeFirst? |
| } |
| } |
| + |
| + String toString() => name; |
|
ahe
2012/09/18 11:25:54
I prefer this: 'Enqueuer($name)'
This makes debug
Johnni Winther
2012/09/20 08:12:23
Done.
|
| } |