This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
inline.h: Avoid some extra strlen()
authorKarl Williamson <khw@cpan.org>
Sat, 18 Nov 2017 04:59:59 +0000 (21:59 -0700)
committerKarl Williamson <khw@cpan.org>
Sun, 26 Nov 2017 17:17:29 +0000 (10:17 -0700)
The API of these functions says that if the length is 0, strlen() is
called to compute it.  In several cases, control is handed off to a
function using 0, throwing away the already-computed length.  Change
to use the computed length when calling the functions, avoiding the
issue.

embed.fnc
inline.h
proto.h

index 39060f0..181a0a9 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -788,23 +788,23 @@ AnpdD     |STRLEN |is_utf8_char   |NN const U8 *s
 Abmnpd |STRLEN |is_utf8_char_buf|NN const U8 *buf|NN const U8 *buf_end
 AnipdR |bool   |is_utf8_string |NN const U8 *s|const STRLEN len
 AnidR  |bool   |is_utf8_string_flags                                       \
-               |NN const U8 *s|const STRLEN len|const U32 flags
+               |NN const U8 *s|STRLEN len|const U32 flags
 AnidR  |bool   |is_strict_utf8_string|NN const U8 *s|const STRLEN len
 AnidR  |bool   |is_c9strict_utf8_string|NN const U8 *s|const STRLEN len
 Anpdmb |bool   |is_utf8_string_loc                                         \
                |NN const U8 *s|const STRLEN len|NN const U8 **ep
 Andm   |bool   |is_utf8_string_loc_flags                                   \
-               |NN const U8 *s|const STRLEN len|NN const U8 **ep           \
+               |NN const U8 *s|STRLEN len|NN const U8 **ep                 \
                |const U32 flags
 Andm   |bool   |is_strict_utf8_string_loc                                  \
                |NN const U8 *s|const STRLEN len|NN const U8 **ep
 Andm   |bool   |is_c9strict_utf8_string_loc                                \
                |NN const U8 *s|const STRLEN len|NN const U8 **ep
 Anipd  |bool   |is_utf8_string_loclen                                      \
-               |NN const U8 *s|const STRLEN len|NULLOK const U8 **ep       \
+               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
                |NULLOK STRLEN *el
 Anid   |bool   |is_utf8_string_loclen_flags                                \
-               |NN const U8 *s|const STRLEN len|NULLOK const U8 **ep       \
+               |NN const U8 *s|STRLEN len|NULLOK const U8 **ep             \
                |NULLOK STRLEN *el|const U32 flags
 Anid   |bool   |is_strict_utf8_string_loclen                               \
                |NN const U8 *s|const STRLEN len|NULLOK const U8 **ep       \
index ddafde9..0ce02e6 100644 (file)
--- a/inline.h
+++ b/inline.h
@@ -663,15 +663,19 @@ C<L</is_c9strict_utf8_string_loclen>>.
 */
 
 PERL_STATIC_INLINE bool
-S_is_utf8_string_flags(const U8 *s, const STRLEN len, const U32 flags)
+S_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags)
 {
-    const U8* const send = s + (len ? len : strlen((const char *)s));
+    const U8* send;
     const U8* x = s;
 
     PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS;
     assert(0 == (flags & ~(UTF8_DISALLOW_ILLEGAL_INTERCHANGE
                           |UTF8_DISALLOW_PERL_EXTENDED)));
 
+    if (len == 0) {
+        len = strlen((const char *)s);
+    }
+
     if (flags == 0) {
         return is_utf8_string(s, len);
     }
@@ -688,6 +692,7 @@ S_is_utf8_string_flags(const U8 *s, const STRLEN len, const U32 flags)
         return is_c9strict_utf8_string(s, len);
     }
 
+    send = s + len;
     while (x < send) {
         STRLEN cur_len = isUTF8_CHAR_flags(x, send, flags);
         if (UNLIKELY(! cur_len)) {
@@ -908,9 +913,9 @@ See also C<L</is_utf8_string_loc_flags>>.
 */
 
 PERL_STATIC_INLINE bool
-S_is_utf8_string_loclen_flags(const U8 *s, const STRLEN len, const U8 **ep, STRLEN *el, const U32 flags)
+S_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags)
 {
-    const U8* const send = s + (len ? len : strlen((const char *)s));
+    const U8* send;
     const U8* x = s;
     STRLEN outlen = 0;
 
@@ -918,6 +923,10 @@ S_is_utf8_string_loclen_flags(const U8 *s, const STRLEN len, const U8 **ep, STRL
     assert(0 == (flags & ~(UTF8_DISALLOW_ILLEGAL_INTERCHANGE
                           |UTF8_DISALLOW_PERL_EXTENDED)));
 
+    if (len == 0) {
+        len = strlen((const char *)s);
+    }
+
     if (flags == 0) {
         return is_utf8_string_loclen(s, len, ep, el);
     }
@@ -934,6 +943,7 @@ S_is_utf8_string_loclen_flags(const U8 *s, const STRLEN len, const U8 **ep, STRL
         return is_c9strict_utf8_string_loclen(s, len, ep, el);
     }
 
+    send = s + len;
     while (x < send) {
         const STRLEN cur_len = isUTF8_CHAR_flags(x, send, flags);
         if (UNLIKELY(! cur_len)) {
diff --git a/proto.h b/proto.h
index 598e7c1..02d0183 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -1692,7 +1692,7 @@ PERL_STATIC_INLINE bool   Perl_is_utf8_string(const U8 *s, const STRLEN len)
 #endif
 
 #ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_is_utf8_string_flags(const U8 *s, const STRLEN len, const U32 flags)
+PERL_STATIC_INLINE bool        S_is_utf8_string_flags(const U8 *s, STRLEN len, const U32 flags)
                        __attribute__warn_unused_result__;
 #define PERL_ARGS_ASSERT_IS_UTF8_STRING_FLAGS  \
        assert(s)
@@ -1703,14 +1703,14 @@ PERL_CALLCONV bool      Perl_is_utf8_string_loc(const U8 *s, const STRLEN len, const
 #define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC    \
        assert(s); assert(ep)
 #endif
-/* PERL_CALLCONV bool  is_utf8_string_loc_flags(const U8 *s, const STRLEN len, const U8 **ep, const U32 flags); */
+/* PERL_CALLCONV bool  is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */
 #ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        Perl_is_utf8_string_loclen(const U8 *s, const STRLEN len, const U8 **ep, STRLEN *el);
+PERL_STATIC_INLINE bool        Perl_is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el);
 #define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN \
        assert(s)
 #endif
 #ifndef PERL_NO_INLINE_FUNCTIONS
-PERL_STATIC_INLINE bool        S_is_utf8_string_loclen_flags(const U8 *s, const STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
+PERL_STATIC_INLINE bool        S_is_utf8_string_loclen_flags(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el, const U32 flags);
 #define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOCLEN_FLAGS   \
        assert(s)
 #endif