Index: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
diff --git a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
index 8760f4ce342c099189856d4d203c50bb4be1f96c..bae5ebe295b038c13e1ab687d27048b082d7c92b 100644 |
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart |
@@ -612,6 +612,12 @@ class CodeEmitterTask extends CompilerTask { |
* print the runtime type JSInt as 'int'. |
*/ |
js('var classData = desc[""], supr, name = cls, fields = classData'), |
+ optional( |
+ compiler.mirrorSystemClass != null, |
+ js.if_('typeof classData == "object" && ' |
+ 'classData instanceof Array', |
+ [js('classData = fields = classData[0]')])), |
+ |
js.if_('typeof classData == "string"', [ |
js('var split = classData.split("/")'), |
js.if_('split.length == 2', [ |
@@ -640,7 +646,10 @@ class CodeEmitterTask extends CompilerTask { |
]), |
])), |
- js('isolateProperties[cls] = defineClass(name, cls, fields, desc)'), |
+ js('var constructor = defineClass(name, cls, fields, desc)'), |
+ optional(compiler.mirrorSystemClass != null, |
+ js('constructor["${namer.metadataField}"] = desc')), |
+ js('isolateProperties[cls] = constructor'), |
js.if_('supr', js('pendingClasses[cls] = supr')) |
]) |
]), |
@@ -1443,6 +1452,9 @@ class CodeEmitterTask extends CompilerTask { |
buffer.write('$superName;'); |
int bufferClassLength = buffer.length; |
+ var fieldMetadata = []; |
+ bool hasMetadata = false; |
+ |
visitClassFields(classElement, (Element member, |
String name, |
String accessorName, |
@@ -1458,6 +1470,13 @@ class CodeEmitterTask extends CompilerTask { |
if (!classIsNative || needsAccessor) { |
buffer.write(separator); |
separator = ','; |
+ if (compiler.mirrorSystemClass != null) { |
+ var metadata = buildMetadataFunction(member); |
+ fieldMetadata.add(metadata); |
+ if (metadata != null) { |
+ hasMetadata = true; |
+ } |
+ } |
if (!needsAccessor) { |
// Emit field for constructor generation. |
assert(!classIsNative); |
@@ -1501,7 +1520,12 @@ class CodeEmitterTask extends CompilerTask { |
bool fieldsAdded = buffer.length > bufferClassLength; |
String compactClassData = buffer.toString(); |
- builder.addProperty('', js.string(compactClassData)); |
+ jsAst.Expression classDataNode = js.string(compactClassData); |
+ if (hasMetadata) { |
+ fieldMetadata.insert(0, classDataNode); |
+ classDataNode = new jsAst.ArrayInitializer.from(fieldMetadata); |
+ } |
+ builder.addProperty('', classDataNode); |
return fieldsAdded; |
} |
@@ -3282,7 +3306,6 @@ if (typeof document !== "undefined" && document.readyState !== "complete") { |
} |
$classesCollector[property] = newDesc; |
classes.push(property); |
- classes.push(element[""]); |
} |
} |
libraries.push([name, uri, classes, functions, metadata]); |