Commit b69bb896 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto

Merge pull request #1664 from h2so5/clone-class-module

clone Class/Module rightly
parents e0e5aebc 25045345
...@@ -293,13 +293,23 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj) ...@@ -293,13 +293,23 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj)
} }
} }
static void
copy_class(mrb_state *mrb, mrb_value dst, mrb_value src)
{
struct RClass *dc = mrb_class_ptr(dst);
struct RClass *sc = mrb_class_ptr(src);
dc->mt = kh_copy(mt, mrb, sc->mt);
dc->super = sc->super;
}
static void static void
init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
{ {
switch (mrb_type(obj)) { switch (mrb_type(obj)) {
case MRB_TT_OBJECT:
case MRB_TT_CLASS: case MRB_TT_CLASS:
case MRB_TT_MODULE: case MRB_TT_MODULE:
copy_class(mrb, dest, obj);
case MRB_TT_OBJECT:
case MRB_TT_SCLASS: case MRB_TT_SCLASS:
case MRB_TT_HASH: case MRB_TT_HASH:
case MRB_TT_DATA: case MRB_TT_DATA:
......
...@@ -359,3 +359,13 @@ assert('singleton tests') do ...@@ -359,3 +359,13 @@ assert('singleton tests') do
end end
end end
end end
assert('clone Class') do
class Foo
def func
true
end
end
Foo.clone.new.func
end
...@@ -503,3 +503,17 @@ assert('Issue 1467') do ...@@ -503,3 +503,17 @@ assert('Issue 1467') do
C1.new C1.new
C2.new C2.new
end end
assert('clone Module') do
module M1
def foo
true
end
end
class B
include M1.clone
end
B.new.foo
end
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