From d5dd3e94723fc7754aa5d478e0947479569c25dc Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 15 Jul 2014 17:17:58 +0900 Subject: fiber stack allocation size should be bigger than irep->nregs --- mrbgems/mruby-fiber/src/fiber.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c index ddb31ea38..6823ebe2a 100644 --- a/mrbgems/mruby-fiber/src/fiber.c +++ b/mrbgems/mruby-fiber/src/fiber.c @@ -69,6 +69,7 @@ fiber_init(mrb_state *mrb, mrb_value self) struct RProc *p; mrb_callinfo *ci; mrb_value blk; + size_t slen; mrb_get_args(mrb, "&", &blk); @@ -85,14 +86,18 @@ fiber_init(mrb_state *mrb, mrb_value self) c = f->cxt; /* initialize VM stack */ - c->stbase = (mrb_value *)mrb_malloc(mrb, FIBER_STACK_INIT_SIZE*sizeof(mrb_value)); - c->stend = c->stbase + FIBER_STACK_INIT_SIZE; + slen = FIBER_STACK_INIT_SIZE; + if (p->body.irep->nregs > slen) { + slen += p->body.irep->nregs; + } + c->stbase = (mrb_value *)mrb_malloc(mrb, slen*sizeof(mrb_value)); + c->stend = c->stbase + slen; c->stack = c->stbase; #ifdef MRB_NAN_BOXING { mrb_value *p = c->stbase; - mrb_value *pend = p + FIBER_STACK_INIT_SIZE; + mrb_value *pend = c->stend; while (p < pend) { SET_NIL_VALUE(*p); @@ -100,7 +105,7 @@ fiber_init(mrb_state *mrb, mrb_value self) } } #else - memset(c->stbase, 0, FIBER_STACK_INIT_SIZE * sizeof(mrb_value)); + memset(c->stbase, 0, slen * sizeof(mrb_value)); #endif /* copy receiver from a block */ -- cgit v1.2.3