diff options
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/src/kernel.c b/src/kernel.c index 4b3bed0d8..4b426c6b4 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -26,7 +26,7 @@ typedef enum { NOEX_RESPONDS = 0x80 } mrb_method_flag_t; -int +mrb_bool mrb_obj_basic_to_s_p(mrb_state *mrb, mrb_value obj) { struct RProc *me = mrb_method_search(mrb, mrb_class(mrb, obj), mrb_intern2(mrb, "to_s", 4)); @@ -521,7 +521,7 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) return mrb_yield_internal(mrb, b, 0, 0, self, c); } -int +mrb_bool mrb_obj_is_instance_of(mrb_state *mrb, mrb_value obj, struct RClass* c) { if (mrb_obj_class(mrb, obj) == c) return TRUE; @@ -549,15 +549,40 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) } static void -check_iv_name(mrb_state *mrb, mrb_sym id) +valid_iv_name(mrb_state *mrb, mrb_sym iv_name_id, const char* s, size_t len) +{ + if (len < 2 || !(s[0] == '@' && s[1] != '@')) { + mrb_name_error(mrb, iv_name_id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name_id)); + } +} + +static void +check_iv_name(mrb_state *mrb, mrb_sym iv_name_id) { const char *s; size_t len; - s = mrb_sym2name_len(mrb, id, &len); - if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + s = mrb_sym2name_len(mrb, iv_name_id, &len); + valid_iv_name(mrb, iv_name_id, s, len); +} + +static mrb_sym +get_valid_iv_sym(mrb_state *mrb, mrb_value iv_name) +{ + mrb_sym iv_name_id; + + mrb_assert(mrb_symbol_p(iv_name) || mrb_string_p(iv_name)); + + if (mrb_string_p(iv_name)) { + iv_name_id = mrb_intern_cstr(mrb, RSTRING_PTR(iv_name)); + valid_iv_name(mrb, iv_name_id, RSTRING_PTR(iv_name), RSTRING_LEN(iv_name)); + } + else { + iv_name_id = mrb_symbol(iv_name); + check_iv_name(mrb, iv_name_id); } + + return iv_name_id; } /* 15.3.1.3.20 */ @@ -582,10 +607,11 @@ mrb_value mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) { mrb_sym mid; + mrb_value sym; mrb_bool defined_p; - mrb_get_args(mrb, "n", &mid); - check_iv_name(mrb, mid); + mrb_get_args(mrb, "o", &sym); + mid = get_valid_iv_sym(mrb, sym); defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid); return mrb_bool_value(defined_p); @@ -614,12 +640,13 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { - mrb_sym id; + mrb_sym iv_name_id; + mrb_value iv_name; - mrb_get_args(mrb, "n", &id); + mrb_get_args(mrb, "o", &iv_name); - check_iv_name(mrb, id); - return mrb_iv_get(mrb, self, id); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + return mrb_iv_get(mrb, self, iv_name_id); } /* 15.3.1.3.22 */ @@ -645,12 +672,13 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { - mrb_sym id; - mrb_value val; + mrb_sym iv_name_id; + mrb_value iv_name, val; + + mrb_get_args(mrb, "oo", &iv_name, &val); - mrb_get_args(mrb, "no", &id, &val); - check_iv_name(mrb, id); - mrb_iv_set(mrb, self, id, val); + iv_name_id = get_valid_iv_sym(mrb, iv_name); + mrb_iv_set(mrb, self, iv_name_id, val); return val; } @@ -938,7 +966,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) return val; } -static inline int +static inline mrb_bool basic_obj_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym id, int pub) { return mrb_respond_to(mrb, obj, id); @@ -1101,5 +1129,5 @@ mrb_init_kernel(mrb_state *mrb) mrb_define_method(mrb, krn, "to_s", mrb_any_to_s, MRB_ARGS_NONE()); /* 15.3.1.3.46 */ mrb_include_module(mrb, mrb->object_class, mrb->kernel_module); - mrb_alias_method(mrb, mrb->module_class, mrb_intern(mrb, "dup"), mrb_intern(mrb, "clone")); + mrb_alias_method(mrb, mrb->module_class, mrb_intern2(mrb, "dup", 3), mrb_intern2(mrb, "clone", 5)); } |
