From 8b126d59b3b28a5c4b6de6e106a93d1aaa3d2174 Mon Sep 17 00:00:00 2001 From: glass Date: Wed, 31 Jul 2013 07:53:08 +0000 Subject: * string.c (rb_str_rindex): refactoring and avoid to call str_nth() if pos == 0. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42268 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- string.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) (limited to 'string.c') diff --git a/string.c b/string.c index e7f9b44324..e09852cdb9 100644 --- a/string.c +++ b/string.c @@ -2673,27 +2673,33 @@ rb_str_rindex(VALUE str, VALUE sub, long pos) long len, slen; char *s, *sbeg, *e, *t; rb_encoding *enc; - int singlebyte = single_byte_optimizable(str); + int singlebyte; enc = rb_enc_check(str, sub); - if (is_broken_string(sub)) { - return -1; - } - len = str_strlen(str, enc); + if (is_broken_string(sub)) return -1; + singlebyte = single_byte_optimizable(str); + len = singlebyte ? RSTRING_LEN(str) : str_strlen(str, enc); slen = str_strlen(sub, enc); + /* substring longer than string */ if (len < slen) return -1; - if (len - pos < slen) { - pos = len - slen; - } - if (len == 0) { - return pos; - } + if (len - pos < slen) pos = len - slen; + if (len == 0) return pos; + sbeg = RSTRING_PTR(str); e = RSTRING_END(str); t = RSTRING_PTR(sub); slen = RSTRING_LEN(sub); + + if (pos == 0) { + if (memcmp(sbeg, t, slen) == 0) + return 0; + else + return -1; + } + s = str_nth(sbeg, e, pos, enc, singlebyte); + while (s) { if (memcmp(s, t, slen) == 0) { return pos; -- cgit v1.2.3