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