Chromium Code Reviews| Index: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
| =================================================================== |
| --- sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart (revision 15254) |
| +++ sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart (working copy) |
| @@ -236,7 +236,9 @@ |
| for (var cls in collectedClasses) { |
| if (hasOwnProperty.call(collectedClasses, cls)) { |
| var desc = collectedClasses[cls]; |
| - $isolatePropertiesName[cls] = $defineClassName(cls, desc[''], desc); |
| +'''/* The second argument of defineNativeClass is the list of fields, |
|
ahe
2012/11/22 13:51:52
defineNativeClass?!?
ngeoffray
2012/11/22 13:54:17
:-), changed to defineClassName.
|
| + which might be undefined if there is no field. */''' |
|
floitsch
2012/11/22 13:59:30
If the class doesn't have any declared fields (in
ngeoffray
2012/11/22 14:01:41
Done.
|
| + $isolatePropertiesName[cls] = $defineClassName(cls, desc[''] || [], desc); |
| if (desc['super'] !== "") $pendingClassesName[cls] = desc['super']; |
| } |
| } |
| @@ -677,12 +679,11 @@ |
| */ |
| void emitInstanceMembers(ClassElement classElement, |
| CodeBuffer buffer, |
| - bool needsLeadingComma) { |
| + bool emitLeadingComma) { |
| assert(invariant(classElement, classElement.isDeclaration)); |
| - bool needsComma = needsLeadingComma; |
| void defineInstanceMember(String name, StringBuffer memberBuffer) { |
| - if (needsComma) buffer.add(','); |
| - needsComma = true; |
| + if (emitLeadingComma) buffer.add(','); |
| + emitLeadingComma = true; |
| buffer.add('\n'); |
| buffer.add(' $name: '); |
| buffer.add(memberBuffer); |
| @@ -852,8 +853,9 @@ |
| /* Do nothing. */ |
| } |
| - void emitClassFields(ClassElement classElement, CodeBuffer buffer) { |
| - buffer.add('"": ['); |
| + void emitClassFields(ClassElement classElement, |
| + CodeBuffer buffer, |
| + bool emitEndingComma) { |
| bool isFirstField = true; |
| visitClassFields(classElement, (Element member, |
| String name, |
| @@ -862,6 +864,7 @@ |
| bool needsSetter, |
| bool needsCheckedSetter) { |
| if (isFirstField) { |
| + buffer.add('"": ['); |
| isFirstField = false; |
| } else { |
| buffer.add(", "); |
| @@ -882,12 +885,19 @@ |
| } |
| buffer.add('"'); |
| }); |
| - buffer.add(']'); |
| + if (!isFirstField) { |
| + // There was at least one field. |
| + buffer.add(']'); |
| + if (emitEndingComma) { |
| + buffer.add(', '); |
| + } |
| + } |
| } |
| /** Each getter/setter must be prefixed with a ",\n ". */ |
| - void emitClassGettersSetters(ClassElement classElement, CodeBuffer buffer, |
| - {bool omitLeadingComma: false}) { |
| + void emitClassGettersSetters(ClassElement classElement, |
| + CodeBuffer buffer, |
| + bool emitLeadingComma) { |
| visitClassFields(classElement, (Element member, |
| String name, |
| String accessorName, |
| @@ -896,10 +906,10 @@ |
| bool needsCheckedSetter) { |
| if (needsCheckedSetter) { |
| assert(!needsSetter); |
| - if (!omitLeadingComma) { |
| + if (emitLeadingComma) { |
| buffer.add(",\n "); |
| } else { |
| - omitLeadingComma = false; |
| + emitLeadingComma = true; |
| } |
| generateCheckedSetter(member, name, accessorName, buffer); |
| } |
| @@ -932,14 +942,14 @@ |
| } |
| buffer.add('$classesCollector.$className = {'); |
| - emitClassConstructor(classElement, buffer); |
| - emitClassFields(classElement, buffer); |
| + emitClassConstructor(classElement, buffer, true); |
| + emitClassFields(classElement, buffer, true); |
| // TODO(floitsch): the emitInstanceMember should simply always emit a ',\n'. |
| // That does currently not work because the native classes have a different |
| // syntax. |
| - buffer.add(',\n "super": "$superName"'); |
| - emitClassGettersSetters(classElement, buffer); |
| - emitInstanceMembers(classElement, buffer, true); |
| + buffer.add('\n "super": "$superName"'); |
| + emitClassGettersSetters(classElement, buffer, true); |
| + emitInstanceMembers(classElement, buffer); |
| buffer.add('\n};\n\n'); |
| } |