Chromium Code Reviews| Index: frog/leg/emitter.dart |
| =================================================================== |
| --- frog/leg/emitter.dart (revision 3496) |
| +++ frog/leg/emitter.dart (working copy) |
| @@ -56,12 +56,12 @@ |
| // TODO(ngeoffray): Have another class generate the code for the |
| // fields. |
| assert(member.kind === ElementKind.FIELD); |
| - if (compiler.universe.invokedSetters.contains(member.name.stringValue)) { |
| + if (compiler.universe.invokedSetters.contains(member.name)) { |
| String setterName = namer.setterName(member.name); |
| buffer.add('$prototype.$setterName = function(v){\n' + |
| ' this.${namer.getName(member)} = v;\n}\n'); |
| } |
| - if (compiler.universe.invokedGetters.contains(member.name.stringValue)) { |
| + if (compiler.universe.invokedGetters.contains(member.name)) { |
| String getterName = namer.getterName(member.name); |
| buffer.add('$prototype.$getterName = function(){\n' + |
| ' return this.${namer.getName(member)};\n}\n'); |
| @@ -80,7 +80,7 @@ |
| if (member.isInstanceMember() && member.kind == ElementKind.FIELD) { |
| if (!isFirst) argumentsBuffer.add(', '); |
| isFirst = false; |
| - String memberName = namer.instanceName(member.name); |
| + String memberName = namer.instanceFieldName(member.name); |
| argumentsBuffer.add('${className}_$memberName'); |
| bodyBuffer.add(' this.$memberName = ${className}_$memberName;\n'); |
| } |
| @@ -183,6 +183,50 @@ |
| } |
| } |
| + void emitNoSuchMethodCalls(StringBuffer buffer) { |
| + // Do not generate no such method calls if there is no class. |
| + if (!addedInheritFunction) return; |
|
floitsch
2012/01/24 11:46:03
I assume you don't want to use instantiatedClasses
floitsch
2012/01/24 11:46:03
Add TODO that we don't need to generate these meth
ngeoffray
2012/01/24 12:09:39
Done.
ngeoffray
2012/01/24 12:09:39
No, I just didn't think of using it (addedInheritF
|
| + |
| + ClassElement objectClass = |
| + compiler.universe.find(const SourceString('Object')); |
| + String className = namer.isolatePropertyAccess(objectClass); |
| + String prototype = '$className.prototype'; |
| + String noSuchMethodName = |
| + namer.instanceMethodName(Compiler.NO_SUCH_METHOD, 2); |
| + |
| + void generateMethod(String methodName, String jsName, int arity) { |
| + buffer.add('$prototype.$jsName = function'); |
| + StringBuffer args = new StringBuffer(); |
| + for (int i = 0; i < arity; i++) { |
| + if (i != 0) args.add(', '); |
| + args.add('arg$i'); |
| + } |
| + buffer.add(' ($args) {\n'); |
| + buffer.add(" return this.$noSuchMethodName('$methodName', [$args]);\n"); |
| + buffer.add('}\n'); |
| + } |
| + |
| + compiler.universe.invokedNames.forEach((SourceString methodName, |
| + Set<int> arities) { |
| + if (objectClass.lookupLocalMember(methodName) === null) { |
| + for (int arity in arities) { |
| + String jsName = namer.instanceMethodName(methodName, arity); |
| + generateMethod(methodName.stringValue, jsName, arity); |
| + } |
| + } |
| + }); |
| + |
| + compiler.universe.invokedGetters.forEach((SourceString getterName) { |
| + String jsName = namer.getterName(getterName); |
| + generateMethod('get $getterName', jsName, 0); |
| + }); |
| + |
| + compiler.universe.invokedSetters.forEach((SourceString setterName) { |
| + String jsName = namer.setterName(setterName); |
| + generateMethod('set $setterName', jsName, 1); |
| + }); |
| + } |
| + |
| String assembleProgram() { |
| measure(() { |
| StringBuffer buffer = new StringBuffer(); |
| @@ -190,10 +234,12 @@ |
| emitStaticNonFinalFieldInitializations(buffer); |
| buffer.add('}\n\n'); |
| emitClasses(buffer); |
| + emitNoSuchMethodCalls(buffer); |
| emitStaticFunctions(buffer); |
| emitStaticFinalFieldInitializations(buffer); |
| buffer.add('var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n'); |
| - buffer.add('${namer.CURRENT_ISOLATE}.main();\n'); |
| + Element main = compiler.universe.find(Compiler.MAIN); |
| + buffer.add('${namer.isolateAccess(main)}();\n'); |
| compiler.assembledCode = buffer.toString(); |
| }); |
| return compiler.assembledCode; |