summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-26 05:13:54 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-26 05:13:54 +0000
commitbe44af047a954fbbdbe6fa0eca988e9159ae2476 (patch)
treea66c380d1a2509750004852d2a1b5b25c0a5c6f7 /include
parent374513ce821aa1c580af916d2a966a283f335e7f (diff)
ruby.h: count and verify
* include/ruby/ruby.h (rb_scan_args_count): verify length with counting variables together. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55173 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'include')
-rw-r--r--include/ruby/ruby.h123
1 files changed, 52 insertions, 71 deletions
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 234ccd9fbc..a76576c890 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -2164,90 +2164,71 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
# endif
# define rb_scan_args_isdigit(c) ((unsigned char)((c)-'0')<10)
-
-# define rb_scan_args_count_block(fmt, ofs) \
- ((fmt)[ofs]=='&')
-
-# define rb_scan_args_count_hash(fmt, ofs) \
- ((fmt)[ofs]!=':' ? \
- rb_scan_args_count_block(fmt, ofs) : \
- rb_scan_args_count_block(fmt, (ofs)+1)+1)
-
-# define rb_scan_args_count_trail(fmt, ofs) \
- (!rb_scan_args_isdigit((fmt)[ofs]) ? \
- rb_scan_args_count_hash(fmt, ofs) : \
- ((fmt)[ofs]-'0') + rb_scan_args_count_hash(fmt, (ofs)+1))
-
-# define rb_scan_args_count_var(fmt, ofs) \
- ((fmt)[ofs]!='*' ? \
- rb_scan_args_count_trail(fmt, ofs) : \
- rb_scan_args_count_trail(fmt, (ofs)+1)+1)
-
-# define rb_scan_args_count(fmt) \
- (!rb_scan_args_isdigit((fmt)[0]) ? rb_scan_args_count_var(fmt, 0) : \
- !rb_scan_args_isdigit((fmt)[1]) ? rb_scan_args_count_var(fmt, 1)+(fmt)[0]-'0' : \
- rb_scan_args_count_var(fmt, 2)+(fmt)[0]-'0'+(fmt)[1]-'0')
-
-# define rb_scan_args_lead_p(fmt) rb_scan_args_isdigit((fmt)[0])
-# define rb_scan_args_n_lead(fmt) (rb_scan_args_lead_p(fmt) ? (fmt)[0]-'0' : 0)
-# define rb_scan_args_opt_p(fmt) (rb_scan_args_lead_p(fmt) && rb_scan_args_isdigit((fmt)[1]))
-# define rb_scan_args_n_opt(fmt) (rb_scan_args_opt_p(fmt) ? (fmt)[1]-'0' : 0)
+# define rb_scan_args_count_end(fmt, ofs, varc, vari) \
+ (((varc) \
+ /(!fmt[ofs] || rb_scan_args_bad_format(fmt))) \
+ /((varc)==(vari) || rb_scan_args_length_mismatch(vari, varc)))
+
+# define rb_scan_args_count_block(fmt, ofs, varc, vari) \
+ (fmt[ofs]!='&' ? \
+ rb_scan_args_count_end(fmt, ofs, varc, vari) : \
+ rb_scan_args_count_end(fmt, ofs+1, varc, vari+1))
+
+# define rb_scan_args_count_hash(fmt, ofs, varc, vari) \
+ (fmt[ofs]!=':' ? \
+ rb_scan_args_count_block(fmt, ofs, varc, vari) : \
+ rb_scan_args_count_block(fmt, ofs+1, varc, vari+1))
+
+# define rb_scan_args_count_trail(fmt, ofs, varc, vari) \
+ (!rb_scan_args_isdigit(fmt[ofs]) ? \
+ rb_scan_args_count_hash(fmt, ofs, varc, vari) : \
+ rb_scan_args_count_hash(fmt, ofs+1, varc, vari+(fmt[ofs]-'0')))
+
+# define rb_scan_args_count_var(fmt, ofs, varc, vari) \
+ (fmt[ofs]!='*' ? \
+ rb_scan_args_count_trail(fmt, ofs, varc, vari) : \
+ rb_scan_args_count_trail(fmt, ofs+1, varc, vari+1))
+
+# define rb_scan_args_count_opt(fmt, ofs, varc, vari) \
+ (!rb_scan_args_isdigit(fmt[1]) ? \
+ rb_scan_args_count_var(fmt, ofs, varc, vari) : \
+ rb_scan_args_count_var(fmt, ofs+1, varc, vari+fmt[ofs]-'0'))
+
+# define rb_scan_args_count(fmt, varc) \
+ (!rb_scan_args_isdigit(fmt[0]) ? \
+ rb_scan_args_count_var(fmt, 0, varc, 0) : \
+ rb_scan_args_count_opt(fmt, 1, varc, fmt[0]-'0'))
+
+# define rb_scan_args_lead_p(fmt) rb_scan_args_isdigit(fmt[0])
+# define rb_scan_args_n_lead(fmt) (rb_scan_args_lead_p(fmt) ? fmt[0]-'0' : 0)
+# define rb_scan_args_opt_p(fmt) (rb_scan_args_lead_p(fmt) && rb_scan_args_isdigit(fmt[1]))
+# define rb_scan_args_n_opt(fmt) (rb_scan_args_opt_p(fmt) ? fmt[1]-'0' : 0)
# define rb_scan_args_var_idx(fmt) \
- (!rb_scan_args_lead_p(fmt) ? 0 : !rb_scan_args_isdigit((fmt)[1]) ? 1 : 2)
-# define rb_scan_args_f_var(fmt) ((fmt)[rb_scan_args_var_idx(fmt)]=='*')
+ (!rb_scan_args_lead_p(fmt) ? 0 : !rb_scan_args_isdigit(fmt[1]) ? 1 : 2)
+# define rb_scan_args_f_var(fmt) (fmt[rb_scan_args_var_idx(fmt)]=='*')
# define rb_scan_args_trail_idx(fmt) \
(rb_scan_args_lead_p(fmt) ? \
- (rb_scan_args_isdigit((fmt)[1]) || (fmt)[1]=='*')+1 : \
- ((fmt)[0]=='*'))
+ (rb_scan_args_isdigit(fmt[1]) || fmt[1]=='*')+1 : \
+ (fmt[0]=='*'))
# define rb_scan_args_trail_p(fmt) \
(rb_scan_args_lead_p(fmt) ? \
- (rb_scan_args_isdigit((fmt)[1]) || (fmt)[1]=='*') && \
- rb_scan_args_isdigit((fmt)[2]) : \
- (fmt)[0]=='*' && rb_scan_args_isdigit((fmt)[1]))
+ (rb_scan_args_isdigit(fmt[1]) || fmt[1]=='*') && \
+ rb_scan_args_isdigit(fmt[2]) : \
+ fmt[0]=='*' && rb_scan_args_isdigit(fmt[1]))
# define rb_scan_args_n_trail(fmt) \
(rb_scan_args_lead_p(fmt) ? \
- ((rb_scan_args_isdigit((fmt)[1]) || (fmt)[1]=='*') && \
- rb_scan_args_isdigit((fmt)[2]) ? (fmt)[2]-'0' : 0) : \
- ((fmt)[0]=='*' && rb_scan_args_isdigit((fmt)[1]) ? (fmt)[1]-'0' : 0))
+ ((rb_scan_args_isdigit(fmt[1]) || fmt[1]=='*') && \
+ rb_scan_args_isdigit(fmt[2]) ? fmt[2]-'0' : 0) : \
+ (fmt[0]=='*' && rb_scan_args_isdigit(fmt[1]) ? fmt[1]-'0' : 0))
# define rb_scan_args_hash_idx(fmt) \
(rb_scan_args_trail_idx(fmt)+rb_scan_args_trail_p(fmt))
-# define rb_scan_args_f_hash(fmt) ((fmt)[rb_scan_args_hash_idx(fmt)]==':')
+# define rb_scan_args_f_hash(fmt) (fmt[rb_scan_args_hash_idx(fmt)]==':')
# define rb_scan_args_block_idx(fmt) \
(rb_scan_args_hash_idx(fmt)+rb_scan_args_f_hash(fmt))
-# define rb_scan_args_f_block(fmt) ((fmt)[rb_scan_args_block_idx(fmt)]=='&')
+# define rb_scan_args_f_block(fmt) (fmt[rb_scan_args_block_idx(fmt)]=='&')
# define rb_scan_args_end_idx(fmt) \
(rb_scan_args_block_idx(fmt)+rb_scan_args_f_block(fmt))
-# define rb_scan_args_validate(fmt, varc) \
- (!rb_scan_args_isdigit((fmt)[0]) ? \
- rb_scan_args_validate_var(fmt, 0, varc) : \
- !rb_scan_args_isdigit((fmt)[1]) ? \
- rb_scan_args_validate_var(fmt, 1, (varc-(fmt)[0]+'0')) : \
- rb_scan_args_validate_var(fmt, 2, (varc-(fmt)[0]+'0'-(fmt)[1]+'0')))
-# define rb_scan_args_validate_var(fmt, ofs, varc) \
- ((fmt)[ofs]=='*' ? \
- rb_scan_args_validate_trail(fmt, ofs+1, (varc-1)) : \
- rb_scan_args_validate_trail(fmt, ofs, varc))
-# define rb_scan_args_validate_trail(fmt, ofs, varc) \
- (rb_scan_args_isdigit((fmt)[ofs]) ? \
- rb_scan_args_validate_hash(fmt, ofs+1, (varc-1)) : \
- rb_scan_args_validate_hash(fmt, ofs, varc))
-# define rb_scan_args_validate_hash(fmt, ofs, varc) \
- ((fmt)[ofs]==':' ? \
- rb_scan_args_validate_block(fmt, ofs+1, (varc-1)) : \
- rb_scan_args_validate_block(fmt, ofs, varc))
-# define rb_scan_args_validate_block(fmt, ofs, varc) \
- ((fmt)[ofs]=='&' ? \
- rb_scan_args_validate_end(fmt, ofs+1, (varc-1)) : \
- rb_scan_args_validate_end(fmt, ofs, varc))
-# define rb_scan_args_validate_end(fmt, ofs, varc) \
- ((fmt)[ofs]?rb_scan_args_bad_format(fmt):!(varc))
-
-# define rb_scan_args_verify(fmt, varc) \
- ((varc)\
- /(rb_scan_args_validate(fmt, varc)|| \
- rb_scan_args_length_mismatch((varc), rb_scan_args_count(fmt))))
-
# define rb_scan_args0(argc, argv, fmt, varc, vars) \
rb_scan_args_set(argc, argv, \
rb_scan_args_n_lead(fmt), \
@@ -2256,7 +2237,7 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
rb_scan_args_f_var(fmt), \
rb_scan_args_f_hash(fmt), \
rb_scan_args_f_block(fmt), \
- rb_scan_args_verify(fmt, varc), vars)
+ rb_scan_args_count(fmt, varc), vars)
ALWAYS_INLINE(static int
rb_scan_args_set(int argc, const VALUE *argv,
int n_lead, int n_opt, int n_trail,