static void stack_extend(mrb_state *mrb, int room, int keep) { int size, off; if (mrb->stack + room >= mrb->stend) { mrb_value *oldbase = mrb->stbase; size = mrb->stend - mrb->stbase; off = mrb->stack - mrb->stbase; if (room <= size) /* double size is enough? */ size *= 2; else size += room; mrb->stbase = (mrb_value *)mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stack = mrb->stbase + off; mrb->stend = mrb->stbase + size; envadjust(mrb, oldbase, mrb->stbase); } if (room > keep) { int i; for (i=keep; i<room; i++) { #ifndef MRB_NAN_BOXING static const mrb_value mrb_value_zero = { { 0 } }; mrb->stack[i] = mrb_value_zero; #else SET_NIL_VALUE(mrb->stack[i]); #endif } } }
static void stack_extend(mrb_state *mrb, int room, int keep) { int size, off; if (mrb->stack + room >= mrb->stend) { mrb_value *oldbase = mrb->stbase; size = mrb->stend - mrb->stbase; off = mrb->stack - mrb->stbase; /* do not leave uninitialized malloc region */ if (keep > size) keep = size; /* Use linear stack growth. It is slightly slower than doubling thestack space, but it saves memory on small devices. */ if (room <= size) size += MRB_STACK_GROWTH; else size += room; mrb->stbase = (mrb_value *)mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stack = mrb->stbase + off; mrb->stend = mrb->stbase + size; envadjust(mrb, oldbase, mrb->stbase); /* Raise an exception if the new stack size will be too large, to prevent infinite recursion. However, do this only after resizing the stack, so mrb_raisef has stack space to work with. */ if(size > MRB_STACK_MAX) { mrb_raisef(mrb, E_RUNTIME_ERROR, "stack level too deep. (limit=%d)", MRB_STACK_MAX); } } if (room > keep) { int i; for (i=keep; i<room; i++) { #ifndef MRB_NAN_BOXING static const mrb_value mrb_value_zero = { { 0 } }; mrb->stack[i] = mrb_value_zero; #else SET_NIL_VALUE(mrb->stack[i]); #endif } } }
static void stack_extend(mrb_state *mrb, int room, int keep) { int size, off; if (mrb->stack + room >= mrb->stend) { mrb_value *oldbase = mrb->stbase; size = mrb->stend - mrb->stbase; off = mrb->stack - mrb->stbase; if (room <= size) /* double size is enough? */ size *= 2; else size += room; mrb->stbase = mrb_realloc(mrb, mrb->stbase, sizeof(mrb_value) * size); mrb->stack = mrb->stbase + off; mrb->stend = mrb->stbase + size; envadjust(mrb, oldbase, mrb->stbase); } if (room > keep) { memset(mrb->stack+keep, 0, sizeof(mrb_value) * (room-keep)); } }