From 0b25c9d2247645025360dbd7a3260e6bf7309605 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sat, 28 Oct 2023 18:24:41 +0900 Subject: [PATCH] Fixed acquisition of wrong target class in `Kernel#binding` fixed #6089 --- mrbgems/mruby-eval/test/binding.rb | 17 +++++++++++++++++ src/proc.c | 7 +------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mrbgems/mruby-eval/test/binding.rb b/mrbgems/mruby-eval/test/binding.rb index 1266690ed..1a470329b 100644 --- a/mrbgems/mruby-eval/test/binding.rb +++ b/mrbgems/mruby-eval/test/binding.rb @@ -62,3 +62,20 @@ assert "access local variables into procs" do bx.eval("a = 2") assert_equal 2, block.call end + +assert "Binding#eval on another target class" do + obj = Object.new + Module.new do + self::BINDING = obj.instance_eval { binding } + + def self.eval(code) + self::BINDING.eval code + end + + self.eval "def self.m1; :m1; end" + self.eval "def m2; :m2; end" + end + + assert_equal :m1, obj.m1 + assert_equal :m2, obj.m2 +end diff --git a/src/proc.c b/src/proc.c index d0a6c9b88..0317a47e8 100644 --- a/src/proc.c +++ b/src/proc.c @@ -418,18 +418,13 @@ mrb_proc_get_caller(mrb_state *mrb, struct REnv **envp) if (envp) *envp = NULL; } else { - struct RClass *tc = MRB_PROC_TARGET_CLASS(proc); struct REnv *e = mrb_vm_ci_env(ci); if (e == NULL) { int nstacks = proc->body.irep->nlocals; - e = mrb_env_new(mrb, c, ci, nstacks, ci->stack, tc); + e = mrb_env_new(mrb, c, ci, nstacks, ci->stack, mrb_vm_ci_target_class(ci)); ci->u.env = e; } - else if (tc) { - e->c = tc; - mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc); - } if (envp) *envp = e; }