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); } }
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; }