From 55b2e45a26974c9b68d706811a8e4464b93c1429 Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 5 Jan 2022 16:40:13 +0900 Subject: Fixing keyword arguments with `super` fix #5627 --- src/vm.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 0d197098d..698f59d0e 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1729,6 +1729,16 @@ RETRY_TRY_BLOCK: } mrb_assert(bidx < irep->nregs); + uint8_t nk = (b >> 4) & 0x0f; + if (nk > 0 && nk < CALL_MAXARGS) { /* pack keyword arguments */ + uint8_t n = b & 0x0f; + 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; + b = n | (nk<<4); + } + if (mid == 0 || !target_class) { mrb_value exc = mrb_exc_new_lit(mrb, E_NOMETHOD_ERROR, "super called outside of method"); mrb_exc_set(mrb, exc); -- cgit v1.2.3