Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| =================================================================== |
| --- runtime/lib/mirrors.cc (revision 9796) |
| +++ runtime/lib/mirrors.cc (working copy) |
| @@ -293,7 +293,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); |
| @@ -380,7 +380,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), |
| @@ -687,7 +687,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; |
| @@ -703,6 +706,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 contructor to |
|
Ivan Posva
2012/07/23 23:57:20
constructor
|
| + // 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; |
| } |
| @@ -798,6 +821,32 @@ |
| Dart_SetReturnValue(args, wrapped_result); |
| } |
| +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) { |