示例#1
0
文件: eval.c 项目: pbosetti/mruby
static mrb_value
f_instance_eval(mrb_state *mrb, mrb_value self)
{
  struct mrb_context *c = mrb->c;
  mrb_value b;
  mrb_int argc; mrb_value *argv;

  mrb_get_args(mrb, "*&", &argv, &argc, &b);

  if (mrb_nil_p(b)) {
    char *s;
    mrb_int len;
    char *file = NULL;
    mrb_int line = 1;
    mrb_value cv;
    struct RProc *proc;

    mrb_get_args(mrb, "s|zi", &s, &len, &file, &line);
    c->ci->acc = CI_ACC_SKIP;
    cv = mrb_singleton_class(mrb, self);
    c->ci->target_class = mrb_class_ptr(cv);
    proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line);
    mrb->c->ci->env = NULL;
    return mrb_vm_run(mrb, proc, mrb->c->stack[0], 0);
  }
  else {
    mrb_get_args(mrb, "&", &b);
    return mrb_obj_instance_eval(mrb, self);
  }
}
示例#2
0
文件: hello.cpp 项目: yielding/code
int main()
{
  mrb_state *mrb = mrb_open();
  init_TestClass(mrb);

  char code[] = "$t = Test.new; res = $t.run; p res";
  printf("Executing Ruby code from C!\n");

  auto c = mrbc_context_new(mrb);
  auto p = mrb_parse_string(mrb, code, c);
  auto n = mrb_generate_code(mrb, p);

  // mrb_run(mrb, n, mrb_top_self(mrb));
  unsigned stack_keep = 0;
  auto result = mrb_vm_run(mrb,
                n,
                mrb_top_self(mrb),
                stack_keep);

  if (mrb->exc) // have exception
  {
    mrb_p(mrb, mrb_obj_value(mrb->exc));
    mrb->exc = 0;
  }
  else
  {
    if (!mrb_respond_to(mrb, result, mrb_intern_lit(mrb, "inspect")))
      result = mrb_any_to_s(mrb, result);
    
    mrb_p(mrb, result);
  }

  mrbc_context_free(mrb, c);
  mrb_close(mrb);

  return 0;
}