mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Fix keyword argument separation warnings for enumerators
This makes objects created via #to_enum and related methods pass keyword arguments as keywords. To implement this, add a kw_splat member of struct enumerator and struct iter_method_arg, and add rb_block_call_kw, which is the same as rb_block_call_kw with a flag for whether the last argument is keyword options.
This commit is contained in:
parent
37a2c660aa
commit
80e679ef2d
Notes:
git
2019-09-07 11:41:46 +09:00
3 changed files with 41 additions and 10 deletions
20
vm_eval.c
20
vm_eval.c
|
@ -1277,6 +1277,7 @@ struct iter_method_arg {
|
|||
ID mid;
|
||||
int argc;
|
||||
const VALUE *argv;
|
||||
int kw_splat;
|
||||
};
|
||||
|
||||
static VALUE
|
||||
|
@ -1285,7 +1286,7 @@ iterate_method(VALUE obj)
|
|||
const struct iter_method_arg * arg =
|
||||
(struct iter_method_arg *) obj;
|
||||
|
||||
return rb_call(arg->obj, arg->mid, arg->argc, arg->argv, CALL_FCALL);
|
||||
return rb_call(arg->obj, arg->mid, arg->argc, arg->argv, arg->kw_splat ? CALL_FCALL_KW : CALL_FCALL);
|
||||
}
|
||||
|
||||
VALUE
|
||||
|
@ -1298,6 +1299,21 @@ rb_block_call(VALUE obj, ID mid, int argc, const VALUE * argv,
|
|||
arg.mid = mid;
|
||||
arg.argc = argc;
|
||||
arg.argv = argv;
|
||||
arg.kw_splat = 0;
|
||||
return rb_iterate(iterate_method, (VALUE)&arg, bl_proc, data2);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_block_call_kw(VALUE obj, ID mid, int argc, const VALUE * argv,
|
||||
rb_block_call_func_t bl_proc, VALUE data2, int kw_splat)
|
||||
{
|
||||
struct iter_method_arg arg;
|
||||
|
||||
arg.obj = obj;
|
||||
arg.mid = mid;
|
||||
arg.argc = argc;
|
||||
arg.argv = argv;
|
||||
arg.kw_splat = kw_splat;
|
||||
return rb_iterate(iterate_method, (VALUE)&arg, bl_proc, data2);
|
||||
}
|
||||
|
||||
|
@ -1314,6 +1330,7 @@ rb_lambda_call(VALUE obj, ID mid, int argc, const VALUE *argv,
|
|||
arg.mid = mid;
|
||||
arg.argc = argc;
|
||||
arg.argv = argv;
|
||||
arg.kw_splat = 0;
|
||||
block = rb_vm_ifunc_new(bl_proc, (void *)data2, min_argc, max_argc);
|
||||
return rb_iterate0(iterate_method, (VALUE)&arg, block, GET_EC());
|
||||
}
|
||||
|
@ -1337,6 +1354,7 @@ rb_check_block_call(VALUE obj, ID mid, int argc, const VALUE *argv,
|
|||
arg.mid = mid;
|
||||
arg.argc = argc;
|
||||
arg.argv = argv;
|
||||
arg.kw_splat = 0;
|
||||
return rb_iterate(iterate_check_method, (VALUE)&arg, bl_proc, data2);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue