Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| =================================================================== |
| --- runtime/lib/mirrors.cc (revision 21243) |
| +++ runtime/lib/mirrors.cc (working copy) |
| @@ -198,6 +198,22 @@ |
| return Dart_True(); |
| } |
| +static Dart_Handle UnpackLocalArgList(Dart_Handle arg_list, |
| + GrowableArray<Dart_Handle>* arg_array) { |
| + intptr_t len = 0; |
| + Dart_Handle result = Dart_ListLength(arg_list, &len); |
| + if (Dart_IsError(result)) { |
| + return result; |
| + } |
| + for (intptr_t i = 0; i < len; i++) { |
| + Dart_Handle arg = Dart_ListGetAt(arg_list, i); |
| + if (Dart_IsError(arg)) { |
| + return arg; |
| + } |
| + arg_array->Add(arg); |
| + } |
| + return Dart_True(); |
| +} |
| static Dart_Handle CreateLazyMirror(Dart_Handle target); |
| @@ -1051,7 +1067,7 @@ |
| } |
| -void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_invoke)( |
| +void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_invokeAsync)( |
| Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| @@ -1105,7 +1121,7 @@ |
| } |
| -void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_setField)( |
| +void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_setFieldAsync)( |
| Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| @@ -1134,7 +1150,7 @@ |
| } |
| -void NATIVE_ENTRY_FUNCTION(LocalClosureMirrorImpl_apply)( |
| +void NATIVE_ENTRY_FUNCTION(LocalClosureMirrorImpl_applyAsync)( |
| Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| @@ -1164,7 +1180,7 @@ |
| } |
| -void NATIVE_ENTRY_FUNCTION(LocalClassMirrorImpl_invokeConstructor)( |
| +void NATIVE_ENTRY_FUNCTION(LocalClassMirrorImpl_invokeConstructorAsync)( |
| Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle klass_mirror = Dart_GetNativeArgument(args, 0); |
| @@ -1196,7 +1212,127 @@ |
| Dart_ExitScope(); |
| } |
|
Ivan Posva
2013/04/12 21:15:26
Two lines.
|
| +void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_invoke)( |
| + Dart_NativeArguments args) { |
| + Dart_EnterScope(); |
| + Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| + Dart_Handle member = Dart_GetNativeArgument(args, 1); |
|
Ivan Posva
2013/04/12 21:15:26
Want to add a comment here that the wrapped argume
|
| + Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 2); |
| + |
| + Dart_Handle reflectee = UnwrapMirror(mirror); |
| + GrowableArray<Dart_Handle> invoke_args; |
| + Dart_Handle result = UnpackLocalArgList(wrapped_invoke_args, &invoke_args); |
| + if (Dart_IsError(result)) { |
| + Dart_PropagateError(result); |
| + } |
| + result = |
| + Dart_Invoke(reflectee, member, invoke_args.length(), invoke_args.data()); |
| + if (Dart_IsError(result)) { |
| + // Instead of propagating the error from an invoke 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); |
| + Dart_ExitScope(); |
| +} |
| + |
|
Ivan Posva
2013/04/12 21:15:26
ditto
|
| +void NATIVE_ENTRY_FUNCTION(LocalObjectMirrorImpl_setField)( |
|
Ivan Posva
2013/04/12 21:15:26
What is the difference between this and the Async
|
| + Dart_NativeArguments args) { |
| + Dart_EnterScope(); |
| + Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| + Dart_Handle fieldName = Dart_GetNativeArgument(args, 1); |
| + |
| + Dart_Handle set_arg = Dart_GetNativeArgument(args, 2); |
| + |
| + Dart_Handle reflectee = UnwrapMirror(mirror); |
| + if (Dart_IsError(set_arg)) { |
| + Dart_PropagateError(set_arg); |
| + } |
| + Dart_Handle result = Dart_SetField(reflectee, fieldName, set_arg); |
| + if (Dart_IsError(result)) { |
| + // Instead of propagating the error from a SetField 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); |
| + Dart_ExitScope(); |
| +} |
| + |
| + |
| +void NATIVE_ENTRY_FUNCTION(LocalClosureMirrorImpl_apply)( |
| + Dart_NativeArguments args) { |
| + Dart_EnterScope(); |
| + Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
| + |
| + Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 1); |
| + |
| + Dart_Handle reflectee = UnwrapMirror(mirror); |
| + GrowableArray<Dart_Handle> invoke_args; |
| + Dart_Handle result = UnpackLocalArgList(wrapped_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); |
| + Dart_ExitScope(); |
| +} |
| + |
| + |
| +void NATIVE_ENTRY_FUNCTION(LocalClassMirrorImpl_invokeConstructor)( |
| + Dart_NativeArguments args) { |
| + Dart_EnterScope(); |
| + Dart_Handle klass_mirror = Dart_GetNativeArgument(args, 0); |
| + Dart_Handle constructor_name = Dart_GetNativeArgument(args, 1); |
| + |
| + Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 2); |
| + |
| + Dart_Handle klass = UnwrapMirror(klass_mirror); |
| + GrowableArray<Dart_Handle> invoke_args; |
| + Dart_Handle result = UnpackLocalArgList(wrapped_invoke_args, &invoke_args); |
| + if (Dart_IsError(result)) { |
| + Dart_PropagateError(result); |
| + } |
| + result = Dart_New(klass, |
| + constructor_name, |
| + invoke_args.length(), |
| + invoke_args.data()); |
| + if (Dart_IsError(result)) { |
| + // Instead of propagating the error from an invoke 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); |
| + Dart_ExitScope(); |
| +} |
| + |
| + |
| void HandleMirrorsMessage(Isolate* isolate, |
| Dart_Port reply_port, |
| const Instance& message) { |