Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 class ClassStubGenerator { | 7 class ClassStubGenerator { |
| 8 final Namer namer; | 8 final Namer namer; |
| 9 final Compiler compiler; | 9 final Compiler compiler; |
| 10 final JavaScriptBackend backend; | 10 final JavaScriptBackend backend; |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 } | 33 } |
| 34 | 34 |
| 35 jsAst.Expression generateSetter(Element member, String fieldName) { | 35 jsAst.Expression generateSetter(Element member, String fieldName) { |
| 36 ClassElement cls = member.enclosingClass; | 36 ClassElement cls = member.enclosingClass; |
| 37 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; | 37 String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this'; |
| 38 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; | 38 List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : []; |
| 39 // TODO(floitsch): remove 'return'? | 39 // TODO(floitsch): remove 'return'? |
| 40 return js('function(#, v) { return #.# = v; }', | 40 return js('function(#, v) { return #.# = v; }', |
| 41 [args, receiver, fieldName]); | 41 [args, receiver, fieldName]); |
| 42 } | 42 } |
| 43 | |
| 44 /** | |
| 45 * Documentation wanted -- johnniwinther | |
| 46 * | |
| 47 * Invariant: [member] must be a declaration element. | |
| 48 */ | |
| 49 Map<String, jsAst.Expression> generateCallStubsForGetter( | |
|
floitsch
2015/01/22 15:51:14
directly copied except for marked changes.
| |
| 50 Element member, Set<Selector> selectors) { | |
| 51 assert(invariant(member, member.isDeclaration)); | |
| 52 | |
| 53 // If the method is intercepted, the stub gets the | |
| 54 // receiver explicitely and we need to pass it to the getter call. | |
| 55 bool isInterceptedMethod = backend.isInterceptedMethod(member); | |
| 56 bool isInterceptorClass = | |
| 57 backend.isInterceptorClass(member.enclosingClass); | |
| 58 | |
| 59 const String receiverArgumentName = r'$receiver'; | |
| 60 | |
| 61 jsAst.Expression buildGetter() { | |
| 62 jsAst.Expression receiver = | |
| 63 js(isInterceptorClass ? receiverArgumentName : 'this'); | |
| 64 if (member.isGetter) { | |
| 65 String getterName = namer.getterName(member); | |
| 66 if (isInterceptedMethod) { | |
| 67 return js('this.#(#)', [getterName, receiver]); | |
| 68 } | |
| 69 return js('#.#()', [receiver, getterName]); | |
| 70 } else { | |
| 71 String fieldName = namer.instanceFieldPropertyName(member); | |
| 72 return js('#.#', [receiver, fieldName]); | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 Map<String, jsAst.Expression> generatedStubs = <String, jsAst.Expression>{}; | |
| 77 | |
| 78 // Two selectors may match but differ only in type. To avoid generating | |
| 79 // identical stubs for each we track untyped selectors which already have | |
| 80 // stubs. | |
| 81 Set<Selector> generatedSelectors = new Set<Selector>(); | |
| 82 for (Selector selector in selectors) { | |
| 83 if (selector.applies(member, compiler.world)) { | |
| 84 selector = selector.asUntyped; | |
| 85 if (generatedSelectors.contains(selector)) continue; | |
| 86 generatedSelectors.add(selector); | |
| 87 | |
| 88 String invocationName = namer.invocationName(selector); | |
| 89 Selector callSelector = new Selector.callClosureFrom(selector); | |
| 90 String closureCallName = namer.invocationName(callSelector); | |
| 91 | |
| 92 List<jsAst.Parameter> parameters = <jsAst.Parameter>[]; | |
| 93 List<jsAst.Expression> arguments = <jsAst.Expression>[]; | |
| 94 if (isInterceptedMethod) { | |
| 95 parameters.add(new jsAst.Parameter(receiverArgumentName)); | |
| 96 } | |
| 97 | |
| 98 for (int i = 0; i < selector.argumentCount; i++) { | |
| 99 String name = 'arg$i'; | |
| 100 parameters.add(new jsAst.Parameter(name)); | |
| 101 arguments.add(js('#', name)); | |
| 102 } | |
| 103 | |
| 104 jsAst.Fun function = js( | |
| 105 'function(#) { return #.#(#); }', | |
| 106 [ parameters, buildGetter(), closureCallName, arguments]); | |
| 107 | |
| 108 generatedStubs[invocationName] = function; | |
|
floitsch
2015/01/22 15:51:14
changes here and following lines.
| |
| 109 } | |
| 110 } | |
| 111 | |
| 112 return generatedStubs; | |
| 113 } | |
| 43 } | 114 } |
| OLD | NEW |