Index: runtime/lib/mirrors.cc |
=================================================================== |
--- runtime/lib/mirrors.cc (revision 21575) |
+++ 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); |
@@ -1061,18 +1077,26 @@ |
Dart_NativeArguments args) { |
Dart_EnterScope(); |
Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
- Dart_Handle member = Dart_GetNativeArgument(args, 1); |
- // The wrapped arguments are either simple values or instance mirrors. |
- Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle member_name = Dart_GetNativeArgument(args, 1); |
+ // The arguments are either simple values or instance mirrors. |
+ Dart_Handle positional_arguments = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle async = Dart_GetNativeArgument(args, 3); |
Dart_Handle reflectee = UnwrapMirror(mirror); |
+ Dart_Handle result; |
GrowableArray<Dart_Handle> invoke_args; |
- Dart_Handle result = UnwrapArgList(wrapped_invoke_args, &invoke_args); |
+ if (Dart_IdentityEquals(async, Dart_True())) { |
+ result = UnwrapArgList(positional_arguments, &invoke_args); |
+ } else { |
+ result = UnpackLocalArgList(positional_arguments, &invoke_args); |
+ } |
if (Dart_IsError(result)) { |
Dart_PropagateError(result); |
} |
- result = |
- Dart_Invoke(reflectee, member, invoke_args.length(), invoke_args.data()); |
+ result = Dart_Invoke(reflectee, |
+ member_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. |
@@ -1116,11 +1140,16 @@ |
Dart_EnterScope(); |
Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
Dart_Handle fieldName = Dart_GetNativeArgument(args, 1); |
- // The wrapped argument is either a simple value or instance mirror. |
- Dart_Handle wrapped_arg = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle value = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle async = Dart_GetNativeArgument(args, 3); |
Dart_Handle reflectee = UnwrapMirror(mirror); |
- Dart_Handle set_arg = UnwrapArg(wrapped_arg); |
+ Dart_Handle set_arg; |
+ if (Dart_IdentityEquals(async, Dart_True())) { |
+ set_arg = UnwrapArg(value); |
+ } else { |
+ set_arg = value; |
+ } |
if (Dart_IsError(set_arg)) { |
Dart_PropagateError(set_arg); |
} |
@@ -1144,12 +1173,18 @@ |
Dart_NativeArguments args) { |
Dart_EnterScope(); |
Dart_Handle mirror = Dart_GetNativeArgument(args, 0); |
- // The wrapped arguments are either simple values or instance mirrors. |
- Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 1); |
+ // The arguments are either simple values or instance mirrors. |
+ Dart_Handle positional_arguments = Dart_GetNativeArgument(args, 1); |
+ Dart_Handle async = Dart_GetNativeArgument(args, 2); |
Dart_Handle reflectee = UnwrapMirror(mirror); |
GrowableArray<Dart_Handle> invoke_args; |
- Dart_Handle result = UnwrapArgList(wrapped_invoke_args, &invoke_args); |
+ Dart_Handle result; |
+ if (Dart_IdentityEquals(async, Dart_True())) { |
+ result = UnwrapArgList(positional_arguments, &invoke_args); |
+ } else { |
+ result = UnpackLocalArgList(positional_arguments, &invoke_args); |
+ } |
if (Dart_IsError(result)) { |
Dart_PropagateError(result); |
} |
@@ -1175,12 +1210,18 @@ |
Dart_EnterScope(); |
Dart_Handle klass_mirror = Dart_GetNativeArgument(args, 0); |
Dart_Handle constructor_name = Dart_GetNativeArgument(args, 1); |
- // The wrapped arguments are either simple values or instance mirrors. |
- Dart_Handle wrapped_invoke_args = Dart_GetNativeArgument(args, 2); |
+ // The arguments are either simple values or instance mirrors. |
+ Dart_Handle positional_arguments = Dart_GetNativeArgument(args, 2); |
+ Dart_Handle async = Dart_GetNativeArgument(args, 3); |
Dart_Handle klass = UnwrapMirror(klass_mirror); |
GrowableArray<Dart_Handle> invoke_args; |
- Dart_Handle result = UnwrapArgList(wrapped_invoke_args, &invoke_args); |
+ Dart_Handle result; |
+ if (Dart_IdentityEquals(async, Dart_True())) { |
+ result = UnwrapArgList(positional_arguments, &invoke_args); |
+ } else { |
+ result = UnpackLocalArgList(positional_arguments, &invoke_args); |
+ } |
if (Dart_IsError(result)) { |
Dart_PropagateError(result); |
} |