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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart

Issue 15861028: Implement MethodMirror.metadata. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address comments and deal with private members of BoundClosure Created 7 years, 7 months 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_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 417dca932d2030a87bbb16b2dfc317f37986eded..8760f4ce342c099189856d4d203c50bb4be1f96c 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -1161,7 +1161,8 @@ class CodeEmitterTask extends CompilerTask {
if (member.isAbstract(compiler)) return;
jsAst.Expression code = backend.generatedCode[member];
if (code == null) return;
- builder.addProperty(namer.getName(member), code);
+ String name = namer.getName(member);
+ builder.addProperty(name, code);
code = backend.generatedBailoutCode[member];
if (code != null) {
builder.addProperty(namer.getBailoutName(member), code);
@@ -1171,6 +1172,10 @@ class CodeEmitterTask extends CompilerTask {
if (!parameters.optionalParameters.isEmpty) {
addParameterStubs(member, builder.addProperty);
}
+ var metadata = buildMetadataFunction(member);
+ if (metadata != null) {
+ builder.addProperty('@$name', metadata);
+ }
} else if (!member.isField()) {
compiler.internalError('unexpected kind: "${member.kind}"',
element: member);
@@ -1796,7 +1801,13 @@ class CodeEmitterTask extends CompilerTask {
for (Element element in Elements.sortedByPosition(elements)) {
CodeBuffer buffer = bufferForElement(element, eagerBuffer);
jsAst.Expression code = backend.generatedCode[element];
- emitStaticFunction(buffer, namer.getName(element), code);
+ String name = namer.getName(element);
+ emitStaticFunction(buffer, name, code);
+ var metadata = buildMetadataFunction(element);
+ if (metadata != null) {
+ buffer.write(',$n$n"@$name":$_');
+ buffer.write(jsAst.prettyPrint(metadata, compiler));
+ }
jsAst.Expression bailoutCode = backend.generatedBailoutCode[element];
if (bailoutCode != null) {
pendingElementsWithBailouts.remove(element);
@@ -3252,11 +3263,24 @@ if (typeof document !== "undefined" && document.readyState !== "complete") {
for (var property in descriptor) {
if (!hasOwnProperty.call(descriptor, property)) continue;
var element = descriptor[property];
- if (typeof element === "function") {
+ if (property.substring(0, 1) == "@") {
+ property = property.substring(1);
+ ${namer.CURRENT_ISOLATE}[property]["${namer.metadataField}"] = element;
+ } else if (typeof element === "function") {
${namer.CURRENT_ISOLATE}[property] = element;
functions.push(property);
} else {
- $classesCollector[property] = element;
+ var newDesc = {}
+ for (var prop in element) {
+ if (!hasOwnProperty.call(element, prop)) continue;
+ if (prop.substring(0, 1) == "@" && prop != "@") {
+ newDesc[prop.substring(1)]["${namer.metadataField}"] ='''
+'''element[prop];
+ } else {
+ newDesc[prop] = element[prop];
+ }
+ }
+ $classesCollector[property] = newDesc;
classes.push(property);
classes.push(element[""]);
}

Powered by Google App Engine
This is Rietveld 408576698