Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(134)

Side by Side Diff: dart/lib/compiler/implementation/emitter.dart

Issue 10108013: Fix for issue 2433: for stubs on native classes, only call a method with a non-mangled name when th… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « dart/client/tests/client/client-leg.status ('k') | dart/lib/compiler/implementation/native_emitter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698