summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-15 17:17:58 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-15 17:17:58 +0900
commitd5dd3e94723fc7754aa5d478e0947479569c25dc (patch)
tree8b9667d739c6529a1f33b84f4a3b13b468e25a72 /mrbgems
parent472a1c244e4e1c00820c005376547334274de35a (diff)
downloadmruby-d5dd3e94723fc7754aa5d478e0947479569c25dc.tar.gz
mruby-d5dd3e94723fc7754aa5d478e0947479569c25dc.zip
fiber stack allocation size should be bigger than irep->nregs
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c13
1 files 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 */