summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorkyab <[email protected]>2014-04-29 18:42:52 +0900
committerkyab <[email protected]>2014-04-29 18:42:52 +0900
commita13775eb227f8cce688d1984af3527cdf5d56be1 (patch)
tree40c638c337aecb394163f38166a2fca78f49fe31 /src
parentd3417838d27941171b0edcecc41d80aa204749f2 (diff)
downloadmruby-a13775eb227f8cce688d1984af3527cdf5d56be1.tar.gz
mruby-a13775eb227f8cce688d1984af3527cdf5d56be1.zip
Add doubling stack extend, as fix for #2016
Diffstat (limited to 'src')
-rw-r--r--src/vm.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index 9756d0c17..5e5904a3f 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -140,6 +140,12 @@ stack_extend_alloc(mrb_state *mrb, int room)
int size = mrb->c->stend - mrb->c->stbase;
int off = mrb->c->stack - mrb->c->stbase;
+#ifdef MRB_STACK_EXTEND_DOUBLING
+ if (room <= size)
+ size *= 2;
+ else
+ size += room;
+#else
/* Use linear stack growth.
It is slightly slower than doubling the stack space,
but it saves memory on small devices. */
@@ -147,6 +153,7 @@ stack_extend_alloc(mrb_state *mrb, int room)
size += MRB_STACK_GROWTH;
else
size += room;
+#endif
mrb->c->stbase = (mrb_value *)mrb_realloc(mrb, mrb->c->stbase, sizeof(mrb_value) * size);
mrb->c->stack = mrb->c->stbase + off;