diff options
| author | take_cheeze <[email protected]> | 2014-07-15 22:33:14 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-07-15 22:33:14 +0900 |
| commit | dd34decdfcbea92f04b03c7d075e187101b3c3d6 (patch) | |
| tree | 9e286f869b69444589f495d2bd32e66c62b8f7ea /mrbgems/mruby-eval/src/eval.c | |
| parent | d5dd3e94723fc7754aa5d478e0947479569c25dc (diff) | |
| download | mruby-dd34decdfcbea92f04b03c7d075e187101b3c3d6.tar.gz mruby-dd34decdfcbea92f04b03c7d075e187101b3c3d6.zip | |
Implement string compiling `instance_eval` method.
Diffstat (limited to 'mrbgems/mruby-eval/src/eval.c')
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 6ca7d4fc2..d849bb872 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -173,10 +173,37 @@ f_eval(mrb_state *mrb, mrb_value self) return ret; } +mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self); + +static mrb_value +f_instance_eval(mrb_state *mrb, mrb_value self) +{ + mrb_value b, ret; + struct RClass *c; + 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_get_args(mrb, "s|zi", &s, &len, &file, &line); + + return mrb_run(mrb, create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line), self); + } else { + mrb_get_args(mrb, "&", &b); + return mrb_obj_instance_eval(mrb, self); + } +} + void mrb_mruby_eval_gem_init(mrb_state* mrb) { mrb_define_module_function(mrb, mrb->kernel_module, "eval", f_eval, MRB_ARGS_ARG(1, 3)); + mrb_define_method(mrb, mrb->kernel_module, "instance_eval", f_instance_eval, MRB_ARGS_ARG(1, 2)); } void |
