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

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: 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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698