mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
clone Class/Module rightly
This commit is contained in:
+12
-2
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user