diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-16 05:22:04 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-07-16 05:22:04 +0900 |
| commit | f8aac56df02f7106a87a6d8611e9cd8b5b9a4f2e (patch) | |
| tree | c3a211bb44d1ad80f0e4b79493910ef6c273445f | |
| parent | d5dd3e94723fc7754aa5d478e0947479569c25dc (diff) | |
| parent | abf52c77737d7f95609ee06dcb4347b56509258a (diff) | |
| download | mruby-f8aac56df02f7106a87a6d8611e9cd8b5b9a4f2e.tar.gz mruby-f8aac56df02f7106a87a6d8611e9cd8b5b9a4f2e.zip | |
git push origin masterMerge branch 'take-cheeze-instance_eval'
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 26 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/test/eval.rb | 10 |
2 files changed, 36 insertions, 0 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 6ca7d4fc2..06baad531 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -173,10 +173,36 @@ 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; + 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 diff --git a/mrbgems/mruby-eval/test/eval.rb b/mrbgems/mruby-eval/test/eval.rb index eb51f396a..87c64732d 100644 --- a/mrbgems/mruby-eval/test/eval.rb +++ b/mrbgems/mruby-eval/test/eval.rb @@ -50,3 +50,13 @@ assert 'eval syntax error' do eval 'p "test' end end + +assert('String instance_eval') do + obj = Object.new + obj.instance_variable_set :@test, 'test' + assert_raise(ArgumentError) { obj.instance_eval(0) { } } + assert_raise(ArgumentError) { obj.instance_eval('0', 'test', 0, 'test') } + assert_equal(['test.rb', 10]) { obj.instance_eval('[__FILE__, __LINE__]', 'test.rb', 10)} + assert_equal('test') { obj.instance_eval('@test') } + assert_equal('test') { obj.instance_eval { @test } } +end |
