Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/enqueue.dart |
| =================================================================== |
| --- sdk/lib/_internal/compiler/implementation/enqueue.dart (revision 18140) |
| +++ sdk/lib/_internal/compiler/implementation/enqueue.dart (working copy) |
| @@ -319,8 +319,19 @@ |
| registerInvocation(methodName, selector); |
| } |
| - void registerDynamicInvocationOf(Element element) { |
| - addToWorkList(element); |
| + void registerDynamicInvocationOf(Element element, Selector selector) { |
|
kasperl
2013/02/06 07:24:03
So the selector here is always a call here? If so,
ngeoffray
2013/02/06 08:11:55
Yes, it's only a call selector. I added an assert
|
| + if (element.isFunction()) { |
| + addToWorkList(element); |
| + } else { |
| + assert(element.isAbstractField()); |
| + AbstractFieldElement field = element; |
| + addToWorkList(field.getter); |
| + } |
| + // We also need to add the selector to the invoked names map, |
| + // because the emitter uses that map to generate parameter stubs. |
| + Set<Selector> selectors = universe.invokedNames.putIfAbsent( |
| + element.name, () => new Set<Selector>()); |
| + selectors.add(selector); |
| } |
| void registerDynamicGetter(SourceString methodName, Selector selector) { |
| @@ -445,12 +456,12 @@ |
| void enableNoSuchMethod(Element element) { |
| if (compiler.enabledNoSuchMethod) return; |
| + Selector selector = new Selector.noSuchMethod(); |
| if (identical(element.getEnclosingClass(), compiler.objectClass)) { |
| - registerDynamicInvocationOf(element); |
| + registerDynamicInvocationOf(element, selector); |
| return; |
| } |
| compiler.enabledNoSuchMethod = true; |
| - Selector selector = new Selector.noSuchMethod(); |
| registerInvocation(Compiler.NO_SUCH_METHOD, selector); |
| compiler.createInvocationMirrorElement = |