Exemplo n.º 1
0
Arquivo: vm.c Projeto: mrbrdo/mruby_cc
static void
cipop(mrb_state *mrb)
{
  struct mrb_context *c = mrb->c;

  if (c->ci->env) {
    struct REnv *e = c->ci->env;
    size_t len = (size_t)MRB_ENV_STACK_LEN(e);
    mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);

    MRB_ENV_UNSHARE_STACK(e);
    if (len > 0) {
      stack_copy(p, e->stack, len);
    }
    e->stack = p;
    mrb_write_barrier(mrb, (struct RBasic *)e);
  }

  c->ci--;
}
Exemplo n.º 2
0
Arquivo: proc.c Projeto: kmasa/mruby
struct RProc *
mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t f, mrb_int argc, const mrb_value *argv)
{
    struct RProc *p;
    struct REnv *e;
    int ai, i;

    p = mrb_proc_new_cfunc(mrb, f);
    ai = mrb_gc_arena_save(mrb);
    e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
    p->env = e;
    mrb_gc_arena_restore(mrb, ai);

    MRB_ENV_UNSHARE_STACK(e);
    MRB_ENV_STACK_LEN(e) = argc;
    e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
    for (i = 0; i < argc; ++i) {
        e->stack[i] = argv[i];
    }

    return p;
}
Exemplo n.º 3
0
MRB_API struct RProc *
mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const mrb_value *argv)
{
  struct RProc *p = mrb_proc_new_cfunc(mrb, func);
  struct REnv *e;
  int i;

  p->env = e = env_new(mrb, argc);
  MRB_ENV_UNSHARE_STACK(e);
  e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
  if (argv) {
    for (i = 0; i < argc; ++i) {
      e->stack[i] = argv[i];
    }
  }
  else {
    for (i = 0; i < argc; ++i) {
      SET_NIL_VALUE(e->stack[i]);
    }
  }
  return p;
}