source: EcnlProtoTool/trunk/prototool/src/apiprint.c@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 1.5 KB
Line 
1/*
2** apiprint.c
3**
4*/
5
6#include <stdlib.h>
7
8#include "mrdb.h"
9#include "mruby/value.h"
10#include "mruby/class.h"
11#include "mruby/compile.h"
12#include "mruby/error.h"
13#include "mruby/numeric.h"
14#include "mruby/string.h"
15#include "apiprint.h"
16
17static void
18mrdb_check_syntax(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len)
19{
20 mrbc_context *c;
21
22 c = mrbc_context_new(mrb);
23 c->no_exec = TRUE;
24 c->capture_errors = TRUE;
25 c->filename = (char*)dbg->prvfile;
26 c->lineno = dbg->prvline;
27
28 /* Load program */
29 mrb_load_nstring_cxt(mrb, expr, len, c);
30
31 mrbc_context_free(mrb, c);
32}
33
34mrb_value
35mrb_debug_eval(mrb_state *mrb, mrb_debug_context *dbg, const char *expr, size_t len, mrb_bool *exc)
36{
37 void(*tmp)(struct mrb_state *, struct mrb_irep *, mrb_code *, mrb_value *);
38 mrb_value ruby_code;
39 mrb_value s;
40 mrb_value v;
41 mrb_value recv;
42
43 /* disable code_fetch_hook */
44 tmp = mrb->code_fetch_hook;
45 mrb->code_fetch_hook = NULL;
46
47 mrdb_check_syntax(mrb, dbg, expr, len);
48 if (mrb->exc) {
49 v = mrb_obj_value(mrb->exc);
50 mrb->exc = 0;
51 }
52 else {
53 /*
54 * begin
55 * expr
56 * rescue => e
57 * e
58 * end
59 */
60 ruby_code = mrb_str_new_lit(mrb, "begin\n");
61 ruby_code = mrb_str_cat(mrb, ruby_code, expr, len);
62 ruby_code = mrb_str_cat_lit(mrb, ruby_code, "\nrescue => e\ne\nend");
63
64 recv = dbg->regs[0];
65
66 v = mrb_funcall(mrb, recv, "instance_eval", 1, ruby_code);
67 }
68
69 if (exc) {
70 *exc = mrb_obj_is_kind_of(mrb, v, mrb->eException_class);
71 }
72
73 s = mrb_funcall(mrb, v, "inspect", 0);
74
75 /* enable code_fetch_hook */
76 mrb->code_fetch_hook = tmp;
77
78 return s;
79}
Note: See TracBrowser for help on using the repository browser.