summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-eval
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-07-23 18:26:24 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-07-23 18:26:24 +0900
commitb09d2eb90074c50ed83d4d10d3fe0393bc9e43da (patch)
tree1152292a06d86a489eb421949091453beb4a6bd5 /mrbgems/mruby-eval
parentcb42c9875728422e46270c3bbbbfa30578f25a4c (diff)
downloadmruby-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.c1
-rw-r--r--mrbgems/mruby-eval/test/eval.rb17
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 }