Chromium Code Reviews| Index: lib/compiler/implementation/enqueue.dart |
| diff --git a/lib/compiler/implementation/enqueue.dart b/lib/compiler/implementation/enqueue.dart |
| index 855c539fa1d4a28b9b0a875062deca3965ceb5cf..880da61e67927f02bcd6b40d1409e06afb41565a 100644 |
| --- a/lib/compiler/implementation/enqueue.dart |
| +++ b/lib/compiler/implementation/enqueue.dart |
| @@ -17,12 +17,41 @@ 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]) { |
|
floitsch
2012/06/07 10:59:39
not that it matters, but afaics the second argumen
Søren Gjesse
2012/06/13 10:55:09
Done.
|
| + if (queueElements.contains(element)) return; |
| + if (element.kind !== ElementKind.GENERATIVE_CONSTRUCTOR_BODY && |
|
floitsch
2012/06/07 10:59:39
Explain why these are not recompilation canditates
Søren Gjesse
2012/06/13 10:55:09
Turned out that it is only for generative construc
|
| + element.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) { |
| + 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; |
| final Set<ClassElement> seenClasses; |
| final Universe universe; |
| final Queue<WorkItem> queue; |
| + final RecompilationQueue recompilationCandidates; |
| bool queueIsClosed = false; |
| EnqueueTask task; |
| @@ -30,9 +59,11 @@ class Enqueuer { |
| : instanceMembersByName = new Map<String, Link<Element>>(), |
| seenClasses = new Set<ClassElement>(), |
| universe = new Universe(), |
| - queue = new Queue<WorkItem>(); |
| + queue = new Queue<WorkItem>(), |
| + recompilationCandidates = new RecompilationQueue(); |
| void addToWorkList(Element element, [TreeElements elements]) { |
| + if (compiler.pass == 2) return; |
|
floitsch
2012/06/07 10:59:39
assert that the element has already been compiled?
Søren Gjesse
2012/06/13 10:55:09
Done.
|
| if (queueIsClosed) { |
| compiler.internalErrorOnElement(element, "Work list is closed."); |
| } |
| @@ -42,6 +73,13 @@ class Enqueuer { |
| queue.add(new WorkItem(element, elements)); |
| } |
| + void addToRecompilationCandidates(Element element, [TreeElements elements]) { |
| + if (queueIsClosed) { |
| + compiler.internalErrorOnElement(element, "Work list is closed."); |
| + } |
| + recompilationCandidates.add(element, elements); |
| + } |
| + |
| void registerInstantiatedClass(ClassElement cls) { |
| universe.instantiatedClasses.add(cls); |
| onRegisterInstantiatedClass(cls); |