summaryrefslogtreecommitdiff
path: root/yjit_codegen.c
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2021-12-30 11:13:37 -0800
committerJohn Hawthorn <john@hawthorn.email>2021-12-31 17:30:47 -0800
commit5414de4b6e4372af832e338f8eb7a9fe8de17c84 (patch)
treed2d8de6dc8a182558e6719508393b03017e8f112 /yjit_codegen.c
parent2fac066b3ad67767107cab30e1dd9a00562f1376 (diff)
YJIT: Fix SP index with optarg and unordered kwarg
Previously when we were calling a method with an optional argument and multiple keywords arguments which weren't in the order the receiver expected we would use the wrong SP index to rearrange them. Fixes Bug #18453
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5379
Diffstat (limited to 'yjit_codegen.c')
-rw-r--r--yjit_codegen.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/yjit_codegen.c b/yjit_codegen.c
index 8a547d2ef6..21e4813c19 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -3671,7 +3671,10 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
if (doing_kw_call) {
// Here we're calling a method with keyword arguments and specifying
// keyword arguments at this call site.
- const int lead_num = iseq->body->param.lead_num;
+
+ // Number of positional arguments the callee expects before the first
+ // keyword argument
+ const int args_before_kw = required_num + opt_num;
// This struct represents the metadata about the caller-specified
// keyword arguments.
@@ -3761,7 +3764,7 @@ gen_send_iseq(jitstate_t *jit, ctx_t *ctx, const struct rb_callinfo *ci, const r
if (callee_kwarg == caller_kwargs[swap_idx]) {
// First we're going to generate the code that is going
// to perform the actual swapping at runtime.
- stack_swap(ctx, cb, argc - 1 - swap_idx - lead_num, argc - 1 - kwarg_idx - lead_num, REG1, REG0);
+ stack_swap(ctx, cb, argc - 1 - swap_idx - args_before_kw, argc - 1 - kwarg_idx - args_before_kw, REG1, REG0);
// Next we're going to do some bookkeeping on our end so
// that we know the order that the arguments are