From a4b57aa47bff2bc35b09d881b793307efca6b098 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sat, 13 Apr 2024 22:22:39 +0900 Subject: [PATCH] Minimize zero initialization of the stack --- mrbgems/mruby-fiber/src/fiber.c | 8 +++++--- src/vm.c | 6 ++++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index 946eb7166..619c1d9b2 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -43,8 +43,8 @@ fiber_init_fiber(mrb_state *mrb, struct RFiber *f, const struct RProc *p) c->stend = c->stbase + slen; { - mrb_value *s = c->stbase; - mrb_value *send = c->stend; + mrb_value *s = c->stbase + 1; + mrb_value *send = c->stbase + p->body.irep->nregs; while (s < send) { SET_NIL_VALUE(*s); @@ -56,9 +56,11 @@ fiber_init_fiber(mrb_state *mrb, struct RFiber *f, const struct RProc *p) c->stbase[0] = mrb->c->ci->stack[0]; /* initialize callinfo stack */ - c->cibase = (mrb_callinfo*)mrb_calloc(mrb, FIBER_CI_INIT_SIZE, sizeof(mrb_callinfo)); + static const mrb_callinfo ci_zero = { 0 }; + c->cibase = (mrb_callinfo*)mrb_malloc(mrb, FIBER_CI_INIT_SIZE * sizeof(mrb_callinfo)); c->ciend = c->cibase + FIBER_CI_INIT_SIZE; c->ci = c->cibase; + c->cibase[0] = ci_zero; /* adjust return callinfo */ ci = c->ci; diff --git a/src/vm.c b/src/vm.c index 025fbc9e7..01fa16346 100644 --- a/src/vm.c +++ b/src/vm.c @@ -116,12 +116,14 @@ stack_init(mrb_state *mrb) struct mrb_context *c = mrb->c; /* mrb_assert(mrb->stack == NULL); */ - c->stbase = (mrb_value*)mrb_calloc(mrb, STACK_INIT_SIZE, sizeof(mrb_value)); + c->stbase = (mrb_value*)mrb_malloc(mrb, STACK_INIT_SIZE * sizeof(mrb_value)); c->stend = c->stbase + STACK_INIT_SIZE; /* mrb_assert(ci == NULL); */ - c->cibase = (mrb_callinfo*)mrb_calloc(mrb, CALLINFO_INIT_SIZE, sizeof(mrb_callinfo)); + static const mrb_callinfo ci_zero = { 0 }; + c->cibase = (mrb_callinfo*)mrb_malloc(mrb, CALLINFO_INIT_SIZE * sizeof(mrb_callinfo)); c->ciend = c->cibase + CALLINFO_INIT_SIZE; + c->cibase[0] = ci_zero; c->ci = c->cibase; c->ci->u.target_class = mrb->object_class; c->ci->stack = c->stbase;