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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart

Issue 27524003: Generate tear-off closures dynamically. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed unit tests. Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index 5067c2870c58cb727a6f292edd32c7c3b180c34c..35e1178adcbaef88d2a4ed56eb1e912434dc61d9 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -108,7 +108,6 @@ class ClassEmitter extends CodeEmitterHelper {
throw new SpannableAssertionFailure(
element, 'Must be a ClassElement or a LibraryElement');
}
- StringBuffer buffer = new StringBuffer();
if (emitStatics) {
assert(invariant(element, superName == null, message: superName));
} else {
@@ -116,16 +115,13 @@ class ClassEmitter extends CodeEmitterHelper {
String nativeName =
namer.getPrimitiveInterceptorRuntimeName(element);
if (nativeName != null) {
- buffer.write('$nativeName/');
+ builder.nativeName = nativeName;
}
- buffer.write('$superName;');
+ builder.superName = superName;
}
- int bufferClassLength = buffer.length;
-
- String separator = '';
-
var fieldMetadata = [];
bool hasMetadata = false;
+ bool fieldsAdded = false;
if (!onlyForRti) {
visitFields(element, emitStatics,
@@ -142,8 +138,6 @@ class ClassEmitter extends CodeEmitterHelper {
// constructors, so we don't need the fields unless we are generating
// accessors at runtime.
if (!classIsNative || needsAccessor) {
- buffer.write(separator);
- separator = ',';
var metadata = task.metadataEmitter.buildMetadataFunction(field);
if (metadata != null) {
hasMetadata = true;
@@ -152,16 +146,17 @@ class ClassEmitter extends CodeEmitterHelper {
}
fieldMetadata.add(metadata);
recordMangledField(field, accessorName, field.name);
+ String fieldName = name;
+ String fieldCode = '';
+ String reflectionMarker = '';
if (!needsAccessor) {
// Emit field for constructor generation.
assert(!classIsNative);
- buffer.write(name);
} else {
// Emit (possibly renaming) field name so we can add accessors at
// runtime.
- buffer.write(accessorName);
if (name != accessorName) {
- buffer.write(':$name');
+ fieldName = '$accessorName:$name';
}
int getterCode = 0;
@@ -208,28 +203,25 @@ class ClassEmitter extends CodeEmitterHelper {
compiler.reportInternalError(
field, 'Internal error: code is 0 ($element/$field)');
} else {
- buffer.write(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]);
+ fieldCode = FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE];
}
}
if (backend.isAccessibleByReflection(field)) {
- buffer.write('-');
+ reflectionMarker = '-';
if (backend.isNeededForReflection(field)) {
DartType type = field.computeType(compiler);
- buffer.write('${task.metadataEmitter.reifyType(type)}');
+ reflectionMarker = '-${task.metadataEmitter.reifyType(type)}';
}
}
+ builder.addField('$fieldName$fieldCode$reflectionMarker');
+ fieldsAdded = true;
}
});
}
- bool fieldsAdded = buffer.length > bufferClassLength;
- String compactClassData = buffer.toString();
- jsAst.Expression classDataNode = js.string(compactClassData);
if (hasMetadata) {
- fieldMetadata.insert(0, classDataNode);
- classDataNode = new jsAst.ArrayInitializer.from(fieldMetadata);
+ builder.fieldMetadata = fieldMetadata;
}
- builder.addProperty('', classDataNode);
return fieldsAdded;
}
@@ -321,7 +313,7 @@ class ClassEmitter extends CodeEmitterHelper {
List<jsAst.Property> statics = new List<jsAst.Property>();
ClassBuilder staticsBuilder = new ClassBuilder();
if (emitFields(classElement, staticsBuilder, null, emitStatics: true)) {
- statics.add(staticsBuilder.properties.single);
+ statics.add(staticsBuilder.toObjectInitializer().properties.single);
}
Map<String, ClassBuilder> classPropertyLists =

Powered by Google App Engine
This is Rietveld 408576698