diff options
| author | Hiroshi Mimaki <[email protected]> | 2014-11-19 09:02:10 +0900 |
|---|---|---|
| committer | Hiroshi Mimaki <[email protected]> | 2014-11-19 09:02:10 +0900 |
| commit | 4e4bfb08cbbc0198d1489004f807ba6a75469f16 (patch) | |
| tree | c079d5715e1942db88e9ca6472223acc73ac7059 /mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c | |
| parent | 5c6d6309b6b5e01ef3ff38f772e0fdd3fc5dd372 (diff) | |
| parent | b473043acfd1b4697e978e3ac4656dc9b03b3b22 (diff) | |
| download | mruby-1.1.0.tar.gz mruby-1.1.0.zip | |
Merge pull request #2640 from mruby-Forum/v1.1.01.1.0
mruby-1.1.0
Diffstat (limited to 'mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c')
| -rwxr-xr-x | mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c new file mode 100755 index 000000000..23b321f7c --- /dev/null +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c @@ -0,0 +1,78 @@ +/* +** apiprint.c +** +*/ + +#include <string.h> +#include "mrdb.h" +#include "mruby/value.h" +#include "mruby/class.h" +#include "mruby/compile.h" +#include "mruby/error.h" +#include "mruby/numeric.h" +#include "mruby/string.h" +#include "apiprint.h" + +static void +mrdb_check_syntax(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len) +{ + mrbc_context *c; + + c = mrbc_context_new(mrb); + c->no_exec = TRUE; + c->capture_errors = TRUE; + c->filename = (char*)dbg->prvfile; + c->lineno = dbg->prvline; + + /* Load program */ + mrb_load_nstring_cxt(mrb, expr, len, c); + + mrbc_context_free(mrb, c); +} + +mrb_value +mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc) +{ + void *tmp; + mrb_value ruby_code; + mrb_value s; + mrb_value v; + mrb_value recv; + + /* disable code_fetch_hook */ + tmp = mrb->code_fetch_hook; + mrb->code_fetch_hook = NULL; + + mrdb_check_syntax(mrb, dbg, expr, len); + if (mrb->exc) { + v = mrb_obj_value(mrb->exc); + mrb->exc = 0; + } + else { + /* + * begin + * expr + * rescue => e + * e + * end + */ + ruby_code = mrb_str_new_cstr(mrb, "begin\n"); + ruby_code = mrb_str_cat(mrb, ruby_code, expr, len); + ruby_code = mrb_str_cat_cstr(mrb, ruby_code, "\nrescue => e\ne\nend"); + + recv = dbg->regs[0]; + + v = mrb_funcall(mrb, recv, "instance_eval", 1, ruby_code); + } + + if (exc) { + *exc = mrb_obj_is_kind_of(mrb, v, mrb->eException_class); + } + + s = mrb_funcall(mrb, v, "inspect", 0); + + /* enable code_fetch_hook */ + mrb->code_fetch_hook = tmp; + + return s; +} |
