Commit 0b14f950 authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

add check for instance variable names

parent 04c0d936
...@@ -597,6 +597,18 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) ...@@ -597,6 +597,18 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self)
} }
} }
static void
check_iv_name(mrb_state *mrb, mrb_sym id)
{
char *s;
int len;
s = mrb_sym2name_len(mrb, id, &len);
if (len < 2 && s[0] != '@') {
mrb_name_error(mrb, id, "`%s' is not allowed as an instance variable name", s);
}
}
/* 15.3.1.3.20 */ /* 15.3.1.3.20 */
/* /*
* call-seq: * call-seq:
...@@ -618,13 +630,12 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) ...@@ -618,13 +630,12 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self)
mrb_value mrb_value
mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)
{ {
mrb_value arg;
khiter_t k; khiter_t k;
kh_iv_t *h = RCLASS_IV_TBL(self); kh_iv_t *h = RCLASS_IV_TBL(self);
mrb_sym mid; mrb_sym mid;
mrb_get_args(mrb, "o", &arg); mrb_get_args(mrb, "n", &mid);
mid = mrb_to_id(mrb, arg); check_iv_name(mrb, mid);
if (h) { if (h) {
k = kh_get(iv, h, mid); k = kh_get(iv, h, mid);
...@@ -658,15 +669,11 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) ...@@ -658,15 +669,11 @@ mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self)
mrb_value mrb_value
mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)
{ {
mrb_value arg;
mrb_sym id; mrb_sym id;
mrb_get_args(mrb, "o", &arg); mrb_get_args(mrb, "n", &id);
id = mrb_to_id(mrb, arg);
//if (!mrb_is_instance_id(id)) { check_iv_name(mrb, id);
// mrb_name_error(mrb, id, "`%s' is not allowed as an instance variable name", mrb_sym2name(mrb, id));
//}
return mrb_iv_get(mrb, self, id); return mrb_iv_get(mrb, self, id);
} }
...@@ -693,12 +700,11 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) ...@@ -693,12 +700,11 @@ mrb_obj_ivar_get(mrb_state *mrb, mrb_value self)
mrb_value mrb_value
mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) mrb_obj_ivar_set(mrb_state *mrb, mrb_value self)
{ {
mrb_value key;
mrb_value val;
mrb_sym id; mrb_sym id;
mrb_value val;
mrb_get_args(mrb, "oo", &key, &val); mrb_get_args(mrb, "no", &id, &val);
id = mrb_to_id(mrb, key); check_iv_name(mrb, id);
mrb_iv_set(mrb, self, id, val); mrb_iv_set(mrb, self, id, val);
return val; return val;
} }
...@@ -1011,6 +1017,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self) ...@@ -1011,6 +1017,7 @@ mrb_obj_remove_instance_variable(mrb_state *mrb, mrb_value self)
mrb_value val; mrb_value val;
mrb_get_args(mrb, "n", &sym); mrb_get_args(mrb, "n", &sym);
check_iv_name(mrb, sym);
val = mrb_iv_remove(mrb, self, sym); val = mrb_iv_remove(mrb, self, sym);
if (mrb_undef_p(val)) { if (mrb_undef_p(val)) {
mrb_name_error(mrb, sym, "instance variable %s not defined", mrb_sym2name(mrb, sym)); mrb_name_error(mrb, sym, "instance variable %s not defined", mrb_sym2name(mrb, sym));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment