Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/enqueue.dart |
| diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart |
| index 7e8e812b56f261e8b5774aa945b7118de00570d9..0b41389561e7d3200b3097f889dbf99892e7ec39 100644 |
| --- a/sdk/lib/_internal/compiler/implementation/enqueue.dart |
| +++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart |
| @@ -41,6 +41,8 @@ class Enqueuer { |
| bool queueIsClosed = false; |
| EnqueueTask task; |
| + native.NativeEnqueuer nativeEnqueuer; // Set by compiler. |
| + |
| Enqueuer(this.name, this.compiler, |
| ItemCompilationContext itemCompilationContextCreator()) |
| : this.itemCompilationContextCreator = itemCompilationContextCreator, |
| @@ -116,6 +118,8 @@ class Enqueuer { |
| && library.uri.toString() == 'dart:isolate') { |
| compiler.enableIsolateSupport(library); |
| } |
| + |
| + nativeEnqueuer.registerElement(element); |
| } |
| /** |
| @@ -168,7 +172,11 @@ class Enqueuer { |
| if (universe.generatedCode.containsKey(member)) return; |
| if (resolvedElements[member] != null) return; |
| if (!member.isInstanceMember()) return; |
| - if (member.isField()) return; |
| + if (member.isField()) { |
| + // Native fields need to go into instanceMembersByName as they are virtual |
| + // instantiation points and escape points. |
| + if (!member.enclosingElement.isNative()) return; |
| + } |
| String memberName = member.name.slowToString(); |
| Link<Element> members = instanceMembersByName.putIfAbsent( |
| @@ -200,10 +208,19 @@ class Enqueuer { |
| if (universe.hasInvocation(member, compiler)) { |
| return addToWorkList(member); |
| } |
| - } else if (identical(member.kind, ElementKind.SETTER)) { |
| + } else if (member.kind == ElementKind.SETTER) { |
| if (universe.hasInvokedSetter(member, compiler)) { |
| return addToWorkList(member); |
| } |
| + } else if (member.kind == ElementKind.FIELD && |
| + member.enclosingElement.isNative()) { |
| + if (universe.hasInvokedGetter(member, compiler) || |
| + universe.hasInvocation(member, compiler)) { |
| + nativeEnqueuer.registerFieldLoad(member); |
| + } |
| + if (universe.hasInvokedSetter(member, compiler)) { |
| + nativeEnqueuer.registerFieldStore(member); |
| + } |
| } |
| } |
| @@ -293,7 +310,26 @@ class Enqueuer { |
| void handleUnseenSelector(SourceString methodName, Selector selector) { |
| processInstanceMembers(methodName, (Element member) { |
| if (selector.applies(member, compiler)) { |
| - addToWorkList(member); |
| + // print('unseen $selector add $member ${member.kind}'); |
|
ngeoffray
2012/11/15 12:49:57
Remove print
|
| + if (member.isField() && member.enclosingElement.isNative()) { |
| + if (selector.isGetter() || selector.isCall()) { |
| + nativeEnqueuer.registerFieldLoad(member); |
| + // We have to also handle storing to the field because we only get |
| + // one look at each member and there might be a store we have not |
| + // seen yet. |
| + // TODO(sra): Process fields for storing separately. |
| + nativeEnqueuer.registerFieldStore(member); |
| + } else { |
| + nativeEnqueuer.registerFieldStore(member); |
| + // We have to also handle loading from the field because we only get |
| + // one look at each member and there might be a load we have not |
| + // seen yet. |
| + // TODO(sra): Process fields for storing separately. |
| + nativeEnqueuer.registerFieldLoad(member); |
| + } |
| + } else { |
| + addToWorkList(member); |
| + } |
| return true; |
| } |
| return false; |
| @@ -367,6 +403,13 @@ class Enqueuer { |
| String toString() => 'Enqueuer($name)'; |
| + void logSummary(log(message)) { |
| + log(isResolutionQueue |
| + ? 'Resolved ${resolvedElements.length} elements.' |
| + : 'Compiled ${universe.generatedCode.length} methods.'); |
| + nativeEnqueuer.logSummary(log); |
| + } |
| + |
| registerUsedSelector(Selector selector) { |
| Element interceptor = compiler.backend.getInterceptor(selector); |
| if (interceptor != null) { |