diff options
| author | dearblue <[email protected]> | 2022-01-05 16:40:13 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2022-01-05 16:40:13 +0900 |
| commit | 55b2e45a26974c9b68d706811a8e4464b93c1429 (patch) | |
| tree | 8e13971949a4756f0785ff0cab59fc5980347bcc | |
| parent | d34e1cb84c56be7a08602c105ad77ff51b07e856 (diff) | |
| download | mruby-55b2e45a26974c9b68d706811a8e4464b93c1429.tar.gz mruby-55b2e45a26974c9b68d706811a8e4464b93c1429.zip | |
Fixing keyword arguments with `super`
fix #5627
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 4 | ||||
| -rw-r--r-- | src/vm.c | 10 |
2 files changed, 12 insertions, 2 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 16ae95e2e..3504e6062 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2854,8 +2854,8 @@ codegen(codegen_scope *s, node *tree, int val) if (s2 && (s2->ainfo & 0x1) && tree->cdr->car) { nk = gen_hash(s, tree->cdr->car->cdr, VAL, 14); if (nk < 0) {st++; nk = 15;} - else st += nk; - n |= 15<<4; + else st += nk*2; + n |= nk<<4; } /* block arguments */ if (tree->cdr->cdr) { @@ -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); |
