summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c
diff options
context:
space:
mode:
authorHiroshi Mimaki <[email protected]>2014-11-19 09:02:10 +0900
committerHiroshi Mimaki <[email protected]>2014-11-19 09:02:10 +0900
commit4e4bfb08cbbc0198d1489004f807ba6a75469f16 (patch)
treec079d5715e1942db88e9ca6472223acc73ac7059 /mrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c
parent5c6d6309b6b5e01ef3ff38f772e0fdd3fc5dd372 (diff)
parentb473043acfd1b4697e978e3ac4656dc9b03b3b22 (diff)
downloadmruby-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-xmrbgems/mruby-bin-debugger/tools/mrdb/apiprint.c78
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;
+}