| 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; | 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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 bool needsSetter = field.needsUncheckedSetter; | 111 bool needsSetter = field.needsUncheckedSetter; |
| 112 | 112 |
| 113 // Ignore needsCheckedSetter - that is handled below. | 113 // Ignore needsCheckedSetter - that is handled below. |
| 114 bool needsAccessor = (needsGetter || needsSetter); | 114 bool needsAccessor = (needsGetter || needsSetter); |
| 115 // We need to output the fields for non-native classes so we can auto- | 115 // We need to output the fields for non-native classes so we can auto- |
| 116 // generate the constructor. For native classes there are no | 116 // generate the constructor. For native classes there are no |
| 117 // constructors, so we don't need the fields unless we are generating | 117 // constructors, so we don't need the fields unless we are generating |
| 118 // accessors at runtime. | 118 // accessors at runtime. |
| 119 bool needsFieldsForConstructor = !emitStatics && !classIsNative; | 119 bool needsFieldsForConstructor = !emitStatics && !classIsNative; |
| 120 if (needsFieldsForConstructor || needsAccessor) { | 120 if (needsFieldsForConstructor || needsAccessor) { |
| 121 var metadata = | 121 var metadata = task.metadataEmitter.buildMetadataFunction(fieldElement); |
| 122 emitter.metadataEmitter.buildMetadataFunction(fieldElement); | |
| 123 if (metadata != null) { | 122 if (metadata != null) { |
| 124 hasMetadata = true; | 123 hasMetadata = true; |
| 125 } else { | 124 } else { |
| 126 metadata = new jsAst.LiteralNull(); | 125 metadata = new jsAst.LiteralNull(); |
| 127 } | 126 } |
| 128 fieldMetadata.add(metadata); | 127 fieldMetadata.add(metadata); |
| 129 recordMangledField(fieldElement, accessorName, | 128 recordMangledField(fieldElement, accessorName, |
| 130 namer.privateName(fieldElement.library, fieldElement.name)); | 129 namer.privateName(fieldElement.library, fieldElement.name)); |
| 131 String fieldName = name; | 130 String fieldName = name; |
| 132 String fieldCode = ''; | 131 String fieldCode = ''; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 156 int code = field.getterFlags + (field.setterFlags << 2); | 155 int code = field.getterFlags + (field.setterFlags << 2); |
| 157 if (code == 0) { | 156 if (code == 0) { |
| 158 compiler.internalError(fieldElement, | 157 compiler.internalError(fieldElement, |
| 159 'Field code is 0 ($fieldElement).'); | 158 'Field code is 0 ($fieldElement).'); |
| 160 } else { | 159 } else { |
| 161 fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]; | 160 fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]; |
| 162 } | 161 } |
| 163 } | 162 } |
| 164 if (backend.isAccessibleByReflection(fieldElement)) { | 163 if (backend.isAccessibleByReflection(fieldElement)) { |
| 165 DartType type = fieldElement.type; | 164 DartType type = fieldElement.type; |
| 166 reflectionMarker = '-${emitter.metadataEmitter.reifyType(type)}'; | 165 reflectionMarker = '-${task.metadataEmitter.reifyType(type)}'; |
| 167 } | 166 } |
| 168 String builtFieldname = '$fieldName$fieldCode$reflectionMarker'; | 167 String builtFieldname = '$fieldName$fieldCode$reflectionMarker'; |
| 169 builder.addField(builtFieldname); | 168 builder.addField(builtFieldname); |
| 170 // Add 1 because adding a field to the class also requires a comma | 169 // Add 1 because adding a field to the class also requires a comma |
| 171 compiler.dumpInfoTask.recordFieldNameSize(fieldElement, | 170 compiler.dumpInfoTask.recordFieldNameSize(fieldElement, |
| 172 builtFieldname.length + 1); | 171 builtFieldname.length + 1); |
| 173 fieldsAdded = true; | 172 fieldsAdded = true; |
| 174 } | 173 } |
| 175 } | 174 } |
| 176 | 175 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 builder.addProperty(namer.nativeSpecProperty, js.string(cls.nativeInfo)); | 271 builder.addProperty(namer.nativeSpecProperty, js.string(cls.nativeInfo)); |
| 273 } | 272 } |
| 274 } | 273 } |
| 275 | 274 |
| 276 void emitClassBuilderWithReflectionData(Class cls, | 275 void emitClassBuilderWithReflectionData(Class cls, |
| 277 ClassBuilder classBuilder, | 276 ClassBuilder classBuilder, |
| 278 ClassBuilder enclosingBuilder) { | 277 ClassBuilder enclosingBuilder) { |
| 279 ClassElement classElement = cls.element; | 278 ClassElement classElement = cls.element; |
| 280 String className = cls.name; | 279 String className = cls.name; |
| 281 | 280 |
| 282 var metadata = emitter.metadataEmitter.buildMetadataFunction(classElement); | 281 var metadata = task.metadataEmitter.buildMetadataFunction(classElement); |
| 283 if (metadata != null) { | 282 if (metadata != null) { |
| 284 classBuilder.addProperty("@", metadata); | 283 classBuilder.addProperty("@", metadata); |
| 285 } | 284 } |
| 286 | 285 |
| 287 if (backend.isAccessibleByReflection(classElement)) { | 286 if (backend.isAccessibleByReflection(classElement)) { |
| 288 List<DartType> typeVars = classElement.typeVariables; | 287 List<DartType> typeVars = classElement.typeVariables; |
| 289 Iterable typeVariableProperties = emitter.typeVariableHandler | 288 Iterable typeVariableProperties = emitter.typeVariableHandler |
| 290 .typeVariablesOf(classElement).map(js.number); | 289 .typeVariablesOf(classElement).map(js.number); |
| 291 | 290 |
| 292 ClassElement superclass = classElement.superclass; | 291 ClassElement superclass = classElement.superclass; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 compiler.dumpInfoTask.registerElementAst(classBuilder.element, propertyValue
); | 324 compiler.dumpInfoTask.registerElementAst(classBuilder.element, propertyValue
); |
| 326 enclosingBuilder.addProperty(className, propertyValue); | 325 enclosingBuilder.addProperty(className, propertyValue); |
| 327 | 326 |
| 328 String reflectionName = emitter.getReflectionName(classElement, className); | 327 String reflectionName = emitter.getReflectionName(classElement, className); |
| 329 if (reflectionName != null) { | 328 if (reflectionName != null) { |
| 330 if (!backend.isAccessibleByReflection(classElement)) { | 329 if (!backend.isAccessibleByReflection(classElement)) { |
| 331 enclosingBuilder.addProperty("+$reflectionName", js.number(0)); | 330 enclosingBuilder.addProperty("+$reflectionName", js.number(0)); |
| 332 } else { | 331 } else { |
| 333 List<int> types = <int>[]; | 332 List<int> types = <int>[]; |
| 334 if (classElement.supertype != null) { | 333 if (classElement.supertype != null) { |
| 335 types.add(emitter.metadataEmitter.reifyType(classElement.supertype)); | 334 types.add(task.metadataEmitter.reifyType(classElement.supertype)); |
| 336 } | 335 } |
| 337 for (DartType interface in classElement.interfaces) { | 336 for (DartType interface in classElement.interfaces) { |
| 338 types.add(emitter.metadataEmitter.reifyType(interface)); | 337 types.add(task.metadataEmitter.reifyType(interface)); |
| 339 } | 338 } |
| 340 enclosingBuilder.addProperty("+$reflectionName", | 339 enclosingBuilder.addProperty("+$reflectionName", |
| 341 new jsAst.ArrayInitializer(types.map(js.number).toList())); | 340 new jsAst.ArrayInitializer(types.map(js.number).toList())); |
| 342 } | 341 } |
| 343 } | 342 } |
| 344 } | 343 } |
| 345 | 344 |
| 346 /** | 345 /** |
| 347 * Invokes [f] for each of the fields of [element]. | 346 * Invokes [f] for each of the fields of [element]. |
| 348 * | 347 * |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 js.number(index)); | 587 js.number(index)); |
| 589 } | 588 } |
| 590 jsAst.Expression convertRtiToRuntimeType = emitter | 589 jsAst.Expression convertRtiToRuntimeType = emitter |
| 591 .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType')); | 590 .staticFunctionAccess(backend.findHelper('convertRtiToRuntimeType')); |
| 592 compiler.dumpInfoTask.registerElementAst(element, | 591 compiler.dumpInfoTask.registerElementAst(element, |
| 593 builder.addProperty(name, | 592 builder.addProperty(name, |
| 594 js('function () { return #(#) }', | 593 js('function () { return #(#) }', |
| 595 [convertRtiToRuntimeType, computeTypeVariable]))); | 594 [convertRtiToRuntimeType, computeTypeVariable]))); |
| 596 } | 595 } |
| 597 } | 596 } |
| OLD | NEW |