utf8.c: Avoid some unnecessary conversions to UTF-8
authorKarl Williamson <khw@cpan.org>
Wed, 11 Jul 2018 13:44:53 +0000 (07:44 -0600)
committerKarl Williamson <khw@cpan.org>
Wed, 11 Jul 2018 14:08:11 +0000 (08:08 -0600)
The UTF-8 is needed only in some circumstances, so can be skipped unless
needed.

embed.fnc
proto.h
utf8.c

index f289069..67a8782 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -1779,7 +1779,7 @@ s |U32    |check_and_deprecate                                        \
                                |NN const char * const file                 \
                                |const unsigned line
 s      |UV     |_to_utf8_case  |const UV uv1                                   \
-                               |NN const U8 *p                                 \
+                               |NULLOK const U8 *p                             \
                                |NN U8* ustrp                                   \
                                |NN STRLEN *lenp                                \
                                |NN SV *invlist                                 \
diff --git a/proto.h b/proto.h
index d091961..4158dd2 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -5951,7 +5951,7 @@ STATIC bool       S_isa_lookup(pTHX_ HV *stash, const char * const name, STRLEN len, U
 #if defined(PERL_IN_UTF8_C)
 STATIC UV      S__to_utf8_case(pTHX_ const UV uv1, const U8 *p, U8* ustrp, STRLEN *lenp, SV *invlist, const int * const invmap, const unsigned int * const * const aux_tables, const U8 * const aux_table_lengths, const char * const normal);
 #define PERL_ARGS_ASSERT__TO_UTF8_CASE \
-       assert(p); assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal)
+       assert(ustrp); assert(lenp); assert(invlist); assert(invmap); assert(normal)
 STATIC U32     S_check_and_deprecate(pTHX_ const U8 * p, const U8 ** e, const unsigned type, const bool use_locale, const char * const file, const unsigned line);
 #define PERL_ARGS_ASSERT_CHECK_AND_DEPRECATE   \
        assert(p); assert(e); assert(file)
diff --git a/utf8.c b/utf8.c
index bdbe23f..afe23ca 100644 (file)
--- a/utf8.c
+++ b/utf8.c
@@ -2926,8 +2926,7 @@ Perl_to_uni_upper(pTHX_ UV c, U8* p, STRLEN *lenp)
        return _to_upper_title_latin1((U8) c, p, lenp, 'S');
     }
 
-    uvchr_to_utf8(p, c);
-    return CALL_UPPER_CASE(c, p, p, lenp);
+    return CALL_UPPER_CASE(c, NULL, p, lenp);
 }
 
 UV
@@ -2939,8 +2938,7 @@ Perl_to_uni_title(pTHX_ UV c, U8* p, STRLEN *lenp)
        return _to_upper_title_latin1((U8) c, p, lenp, 's');
     }
 
-    uvchr_to_utf8(p, c);
-    return CALL_TITLE_CASE(c, p, p, lenp);
+    return CALL_TITLE_CASE(c, NULL, p, lenp);
 }
 
 STATIC U8
@@ -2979,8 +2977,7 @@ Perl_to_uni_lower(pTHX_ UV c, U8* p, STRLEN *lenp)
        return to_lower_latin1((U8) c, p, lenp, 0 /* 0 is a dummy arg */ );
     }
 
-    uvchr_to_utf8(p, c);
-    return CALL_LOWER_CASE(c, p, p, lenp);
+    return CALL_LOWER_CASE(c, NULL, p, lenp);
 }
 
 UV
@@ -3076,8 +3073,7 @@ Perl__to_uni_fold_flags(pTHX_ UV c, U8* p, STRLEN *lenp, U8 flags)
 
     /* Here, above 255.  If no special needs, just use the macro */
     if ( ! (flags & (FOLD_FLAGS_LOCALE|FOLD_FLAGS_NOMIX_ASCII))) {
-       uvchr_to_utf8(p, c);
-       return CALL_FOLD_CASE(c, p, p, lenp, flags & FOLD_FLAGS_FULL);
+       return CALL_FOLD_CASE(c, NULL, p, lenp, flags & FOLD_FLAGS_FULL);
     }
     else {  /* Otherwise, _toFOLD_utf8_flags has the intelligence to deal with
               the special flags. */
@@ -3532,12 +3528,16 @@ S__to_utf8_case(pTHX_ const UV uv1, const U8 *p,
     /* Here, there was no mapping defined, which means that the code point maps
      * to itself.  Return the inputs */
   cases_to_self:
-    len = UTF8SKIP(p);
-    if (p != ustrp) {   /* Don't copy onto itself */
-        Copy(p, ustrp, len, U8);
+    if (p) {
+        len = UTF8SKIP(p);
+        if (p != ustrp) {   /* Don't copy onto itself */
+            Copy(p, ustrp, len, U8);
+        }
+        *lenp = len;
+    }
+    else {
+       *lenp = uvchr_to_utf8(ustrp, uv1) - ustrp;
     }
-
-    *lenp = len;
 
     return uv1;