| 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 ClassStubGenerator get _stubGenerator => | 9 ClassStubGenerator get _stubGenerator => |
| 10 new ClassStubGenerator(compiler, namer, backend); | 10 new ClassStubGenerator(compiler, namer, backend); |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 accessorName, | 463 accessorName, |
| 464 () => memberName); | 464 () => memberName); |
| 465 } | 465 } |
| 466 assert(invariant(member, previousName == memberName, | 466 assert(invariant(member, previousName == memberName, |
| 467 message: '$previousName != ${memberName}')); | 467 message: '$previousName != ${memberName}')); |
| 468 } | 468 } |
| 469 | 469 |
| 470 bool fieldNeedsGetter(VariableElement field) { | 470 bool fieldNeedsGetter(VariableElement field) { |
| 471 assert(field.isField); | 471 assert(field.isField); |
| 472 if (fieldAccessNeverThrows(field)) return false; | 472 if (fieldAccessNeverThrows(field)) return false; |
| 473 return backend.shouldRetainGetter(field) | 473 if (backend.shouldRetainGetter(field)) return true; |
| 474 || compiler.codegenWorld.hasInvokedGetter(field, compiler.world); | 474 return field.isClassMember && |
| 475 compiler.codegenWorld.hasInvokedGetter(field, compiler.world); |
| 475 } | 476 } |
| 476 | 477 |
| 477 bool fieldNeedsSetter(VariableElement field) { | 478 bool fieldNeedsSetter(VariableElement field) { |
| 478 assert(field.isField); | 479 assert(field.isField); |
| 479 if (fieldAccessNeverThrows(field)) return false; | 480 if (fieldAccessNeverThrows(field)) return false; |
| 480 return (!field.isFinal && !field.isConst) | 481 if (field.isFinal || field.isConst) return false; |
| 481 && (backend.shouldRetainSetter(field) | 482 if (backend.shouldRetainSetter(field)) return true; |
| 482 || compiler.codegenWorld.hasInvokedSetter(field, compiler.world)); | 483 return field.isClassMember && |
| 484 compiler.codegenWorld.hasInvokedSetter(field, compiler.world); |
| 483 } | 485 } |
| 484 | 486 |
| 485 // We never access a field in a closure (a captured variable) without knowing | |
| 486 // that it is there. Therefore we don't need to use a getter (that will throw | |
| 487 // if the getter method is missing), but can always access the field directly. | |
| 488 static bool fieldAccessNeverThrows(VariableElement field) { | 487 static bool fieldAccessNeverThrows(VariableElement field) { |
| 489 return field is ClosureFieldElement; | 488 return |
| 489 // We never access a field in a closure (a captured variable) without |
| 490 // knowing that it is there. Therefore we don't need to use a getter |
| 491 // (that will throw if the getter method is missing), but can always |
| 492 // access the field directly. |
| 493 field is ClosureFieldElement; |
| 490 } | 494 } |
| 491 | 495 |
| 492 bool canAvoidGeneratedCheckedSetter(VariableElement member) { | 496 bool canAvoidGeneratedCheckedSetter(VariableElement member) { |
| 493 // We never generate accessors for top-level/static fields. | 497 // We never generate accessors for top-level/static fields. |
| 494 if (!member.isInstanceMember) return true; | 498 if (!member.isInstanceMember) return true; |
| 495 DartType type = member.type; | 499 DartType type = member.type; |
| 496 return type.treatAsDynamic || (type.element == compiler.objectClass); | 500 return type.treatAsDynamic || (type.element == compiler.objectClass); |
| 497 } | 501 } |
| 498 | 502 |
| 499 void generateCheckedSetter(Element member, | 503 void generateCheckedSetter(Element member, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 ? new Selector.getter(member.name, member.library) | 559 ? new Selector.getter(member.name, member.library) |
| 556 : new Selector.setter(member.name, member.library); | 560 : new Selector.setter(member.name, member.library); |
| 557 String reflectionName = emitter.getReflectionName(selector, name); | 561 String reflectionName = emitter.getReflectionName(selector, name); |
| 558 if (reflectionName != null) { | 562 if (reflectionName != null) { |
| 559 var reflectable = | 563 var reflectable = |
| 560 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 564 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| 561 builder.addProperty('+$reflectionName', reflectable); | 565 builder.addProperty('+$reflectionName', reflectable); |
| 562 } | 566 } |
| 563 } | 567 } |
| 564 } | 568 } |
| OLD | NEW |