pp_sys.c: Simplify uses of sv_len_utf8
authorFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 13:28:48 +0000 (06:28 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:51:58 +0000 (12:51 -0700)
sv_len_utf8 is now careful not to record caches on magical or over-
loaded scalars (any non-PV, in fact).  It also returns the number of logical characters correctly, regardless of whether its input is utf8.
So we can take advantage of that to simplify pp_sysread.

For pp_syswrite, we can use sv_or_pv_len_utf8 with the existing
string buffer.

pp_sys.c

index 68510f8..8fb75f5 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -1660,12 +1660,7 @@ PP(pp_sysread)
        buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
     }
     if (DO_UTF8(bufsv)) {
-       /* offset adjust in characters not bytes */
-        /* SV's length cache is only safe for non-magical values */
-        if (SvGMAGICAL(bufsv))
-            blen = utf8_length((const U8 *)buffer, (const U8 *)buffer + blen);
-        else
-            blen = sv_len_utf8(bufsv);
+       blen = sv_len_utf8_nomg(bufsv);
     }
 
     charstart = TRUE;
@@ -1946,15 +1941,9 @@ PP(pp_syswrite)
                blen_chars = orig_blen_bytes;
            } else {
                /* The SV really is UTF-8.  */
-               if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
-                   /* Don't call sv_len_utf8 again because it will call magic
-                      or overloading a second time, and we might get back a
-                      different result.  */
-                   blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
-               } else {
-                   /* It's safe, and it may well be cached.  */
-                   blen_chars = sv_len_utf8(bufsv);
-               }
+               /* Don't call sv_len_utf8 on a magical or overloaded
+                  scalar, as we might get back a different result.  */
+               blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
            }
        } else {
            blen_chars = blen;