| 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 |