diff options
Diffstat (limited to 'src/class.c')
| -rw-r--r-- | src/class.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/class.c b/src/class.c index 9abd90c31..879502364 100644 --- a/src/class.c +++ b/src/class.c @@ -1,3 +1,9 @@ +/* +** class.c - Class class +** +** See Copyright Notice in mruby.h +*/ + #include "mruby.h" #include <stdarg.h> #include <stdio.h> @@ -5,11 +11,11 @@ #include "mruby/proc.h" #include "mruby/string.h" #include "mruby/numeric.h" -#include "variable.h" +#include "mruby/variable.h" #include "mruby/array.h" #include "error.h" -#include "ritehash.h" +#include "mruby/khash.h" #ifdef INCLUDE_REGEXP #define mrb_usascii_str_new2 mrb_usascii_str_new_cstr @@ -105,7 +111,12 @@ make_metaclass(mrb_state *mrb, struct RClass *c) } sc = mrb_obj_alloc(mrb, MRB_TT_SCLASS, mrb->class_class); sc->mt = 0; - sc->super = c->c; + if (!c->super) { + sc->super = mrb->class_class; + } + else { + sc->super = c->super->c; + } c->c = sc; mrb_field_write_barrier(mrb, (struct RBasic*)c, (struct RBasic*)sc); mrb_field_write_barrier(mrb, (struct RBasic*)sc, (struct RBasic*)sc->super); @@ -202,7 +213,10 @@ mrb_vm_define_class(mrb_state *mrb, mrb_value outer, mrb_value super, mrb_sym id if (!c) { struct RClass *s = 0; - if (!mrb_nil_p(super)) s = mrb_class_ptr(super); + if (!mrb_nil_p(super)) { + mrb_check_type(mrb, super, MRB_TT_CLASS); + s = mrb_class_ptr(super); + } c = mrb_class_new(mrb, s); setup_class(mrb, outer, c, id); } @@ -278,10 +292,9 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RPro { khash_t(mt) *h = c->mt; khiter_t k; - int ret; if (!h) h = c->mt = kh_init(mt, mrb); - k = kh_put(mt, h, mid, &ret); + k = kh_put(mt, h, mid); kh_value(h, k) = p; } @@ -306,10 +319,9 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b { khash_t(mt) *h = c->mt; khiter_t k; - int ret; if (!h) h = c->mt = kh_init(mt, mrb); - k = kh_put(mt, h, name, &ret); + k = kh_put(mt, h, name); kh_value(h, k) = mrb_proc_ptr(body); } @@ -829,7 +841,6 @@ mrb_class_new(mrb_state *mrb, struct RClass *super) struct RClass *c; if (super) { -// mrb_check_type(mrb, super, MRB_TT_CLASS); mrb_check_inheritable(mrb, super); } c = boot_defclass(mrb, super); @@ -845,7 +856,6 @@ struct RClass * mrb_module_new(mrb_state *mrb) { struct RClass *m = mrb_obj_alloc(mrb, MRB_TT_MODULE, mrb->module_class); - make_metaclass(mrb, m); return m; } @@ -930,12 +940,16 @@ mrb_mod_to_s(mrb_state *mrb, mrb_value klass) switch (mrb_type(klass)) { - case MRB_TT_CLASS: - snprintf(buf, 256, "#<Class:%p>", c); - break; - case MRB_TT_MODULE: - snprintf(buf, 256, "#<Module:%p>", c); - break; + case MRB_TT_CLASS: + snprintf(buf, 256, "#<Class:%p>", c); + break; + + case MRB_TT_MODULE: + snprintf(buf, 256, "#<Module:%p>", c); + break; + + default: + break; } return mrb_str_dup(mrb, mrb_str_new_cstr(mrb, buf)); } |
