diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-03-14 23:09:05 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-03-14 23:09:05 +0900 |
| commit | 16b1b2978e4f4d838f3d12e7221139a92429603b (patch) | |
| tree | d1019f368520c284e5e16d264a6d3bd231df0b48 /src/variable.c | |
| parent | 63124bf63350529f5c601d12a7c0bf16d763af78 (diff) | |
| download | mruby-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.c | 20 |
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; +} |
