diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-09-02 16:37:40 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-09-02 16:37:40 +0900 |
| commit | 6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc (patch) | |
| tree | 78263dc0432864d3e481b6d11c128ef974b58ab1 /src/variable.c | |
| parent | 471c43ff965ae46b040daa0cda77a491a6f480af (diff) | |
| download | mruby-6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc.tar.gz mruby-6c7b0d88e87a41b6e2c908e0a9dcbc722b7553dc.zip | |
refactor valid instance variable name check
Diffstat (limited to 'src/variable.c')
| -rw-r--r-- | src/variable.c | 29 |
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) { |
