aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-25 08:11:36 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-25 08:11:36 +0000
commit6e2f656a6cafbd4d1046e1658b94890c8b5172cb (patch)
tree333881059445427c256a5c50e1c8eefaa6fbd3c5
parent5f4829655b47bbc4728e80f2440ea730d592dabc (diff)
downloadruby-6e2f656a6cafbd4d1046e1658b94890c8b5172cb.tar.gz
ruby.h: rb_scan_args_validate
* include/ruby/ruby.h (rb_scan_args_validate): move failed condition to the terminal. [ruby-core:75714] [Bug #12426] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55158 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--include/ruby/ruby.h35
2 files changed, 34 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 59832b647a..0c8dada447 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed May 25 17:11:34 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (rb_scan_args_validate): move failed
+ condition to the terminal. [ruby-core:75714] [Bug #12426]
+
Wed May 25 13:13:37 2016 NARUSE, Yui <naruse@ruby-lang.org>
* regcomp.c: remove condition for debug output because prelude
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index b7ee5db942..234ccd9fbc 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -2160,8 +2160,8 @@ ERRORFUNC(("bad scan arg format"), int rb_scan_args_bad_format(const char*));
ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mismatch(int,int));
# else
# define rb_scan_args_bad_format(fmt) 0
-# define rb_scan_args_length_mismatch(vari,varc) 0
-#endif
+# define rb_scan_args_length_mismatch(vari, varc) 0
+# endif
# define rb_scan_args_isdigit(c) ((unsigned char)((c)-'0')<10)
@@ -2217,12 +2217,35 @@ ERRORFUNC(("variable argument length doesn't match"), int rb_scan_args_length_mi
# 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_valid_p(fmt) (!(fmt)[rb_scan_args_end_idx(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_valid_p(fmt)||rb_scan_args_bad_format(fmt))) \
- /(((varc)==rb_scan_args_count(fmt))|| \
+ ((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) \