Commit a28fa35e authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3282 from bouk/fix-break-instance-class

Fix segfault when defining class inside instance_exec on primitive
parents 1e892c0f 4523aaec
...@@ -23,3 +23,31 @@ assert('Object#tap') do ...@@ -23,3 +23,31 @@ assert('Object#tap') do
], ret ], ret
assert_equal(:tap_ok, Class.new {def m; tap{return :tap_ok}; end}.new.m) assert_equal(:tap_ok, Class.new {def m; tap{return :tap_ok}; end}.new.m)
end end
assert('instance_exec on primitives with class and module definition') do
begin
class A
1.instance_exec do
class B
end
end
end
assert_kind_of Class, A::B
ensure
Object.remove_const :A
end
begin
class A
1.instance_exec do
module B
end
end
end
assert_kind_of Module, A::B
ensure
Object.remove_const :A
end
end
...@@ -2261,7 +2261,7 @@ RETRY_TRY_BLOCK: ...@@ -2261,7 +2261,7 @@ RETRY_TRY_BLOCK:
CASE(OP_CLASS) { CASE(OP_CLASS) {
/* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */ /* A B R(A) := newclass(R(A),Syms(B),R(A+1)) */
struct RClass *c = 0; struct RClass *c = 0, *baseclass;
int a = GETARG_A(i); int a = GETARG_A(i);
mrb_value base, super; mrb_value base, super;
mrb_sym id = syms[GETARG_B(i)]; mrb_sym id = syms[GETARG_B(i)];
...@@ -2269,7 +2269,10 @@ RETRY_TRY_BLOCK: ...@@ -2269,7 +2269,10 @@ RETRY_TRY_BLOCK:
base = regs[a]; base = regs[a];
super = regs[a+1]; super = regs[a+1];
if (mrb_nil_p(base)) { if (mrb_nil_p(base)) {
base = mrb_obj_value(mrb->c->ci->target_class); baseclass = mrb->c->ci->proc->target_class;
if (!baseclass) baseclass = mrb->c->ci->target_class;
base = mrb_obj_value(baseclass);
} }
c = mrb_vm_define_class(mrb, base, super, id); c = mrb_vm_define_class(mrb, base, super, id);
regs[a] = mrb_obj_value(c); regs[a] = mrb_obj_value(c);
...@@ -2279,14 +2282,17 @@ RETRY_TRY_BLOCK: ...@@ -2279,14 +2282,17 @@ RETRY_TRY_BLOCK:
CASE(OP_MODULE) { CASE(OP_MODULE) {
/* A B R(A) := newmodule(R(A),Syms(B)) */ /* A B R(A) := newmodule(R(A),Syms(B)) */
struct RClass *c = 0; struct RClass *c = 0, *baseclass;
int a = GETARG_A(i); int a = GETARG_A(i);
mrb_value base; mrb_value base;
mrb_sym id = syms[GETARG_B(i)]; mrb_sym id = syms[GETARG_B(i)];
base = regs[a]; base = regs[a];
if (mrb_nil_p(base)) { if (mrb_nil_p(base)) {
base = mrb_obj_value(mrb->c->ci->target_class); baseclass = mrb->c->ci->proc->target_class;
if (!baseclass) baseclass = mrb->c->ci->target_class;
base = mrb_obj_value(baseclass);
} }
c = mrb_vm_define_module(mrb, base, id); c = mrb_vm_define_module(mrb, base, id);
regs[a] = mrb_obj_value(c); regs[a] = mrb_obj_value(c);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment