| 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 | 8 |
| 9 ClassStubGenerator get _stubGenerator => | 9 ClassStubGenerator get _stubGenerator => |
| 10 new ClassStubGenerator(compiler, namer, backend); | 10 new ClassStubGenerator(compiler, namer, backend); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 if (hasMetadata) { | 186 if (hasMetadata) { |
| 187 builder.fieldMetadata = fieldMetadata; | 187 builder.fieldMetadata = fieldMetadata; |
| 188 } | 188 } |
| 189 return fieldsAdded; | 189 return fieldsAdded; |
| 190 } | 190 } |
| 191 | 191 |
| 192 /// Emits checked setters for fields. | 192 /// Emits checked setters for fields. |
| 193 void emitCheckedClassSetters(Class cls, ClassBuilder builder) { | 193 void emitCheckedClassSetters(Class cls, ClassBuilder builder) { |
| 194 if (cls.onlyForRti) return; | 194 if (cls.onlyForRti) return; |
| 195 | 195 |
| 196 for (Field field in cls.fields) { | 196 for (StubMethod method in cls.checkedSetters) { |
| 197 if (field.needsCheckedSetter) { | 197 Element member = method.element; |
| 198 assert(!field.needsUncheckedSetter); | 198 assert(member != null); |
| 199 compiler.withCurrentElement(field.element, () { | 199 jsAst.Expression code = method.code; |
| 200 generateCheckedSetter( | 200 jsAst.Name setterName = method.name; |
| 201 field.element, field.name, field.accessorName, builder); | 201 compiler.dumpInfoTask.registerElementAst(member, |
| 202 }); | 202 builder.addProperty(setterName, code)); |
| 203 } | 203 generateReflectionDataForFieldGetterOrSetter( |
| 204 member, setterName, builder, isGetter: false); |
| 204 } | 205 } |
| 205 } | 206 } |
| 206 | 207 |
| 207 /// Emits getters/setters for fields if compiling in CSP mode. | 208 /// Emits getters/setters for fields if compiling in CSP mode. |
| 208 void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) { | 209 void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) { |
| 209 | 210 |
| 210 if (!compiler.useContentSecurityPolicy || cls.onlyForRti) return; | 211 if (!compiler.useContentSecurityPolicy || cls.onlyForRti) return; |
| 211 | 212 |
| 212 for (Field field in cls.fields) { | 213 for (Field field in cls.fields) { |
| 213 Element member = field.element; | 214 Element member = field.element; |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 () => memberName); | 370 () => memberName); |
| 370 } else { | 371 } else { |
| 371 previousName = emitter.mangledGlobalFieldNames.putIfAbsent( | 372 previousName = emitter.mangledGlobalFieldNames.putIfAbsent( |
| 372 accessorName, | 373 accessorName, |
| 373 () => memberName); | 374 () => memberName); |
| 374 } | 375 } |
| 375 assert(invariant(member, previousName == memberName, | 376 assert(invariant(member, previousName == memberName, |
| 376 message: '$previousName != ${memberName}')); | 377 message: '$previousName != ${memberName}')); |
| 377 } | 378 } |
| 378 | 379 |
| 379 void generateCheckedSetter(Element member, | |
| 380 jsAst.Name fieldName, | |
| 381 jsAst.Name accessorName, | |
| 382 ClassBuilder builder) { | |
| 383 jsAst.Expression code = backend.generatedCode[member]; | |
| 384 assert(code != null); | |
| 385 jsAst.Name setterName = namer.deriveSetterName(accessorName); | |
| 386 compiler.dumpInfoTask.registerElementAst(member, | |
| 387 builder.addProperty(setterName, code)); | |
| 388 generateReflectionDataForFieldGetterOrSetter( | |
| 389 member, setterName, builder, isGetter: false); | |
| 390 } | |
| 391 | |
| 392 void emitGetterForCSP(Element member, jsAst.Name fieldName, | 380 void emitGetterForCSP(Element member, jsAst.Name fieldName, |
| 393 jsAst.Name accessorName, | 381 jsAst.Name accessorName, |
| 394 ClassBuilder builder) { | 382 ClassBuilder builder) { |
| 395 jsAst.Expression function = | 383 jsAst.Expression function = |
| 396 _stubGenerator.generateGetter(member, fieldName); | 384 _stubGenerator.generateGetter(member, fieldName); |
| 397 | 385 |
| 398 jsAst.Name getterName = namer.deriveGetterName(accessorName); | 386 jsAst.Name getterName = namer.deriveGetterName(accessorName); |
| 399 ClassElement cls = member.enclosingClass; | 387 ClassElement cls = member.enclosingClass; |
| 400 jsAst.Name className = namer.className(cls); | 388 jsAst.Name className = namer.className(cls); |
| 401 OutputUnit outputUnit = | 389 OutputUnit outputUnit = |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 ? new Selector.getter(member.name, member.library) | 425 ? new Selector.getter(member.name, member.library) |
| 438 : new Selector.setter(member.name, member.library); | 426 : new Selector.setter(member.name, member.library); |
| 439 String reflectionName = emitter.getReflectionName(selector, name); | 427 String reflectionName = emitter.getReflectionName(selector, name); |
| 440 if (reflectionName != null) { | 428 if (reflectionName != null) { |
| 441 var reflectable = | 429 var reflectable = |
| 442 js(backend.isAccessibleByReflection(member) ? '1' : '0'); | 430 js(backend.isAccessibleByReflection(member) ? '1' : '0'); |
| 443 builder.addPropertyByName('+$reflectionName', reflectable); | 431 builder.addPropertyByName('+$reflectionName', reflectable); |
| 444 } | 432 } |
| 445 } | 433 } |
| 446 } | 434 } |
| OLD | NEW |