| 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);
|
| }
|
|
|