diff options
| author | h2so5 <[email protected]> | 2014-01-25 07:47:15 +0900 |
|---|---|---|
| committer | h2so5 <[email protected]> | 2014-01-25 07:47:15 +0900 |
| commit | 25045345c9ae9f456b27c9fbc63caee6372e16d4 (patch) | |
| tree | 3240f552ea496ffc3a32f5e7635fbb37691ba526 | |
| parent | e0e5aebc66833dfe55b362678032f7e0e4a265d7 (diff) | |
| download | mruby-25045345c9ae9f456b27c9fbc63caee6372e16d4.tar.gz mruby-25045345c9ae9f456b27c9fbc63caee6372e16d4.zip | |
clone Class/Module rightly
| -rw-r--r-- | src/kernel.c | 14 | ||||
| -rw-r--r-- | test/t/class.rb | 10 | ||||
| -rw-r--r-- | test/t/module.rb | 14 |
3 files changed, 36 insertions, 2 deletions
diff --git a/src/kernel.c b/src/kernel.c index 15567a65f..e811b394c 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -294,12 +294,22 @@ 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: diff --git a/test/t/class.rb b/test/t/class.rb index a6ba336e3..bea20ee24 100644 --- a/test/t/class.rb +++ b/test/t/class.rb @@ -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 diff --git a/test/t/module.rb b/test/t/module.rb index 170eb925a..48a09f720 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -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 |
