Skip to content

Commit edab32a

Browse files
committed
special case same-encoding strings, length-1 needles.
1 parent c726cd5 commit edab32a

File tree

1 file changed

+30
-20
lines changed

1 file changed

+30
-20
lines changed

src/vm/parrot/ops/nqp.ops

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3957,30 +3957,40 @@ inline op nqp_string_equal_at(out INT, in STR, in STR, in INT) {
39573957
String_iter hay_iter;
39583958
String_iter needle_iter;
39593959

3960-
offset = (INTVAL)($4);
3960+
if (0 && ($3)->strlen == 1) {
3961+
STRING_ITER_INIT(interp, &hay_iter);
3962+
STRING_iter_skip(interp, $2, &hay_iter, offset);
3963+
$1 = (STRING_ord(interp, $3, 0) == STRING_ord(interp, $2, hay_iter.bytepos));
3964+
} else {
3965+
offset = (INTVAL)($4);
39613966

3962-
if (offset < 0) {
3963-
offset += ($2)->strlen;
39643967
if (offset < 0) {
3965-
offset = 0;
3968+
offset += ($2)->strlen;
3969+
if (offset < 0) {
3970+
offset = 0;
3971+
}
39663972
}
3967-
}
3968-
3969-
if (($2)->strlen - offset < ($3)->strlen || offset > ($2)->strlen) {
3970-
$1 = 0;
3971-
} else {
3972-
done = 0;
3973-
$1 = 1;
3974-
3975-
STRING_ITER_INIT(interp, &hay_iter);
3976-
STRING_iter_skip(interp, $2, &hay_iter, offset);
3977-
STRING_ITER_INIT(interp, &needle_iter);
39783973

3979-
for (cmp_index = 0; cmp_index < $3->strlen && !done; cmp_index++) {
3980-
if (STRING_iter_get_and_advance(interp, $2, &hay_iter)
3981-
!= STRING_iter_get_and_advance(interp, $3, &needle_iter)) {
3982-
$1 = 0;
3983-
done = 1;
3974+
if (($2)->encoding == ($3)->encoding) {
3975+
STRING_ITER_INIT(interp, &hay_iter);
3976+
STRING_iter_skip(interp, $2, &hay_iter, offset);
3977+
$1 = memcmp($2->strstart + hay_iter.bytepos, $3->strstart, STRING_byte_length($3)) == 0;
3978+
} else if (($2)->strlen - offset < ($3)->strlen || offset > ($2)->strlen) {
3979+
$1 = 0;
3980+
} else {
3981+
done = 0;
3982+
$1 = 1;
3983+
3984+
STRING_ITER_INIT(interp, &hay_iter);
3985+
STRING_iter_skip(interp, $2, &hay_iter, offset);
3986+
STRING_ITER_INIT(interp, &needle_iter);
3987+
3988+
for (cmp_index = 0; cmp_index < $3->strlen && !done; cmp_index++) {
3989+
if (STRING_iter_get_and_advance(interp, $2, &hay_iter)
3990+
!= STRING_iter_get_and_advance(interp, $3, &needle_iter)) {
3991+
$1 = 0;
3992+
done = 1;
3993+
}
39843994
}
39853995
}
39863996
}

0 commit comments

Comments
 (0)