diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-09-04 04:01:49 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-09-04 04:01:49 +0900 |
| commit | 8bb7962eb8e193e94d866626f07d52b63ff2016c (patch) | |
| tree | 71c5ca1edd8b461c2309d2c24a0b9c21753bdc59 /src/kernel.c | |
| parent | 7967c76e1473a72bc91a436a16df7404dcd0caf2 (diff) | |
| parent | 26bee4a16b5763b407a842bd1697389961600d68 (diff) | |
| download | mruby-8bb7962eb8e193e94d866626f07d52b63ff2016c.tar.gz mruby-8bb7962eb8e193e94d866626f07d52b63ff2016c.zip | |
Merge branch 'module-prepend' of https://github.com/polyfox/mruby into polyfox-module-prepend
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/kernel.c b/src/kernel.c index b5b13f874..36ad683ee 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -248,6 +248,11 @@ mrb_singleton_class_clone(mrb_state *mrb, mrb_value obj) clone->c = mrb_singleton_class_clone(mrb, mrb_obj_value(klass)); } + if (klass->origin != klass) + clone->origin = klass->origin; + else + clone->origin = clone; + clone->super = klass->super; if (klass->iv) { mrb_iv_copy(mrb, mrb_obj_value(clone), mrb_obj_value(klass)); @@ -269,6 +274,13 @@ 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); + /* if the origin is not the same as the class, then the origin and + the current class need to be copied */ + if (sc->origin != sc) { + dc->origin = mrb_class_ptr(mrb_obj_dup(mrb, mrb_obj_value(sc->origin))); + } else { + dc->origin = dc; + } dc->mt = kh_copy(mt, mrb, sc->mt); dc->super = sc->super; } @@ -641,13 +653,19 @@ mrb_class_instance_method_list(mrb_state *mrb, mrb_bool recur, struct RClass* kl { khint_t i; mrb_value ary; + mrb_bool prepended; struct RClass* oldklass; khash_t(st)* set = kh_init(st, mrb); + if (!recur && klass->origin != klass) { + klass = klass->origin; + prepended = 1; + } + oldklass = 0; while (klass && (klass != oldklass)) { method_entry_loop(mrb, klass, set); - if ((klass->tt == MRB_TT_ICLASS) || + if ((klass->tt == MRB_TT_ICLASS && !prepended) || (klass->tt == MRB_TT_SCLASS)) { } else { |
