Make `rb_str_rindex` return byte index

Leave callers to convert byte index to char index, as well as
`rb_str_index`, so that `rb_str_rpartition` does not need to
re-convert char index to byte index.
This commit is contained in:
Nobuyoshi Nakada 2023-07-09 16:39:28 +09:00
Родитель e2257831ab
Коммит 5e79d5a560
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 3582D74E1FEE4465
2 изменённых файлов: 25 добавлений и 3 удалений

Просмотреть файл

@ -0,0 +1,18 @@
prelude: |
str1 = [*"a".."z",*"0".."9"].join("")
str10 = str1 * 10 + ":"
str100 = str1 * 100 + ":"
str1000 = str1 * 1000 + ":"
nonascii1 = [*"\u{e0}".."\u{ff}"].join("")
nonascii10 = nonascii1 * 10 + ":"
nonascii100 = nonascii1 * 100 + ":"
nonascii1000 = nonascii1 * 1000 + ":"
benchmark:
rpartition-1: str1.rpartition(":")
rpartition-10: str10.rpartition(":")
rpartition-100: str100.rpartition(":")
rpartition-1000: str1000.rpartition(":")
rpartition-nonascii1: nonascii1.rpartition(":")
rpartition-nonascii10: nonascii10.rpartition(":")
rpartition-nonascii100: nonascii100.rpartition(":")
rpartition-nonascii1000: nonascii1000.rpartition(":")

Просмотреть файл

@ -3807,6 +3807,7 @@ strseq_core(const char *str_ptr, const char *str_ptr_end, long str_len,
return pos + offset; return pos + offset;
} }
/* found index in byte */
#define rb_str_index(str, sub, offset) rb_strseq_index(str, sub, offset, 0) #define rb_str_index(str, sub, offset) rb_strseq_index(str, sub, offset, 0)
static long static long
@ -4068,6 +4069,7 @@ str_rindex(VALUE str, VALUE sub, const char *s, rb_encoding *enc)
} }
#endif #endif
/* found index in byte */
static long static long
rb_str_rindex(VALUE str, VALUE sub, long pos) rb_str_rindex(VALUE str, VALUE sub, long pos)
{ {
@ -4097,7 +4099,7 @@ rb_str_rindex(VALUE str, VALUE sub, long pos)
} }
s = str_nth(sbeg, RSTRING_END(str), pos, enc, singlebyte); s = str_nth(sbeg, RSTRING_END(str), pos, enc, singlebyte);
return rb_str_sublen(str, str_rindex(str, sub, s, enc)); return str_rindex(str, sub, s, enc);
} }
/* /*
@ -4197,7 +4199,10 @@ rb_str_rindex_m(int argc, VALUE *argv, VALUE str)
else { else {
StringValue(sub); StringValue(sub);
pos = rb_str_rindex(str, sub, pos); pos = rb_str_rindex(str, sub, pos);
if (pos >= 0) return LONG2NUM(pos); if (pos >= 0) {
pos = rb_str_sublen(str, pos);
return LONG2NUM(pos);
}
} }
return Qnil; return Qnil;
} }
@ -10425,7 +10430,6 @@ rb_str_rpartition(VALUE str, VALUE sep)
if (pos < 0) { if (pos < 0) {
goto failed; goto failed;
} }
pos = rb_str_offset(str, pos);
} }
return rb_ary_new3(3, rb_str_subseq(str, 0, pos), return rb_ary_new3(3, rb_str_subseq(str, 0, pos),