From e93226f40223d31d93355a9245c102b7db8482c3 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 21 Jul 2024 21:58:18 +0900 Subject: [PATCH] Doubling the call stack when extending it Previously it was "approximately double". --- src/vm.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vm.c b/src/vm.c index 8830ca332..4f84898d9 100644 --- a/src/vm.c +++ b/src/vm.c @@ -336,19 +336,21 @@ cipush(mrb_state *mrb, mrb_int push_stacks, uint8_t cci, struct RClass *target_c const struct RProc *proc, struct RProc *blk, mrb_sym mid, uint16_t argc) { struct mrb_context *c = mrb->c; - mrb_callinfo *ci = c->ci; + mrb_callinfo *ci = c->ci + 1; - if (ci + 1 == c->ciend) { + if (ci < c->ciend) { + c->ci = ci; + } + else { ptrdiff_t size = ci - c->cibase; - if (size > MRB_CALL_LEVEL_MAX) { + if (size >= MRB_CALL_LEVEL_MAX) { mrb_exc_raise(mrb, mrb_obj_value(mrb->stack_err)); } c->cibase = (mrb_callinfo*)mrb_realloc(mrb, c->cibase, sizeof(mrb_callinfo)*size*2); - c->ci = c->cibase + size; + c->ci = ci = c->cibase + size; c->ciend = c->cibase + size * 2; } - ci = ++c->ci; ci->mid = mid; CI_PROC_SET(ci, proc); ci->blk = blk;