summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2019-09-06 13:33:19 -0700
committerJeremy Evans <code@jeremyevans.net>2019-09-06 19:41:23 -0700
commit80e679ef2d6f370e853e37053c73930c65b5e76c (patch)
tree102bd04e9ea105ec35b0ac7d03bf860e52068d12 /vm_eval.c
parent37a2c660aa4f4aacfd6a56651b10124e3ac01321 (diff)
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.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/2432
Diffstat (limited to 'vm_eval.c')
-rw-r--r--vm_eval.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 4a3b9e325f..e8e12bcef2 100644
--- a/vm_eval.c
+++ b/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);
}