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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/old_emitter/class_emitter.dart

Issue 917083003: Revert "dart2js: Refactoring, documentation, and a few bugfixes in Namer class." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 10 months 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 ClassStubGenerator get _stubGenerator => 9 ClassStubGenerator get _stubGenerator =>
10 new ClassStubGenerator(compiler, namer, backend); 10 new ClassStubGenerator(compiler, namer, backend);
11 11
12 /** 12 /**
13 * Documentation wanted -- johnniwinther 13 * Documentation wanted -- johnniwinther
14 */ 14 */
15 void emitClass(Class cls, ClassBuilder enclosingBuilder) { 15 void emitClass(Class cls, ClassBuilder enclosingBuilder) {
16 ClassElement classElement = cls.element; 16 ClassElement classElement = cls.element;
17 17
18 assert(invariant(classElement, classElement.isDeclaration)); 18 assert(invariant(classElement, classElement.isDeclaration));
19 19
20 emitter.needsClassSupport = true; 20 emitter.needsClassSupport = true;
21 21
22 ClassElement superclass = classElement.superclass; 22 ClassElement superclass = classElement.superclass;
23 String superName = ""; 23 String superName = "";
24 if (superclass != null) { 24 if (superclass != null) {
25 superName = namer.className(superclass); 25 superName = namer.getNameOfClass(superclass);
26 } 26 }
27 27
28 if (cls.isMixinApplication) { 28 if (cls.isMixinApplication) {
29 MixinApplication mixinApplication = cls; 29 MixinApplication mixinApplication = cls;
30 String mixinName = mixinApplication.mixinClass.name; 30 String mixinName = mixinApplication.mixinClass.name;
31 superName = '$superName+$mixinName'; 31 superName = '$superName+$mixinName';
32 emitter.needsMixinSupport = true; 32 emitter.needsMixinSupport = true;
33 } 33 }
34 34
35 ClassBuilder builder = new ClassBuilder(classElement, namer); 35 ClassBuilder builder = new ClassBuilder(classElement, namer);
36 builder.superName = superName; 36 builder.superName = superName;
37 emitConstructorsForCSP(cls); 37 emitConstructorsForCSP(cls);
38 emitFields(cls, builder); 38 emitFields(cls, builder);
39 emitCheckedClassSetters(cls, builder); 39 emitCheckedClassSetters(cls, builder);
40 emitClassGettersSettersForCSP(cls, builder); 40 emitClassGettersSettersForCSP(cls, builder);
41 emitInstanceMembers(cls, builder); 41 emitInstanceMembers(cls, builder);
42 emitStubs(cls.callStubs, builder); 42 emitStubs(cls.callStubs, builder);
43 emitStubs(cls.typeVariableReaderStubs, builder); 43 emitStubs(cls.typeVariableReaderStubs, builder);
44 emitRuntimeTypeInformation(cls, builder); 44 emitRuntimeTypeInformation(cls, builder);
45 emitNativeInfo(cls, builder); 45 emitNativeInfo(cls, builder);
46 46
47 if (classElement == backend.closureClass) { 47 if (classElement == backend.closureClass) {
48 // We add a special getter here to allow for tearing off a closure from 48 // We add a special getter here to allow for tearing off a closure from
49 // itself. 49 // itself.
50 String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME);
50 jsAst.Fun function = js('function() { return this; }'); 51 jsAst.Fun function = js('function() { return this; }');
51 String name = namer.getterForPublicMember(Compiler.CALL_OPERATOR_NAME); 52 builder.addProperty(namer.getterNameFromAccessorName(name), function);
52 builder.addProperty(name, function);
53 } 53 }
54 54
55 emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder); 55 emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder);
56 } 56 }
57 /** 57 /**
58 * Emits the precompiled constructor when in CSP mode. 58 * Emits the precompiled constructor when in CSP mode.
59 */ 59 */
60 void emitConstructorsForCSP(Class cls) { 60 void emitConstructorsForCSP(Class cls) {
61 List<String> fieldNames = <String>[]; 61 List<String> fieldNames = <String>[];
62 62
63 if (!compiler.useContentSecurityPolicy) return; 63 if (!compiler.useContentSecurityPolicy) return;
64 64
65 if (!cls.onlyForRti && !cls.isNative) { 65 if (!cls.onlyForRti && !cls.isNative) {
66 fieldNames = cls.fields.map((Field field) => field.name).toList(); 66 fieldNames = cls.fields.map((Field field) => field.name).toList();
67 } 67 }
68 68
69 ClassElement classElement = cls.element; 69 ClassElement classElement = cls.element;
70 70
71 jsAst.Expression constructorAst = 71 jsAst.Expression constructorAst =
72 _stubGenerator.generateClassConstructor(classElement, fieldNames); 72 _stubGenerator.generateClassConstructor(classElement, fieldNames);
73 73
74 String constructorName = namer.className(classElement); 74 String constructorName = namer.getNameOfClass(classElement);
75 OutputUnit outputUnit = 75 OutputUnit outputUnit =
76 compiler.deferredLoadTask.outputUnitForElement(classElement); 76 compiler.deferredLoadTask.outputUnitForElement(classElement);
77 emitter.emitPrecompiledConstructor( 77 emitter.emitPrecompiledConstructor(
78 outputUnit, constructorName, constructorAst, fieldNames); 78 outputUnit, constructorName, constructorAst, fieldNames);
79 } 79 }
80 80
81 /// Returns `true` if fields added. 81 /// Returns `true` if fields added.
82 bool emitFields(FieldContainer container, 82 bool emitFields(FieldContainer container,
83 ClassBuilder builder, 83 ClassBuilder builder,
84 { bool classIsNative: false, 84 { bool classIsNative: false,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 assert(!classIsNative); 135 assert(!classIsNative);
136 } else { 136 } else {
137 // Emit (possibly renaming) field name so we can add accessors at 137 // Emit (possibly renaming) field name so we can add accessors at
138 // runtime. 138 // runtime.
139 if (name != accessorName) { 139 if (name != accessorName) {
140 fieldName = '$accessorName:$name'; 140 fieldName = '$accessorName:$name';
141 } 141 }
142 142
143 if (field.needsInterceptedGetter) { 143 if (field.needsInterceptedGetter) {
144 emitter.interceptorEmitter.interceptorInvocationNames.add( 144 emitter.interceptorEmitter.interceptorInvocationNames.add(
145 namer.getterForElement(fieldElement)); 145 namer.getterName(fieldElement));
146 } 146 }
147 // TODO(16168): The setter creator only looks at the getter-name. 147 // TODO(16168): The setter creator only looks at the getter-name.
148 // Even though the setter could avoid the interceptor convention we 148 // Even though the setter could avoid the interceptor convention we
149 // currently still need to add the additional argument. 149 // currently still need to add the additional argument.
150 if (field.needsInterceptedGetter || field.needsInterceptedSetter) { 150 if (field.needsInterceptedGetter || field.needsInterceptedSetter) {
151 emitter.interceptorEmitter.interceptorInvocationNames.add( 151 emitter.interceptorEmitter.interceptorInvocationNames.add(
152 namer.setterForElement(fieldElement)); 152 namer.setterName(fieldElement));
153 } 153 }
154 154
155 int code = field.getterFlags + (field.setterFlags << 2); 155 int code = field.getterFlags + (field.setterFlags << 2);
156 if (code == 0) { 156 if (code == 0) {
157 compiler.internalError(fieldElement, 157 compiler.internalError(fieldElement,
158 'Field code is 0 ($fieldElement).'); 158 'Field code is 0 ($fieldElement).');
159 } else { 159 } else {
160 fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]; 160 fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE];
161 } 161 }
162 } 162 }
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 DartType type = member.type; 486 DartType type = member.type;
487 return type.treatAsDynamic || (type.element == compiler.objectClass); 487 return type.treatAsDynamic || (type.element == compiler.objectClass);
488 } 488 }
489 489
490 void generateCheckedSetter(Element member, 490 void generateCheckedSetter(Element member,
491 String fieldName, 491 String fieldName,
492 String accessorName, 492 String accessorName,
493 ClassBuilder builder) { 493 ClassBuilder builder) {
494 jsAst.Expression code = backend.generatedCode[member]; 494 jsAst.Expression code = backend.generatedCode[member];
495 assert(code != null); 495 assert(code != null);
496 String setterName = namer.deriveSetterName(accessorName); 496 String setterName = namer.setterNameFromAccessorName(accessorName);
497 compiler.dumpInfoTask.registerElementAst(member, 497 compiler.dumpInfoTask.registerElementAst(member,
498 builder.addProperty(setterName, code)); 498 builder.addProperty(setterName, code));
499 generateReflectionDataForFieldGetterOrSetter( 499 generateReflectionDataForFieldGetterOrSetter(
500 member, setterName, builder, isGetter: false); 500 member, setterName, builder, isGetter: false);
501 } 501 }
502 502
503 void emitGetterForCSP(Element member, String fieldName, String accessorName, 503 void emitGetterForCSP(Element member, String fieldName, String accessorName,
504 ClassBuilder builder) { 504 ClassBuilder builder) {
505 jsAst.Expression function = 505 jsAst.Expression function =
506 _stubGenerator.generateGetter(member, fieldName); 506 _stubGenerator.generateGetter(member, fieldName);
507 507
508 String getterName = namer.deriveGetterName(accessorName); 508 String getterName = namer.getterNameFromAccessorName(accessorName);
509 ClassElement cls = member.enclosingClass; 509 ClassElement cls = member.enclosingClass;
510 String className = namer.className(cls); 510 String className = namer.getNameOfClass(cls);
511 OutputUnit outputUnit = 511 OutputUnit outputUnit =
512 compiler.deferredLoadTask.outputUnitForElement(member); 512 compiler.deferredLoadTask.outputUnitForElement(member);
513 emitter.cspPrecompiledFunctionFor(outputUnit).add( 513 emitter.cspPrecompiledFunctionFor(outputUnit).add(
514 js('#.prototype.# = #', [className, getterName, function])); 514 js('#.prototype.# = #', [className, getterName, function]));
515 if (backend.isAccessibleByReflection(member)) { 515 if (backend.isAccessibleByReflection(member)) {
516 emitter.cspPrecompiledFunctionFor(outputUnit).add( 516 emitter.cspPrecompiledFunctionFor(outputUnit).add(
517 js('#.prototype.#.${namer.reflectableField} = 1', 517 js('#.prototype.#.${namer.reflectableField} = 1',
518 [className, getterName])); 518 [className, getterName]));
519 } 519 }
520 } 520 }
521 521
522 void emitSetterForCSP(Element member, String fieldName, String accessorName, 522 void emitSetterForCSP(Element member, String fieldName, String accessorName,
523 ClassBuilder builder) { 523 ClassBuilder builder) {
524 jsAst.Expression function = 524 jsAst.Expression function =
525 _stubGenerator.generateSetter(member, fieldName); 525 _stubGenerator.generateSetter(member, fieldName);
526 526
527 String setterName = namer.deriveSetterName(accessorName); 527 String setterName = namer.setterNameFromAccessorName(accessorName);
528 ClassElement cls = member.enclosingClass; 528 ClassElement cls = member.enclosingClass;
529 String className = namer.className(cls); 529 String className = namer.getNameOfClass(cls);
530 OutputUnit outputUnit = 530 OutputUnit outputUnit =
531 compiler.deferredLoadTask.outputUnitForElement(member); 531 compiler.deferredLoadTask.outputUnitForElement(member);
532 emitter.cspPrecompiledFunctionFor(outputUnit).add( 532 emitter.cspPrecompiledFunctionFor(outputUnit).add(
533 js('#.prototype.# = #', [className, setterName, function])); 533 js('#.prototype.# = #', [className, setterName, function]));
534 if (backend.isAccessibleByReflection(member)) { 534 if (backend.isAccessibleByReflection(member)) {
535 emitter.cspPrecompiledFunctionFor(outputUnit).add( 535 emitter.cspPrecompiledFunctionFor(outputUnit).add(
536 js('#.prototype.#.${namer.reflectableField} = 1', 536 js('#.prototype.#.${namer.reflectableField} = 1',
537 [className, setterName])); 537 [className, setterName]));
538 } 538 }
539 } 539 }
540 540
541 void generateReflectionDataForFieldGetterOrSetter(Element member, 541 void generateReflectionDataForFieldGetterOrSetter(Element member,
542 String name, 542 String name,
543 ClassBuilder builder, 543 ClassBuilder builder,
544 {bool isGetter}) { 544 {bool isGetter}) {
545 Selector selector = isGetter 545 Selector selector = isGetter
546 ? new Selector.getter(member.name, member.library) 546 ? new Selector.getter(member.name, member.library)
547 : new Selector.setter(member.name, member.library); 547 : new Selector.setter(member.name, member.library);
548 String reflectionName = emitter.getReflectionName(selector, name); 548 String reflectionName = emitter.getReflectionName(selector, name);
549 if (reflectionName != null) { 549 if (reflectionName != null) {
550 var reflectable = 550 var reflectable =
551 js(backend.isAccessibleByReflection(member) ? '1' : '0'); 551 js(backend.isAccessibleByReflection(member) ? '1' : '0');
552 builder.addProperty('+$reflectionName', reflectable); 552 builder.addProperty('+$reflectionName', reflectable);
553 } 553 }
554 } 554 }
555 } 555 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698