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 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 class NativeEmitter { | 7 class NativeEmitter { |
8 | 8 |
9 CodeEmitterTask emitter; | 9 CodeEmitterTask emitter; |
10 CodeBuffer nativeBuffer; | 10 CodeBuffer nativeBuffer; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 const SourceString('hashCodeForNativeObject')); | 83 const SourceString('hashCodeForNativeObject')); |
84 return backend.namer.isolateAccess(element); | 84 return backend.namer.isolateAccess(element); |
85 } | 85 } |
86 | 86 |
87 String get defineNativeClassName | 87 String get defineNativeClassName |
88 => '${backend.namer.CURRENT_ISOLATE}.\$defineNativeClass'; | 88 => '${backend.namer.CURRENT_ISOLATE}.\$defineNativeClass'; |
89 | 89 |
90 String get defineNativeClassFunction { | 90 String get defineNativeClassFunction { |
91 return """ | 91 return """ |
92 function(cls, desc) { | 92 function(cls, desc) { |
93 var fields = desc[''] || []; | |
94 var generateGetterSetter = ${emitter.generateGetterSetterFunction}; | 93 var generateGetterSetter = ${emitter.generateGetterSetterFunction}; |
95 for (var i = 0; i < fields.length; i++) { | 94 var fields = desc['']; |
96 generateGetterSetter(fields[i], desc); | 95 var fields_array = fields ? fields.split(',') : []; |
| 96 for (var i = 0; i < fields_array.length; i++) { |
| 97 generateGetterSetter(fields_array[i], desc); |
97 } | 98 } |
98 var hasOwnProperty = Object.prototype.hasOwnProperty; | 99 var hasOwnProperty = Object.prototype.hasOwnProperty; |
99 for (var method in desc) { | 100 for (var method in desc) { |
100 if (method !== '') { | 101 if (method) { """/* Short version of: if (method != '') */""" |
101 if (hasOwnProperty.call(desc, method)) { | 102 if (hasOwnProperty.call(desc, method)) { |
102 $dynamicName(method)[cls] = desc[method]; | 103 $dynamicName(method)[cls] = desc[method]; |
103 } | 104 } |
104 } | 105 } |
105 } | 106 } |
106 }"""; | 107 }"""; |
107 } | 108 } |
108 | 109 |
109 void generateNativeLiteral(ClassElement classElement) { | 110 void generateNativeLiteral(ClassElement classElement) { |
110 String quotedNative = classElement.nativeTagInfo.slowToString(); | 111 String quotedNative = classElement.nativeTagInfo.slowToString(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 generateNativeLiteral(classElement); | 154 generateNativeLiteral(classElement); |
154 // The native literal kind needs to be dealt with specially when | 155 // The native literal kind needs to be dealt with specially when |
155 // generating code for it. | 156 // generating code for it. |
156 return; | 157 return; |
157 } | 158 } |
158 | 159 |
159 CodeBuffer fieldBuffer = new CodeBuffer(); | 160 CodeBuffer fieldBuffer = new CodeBuffer(); |
160 CodeBuffer getterSetterBuffer = new CodeBuffer(); | 161 CodeBuffer getterSetterBuffer = new CodeBuffer(); |
161 CodeBuffer methodBuffer = new CodeBuffer(); | 162 CodeBuffer methodBuffer = new CodeBuffer(); |
162 | 163 |
163 emitter.emitClassFields(classElement, fieldBuffer, false); | 164 emitter.emitClassFields(classElement, fieldBuffer, false, isNative: true); |
164 emitter.emitClassGettersSetters(classElement, getterSetterBuffer, false); | 165 emitter.emitClassGettersSetters(classElement, getterSetterBuffer, false); |
165 emitter.emitInstanceMembers(classElement, methodBuffer, false); | 166 emitter.emitInstanceMembers(classElement, methodBuffer, false); |
166 | 167 |
167 if (methodBuffer.isEmpty | 168 if (methodBuffer.isEmpty |
168 && fieldBuffer.isEmpty | 169 && fieldBuffer.isEmpty |
169 && getterSetterBuffer.isEmpty) { | 170 && getterSetterBuffer.isEmpty) { |
170 return; | 171 return; |
171 } | 172 } |
172 | 173 |
173 String nativeTag = toNativeTag(classElement); | 174 String nativeTag = toNativeTag(classElement); |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 if (!first) targetBuffer.add(",\n"); | 567 if (!first) targetBuffer.add(",\n"); |
567 targetBuffer.add(" $name: $function"); | 568 targetBuffer.add(" $name: $function"); |
568 first = false; | 569 first = false; |
569 }); | 570 }); |
570 targetBuffer.add("\n});\n\n"); | 571 targetBuffer.add("\n});\n\n"); |
571 } | 572 } |
572 targetBuffer.add(nativeBuffer); | 573 targetBuffer.add(nativeBuffer); |
573 targetBuffer.add('\n'); | 574 targetBuffer.add('\n'); |
574 } | 575 } |
575 } | 576 } |
OLD | NEW |