Chromium Code Reviews| Index: lib/compiler/implementation/enqueue.dart |
| diff --git a/lib/compiler/implementation/enqueue.dart b/lib/compiler/implementation/enqueue.dart |
| index a0a453af6be5b08e14bf3beae2e3f81602e759f5..e0c056c2da147284fb4e4899dba0a20e27cfec09 100644 |
| --- a/lib/compiler/implementation/enqueue.dart |
| +++ b/lib/compiler/implementation/enqueue.dart |
| @@ -17,6 +17,34 @@ class EnqueueTask extends CompilerTask { |
| } |
| } |
| +class RecompilationQueue { |
| + final Queue<WorkItem> queue; |
| + final Set<Element> queueElements; |
| + |
| + RecompilationQueue() |
| + : queue = new Queue<WorkItem>(), |
| + queueElements = new Set<Element>(); |
| + |
| + void add(Element element, TreeElements elements) { |
| + if (queueElements.contains(element)) return; |
| + // TODO(sgjesse): Make this handle constructor bodies as well. |
| + if (element.kind !== ElementKind.GENERATIVE_CONSTRUCTOR_BODY) { |
| + queueElements.add(element); |
| + queue.add(new WorkItem(element, elements)); |
| + } |
| + } |
| + |
| + int get length() => queue.length; |
| + |
| + bool isEmpty() => queue.isEmpty(); |
| + |
| + WorkItem next() { |
| + WorkItem item = queue.removeLast(); |
| + queueElements.remove(item.element); |
| + return item; |
| + } |
| +} |
| + |
| class Enqueuer { |
| final Compiler compiler; // TODO(ahe): Remove this dependency. |
| final Map<String, Link<Element>> instanceMembersByName; |
| @@ -24,6 +52,8 @@ class Enqueuer { |
| final Universe universe; |
| final Queue<WorkItem> queue; |
| final Map<Element, TreeElements> resolvedElements; |
| + final RecompilationQueue recompilationCandidates; |
| + |
| bool queueIsClosed = false; |
| EnqueueTask task; |
| @@ -32,7 +62,8 @@ class Enqueuer { |
| seenClasses = new Set<ClassElement>(), |
| universe = new Universe(), |
| queue = new Queue<WorkItem>(), |
| - resolvedElements = new Map<Element, TreeElements>(); |
| + resolvedElements = new Map<Element, TreeElements>(), |
| + recompilationCandidates = new RecompilationQueue(); |
| bool get isFirstQueue() => compiler.enqueuer.resolution === this; |
| @@ -43,6 +74,7 @@ class Enqueuer { |
| void addToWorkList(Element element, [TreeElements elements]) { |
| if (element.isForeign()) return; |
| + if (compiler.pass == 2) return; |
| if (queueIsClosed) { |
| if (isFirstQueue && getCachedElements(element) !== null) return; |
| compiler.internalErrorOnElement(element, "Work list is closed."); |
| @@ -56,6 +88,17 @@ class Enqueuer { |
| queue.add(new WorkItem(element, elements)); |
| } |
| + void addToRecompilationCandidates(Element element, [TreeElements elements]) { |
|
floitsch
2012/06/13 12:51:10
maybe
addRecompilationCandidate
registerRecompilat
Søren Gjesse
2012/06/14 06:37:10
Changed to registerRecompilationCandidate.
|
| + if (element.isMember() && |
| + element.getEnclosingClass().name == const SourceString("Closure")) { |
|
floitsch
2012/06/13 12:51:10
explain why.
Søren Gjesse
2012/06/14 06:37:10
Added a function canByRecompiled and placed the ex
|
| + return; |
| + } |
| + if (queueIsClosed) { |
| + compiler.internalErrorOnElement(element, "Work list is closed."); |
| + } |
| + recompilationCandidates.add(element, elements); |
| + } |
| + |
| void registerInstantiatedClass(ClassElement cls) { |
| if (cls.isInterface()) { |
| compiler.internalErrorOnElement( |