diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-07-23 18:26:24 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-07-23 18:26:24 +0900 |
| commit | b09d2eb90074c50ed83d4d10d3fe0393bc9e43da (patch) | |
| tree | 1152292a06d86a489eb421949091453beb4a6bd5 /mrbgems/mruby-eval | |
| parent | cb42c9875728422e46270c3bbbbfa30578f25a4c (diff) | |
| download | mruby-b09d2eb90074c50ed83d4d10d3fe0393bc9e43da.tar.gz mruby-b09d2eb90074c50ed83d4d10d3fe0393bc9e43da.zip | |
Kernel#instance_eval should define singleton methods; fix #4069
Diffstat (limited to 'mrbgems/mruby-eval')
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/test/eval.rb | 17 |
2 files changed, 17 insertions, 1 deletions
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 14e89ac14..5c8e78acd 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -325,6 +325,7 @@ f_instance_eval(mrb_state *mrb, mrb_value self) proc = create_proc_from_string(mrb, s, len, mrb_nil_value(), file, line); MRB_PROC_SET_TARGET_CLASS(proc, mrb_class_ptr(cv)); mrb_assert(!MRB_PROC_CFUNC_P(proc)); + mrb->c->ci->target_class = mrb_class_ptr(cv); return exec_irep(mrb, self, proc); } else { diff --git a/mrbgems/mruby-eval/test/eval.rb b/mrbgems/mruby-eval/test/eval.rb index be43412f7..8cf658f29 100644 --- a/mrbgems/mruby-eval/test/eval.rb +++ b/mrbgems/mruby-eval/test/eval.rb @@ -100,7 +100,22 @@ assert('Object#instance_eval with begin-rescue-ensure execution order') do assert_equal([:enter_raise_hell, :begin, :rescue, :ensure], hell_raiser.raise_hell) end -assert('Kernel.#eval(strinng) Issue #4021') do +assert('Kernel#instance_eval() to define singleton methods Issue #3141') do + foo_class = Class.new do + def bar(x) + instance_eval "def baz; #{x}; end" + end + end + + f1 = foo_class.new + f2 = foo_class.new + f1.bar 1 + f2.bar 2 + assert_equal(1){f1.baz} + assert_equal(2){f2.baz} +end + +assert('Kernel.#eval(string) Issue #4021') do assert_equal('FOO') { (eval <<'EOS').call } foo = "FOO" Proc.new { foo } |
