summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-07-03 08:11:52 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-07-03 08:11:52 +0900
commitf452abd138be9a9fe581a745fb3e38a8e65687fa (patch)
tree4b93a644b1f190445d4bb0fb31895c9268504187
parentbcfcbc94bcf245f927601fa98cfd4a9e26548e25 (diff)
downloadmruby-f452abd138be9a9fe581a745fb3e38a8e65687fa.tar.gz
mruby-f452abd138be9a9fe581a745fb3e38a8e65687fa.zip
fiber stack should not be cleared by zero when MRB_NAN_BOXING is set; close #2439
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 9bd15f4b6..07ae80293 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -8,6 +8,8 @@
#define FIBER_STACK_INIT_SIZE 64
#define FIBER_CI_INIT_SIZE 8
+#define SET_NIL_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
+
/*
* call-seq:
* Fiber.new{...} -> obj
@@ -85,10 +87,24 @@ fiber_init(mrb_state *mrb, mrb_value self)
c = f->cxt;
/* initialize VM stack */
- c->stbase = (mrb_value *)mrb_calloc(mrb, FIBER_STACK_INIT_SIZE, sizeof(mrb_value));
+ c->stbase = (mrb_value *)mrb_malloc(mrb, FIBER_STACK_INIT_SIZE*sizeof(mrb_value));
c->stend = c->stbase + FIBER_STACK_INIT_SIZE;
c->stack = c->stbase;
+#ifdef MRB_NAN_BOXING
+ {
+ mrb_value *p = c->stbase;
+ mrb_value *pend = p + FIBER_STACK_INIT_SIZE;
+
+ while (p < pend) {
+ SET_NIL_VALUE(*p);
+ p++;
+ }
+ }
+#else
+ memset(c->stbase, 0, FIBER_STACK_INIT_SIZE * sizeof(mrb_value));
+#endif
+
/* copy receiver from a block */
c->stack[0] = mrb->c->stack[0];