summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-03-14 23:09:05 +0900
committerKOBAYASHI Shuji <[email protected]>2019-03-14 23:09:05 +0900
commit16b1b2978e4f4d838f3d12e7221139a92429603b (patch)
treed1019f368520c284e5e16d264a6d3bd231df0b48 /src/variable.c
parent63124bf63350529f5c601d12a7c0bf16d763af78 (diff)
downloadmruby-16b1b2978e4f4d838f3d12e7221139a92429603b.tar.gz
mruby-16b1b2978e4f4d838f3d12e7221139a92429603b.zip
Fix constant name validation
`X!` etc are invalid constant name.
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/variable.c b/src/variable.c
index 14e9da9ef..b712af261 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -428,22 +428,17 @@ mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
}
-#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
-
MRB_API mrb_bool
mrb_iv_name_sym_p(mrb_state *mrb, mrb_sym iv_name)
{
const char *s;
- mrb_int i, len;
+ mrb_int len;
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++) {
- if (!identchar(s[i])) return FALSE;
- }
- return TRUE;
+ return mrb_ident_p(s+1, len-1);
}
MRB_API void
@@ -1114,3 +1109,14 @@ mrb_class_find_path(mrb_state *mrb, struct RClass *c)
}
return path;
}
+
+#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
+
+mrb_bool
+mrb_ident_p(const char *s, mrb_int len)
+{
+ for (mrb_int i = 0; i < len; i++) {
+ if (!identchar(s[i])) return FALSE;
+ }
+ return TRUE;
+}