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

Unified Diff: runtime/lib/mirrors.cc

Issue 10800065: Added ClosureMirror to dart:mirrors. Added Dart_ClosureFunction to the (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 5 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
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/lib/mirrors_impl.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/lib/mirrors.cc
===================================================================
--- runtime/lib/mirrors.cc (revision 9835)
+++ runtime/lib/mirrors.cc (working copy)
@@ -301,7 +301,7 @@
static Dart_Handle CreateMethodMirror(Dart_Handle func,
Dart_Handle func_name,
- Dart_Handle lib_mirror) {
+ Dart_Handle owner_mirror) {
ASSERT(Dart_IsFunction(func));
Dart_Handle cls_name = Dart_NewString("_LocalMethodMirrorImpl");
Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
@@ -388,7 +388,7 @@
// TODO(turnidge): Implement constructor kinds (arguments 7 - 10).
Dart_Handle args[] = {
func_name,
- lib_mirror,
+ owner_mirror,
parameter_mirrors,
Dart_NewBoolean(is_static),
Dart_NewBoolean(is_abstract),
@@ -695,7 +695,10 @@
return CreateNullMirror();
}
ASSERT(Dart_IsInstance(instance));
- Dart_Handle cls_name = Dart_NewString("_LocalInstanceMirrorImpl");
+
+ bool is_closure = Dart_IsClosure(instance);
+ Dart_Handle cls_name = Dart_NewString(
+ is_closure ? "_LocalClosureMirrorImpl" : "_LocalInstanceMirrorImpl");
Dart_Handle cls = Dart_GetClass(MirrorLib(), cls_name);
if (Dart_IsError(cls)) {
return cls;
@@ -711,6 +714,26 @@
instance
};
Dart_Handle mirror = Dart_New(cls, Dart_Null(), ARRAY_SIZE(args), args);
+
+ if (is_closure) {
+ // We set the function field of ClosureMirrors outside of the constructor
+ // to break the mutual recursion.
+ Dart_Handle func = Dart_ClosureFunction(instance);
+ if (Dart_IsError(func)) {
+ return func;
+ }
+ Dart_Handle func_name = Dart_NewString("call");
+ Dart_Handle func_mirror = CreateMethodMirror(func, func_name, mirror);
+ if (Dart_IsError(func_mirror)) {
+ return func_mirror;
+ }
+
+ Dart_Handle func_field_name = Dart_NewString("_function");
+ Dart_Handle result = Dart_SetField(mirror, func_field_name, func_mirror);
+ if (Dart_IsError(result)) {
+ return result;
+ }
+ }
return mirror;
}
@@ -856,6 +879,33 @@
}
+void NATIVE_ENTRY_FUNCTION(LocalClosureMirrorImpl_apply)(
+ Dart_NativeArguments args) {
+ Dart_Handle mirror = Dart_GetNativeArgument(args, 0);
+ Dart_Handle raw_invoke_args = Dart_GetNativeArgument(args, 1);
+
+ Dart_Handle reflectee = UnwrapMirror(mirror);
+ GrowableArray<Dart_Handle> invoke_args;
+ Dart_Handle result = UnwrapArgList(raw_invoke_args, &invoke_args);
+ if (Dart_IsError(result)) {
+ Dart_PropagateError(result);
+ }
+ result =
+ Dart_InvokeClosure(reflectee, invoke_args.length(), invoke_args.data());
+ if (Dart_IsError(result)) {
+ // Instead of propagating the error from an apply directly, we
+ // provide reflective access to the error.
+ Dart_PropagateError(CreateMirroredError(result));
+ }
+
+ Dart_Handle wrapped_result = CreateInstanceMirror(result);
+ if (Dart_IsError(wrapped_result)) {
+ Dart_PropagateError(wrapped_result);
+ }
+ Dart_SetReturnValue(args, wrapped_result);
+}
+
+
void HandleMirrorsMessage(Isolate* isolate,
Dart_Port reply_port,
const Instance& message) {
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/lib/mirrors_impl.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698