This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
sv_utf8_decode: Reverse order of tests for speed
authorKarl Williamson <khw@cpan.org>
Sat, 25 Nov 2017 04:56:09 +0000 (21:56 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 25 Nov 2017 05:10:52 +0000 (22:10 -0700)
Not that we have a fast is_utf8_invariant_string_loc(), use it first to
quickly find any variants.  Then use is_utf8_string() from then on.
This is the reverse order as to how it worked before this commit.  This
speeds things up two ways: 1) we use the faster function first, and 2)
use the information it returns to avoid reparsing the string starting at
the beginning.

sv.c

diff --git a/sv.c b/sv.c
index bf0b153..225a743 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -3784,7 +3784,7 @@ Perl_sv_utf8_decode(pTHX_ SV *const sv)
     PERL_ARGS_ASSERT_SV_UTF8_DECODE;
 
     if (SvPOKp(sv)) {
-        const U8 *start, *c;
+        const U8 *start, *c, *first_variant;
 
        /* The octets may have got themselves encoded - get them back as
         * bytes
@@ -3796,9 +3796,9 @@ Perl_sv_utf8_decode(pTHX_ SV *const sv)
          * we want to make sure everything inside is valid utf8 first.
          */
         c = start = (const U8 *) SvPVX_const(sv);
-       if (!is_utf8_string(c, SvCUR(sv)))
-           return FALSE;
-        if (! is_utf8_invariant_string(c, SvCUR(sv))) {
+        if (! is_utf8_invariant_string_loc(c, SvCUR(sv), &first_variant)) {
+            if (!is_utf8_string(first_variant, SvCUR(sv) - (first_variant -c)))
+                return FALSE;
             SvUTF8_on(sv);
         }
        if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {