| 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) {
|
|
|