| 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 |