From 279e0122da06c36f811dbd4380c20dd9ba157370 Mon Sep 17 00:00:00 2001 From: dearblue Date: Fri, 19 Nov 2021 22:35:47 +0900 Subject: Fixes keywords are lost with the `OP_SENDB` If a splat argument was passed, it could write out of range on the VM stack. ```console % bin/mruby -e 'def m(*args, **opts, &blk) p [args, opts, blk] end; m(*%w(X Y Z), r: 1, g: 2, b: 3) {}' [["X", "Y", "Z"], {}, #] ``` --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 3457ce33c..9849c0903 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1573,7 +1573,7 @@ RETRY_TRY_BLOCK: mrb_value recv; if (0 < nk && nk < 15) { /* pack keyword arguments */ - mrb_int kidx = a+n+1; + mrb_int kidx = a+(n==15?1:n)+1; mrb_value kdict = hash_new_from_values(mrb, nk, regs+kidx); regs[kidx] = kdict; nk = 15; -- cgit v1.2.3