public static R_VAL DoFile(IntPtr mrb, string path) { if (!File.Exists(path)) { return(R_VAL.NIL); } #if MRUBY string filename = Path.GetFileName(path); int arena = RubyDLL.mrb_gc_arena_save(mrb); IntPtr mrbc_context = RubyDLL.mrbc_context_new(mrb); RubyDLL.mrbc_filename(mrb, mrbc_context, filename); var ret = RubyDLL.mrb_load_string_cxt(mrb, RubyDLL.ToCBytes(File.ReadAllText(path)), mrbc_context); RubyDLL.mrbc_context_free(mrb, mrbc_context); if (RubyDLL.mrb_has_exc(mrb)) { Console.WriteLine(GetExceptionBackTrace(mrb)); RubyDLL.mrb_exc_clear(mrb); } RubyDLL.mrb_gc_arena_restore(mrb, arena); return(ret); #else int status; RubyDLL.rb_load_protect(R_VAL.Create(path), 0, out status); return(status == 0 ? R_VAL.TRUE : R_VAL.FALSE); #endif }
public R_VAL DoString(string str) { #if MRUBY int arena = RubyDLL.mrb_gc_arena_save(rb_state); IntPtr mrbc_context = RubyDLL.mrbc_context_new(rb_state); RubyDLL.mrbc_filename(this, mrbc_context, "*interactive*"); var ret = RubyDLL.mrb_load_string_cxt(rb_state, RubyDLL.ToCBytes(str), mrbc_context); RubyDLL.mrbc_context_free(rb_state, mrbc_context); if (RubyDLL.mrb_has_exc(rb_state)) { Console.WriteLine(GetExceptionBackTrace()); RubyDLL.mrb_exc_clear(rb_state); } RubyDLL.mrb_gc_arena_restore(rb_state, arena); return(ret); #else int status; // return RubyDLL.rb_eval_string ( str ); return(RubyDLL.rb_eval_string_protect(str, out status)); #endif }