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

Side by Side Diff: frog/var_member.dart

Issue 9270048: Lots of frog cleanup (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 11 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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 /** A dynamic member stub. */ 5 /** A dynamic member stub. */
6 class VarMember { 6 class VarMember {
7 final String name; 7 final String name;
8 bool isGenerated = false; 8 bool isGenerated = false;
9 9
10 VarMember(this.name); 10 VarMember(this.name);
11 11
12 abstract void generate(CodeWriter code); 12 abstract void generate(CodeWriter code);
13 13
14 String get body() => null;
15
14 Type get returnType() => world.varType; 16 Type get returnType() => world.varType;
15 17
16 Value invoke(MethodGenerator context, Node node, Value target, Arguments args) { 18 Value invoke(CallingContext context, Node node, Value target, Arguments args) {
17 return new Value(returnType, 19 return new Value(returnType,
18 '${target.code}.$name(${args.getCode()})', node.span); 20 '${target.code}.$name(${args.getCode()})', node.span);
19 } 21 }
20 } 22 }
21 23
22 /** 24 /**
23 * This function generates a dynamic call stub for functions. It's part of a 25 * This function generates a dynamic call stub for functions. It's part of a
24 * series of steps described below. Most of the code is generated by 26 * series of steps described below. Most of the code is generated by
25 * gen.dart, with some helpers in core.js 27 * gen.dart, with some helpers in core.js
26 * 28 *
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 class VarFunctionStub extends VarMember { 68 class VarFunctionStub extends VarMember {
67 final Arguments args; 69 final Arguments args;
68 70
69 VarFunctionStub(String name, Arguments callArgs) 71 VarFunctionStub(String name, Arguments callArgs)
70 : super(name), args = callArgs.toCallStubArgs() { 72 : super(name), args = callArgs.toCallStubArgs() {
71 // Ensure dependency is generated 73 // Ensure dependency is generated
72 world.functionImplType.markUsed(); 74 world.functionImplType.markUsed();
73 world.gen.genMethod(world.functionImplType.getMember('_genStub')); 75 world.gen.genMethod(world.functionImplType.getMember('_genStub'));
74 } 76 }
75 77
76 Value invoke(MethodGenerator context, Node node, Value target, 78 Value invoke(CallingContext context, Node node, Value target,
77 Arguments args) { 79 Arguments args) {
78 return super.invoke(context, node, target, args); 80 return super.invoke(context, node, target, args);
79 } 81 }
80 82
81 void generate(CodeWriter code) { 83 void generate(CodeWriter code) {
82 isGenerated = true; 84 isGenerated = true;
83 if (args.hasNames) { 85 if (args.hasNames) {
84 generateNamed(code); 86 generateNamed(code);
85 } else { 87 } else {
86 generatePositional(code); 88 generatePositional(code);
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 final Type returnType; 213 final Type returnType;
212 final Arguments args; 214 final Arguments args;
213 215
214 bool invoked = false; 216 bool invoked = false;
215 217
216 VarMethodSet(this.baseName, String name, this.members, Arguments callArgs, 218 VarMethodSet(this.baseName, String name, this.members, Arguments callArgs,
217 this.returnType) 219 this.returnType)
218 : super(name), args = callArgs.toCallStubArgs() { 220 : super(name), args = callArgs.toCallStubArgs() {
219 } 221 }
220 222
221 Value invoke(MethodGenerator context, Node node, Value target, 223 Value invoke(CallingContext context, Node node, Value target,
222 Arguments args) { 224 Arguments args) {
223 _invokeMembers(context, node); 225 _invokeMembers(context, node);
224 return super.invoke(context, node, target, args); 226 return super.invoke(context, node, target, args);
225 } 227 }
226 228
227 /** Invokes members to ensure they're generated. */ 229 /** Invokes members to ensure they're generated. */
228 _invokeMembers(MethodGenerator context, Node node) { 230 _invokeMembers(CallingContext context, Node node) {
229 if (invoked) return; 231 if (invoked) return;
230 invoked = true; 232 invoked = true;
231 233
232 bool hasObjectType = false; 234 bool hasObjectType = false;
233 for (var member in members) { 235 for (var member in members) {
234 // Invoke the member with the stub args (this gives us the method body), 236 // Invoke the member with the stub args (this gives us the method body),
235 // then create the stub method. 237 // then create the stub method.
236 final type = member.declaringType; 238 final type = member.declaringType;
237 final target = new Value(type, 'this', node.span); 239 final target = new Value(type, 'this', node.span);
238 var result = member.invoke(context, node, target, args, isDynamic:true); 240 var result = member.invoke(context, node, target, args);
239 var stub = new VarMethodStub(name, member, args, 'return ' + result.code); 241 var stub = new VarMethodStub(name, member, args, 'return ' + result.code);
240 type.varStubs[stub.name] = stub; 242 type.varStubs[stub.name] = stub;
241 if (type.isObject) hasObjectType = true; 243 if (type.isObject) hasObjectType = true;
242 } 244 }
243 245
244 // Create a noSuchMethod fallback on Object if needed. 246 // Create a noSuchMethod fallback on Object if needed.
245 // Some methods, like toString and == already have a fallback on Object. 247 // Some methods, like toString and == already have a fallback on Object.
246 if (!hasObjectType) { 248 if (!hasObjectType) {
247 final target = new Value(world.objectType, 'this', node.span); 249 final target = new Value(world.objectType, 'this', node.span);
248 var result = target.invokeNoSuchMethod(context, baseName, node, args); 250 var result = target.invokeNoSuchMethod(context, baseName, node, args);
249 var stub = new VarMethodStub(name, null, args, 'return ' + result.code); 251 var stub = new VarMethodStub(name, null, args, 'return ' + result.code);
250 world.objectType.varStubs[stub.name] = stub; 252 world.objectType.varStubs[stub.name] = stub;
251 } 253 }
252 } 254 }
253 255
254 // TODO(jmesserly): get rid of this as it's unused now 256 // TODO(jmesserly): get rid of this as it's unused now
255 void generate(CodeWriter code) {} 257 void generate(CodeWriter code) {}
256 } 258 }
257 259
258 String _getCallStubName(String name, Arguments args) { 260 String _getCallStubName(String name, Arguments args) {
259 // TODO: This code needs global knowledge to ensure the stub name does not 261 // TODO: This code needs global knowledge to ensure the stub name does not
260 // collide with any other name. E.g. it is unlikely but possible for the user 262 // collide with any other name. E.g. it is unlikely but possible for the user
261 // to have methods called 'foo' and 'foo$0'. 263 // to have methods called 'foo' and 'foo$0'.
262 final nameBuilder = new StringBuffer('${name}\$${args.bareCount}'); 264 final nameBuilder = new StringBuffer('${name}\$${args.bareCount}');
263 for (int i = args.bareCount; i < args.length; i++) { 265 for (int i = args.bareCount; i < args.length; i++) {
264 var name = args.getName(i); 266 var argName = args.getName(i);
265 nameBuilder.add('\$'); 267 nameBuilder.add('\$');
266 if (name.contains('\$')) { 268 if (argName.contains('\$')) {
267 // Disambiguate "a:b:" from "a$b:". Using the length works well because 269 // Disambiguate "a:b:" from "a$b:". Using the length works well because
268 // the names can't start with digits. 270 // the names can't start with digits.
269 nameBuilder.add('${name.length}'); 271 nameBuilder.add('${argName.length}');
270 } 272 }
271 nameBuilder.add(name); 273 nameBuilder.add(argName);
272 } 274 }
273 return nameBuilder.toString(); 275 return nameBuilder.toString();
274 } 276 }
OLDNEW
« frog/gen.dart ('K') | « frog/value.dart ('k') | frog/world.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698