diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-04-20 15:04:18 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2009-04-20 15:04:18 +0000 |
commit | a3489ee71a6c8d0ae9ca8b3e211f418e9258e2d4 (patch) | |
tree | a4688a020834a1c8a315c90891505c57565dd125 | |
parent | 8c0ea7cda023737eb5a2e76b975b0c7bde70e467 (diff) | |
download | ruby-a3489ee71a6c8d0ae9ca8b3e211f418e9258e2d4.tar.gz ruby-a3489ee71a6c8d0ae9ca8b3e211f418e9258e2d4.tar.xz ruby-a3489ee71a6c8d0ae9ca8b3e211f418e9258e2d4.zip |
* string.c (rb_str_split_m): faster processing on 7bit strings.
* string.c (ascii_isspace): faster isspace() for 7bit strings.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@23234 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | string.c | 62 |
2 files changed, 59 insertions, 9 deletions
@@ -1,3 +1,9 @@ +Mon Apr 20 20:29:04 2009 Yukihiro Matsumoto <matz@ruby-lang.org> + + * string.c (rb_str_split_m): faster processing on 7bit strings. + + * string.c (ascii_isspace): faster isspace() for 7bit strings. + Sun Apr 19 14:43:18 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> * eval.c (ruby_cleanup): the order of local variables on stack is @@ -5382,6 +5382,26 @@ rb_str_count(int argc, VALUE *argv, VALUE str) return INT2NUM(i); } +static const char isspacetable[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +#define ascii_isspace(c) isspacetable[(unsigned char)(c)] /* * call-seq: @@ -5495,21 +5515,45 @@ rb_str_split_m(int argc, VALUE *argv, VALUE str) unsigned int c; end = beg; - while (ptr < eptr) { - c = rb_enc_codepoint(ptr, eptr, enc); - ptr += rb_enc_mbclen(ptr, eptr, enc); - if (skip) { - if (rb_enc_isspace(c, enc)) { + if (is_ascii_string(str)) { + while (ptr < eptr) { + c = (unsigned char)*ptr++; + if (skip) { + if (ascii_isspace(c)) { + beg = ptr - bptr; + } + else { + end = ptr - bptr; + skip = 0; + if (!NIL_P(limit) && lim <= i) break; + } + } + else if (ascii_isspace(c)) { + rb_ary_push(result, rb_str_subseq(str, beg, end-beg)); + skip = 1; beg = ptr - bptr; + if (!NIL_P(limit)) ++i; } else { end = ptr - bptr; - skip = 0; - if (!NIL_P(limit) && lim <= i) break; } } - else { - if (rb_enc_isspace(c, enc)) { + } + else { + while (ptr < eptr) { + c = rb_enc_codepoint(ptr, eptr, enc); + ptr += rb_enc_mbclen(ptr, eptr, enc); + if (skip) { + if (rb_enc_isspace(c, enc)) { + beg = ptr - bptr; + } + else { + end = ptr - bptr; + skip = 0; + if (!NIL_P(limit) && lim <= i) break; + } + } + else if (rb_enc_isspace(c, enc)) { rb_ary_push(result, rb_str_subseq(str, beg, end-beg)); skip = 1; beg = ptr - bptr; |