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

Side by Side 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, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 js_backend; 5 part of js_backend;
6 6
7 /** 7 /**
8 * A function element that represents a closure call. The signature is copied 8 * A function element that represents a closure call. The signature is copied
9 * from the given element. 9 * from the given element.
10 */ 10 */
(...skipping 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 assert(invariant(member, member.isDeclaration)); 1154 assert(invariant(member, member.isDeclaration));
1155 // TODO(floitsch): we don't need to deal with members of 1155 // TODO(floitsch): we don't need to deal with members of
1156 // uninstantiated classes, that have been overwritten by subclasses. 1156 // uninstantiated classes, that have been overwritten by subclasses.
1157 1157
1158 if (member.isFunction() 1158 if (member.isFunction()
1159 || member.isGenerativeConstructorBody() 1159 || member.isGenerativeConstructorBody()
1160 || member.isAccessor()) { 1160 || member.isAccessor()) {
1161 if (member.isAbstract(compiler)) return; 1161 if (member.isAbstract(compiler)) return;
1162 jsAst.Expression code = backend.generatedCode[member]; 1162 jsAst.Expression code = backend.generatedCode[member];
1163 if (code == null) return; 1163 if (code == null) return;
1164 builder.addProperty(namer.getName(member), code); 1164 String name = namer.getName(member);
1165 builder.addProperty(name, code);
1165 code = backend.generatedBailoutCode[member]; 1166 code = backend.generatedBailoutCode[member];
1166 if (code != null) { 1167 if (code != null) {
1167 builder.addProperty(namer.getBailoutName(member), code); 1168 builder.addProperty(namer.getBailoutName(member), code);
1168 } 1169 }
1169 FunctionElement function = member; 1170 FunctionElement function = member;
1170 FunctionSignature parameters = function.computeSignature(compiler); 1171 FunctionSignature parameters = function.computeSignature(compiler);
1171 if (!parameters.optionalParameters.isEmpty) { 1172 if (!parameters.optionalParameters.isEmpty) {
1172 addParameterStubs(member, builder.addProperty); 1173 addParameterStubs(member, builder.addProperty);
1173 } 1174 }
1175 var metadata = buildMetadataFunction(member);
1176 if (metadata != null) {
1177 builder.addProperty('@$name', metadata);
1178 }
1174 } else if (!member.isField()) { 1179 } else if (!member.isField()) {
1175 compiler.internalError('unexpected kind: "${member.kind}"', 1180 compiler.internalError('unexpected kind: "${member.kind}"',
1176 element: member); 1181 element: member);
1177 } 1182 }
1178 emitExtraAccessors(member, builder); 1183 emitExtraAccessors(member, builder);
1179 } 1184 }
1180 1185
1181 /** 1186 /**
1182 * Documentation wanted -- johnniwinther 1187 * Documentation wanted -- johnniwinther
1183 * 1188 *
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 Iterable<Element> elements = 1794 Iterable<Element> elements =
1790 backend.generatedCode.keys.where(isStaticFunction); 1795 backend.generatedCode.keys.where(isStaticFunction);
1791 Set<Element> pendingElementsWithBailouts = 1796 Set<Element> pendingElementsWithBailouts =
1792 backend.generatedBailoutCode.keys 1797 backend.generatedBailoutCode.keys
1793 .where(isStaticFunction) 1798 .where(isStaticFunction)
1794 .toSet(); 1799 .toSet();
1795 1800
1796 for (Element element in Elements.sortedByPosition(elements)) { 1801 for (Element element in Elements.sortedByPosition(elements)) {
1797 CodeBuffer buffer = bufferForElement(element, eagerBuffer); 1802 CodeBuffer buffer = bufferForElement(element, eagerBuffer);
1798 jsAst.Expression code = backend.generatedCode[element]; 1803 jsAst.Expression code = backend.generatedCode[element];
1799 emitStaticFunction(buffer, namer.getName(element), code); 1804 String name = namer.getName(element);
1805 emitStaticFunction(buffer, name, code);
1806 var metadata = buildMetadataFunction(element);
1807 if (metadata != null) {
1808 buffer.write(',$n$n"@$name":$_');
1809 buffer.write(jsAst.prettyPrint(metadata, compiler));
1810 }
1800 jsAst.Expression bailoutCode = backend.generatedBailoutCode[element]; 1811 jsAst.Expression bailoutCode = backend.generatedBailoutCode[element];
1801 if (bailoutCode != null) { 1812 if (bailoutCode != null) {
1802 pendingElementsWithBailouts.remove(element); 1813 pendingElementsWithBailouts.remove(element);
1803 emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode); 1814 emitStaticFunction(buffer, namer.getBailoutName(element), bailoutCode);
1804 } 1815 }
1805 } 1816 }
1806 1817
1807 if (!pendingElementsWithBailouts.isEmpty) { 1818 if (!pendingElementsWithBailouts.isEmpty) {
1808 addComment('pendingElementsWithBailouts', eagerBuffer); 1819 addComment('pendingElementsWithBailouts', eagerBuffer);
1809 } 1820 }
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after
3245 var data = reflectionData[i]; 3256 var data = reflectionData[i];
3246 var name = data[0]; 3257 var name = data[0];
3247 var uri = data[1]; 3258 var uri = data[1];
3248 var metadata = data[2]; 3259 var metadata = data[2];
3249 var descriptor = data[3]; 3260 var descriptor = data[3];
3250 var classes = []; 3261 var classes = [];
3251 var functions = []; 3262 var functions = [];
3252 for (var property in descriptor) { 3263 for (var property in descriptor) {
3253 if (!hasOwnProperty.call(descriptor, property)) continue; 3264 if (!hasOwnProperty.call(descriptor, property)) continue;
3254 var element = descriptor[property]; 3265 var element = descriptor[property];
3255 if (typeof element === "function") { 3266 if (property.substring(0, 1) == "@") {
3267 property = property.substring(1);
3268 ${namer.CURRENT_ISOLATE}[property]["${namer.metadataField}"] = element;
3269 } else if (typeof element === "function") {
3256 ${namer.CURRENT_ISOLATE}[property] = element; 3270 ${namer.CURRENT_ISOLATE}[property] = element;
3257 functions.push(property); 3271 functions.push(property);
3258 } else { 3272 } else {
3259 $classesCollector[property] = element; 3273 var newDesc = {}
3274 for (var prop in element) {
3275 if (!hasOwnProperty.call(element, prop)) continue;
3276 if (prop.substring(0, 1) == "@" && prop != "@") {
3277 newDesc[prop.substring(1)]["${namer.metadataField}"] ='''
3278 '''element[prop];
3279 } else {
3280 newDesc[prop] = element[prop];
3281 }
3282 }
3283 $classesCollector[property] = newDesc;
3260 classes.push(property); 3284 classes.push(property);
3261 classes.push(element[""]); 3285 classes.push(element[""]);
3262 } 3286 }
3263 } 3287 }
3264 libraries.push([name, uri, classes, functions, metadata]); 3288 libraries.push([name, uri, classes, functions, metadata]);
3265 } 3289 }
3266 })'''; 3290 })''';
3267 } 3291 }
3268 } 3292 }
3269 3293
3270 const String GENERATED_BY = """ 3294 const String GENERATED_BY = """
3271 // Generated by dart2js, the Dart to JavaScript compiler. 3295 // Generated by dart2js, the Dart to JavaScript compiler.
3272 """; 3296 """;
3273 3297
3274 const String HOOKS_API_USAGE = """ 3298 const String HOOKS_API_USAGE = """
3275 // The code supports the following hooks: 3299 // The code supports the following hooks:
3276 // dartPrint(message) - if this function is defined it is called 3300 // dartPrint(message) - if this function is defined it is called
3277 // instead of the Dart [print] method. 3301 // instead of the Dart [print] method.
3278 // dartMainRunner(main) - if this function is defined, the Dart [main] 3302 // dartMainRunner(main) - if this function is defined, the Dart [main]
3279 // method will not be invoked directly. 3303 // method will not be invoked directly.
3280 // Instead, a closure that will invoke [main] is 3304 // Instead, a closure that will invoke [main] is
3281 // passed to [dartMainRunner]. 3305 // passed to [dartMainRunner].
3282 """; 3306 """;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698