OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
6 * A function element that represents a closure call. The signature is copied | 6 * A function element that represents a closure call. The signature is copied |
7 * from the given element. | 7 * from the given element. |
8 */ | 8 */ |
9 class ClosureInvocationElement extends FunctionElement { | 9 class ClosureInvocationElement extends FunctionElement { |
10 ClosureInvocationElement(SourceString name, | 10 ClosureInvocationElement(SourceString name, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 if (addedInheritFunction) return; | 55 if (addedInheritFunction) return; |
56 addedInheritFunction = true; | 56 addedInheritFunction = true; |
57 mainBuffer.add('$inheritsName = '); | 57 mainBuffer.add('$inheritsName = '); |
58 mainBuffer.add(INHERIT_FUNCTION); | 58 mainBuffer.add(INHERIT_FUNCTION); |
59 mainBuffer.add(';\n'); | 59 mainBuffer.add(';\n'); |
60 } | 60 } |
61 | 61 |
62 void addParameterStub(FunctionElement member, | 62 void addParameterStub(FunctionElement member, |
63 String attachTo(String invocationName), | 63 String attachTo(String invocationName), |
64 StringBuffer buffer, | 64 StringBuffer buffer, |
65 Selector selector, | 65 Selector selector) { |
66 bool isNative) { | |
67 FunctionParameters parameters = member.computeParameters(compiler); | 66 FunctionParameters parameters = member.computeParameters(compiler); |
68 int positionalArgumentCount = selector.positionalArgumentCount; | 67 int positionalArgumentCount = selector.positionalArgumentCount; |
69 if (positionalArgumentCount == parameters.parameterCount) { | 68 if (positionalArgumentCount == parameters.parameterCount) { |
70 assert(selector.namedArgumentCount == 0); | 69 assert(selector.namedArgumentCount == 0); |
71 return; | 70 return; |
72 } | 71 } |
73 ConstantHandler handler = compiler.constantHandler; | 72 ConstantHandler handler = compiler.constantHandler; |
74 List<SourceString> names = selector.getOrderedNamedArguments(); | 73 List<SourceString> names = selector.getOrderedNamedArguments(); |
75 | 74 |
76 String invocationName = | 75 String invocationName = |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 handler.writeConstant(argumentBuffer, value); | 145 handler.writeConstant(argumentBuffer, value); |
147 argumentsBuffer[count] = argumentBuffer.toString(); | 146 argumentsBuffer[count] = argumentBuffer.toString(); |
148 } | 147 } |
149 } | 148 } |
150 } | 149 } |
151 count++; | 150 count++; |
152 }); | 151 }); |
153 String parametersString = Strings.join(parametersBuffer, ","); | 152 String parametersString = Strings.join(parametersBuffer, ","); |
154 buffer.add('$parametersString) {\n'); | 153 buffer.add('$parametersString) {\n'); |
155 | 154 |
156 if (isNative) { | 155 if (member.isNative()) { |
157 nativeEmitter.emitParameterStub( | 156 nativeEmitter.emitParameterStub( |
158 member, invocationName, parametersString, argumentsBuffer, | 157 member, invocationName, parametersString, argumentsBuffer, |
159 indexOfLastOptionalArgumentInParameters); | 158 indexOfLastOptionalArgumentInParameters); |
160 } else { | 159 } else { |
161 String arguments = Strings.join(argumentsBuffer, ","); | 160 String arguments = Strings.join(argumentsBuffer, ","); |
162 buffer.add(' return this.${namer.getName(member)}($arguments)'); | 161 buffer.add(' return this.${namer.getName(member)}($arguments)'); |
163 } | 162 } |
164 buffer.add('\n};\n'); | 163 buffer.add('\n};\n'); |
165 } | 164 } |
166 | 165 |
167 void addParameterStubs(FunctionElement member, | 166 void addParameterStubs(FunctionElement member, |
168 String attachTo(String invocationName), | 167 String attachTo(String invocationName), |
169 StringBuffer buffer, | 168 StringBuffer buffer) { |
170 [bool isNative = false]) { | |
171 Set<Selector> selectors = compiler.universe.invokedNames[member.name]; | 169 Set<Selector> selectors = compiler.universe.invokedNames[member.name]; |
172 if (selectors == null) return; | 170 if (selectors == null) return; |
173 FunctionParameters parameters = member.computeParameters(compiler); | 171 FunctionParameters parameters = member.computeParameters(compiler); |
174 for (Selector selector in selectors) { | 172 for (Selector selector in selectors) { |
175 if (!selector.applies(parameters)) continue; | 173 if (!selector.applies(parameters)) continue; |
176 addParameterStub(member, attachTo, buffer, selector, isNative); | 174 addParameterStub(member, attachTo, buffer, selector); |
177 } | 175 } |
178 } | 176 } |
179 | 177 |
180 void addInstanceMember(Element member, | 178 void addInstanceMember(Element member, |
181 String attachTo(String name), | 179 String attachTo(String name), |
182 StringBuffer buffer, | 180 StringBuffer buffer) { |
183 [bool isNative = false]) { | |
184 // TODO(floitsch): we don't need to deal with members of | 181 // TODO(floitsch): we don't need to deal with members of |
185 // uninstantiated classes, that have been overwritten by subclasses. | 182 // uninstantiated classes, that have been overwritten by subclasses. |
186 | 183 |
187 if (member.kind === ElementKind.FUNCTION | 184 if (member.kind === ElementKind.FUNCTION |
188 || member.kind === ElementKind.GENERATIVE_CONSTRUCTOR_BODY | 185 || member.kind === ElementKind.GENERATIVE_CONSTRUCTOR_BODY |
189 || member.kind === ElementKind.GETTER | 186 || member.kind === ElementKind.GETTER |
190 || member.kind === ElementKind.SETTER) { | 187 || member.kind === ElementKind.SETTER) { |
191 if (member.modifiers !== null && member.modifiers.isAbstract()) return; | 188 if (member.modifiers !== null && member.modifiers.isAbstract()) return; |
192 String codeBlock = compiler.universe.generatedCode[member]; | 189 String codeBlock = compiler.universe.generatedCode[member]; |
193 if (codeBlock == null) return; | 190 if (codeBlock == null) return; |
194 buffer.add('${attachTo(namer.getName(member))} = $codeBlock;\n'); | 191 buffer.add('${attachTo(namer.getName(member))} = $codeBlock;\n'); |
195 codeBlock = compiler.universe.generatedBailoutCode[member]; | 192 codeBlock = compiler.universe.generatedBailoutCode[member]; |
196 if (codeBlock !== null) { | 193 if (codeBlock !== null) { |
197 String name = compiler.namer.getBailoutName(member); | 194 String name = compiler.namer.getBailoutName(member); |
198 buffer.add('${attachTo(name)} = $codeBlock;\n'); | 195 buffer.add('${attachTo(name)} = $codeBlock;\n'); |
199 } | 196 } |
200 FunctionElement function = member; | 197 FunctionElement function = member; |
201 FunctionParameters parameters = function.computeParameters(compiler); | 198 FunctionParameters parameters = function.computeParameters(compiler); |
202 if (!parameters.optionalParameters.isEmpty()) { | 199 if (!parameters.optionalParameters.isEmpty()) { |
203 addParameterStubs(member, attachTo, buffer, isNative: isNative); | 200 addParameterStubs(member, attachTo, buffer); |
204 } | 201 } |
205 } else if (member.kind === ElementKind.FIELD) { | 202 } else if (member.kind === ElementKind.FIELD) { |
206 // TODO(ngeoffray): Have another class generate the code for the | 203 // TODO(ngeoffray): Have another class generate the code for the |
207 // fields. | 204 // fields. |
208 if ((member.modifiers === null || !member.modifiers.isFinal()) && | 205 if ((member.modifiers === null || !member.modifiers.isFinal()) && |
209 compiler.universe.invokedSetters.contains(member.name)) { | 206 compiler.universe.invokedSetters.contains(member.name)) { |
210 String setterName = namer.setterName(member.getLibrary(), member.name); | 207 String setterName = namer.setterName(member.getLibrary(), member.name); |
211 String name = | 208 String name = member.isNative() |
212 isNative ? member.name.slowToString() : namer.getName(member); | 209 ? member.name.slowToString() |
| 210 : namer.getName(member); |
213 buffer.add('${attachTo(setterName)} = function(v){\n'); | 211 buffer.add('${attachTo(setterName)} = function(v){\n'); |
214 buffer.add(' this.$name = v;\n};\n'); | 212 buffer.add(' this.$name = v;\n};\n'); |
215 } | 213 } |
216 if (compiler.universe.invokedGetters.contains(member.name)) { | 214 if (compiler.universe.invokedGetters.contains(member.name)) { |
217 String getterName = namer.getterName(member.getLibrary(), member.name); | 215 String getterName = namer.getterName(member.getLibrary(), member.name); |
218 String name = | 216 String name = member.isNative() |
219 isNative ? member.name.slowToString() : namer.getName(member); | 217 ? member.name.slowToString() |
| 218 : namer.getName(member); |
220 buffer.add('${attachTo(getterName)} = function(){\n'); | 219 buffer.add('${attachTo(getterName)} = function(){\n'); |
221 buffer.add(' return this.$name;\n};\n'); | 220 buffer.add(' return this.$name;\n};\n'); |
222 } | 221 } |
223 } else { | 222 } else { |
224 compiler.internalError('unexpected kind: "${member.kind}"', | 223 compiler.internalError('unexpected kind: "${member.kind}"', |
225 element: member); | 224 element: member); |
226 } | 225 } |
227 emitExtraAccessors(member, attachTo, buffer); | 226 emitExtraAccessors(member, attachTo, buffer); |
228 } | 227 } |
229 | 228 |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 mainBuffer.add( | 734 mainBuffer.add( |
736 'var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n'); | 735 'var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n'); |
737 nativeEmitter.emitDynamicDispatchMetadata(); | 736 nativeEmitter.emitDynamicDispatchMetadata(); |
738 nativeEmitter.assembleCode(mainBuffer); | 737 nativeEmitter.assembleCode(mainBuffer); |
739 emitMain(mainBuffer); | 738 emitMain(mainBuffer); |
740 compiler.assembledCode = mainBuffer.toString(); | 739 compiler.assembledCode = mainBuffer.toString(); |
741 }); | 740 }); |
742 return compiler.assembledCode; | 741 return compiler.assembledCode; |
743 } | 742 } |
744 } | 743 } |
OLD | NEW |