diff options
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/src/kernel.c b/src/kernel.c index dce9e249b..d66f9c48d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -686,17 +686,13 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "o", &arg); mrb_sym mid = mrb_to_id(mrb, arg); - //if (!mrb_is_instance_id(id)) { - // mrb_name_error(id, "`%s' is not allowed as an instance variable name", mrb_sym2name(mrb, id)); - //} - //return mrb_ivar_defined(self, id); - k = kh_get(iv, h, mid); - if (k != kh_end(h)) { - return mrb_true_value(); - } - else { - return mrb_false_value(); + if (h) { + k = kh_get(iv, h, mid); + if (k != kh_end(h)) { + return mrb_true_value(); + } } + return mrb_false_value(); } /* 15.3.1.3.21 */ @@ -795,16 +791,15 @@ mrb_obj_instance_variables(mrb_state *mrb, mrb_value self) const char* p; ary = mrb_ary_new(mrb); - //if (mrb_is_instance_id(key)) { - // mrb_ary_push(mrb, ary, mrb_sym2name(mrb, key)); - //} - for (i=0;i<kh_end(h);i++) { - if (kh_exist(h, i)) { + if (h) { + for (i=0;i<kh_end(h);i++) { + if (kh_exist(h, i)) { p = mrb_sym2name(mrb, kh_key(h,i)); if (*p == '@') { if (mrb_type(kh_value(h, i)) != MRB_TT_UNDEF) mrb_ary_push(mrb, ary, mrb_str_new_cstr(mrb, p)); } + } } } return ary; @@ -922,6 +917,7 @@ method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) int i; khash_t(mt) *h = klass->mt; + if (!h) return; for (i=0;i<kh_end(h);i++) { if (kh_exist(h, i)) { mrb_ary_push(mrb, ary, mrb_symbol_value(kh_key(h,i))); @@ -1244,6 +1240,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) case MRB_TT_MODULE: if (!mrb_obj_ptr(self)->iv) break; h = mrb_obj_ptr(self)->iv; + if (!h) break; k = kh_get(iv, h, sym); if (k != kh_end(h)) { val = kh_value(h, k); |
