Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart

Issue 62373009: Field property naming fix - issues 14096, 14806 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review changes Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698