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:
Jeremy Evans 2019-09-06 13:33:19 -07:00
parent 37a2c660aa
commit 80e679ef2d
Notes: git 2019-09-07 11:41:46 +09:00
3 changed files with 41 additions and 10 deletions

View file

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