Exemple #1
0
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
    }
  }
}
Exemple #2
0
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
    }
  }
}
Exemple #3
0
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));
  }
}