summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2022-01-06 10:05:05 +0900
committerGitHub <[email protected]>2022-01-06 10:05:05 +0900
commit696589cf27579079bbb670b25e125917a5f7bd58 (patch)
tree86dd165107c46e9b1213a20e36168474bf83ccb3 /src
parentb1fc0dd5a4b3141623bef300f792809887cd1411 (diff)
parent55b2e45a26974c9b68d706811a8e4464b93c1429 (diff)
downloadmruby-696589cf27579079bbb670b25e125917a5f7bd58.tar.gz
mruby-696589cf27579079bbb670b25e125917a5f7bd58.zip
Merge pull request #5628 from dearblue/super-kwargs
Fixing keyword arguments with `super`
Diffstat (limited to 'src')
-rw-r--r--src/vm.c10
1 files changed, 10 insertions, 0 deletions
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);