summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-09-02 16:37:40 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-09-02 16:37:40 +0900
commit6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc (patch)
tree78263dc0432864d3e481b6d11c128ef974b58ab1 /src/variable.c
parent471c43ff965ae46b040daa0cda77a491a6f480af (diff)
downloadmruby-6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc.tar.gz
mruby-6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc.zip
refactor valid instance variable name check
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/variable.c b/src/variable.c
index 6318d97fc..948bd1871 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -542,6 +542,35 @@ mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
}
+MRB_API mrb_bool
+mrb_iv_p(mrb_state *mrb, mrb_sym iv_name)
+{
+ const char *s;
+ mrb_int i, len;
+ size_t j;
+ const char *invalid = "@$!? ";
+
+ s = mrb_sym2name_len(mrb, iv_name, &len);
+ if (len < 2) return FALSE;
+ if (s[0] != '@') return FALSE;
+ if (s[1] == '@') return FALSE;
+ for (i=1; i<len; i++) {
+ char c = s[i];
+ for (j=0; j<sizeof(invalid); j++) {
+ if (c == invalid[j]) return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+MRB_API void
+mrb_iv_check(mrb_state *mrb, mrb_sym iv_name)
+{
+ if (!mrb_iv_p(mrb, iv_name)) {
+ mrb_name_error(mrb, iv_name, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, iv_name));
+ }
+}
+
MRB_API void
mrb_iv_copy(mrb_state *mrb, mrb_value dest, mrb_value src)
{