OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 class ClassEmitter extends CodeEmitterHelper { | 7 class ClassEmitter extends CodeEmitterHelper { |
8 /** | 8 /** |
9 * Documentation wanted -- johnniwinther | 9 * Documentation wanted -- johnniwinther |
10 * | 10 * |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 if (!needsAccessor) { | 153 if (!needsAccessor) { |
154 // Emit field for constructor generation. | 154 // Emit field for constructor generation. |
155 assert(!classIsNative); | 155 assert(!classIsNative); |
156 buffer.write(name); | 156 buffer.write(name); |
157 } else { | 157 } else { |
158 // Emit (possibly renaming) field name so we can add accessors at | 158 // Emit (possibly renaming) field name so we can add accessors at |
159 // runtime. | 159 // runtime. |
160 buffer.write(accessorName); | 160 buffer.write(accessorName); |
161 if (name != accessorName) { | 161 if (name != accessorName) { |
162 buffer.write(':$name'); | 162 buffer.write(':$name'); |
163 // Only the native classes can have renaming accessors. | |
164 assert(classIsNative); | |
165 } | 163 } |
166 | 164 |
167 int getterCode = 0; | 165 int getterCode = 0; |
168 if (needsGetter) { | 166 if (needsGetter) { |
169 if (field.isInstanceMember()) { | 167 if (field.isInstanceMember()) { |
170 // 01: function() { return this.field; } | 168 // 01: function() { return this.field; } |
171 // 10: function(receiver) { return receiver.field; } | 169 // 10: function(receiver) { return receiver.field; } |
172 // 11: function(receiver) { return this.field; } | 170 // 11: function(receiver) { return this.field; } |
173 bool isIntercepted = backend.fieldHasInterceptedGetter(field); | 171 bool isIntercepted = backend.fieldHasInterceptedGetter(field); |
174 getterCode += isIntercepted ? 2 : 0; | 172 getterCode += isIntercepted ? 2 : 0; |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 // into a native class. | 414 // into a native class. |
417 bool isMixinNativeField = | 415 bool isMixinNativeField = |
418 isClass && element.isNative() && holder.isMixinApplication; | 416 isClass && element.isNative() && holder.isMixinApplication; |
419 | 417 |
420 // See if we can dynamically create getters and setters. | 418 // See if we can dynamically create getters and setters. |
421 // We can only generate getters and setters for [element] since | 419 // We can only generate getters and setters for [element] since |
422 // the fields of super classes could be overwritten with getters or | 420 // the fields of super classes could be overwritten with getters or |
423 // setters. | 421 // setters. |
424 bool needsGetter = false; | 422 bool needsGetter = false; |
425 bool needsSetter = false; | 423 bool needsSetter = false; |
426 // We need to name shadowed fields differently, so they don't clash with | |
427 // the non-shadowed field. | |
428 bool isShadowed = false; | |
429 if (isLibrary || isMixinNativeField || holder == element) { | 424 if (isLibrary || isMixinNativeField || holder == element) { |
430 needsGetter = fieldNeedsGetter(field); | 425 needsGetter = fieldNeedsGetter(field); |
431 needsSetter = fieldNeedsSetter(field); | 426 needsSetter = fieldNeedsSetter(field); |
432 } else { | |
433 ClassElement cls = element; | |
434 isShadowed = cls.isShadowedByField(field); | |
435 } | 427 } |
436 | 428 |
437 if ((isInstantiated && !holder.isNative()) | 429 if ((isInstantiated && !holder.isNative()) |
438 || needsGetter | 430 || needsGetter |
439 || needsSetter) { | 431 || needsSetter) { |
440 String accessorName = isShadowed | 432 String accessorName = namer.fieldAccessorName(field); |
441 ? namer.shadowedFieldName(field) | 433 String fieldName = namer.fieldPropertyName(field); |
442 : namer.getNameOfField(field); | |
443 String fieldName = field.hasFixedBackendName() | |
444 ? field.fixedBackendName() | |
445 : (isMixinNativeField ? name : accessorName); | |
446 bool needsCheckedSetter = false; | 434 bool needsCheckedSetter = false; |
447 if (compiler.enableTypeAssertions | 435 if (compiler.enableTypeAssertions |
448 && needsSetter | 436 && needsSetter |
449 && !canAvoidGeneratedCheckedSetter(field)) { | 437 && !canAvoidGeneratedCheckedSetter(field)) { |
450 needsCheckedSetter = true; | 438 needsCheckedSetter = true; |
451 needsSetter = false; | 439 needsSetter = false; |
452 } | 440 } |
453 // Getters and setters with suffixes will be generated dynamically. | 441 // Getters and setters with suffixes will be generated dynamically. |
454 f(field, fieldName, accessorName, needsGetter, needsSetter, | 442 f(field, fieldName, accessorName, needsGetter, needsSetter, |
455 needsCheckedSetter); | 443 needsCheckedSetter); |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
580 ? new Selector.getter(member.name, member.getLibrary()) | 568 ? new Selector.getter(member.name, member.getLibrary()) |
581 : new Selector.setter(member.name, member.getLibrary()); | 569 : new Selector.setter(member.name, member.getLibrary()); |
582 String reflectionName = task.getReflectionName(selector, name); | 570 String reflectionName = task.getReflectionName(selector, name); |
583 if (reflectionName != null) { | 571 if (reflectionName != null) { |
584 var reflectable = | 572 var reflectable = |
585 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 573 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
586 builder.addProperty('+$reflectionName', reflectable); | 574 builder.addProperty('+$reflectionName', reflectable); |
587 } | 575 } |
588 } | 576 } |
589 } | 577 } |
OLD | NEW |