string.c: add fastpath in str_ensure_byte_pos

If the string only contain single byte characters we can
skips all the costly checks.
This commit is contained in:
Jean Boussier 2024-08-09 15:27:42 +02:00
Родитель a332367dad
Коммит 3bac5f6af5
1 изменённых файлов: 8 добавлений и 6 удалений

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

@ -4254,12 +4254,14 @@ rb_str_index_m(int argc, VALUE *argv, VALUE str)
static void
str_ensure_byte_pos(VALUE str, long pos)
{
const char *s = RSTRING_PTR(str);
const char *e = RSTRING_END(str);
const char *p = s + pos;
if (!at_char_boundary(s, p, e, rb_enc_get(str))) {
rb_raise(rb_eIndexError,
"offset %ld does not land on character boundary", pos);
if (!single_byte_optimizable(str)) {
const char *s = RSTRING_PTR(str);
const char *e = RSTRING_END(str);
const char *p = s + pos;
if (!at_char_boundary(s, p, e, rb_enc_get(str))) {
rb_raise(rb_eIndexError,
"offset %ld does not land on character boundary", pos);
}
}
}