| 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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 // into a native class. | 410 // into a native class. |
| 413 bool isMixinNativeField = | 411 bool isMixinNativeField = |
| 414 isClass && element.isNative() && holder.isMixinApplication; | 412 isClass && element.isNative() && holder.isMixinApplication; |
| 415 | 413 |
| 416 // See if we can dynamically create getters and setters. | 414 // See if we can dynamically create getters and setters. |
| 417 // We can only generate getters and setters for [element] since | 415 // We can only generate getters and setters for [element] since |
| 418 // the fields of super classes could be overwritten with getters or | 416 // the fields of super classes could be overwritten with getters or |
| 419 // setters. | 417 // setters. |
| 420 bool needsGetter = false; | 418 bool needsGetter = false; |
| 421 bool needsSetter = false; | 419 bool needsSetter = false; |
| 422 // We need to name shadowed fields differently, so they don't clash with | |
| 423 // the non-shadowed field. | |
| 424 bool isShadowed = false; | |
| 425 if (isLibrary || isMixinNativeField || holder == element) { | 420 if (isLibrary || isMixinNativeField || holder == element) { |
| 426 needsGetter = fieldNeedsGetter(field); | 421 needsGetter = fieldNeedsGetter(field); |
| 427 needsSetter = fieldNeedsSetter(field); | 422 needsSetter = fieldNeedsSetter(field); |
| 428 } else { | |
| 429 ClassElement cls = element; | |
| 430 isShadowed = cls.isShadowedByField(field); | |
| 431 } | 423 } |
| 432 | 424 |
| 433 if ((isInstantiated && !holder.isNative()) | 425 if ((isInstantiated && !holder.isNative()) |
| 434 || needsGetter | 426 || needsGetter |
| 435 || needsSetter) { | 427 || needsSetter) { |
| 436 String accessorName = isShadowed | 428 String accessorName = namer.fieldAccessorName(field); |
| 437 ? namer.shadowedFieldName(field) | 429 String fieldName = namer.fieldPropertyName(field); |
| 438 : namer.getNameOfField(field); | |
| 439 String fieldName = field.hasFixedBackendName() | |
| 440 ? field.fixedBackendName() | |
| 441 : (isMixinNativeField ? name : accessorName); | |
| 442 bool needsCheckedSetter = false; | 430 bool needsCheckedSetter = false; |
| 443 if (compiler.enableTypeAssertions | 431 if (compiler.enableTypeAssertions |
| 444 && needsSetter | 432 && needsSetter |
| 445 && !canAvoidGeneratedCheckedSetter(field)) { | 433 && !canAvoidGeneratedCheckedSetter(field)) { |
| 446 needsCheckedSetter = true; | 434 needsCheckedSetter = true; |
| 447 needsSetter = false; | 435 needsSetter = false; |
| 448 } | 436 } |
| 449 // Getters and setters with suffixes will be generated dynamically. | 437 // Getters and setters with suffixes will be generated dynamically. |
| 450 f(field, fieldName, accessorName, needsGetter, needsSetter, | 438 f(field, fieldName, accessorName, needsGetter, needsSetter, |
| 451 needsCheckedSetter); | 439 needsCheckedSetter); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 ? new Selector.getter(member.name, member.getLibrary()) | 564 ? new Selector.getter(member.name, member.getLibrary()) |
| 577 : new Selector.setter(member.name, member.getLibrary()); | 565 : new Selector.setter(member.name, member.getLibrary()); |
| 578 String reflectionName = task.getReflectionName(selector, name); | 566 String reflectionName = task.getReflectionName(selector, name); |
| 579 if (reflectionName != null) { | 567 if (reflectionName != null) { |
| 580 var reflectable = | 568 var reflectable = |
| 581 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 569 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| 582 builder.addProperty('+$reflectionName', reflectable); | 570 builder.addProperty('+$reflectionName', reflectable); |
| 583 } | 571 } |
| 584 } | 572 } |
| 585 } | 573 } |
| OLD | NEW |