| 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.full_emitter; | 5 part of dart2js.js_emitter.full_emitter; |
| 6 | 6 |
| 7 class ClassEmitter extends CodeEmitterHelper { | 7 class ClassEmitter extends CodeEmitterHelper { |
| 8 final ClosedWorld closedWorld; | 8 final ClosedWorld closedWorld; |
| 9 | 9 |
| 10 ClassEmitter(this.closedWorld); | 10 ClassEmitter(this.closedWorld); |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 generateReflectionDataForFieldGetterOrSetter(member, setterName, builder, | 208 generateReflectionDataForFieldGetterOrSetter(member, setterName, builder, |
| 209 isGetter: false); | 209 isGetter: false); |
| 210 } | 210 } |
| 211 } | 211 } |
| 212 | 212 |
| 213 /// Emits getters/setters for fields if compiling in CSP mode. | 213 /// Emits getters/setters for fields if compiling in CSP mode. |
| 214 void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) { | 214 void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) { |
| 215 if (!compiler.options.useContentSecurityPolicy || cls.onlyForRti) return; | 215 if (!compiler.options.useContentSecurityPolicy || cls.onlyForRti) return; |
| 216 | 216 |
| 217 for (Field field in cls.fields) { | 217 for (Field field in cls.fields) { |
| 218 Element member = field.element; | 218 FieldElement member = field.element; |
| 219 reporter.withCurrentElement(member, () { | 219 reporter.withCurrentElement(member, () { |
| 220 if (field.needsGetter) { | 220 if (field.needsGetter) { |
| 221 emitGetterForCSP(member, field.name, field.accessorName, builder); | 221 emitGetterForCSP(member, field.name, field.accessorName, builder); |
| 222 } | 222 } |
| 223 if (field.needsUncheckedSetter) { | 223 if (field.needsUncheckedSetter) { |
| 224 emitSetterForCSP(member, field.name, field.accessorName, builder); | 224 emitSetterForCSP(member, field.name, field.accessorName, builder); |
| 225 } | 225 } |
| 226 }); | 226 }); |
| 227 } | 227 } |
| 228 } | 228 } |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 previousName = emitter.mangledFieldNames | 367 previousName = emitter.mangledFieldNames |
| 368 .putIfAbsent(namer.deriveGetterName(accessorName), () => memberName); | 368 .putIfAbsent(namer.deriveGetterName(accessorName), () => memberName); |
| 369 } else { | 369 } else { |
| 370 previousName = emitter.mangledGlobalFieldNames | 370 previousName = emitter.mangledGlobalFieldNames |
| 371 .putIfAbsent(accessorName, () => memberName); | 371 .putIfAbsent(accessorName, () => memberName); |
| 372 } | 372 } |
| 373 assert(invariant(member, previousName == memberName, | 373 assert(invariant(member, previousName == memberName, |
| 374 message: '$previousName != ${memberName}')); | 374 message: '$previousName != ${memberName}')); |
| 375 } | 375 } |
| 376 | 376 |
| 377 void emitGetterForCSP(Element member, jsAst.Name fieldName, | 377 void emitGetterForCSP(FieldElement member, jsAst.Name fieldName, |
| 378 jsAst.Name accessorName, ClassBuilder builder) { | 378 jsAst.Name accessorName, ClassBuilder builder) { |
| 379 jsAst.Expression function = | 379 jsAst.Expression function = |
| 380 _stubGenerator.generateGetter(member, fieldName); | 380 _stubGenerator.generateGetter(member, fieldName); |
| 381 | 381 |
| 382 jsAst.Name getterName = namer.deriveGetterName(accessorName); | 382 jsAst.Name getterName = namer.deriveGetterName(accessorName); |
| 383 ClassElement cls = member.enclosingClass; | 383 ClassElement cls = member.enclosingClass; |
| 384 jsAst.Name className = namer.className(cls); | 384 jsAst.Name className = namer.className(cls); |
| 385 OutputUnit outputUnit = | 385 OutputUnit outputUnit = |
| 386 compiler.deferredLoadTask.outputUnitForElement(member); | 386 compiler.deferredLoadTask.outputUnitForElement(member); |
| 387 emitter | 387 emitter |
| 388 .cspPrecompiledFunctionFor(outputUnit) | 388 .cspPrecompiledFunctionFor(outputUnit) |
| 389 .add(js('#.prototype.# = #', [className, getterName, function])); | 389 .add(js('#.prototype.# = #', [className, getterName, function])); |
| 390 if (backend.isAccessibleByReflection(member)) { | 390 if (backend.isAccessibleByReflection(member)) { |
| 391 emitter.cspPrecompiledFunctionFor(outputUnit).add(js( | 391 emitter.cspPrecompiledFunctionFor(outputUnit).add(js( |
| 392 '#.prototype.#.${namer.reflectableField} = 1', | 392 '#.prototype.#.${namer.reflectableField} = 1', |
| 393 [className, getterName])); | 393 [className, getterName])); |
| 394 } | 394 } |
| 395 } | 395 } |
| 396 | 396 |
| 397 void emitSetterForCSP(Element member, jsAst.Name fieldName, | 397 void emitSetterForCSP(FieldElement member, jsAst.Name fieldName, |
| 398 jsAst.Name accessorName, ClassBuilder builder) { | 398 jsAst.Name accessorName, ClassBuilder builder) { |
| 399 jsAst.Expression function = | 399 jsAst.Expression function = |
| 400 _stubGenerator.generateSetter(member, fieldName); | 400 _stubGenerator.generateSetter(member, fieldName); |
| 401 | 401 |
| 402 jsAst.Name setterName = namer.deriveSetterName(accessorName); | 402 jsAst.Name setterName = namer.deriveSetterName(accessorName); |
| 403 ClassElement cls = member.enclosingClass; | 403 ClassElement cls = member.enclosingClass; |
| 404 jsAst.Name className = namer.className(cls); | 404 jsAst.Name className = namer.className(cls); |
| 405 OutputUnit outputUnit = | 405 OutputUnit outputUnit = |
| 406 compiler.deferredLoadTask.outputUnitForElement(member); | 406 compiler.deferredLoadTask.outputUnitForElement(member); |
| 407 emitter | 407 emitter |
| (...skipping 14 matching lines...) Expand all Loading... |
| 422 : new Selector.setter( | 422 : new Selector.setter( |
| 423 new Name(member.name, member.library, isSetter: true)); | 423 new Name(member.name, member.library, isSetter: true)); |
| 424 String reflectionName = emitter.getReflectionName(selector, name); | 424 String reflectionName = emitter.getReflectionName(selector, name); |
| 425 if (reflectionName != null) { | 425 if (reflectionName != null) { |
| 426 var reflectable = | 426 var reflectable = |
| 427 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 427 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| 428 builder.addPropertyByName('+$reflectionName', reflectable); | 428 builder.addPropertyByName('+$reflectionName', reflectable); |
| 429 } | 429 } |
| 430 } | 430 } |
| 431 } | 431 } |
| OLD | NEW |