clone Class/Module rightly

This commit is contained in:
h2so5
2014-01-25 07:47:15 +09:00
parent e0e5aebc66
commit 25045345c9
3 changed files with 36 additions and 2 deletions
+12 -2
View File
@@ -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
init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj)
{
switch (mrb_type(obj)) {
case MRB_TT_OBJECT:
switch (mrb_type(obj)) {
case MRB_TT_CLASS:
case MRB_TT_MODULE:
copy_class(mrb, dest, obj);
case MRB_TT_OBJECT:
case MRB_TT_SCLASS:
case MRB_TT_HASH:
case MRB_TT_DATA:
+10
View File
@@ -359,3 +359,13 @@ assert('singleton tests') do
end
end
end
assert('clone Class') do
class Foo
def func
true
end
end
Foo.clone.new.func
end
+14
View File
@@ -503,3 +503,17 @@ assert('Issue 1467') do
C1.new
C2.new
end
assert('clone Module') do
module M1
def foo
true
end
end
class B
include M1.clone
end
B.new.foo
end