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

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

Issue 841993003: dart2js: Only emit constructors of the native class interceptors that are used. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comments. Created 5 years, 11 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
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/native_emitter.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
(...skipping 22 matching lines...) Expand all
33 } 33 }
34 34
35 if (classElement.isMixinApplication) { 35 if (classElement.isMixinApplication) {
36 String mixinName = namer.getNameOfClass(computeMixinClass(classElement)); 36 String mixinName = namer.getNameOfClass(computeMixinClass(classElement));
37 superName = '$superName+$mixinName'; 37 superName = '$superName+$mixinName';
38 emitter.needsMixinSupport = true; 38 emitter.needsMixinSupport = true;
39 } 39 }
40 40
41 ClassBuilder builder = new ClassBuilder(classElement, namer); 41 ClassBuilder builder = new ClassBuilder(classElement, namer);
42 builder.superName = superName; 42 builder.superName = superName;
43 emitClassConstructor(classElement, builder, onlyForRti: onlyForRti); 43 emitConstructorsForCSP(classElement, onlyForRti: onlyForRti);
44 emitFields(classElement, builder, onlyForRti: onlyForRti); 44 emitFields(classElement, builder, onlyForRti: onlyForRti);
45 emitClassGettersSetters(classElement, builder, onlyForRti: onlyForRti); 45 emitCheckedClassSetters(classElement, builder, onlyForRti: onlyForRti);
46 emitClassGettersSettersForCSP(classElement, builder,
47 onlyForRti: onlyForRti);
46 emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti); 48 emitInstanceMembers(classElement, builder, onlyForRti: onlyForRti);
47 emitter.typeTestEmitter.emitIsTests(classElement, builder); 49 emitter.typeTestEmitter.emitIsTests(classElement, builder);
48 if (additionalProperties != null) { 50 if (additionalProperties != null) {
49 additionalProperties.forEach(builder.addProperty); 51 additionalProperties.forEach(builder.addProperty);
50 } 52 }
51 53
52 if (classElement == backend.closureClass) { 54 if (classElement == backend.closureClass) {
53 // We add a special getter here to allow for tearing off a closure from 55 // We add a special getter here to allow for tearing off a closure from
54 // itself. 56 // itself.
55 String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME); 57 String name = namer.getMappedInstanceName(Compiler.CALL_OPERATOR_NAME);
56 jsAst.Fun function = js('function() { return this; }'); 58 jsAst.Fun function = js('function() { return this; }');
57 builder.addProperty(namer.getterNameFromAccessorName(name), function); 59 builder.addProperty(namer.getterNameFromAccessorName(name), function);
58 } 60 }
59 61
60 emitTypeVariableReaders(classElement, builder); 62 emitTypeVariableReaders(classElement, builder);
61 63
62 emitClassBuilderWithReflectionData( 64 emitClassBuilderWithReflectionData(
63 className, classElement, builder, properties); 65 className, classElement, builder, properties);
64 } 66 }
65 67 /**
66 void emitClassConstructor(ClassElement classElement, 68 * Emits the precompiled constructor when in CSP mode.
67 ClassBuilder builder, 69 */
70 void emitConstructorsForCSP(ClassElement classElement,
68 {bool onlyForRti: false}) { 71 {bool onlyForRti: false}) {
69 List<String> fields = <String>[]; 72 List<String> fields = <String>[];
73
74 if (!compiler.useContentSecurityPolicy) return;
75
70 if (!onlyForRti && !classElement.isNative) { 76 if (!onlyForRti && !classElement.isNative) {
71 visitFields(classElement, false, 77 visitFields(classElement, false,
72 (Element member, 78 (Element member,
73 String name, 79 String name,
74 String accessorName, 80 String accessorName,
75 bool needsGetter, 81 bool needsGetter,
76 bool needsSetter, 82 bool needsSetter,
77 bool needsCheckedSetter) { 83 bool needsCheckedSetter) {
78 fields.add(name); 84 fields.add(name);
79 }); 85 });
80 } 86 }
81
82 jsAst.Expression constructorAst = 87 jsAst.Expression constructorAst =
83 _stubGenerator.generateClassConstructor(classElement, fields); 88 _stubGenerator.generateClassConstructor(classElement, fields);
84 89
85 String constructorName = namer.getNameOfClass(classElement); 90 String constructorName = namer.getNameOfClass(classElement);
86 OutputUnit outputUnit = 91 OutputUnit outputUnit =
87 compiler.deferredLoadTask.outputUnitForElement(classElement); 92 compiler.deferredLoadTask.outputUnitForElement(classElement);
88 emitter.emitPrecompiledConstructor( 93 emitter.emitPrecompiledConstructor(
89 outputUnit, constructorName, constructorAst, fields); 94 outputUnit, constructorName, constructorAst, fields);
90 } 95 }
91 96
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 } 216 }
212 }); 217 });
213 } 218 }
214 219
215 if (hasMetadata) { 220 if (hasMetadata) {
216 builder.fieldMetadata = fieldMetadata; 221 builder.fieldMetadata = fieldMetadata;
217 } 222 }
218 return fieldsAdded; 223 return fieldsAdded;
219 } 224 }
220 225
221 void emitClassGettersSetters(ClassElement classElement, 226 /// Emits checked setters for fields.
227 void emitCheckedClassSetters(ClassElement classElement,
222 ClassBuilder builder, 228 ClassBuilder builder,
223 {bool onlyForRti: false}) { 229 {bool onlyForRti: false}) {
224 if (onlyForRti) return; 230 if (onlyForRti) return;
225 231
226 visitFields(classElement, false, 232 visitFields(classElement, false,
227 (VariableElement member, 233 (VariableElement member,
228 String name, 234 String name,
229 String accessorName, 235 String accessorName,
230 bool needsGetter, 236 bool needsGetter,
231 bool needsSetter, 237 bool needsSetter,
232 bool needsCheckedSetter) { 238 bool needsCheckedSetter) {
233 compiler.withCurrentElement(member, () { 239 compiler.withCurrentElement(member, () {
234 if (needsCheckedSetter) { 240 if (needsCheckedSetter) {
235 assert(!needsSetter); 241 assert(!needsSetter);
236 generateCheckedSetter(member, name, accessorName, builder); 242 generateCheckedSetter(member, name, accessorName, builder);
237 } 243 }
244 });
245 });
246 }
247
248 /// Emits getters/setters for fields if compiling in CSP mode.
249 void emitClassGettersSettersForCSP(ClassElement classElement,
250 ClassBuilder builder,
251 {bool onlyForRti: false}) {
252
253 if (!compiler.useContentSecurityPolicy || onlyForRti) return;
254
255 visitFields(classElement, false,
256 (VariableElement member,
257 String name,
258 String accessorName,
259 bool needsGetter,
260 bool needsSetter,
261 bool needsCheckedSetter) {
262 compiler.withCurrentElement(member, () {
238 if (needsGetter) { 263 if (needsGetter) {
239 generateGetter(member, name, accessorName, builder); 264 emitGetterForCSP(member, name, accessorName, builder);
240 } 265 }
241 if (needsSetter) { 266 if (needsSetter) {
242 generateSetter(member, name, accessorName, builder); 267 emitSetterForCSP(member, name, accessorName, builder);
243 } 268 }
244 }); 269 });
245 }); 270 });
246 } 271 }
247 272
248 /** 273 /**
249 * Documentation wanted -- johnniwinther 274 * Documentation wanted -- johnniwinther
250 * 275 *
251 * Invariant: [classElement] must be a declaration element. 276 * Invariant: [classElement] must be a declaration element.
252 */ 277 */
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 ClassBuilder builder) { 524 ClassBuilder builder) {
500 jsAst.Expression code = backend.generatedCode[member]; 525 jsAst.Expression code = backend.generatedCode[member];
501 assert(code != null); 526 assert(code != null);
502 String setterName = namer.setterNameFromAccessorName(accessorName); 527 String setterName = namer.setterNameFromAccessorName(accessorName);
503 compiler.dumpInfoTask.registerElementAst(member, 528 compiler.dumpInfoTask.registerElementAst(member,
504 builder.addProperty(setterName, code)); 529 builder.addProperty(setterName, code));
505 generateReflectionDataForFieldGetterOrSetter( 530 generateReflectionDataForFieldGetterOrSetter(
506 member, setterName, builder, isGetter: false); 531 member, setterName, builder, isGetter: false);
507 } 532 }
508 533
509 void generateGetter(Element member, String fieldName, String accessorName, 534 void emitGetterForCSP(Element member, String fieldName, String accessorName,
510 ClassBuilder builder) { 535 ClassBuilder builder) {
511 jsAst.Expression function = 536 jsAst.Expression function =
512 _stubGenerator.generateGetter(member, fieldName); 537 _stubGenerator.generateGetter(member, fieldName);
513 538
514 String getterName = namer.getterNameFromAccessorName(accessorName); 539 String getterName = namer.getterNameFromAccessorName(accessorName);
515 ClassElement cls = member.enclosingClass; 540 ClassElement cls = member.enclosingClass;
516 String className = namer.getNameOfClass(cls); 541 String className = namer.getNameOfClass(cls);
517 OutputUnit outputUnit = 542 OutputUnit outputUnit =
518 compiler.deferredLoadTask.outputUnitForElement(member); 543 compiler.deferredLoadTask.outputUnitForElement(member);
519 emitter.cspPrecompiledFunctionFor(outputUnit).add( 544 emitter.cspPrecompiledFunctionFor(outputUnit).add(
520 js('#.prototype.# = #', [className, getterName, function])); 545 js('#.prototype.# = #', [className, getterName, function]));
521 if (backend.isAccessibleByReflection(member)) { 546 if (backend.isAccessibleByReflection(member)) {
522 emitter.cspPrecompiledFunctionFor(outputUnit).add( 547 emitter.cspPrecompiledFunctionFor(outputUnit).add(
523 js('#.prototype.#.${namer.reflectableField} = 1', 548 js('#.prototype.#.${namer.reflectableField} = 1',
524 [className, getterName])); 549 [className, getterName]));
525 } 550 }
526 } 551 }
527 552
528 void generateSetter(Element member, String fieldName, String accessorName, 553 void emitSetterForCSP(Element member, String fieldName, String accessorName,
529 ClassBuilder builder) { 554 ClassBuilder builder) {
530 jsAst.Expression function = 555 jsAst.Expression function =
531 _stubGenerator.generateSetter(member, fieldName); 556 _stubGenerator.generateSetter(member, fieldName);
532 557
533 String setterName = namer.setterNameFromAccessorName(accessorName); 558 String setterName = namer.setterNameFromAccessorName(accessorName);
534 ClassElement cls = member.enclosingClass; 559 ClassElement cls = member.enclosingClass;
535 String className = namer.getNameOfClass(cls); 560 String className = namer.getNameOfClass(cls);
536 OutputUnit outputUnit = 561 OutputUnit outputUnit =
537 compiler.deferredLoadTask.outputUnitForElement(member); 562 compiler.deferredLoadTask.outputUnitForElement(member);
538 emitter.cspPrecompiledFunctionFor(outputUnit).add( 563 emitter.cspPrecompiledFunctionFor(outputUnit).add(
539 js('#.prototype.# = #', [className, setterName, function])); 564 js('#.prototype.# = #', [className, setterName, function]));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index); 619 js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]', index);
595 } 620 }
596 jsAst.Expression convertRtiToRuntimeType = emitter 621 jsAst.Expression convertRtiToRuntimeType = emitter
597 .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType')); 622 .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType'));
598 compiler.dumpInfoTask.registerElementAst(element, 623 compiler.dumpInfoTask.registerElementAst(element,
599 builder.addProperty(name, 624 builder.addProperty(name,
600 js('function () { return #(#) }', 625 js('function () { return #(#) }',
601 [convertRtiToRuntimeType, computeTypeVariable]))); 626 [convertRtiToRuntimeType, computeTypeVariable])));
602 } 627 }
603 } 628 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/js_emitter/native_emitter.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698