From 5bc15dd69b98c8e14e6242e836467d67b69a2f79 Mon Sep 17 00:00:00 2001 From: dearblue Date: Thu, 4 Aug 2022 22:43:06 +0900 Subject: [PATCH] Fixed assertion in `ARGUMENT_NORMALIZE()` for `bidx`. It should be compared to the `irep->nregs` value as is. At the same time, discovered problems have been fixed. --- mrbgems/mruby-compiler/core/codegen.c | 5 +++++ src/vm.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index c1292e869..88fa6a62d 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1958,9 +1958,14 @@ gen_assignment(codegen_scope *s, node *tree, node *rhs, int sp, int val) push(); pop(); s->sp = call; if (mid == MRB_OPSYM_2(s->mrb, aref) && n == 2) { + push_n(4); pop_n(4); /* self + idx + value + (invisible block for OP_SEND) */ genop_1(s, OP_SETIDX, cursp()); } else { + int st = 2 /* self + block */ + + (((n >> 0) & 0x0f) < 15 ? ((n >> 0) & 0x0f) : 1) + + (((n >> 4) & 0x0f) < 15 ? ((n >> 4) & 0x0f) * 2 : 1); + push_n(st); pop_n(st); genop_3(s, noself ? OP_SSEND : OP_SEND, cursp(), new_sym(s, attrsym(s, mid)), n); } if (safe) { diff --git a/src/vm.c b/src/vm.c index 765f1384f..ec451f1f4 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1256,7 +1256,7 @@ hash_new_from_regs(mrb_state *mrb, mrb_int argc, mrb_int idx) *(arg_info) = n | (nk<<4); \ } \ \ - mrb_assert(bidx < irep->nregs+(arg_base)); \ + mrb_assert(bidx < irep->nregs); \ mrb_int new_bidx = (arg_base)+mrb_bidx(n, nk); \ if ((insn) == OP_SEND) { \ /* clear block argument */ \