doop.c: Change to use is_utf8_invariant_string()
authorKarl Williamson <khw@cpan.org>
Wed, 22 Nov 2017 22:39:13 +0000 (15:39 -0700)
committerKarl Williamson <khw@cpan.org>
Thu, 23 Nov 2017 21:18:51 +0000 (14:18 -0700)
This commit changes 3 occurrences of byte-at-a-time looking to see if a
string is invariant under UTF-8, to using the inlined
is_utf8_invariant_string() which now does much faster word-at-a-time
looking.

doop.c

diff --git a/doop.c b/doop.c
index 5234e26..2294281 100644 (file)
--- a/doop.c
+++ b/doop.c
@@ -323,15 +323,9 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
 
     s = (U8*)SvPV_nomg(sv, len);
     if (!SvUTF8(sv)) {
-       const U8 *t = s;
-       const U8 * const e = s + len;
-       while (t < e) {
-           const U8 ch = *t++;
-           hibit = !NATIVE_BYTE_IS_INVARIANT(ch);
-           if (hibit) {
-               s = bytes_to_utf8(s, &len);
-               break;
-           }
+        hibit = ! is_utf8_invariant_string(s, len);
+        if (hibit) {
+            s = bytes_to_utf8(s, &len);
        }
     }
     send = s + len;
@@ -423,15 +417,9 @@ S_do_trans_count_utf8(pTHX_ SV * const sv)
 
     s = (const U8*)SvPV_nomg_const(sv, len);
     if (!SvUTF8(sv)) {
-       const U8 *t = s;
-       const U8 * const e = s + len;
-       while (t < e) {
-           const U8 ch = *t++;
-           hibit = !NATIVE_BYTE_IS_INVARIANT(ch);
-           if (hibit) {
-               start = s = bytes_to_utf8(s, &len);
-               break;
-           }
+        hibit = ! is_utf8_invariant_string(s, len);
+        if (hibit) {
+            start = s = bytes_to_utf8(s, &len);
        }
     }
     send = s + len;
@@ -477,15 +465,9 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv)
     PERL_ARGS_ASSERT_DO_TRANS_COMPLEX_UTF8;
 
     if (!SvUTF8(sv)) {
-       const U8 *t = s;
-       const U8 * const e = s + len;
-       while (t < e) {
-           const U8 ch = *t++;
-           hibit = !NATIVE_BYTE_IS_INVARIANT(ch);
-           if (hibit) {
-               s = bytes_to_utf8(s, &len);
-               break;
-           }
+        hibit = ! is_utf8_invariant_string(s, len);
+        if (hibit) {
+            s = bytes_to_utf8(s, &len);
        }
     }
     send = s + len;