[Merge] utf8 caches and overload; other bug fixes
authorFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:52:10 +0000 (12:52 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 1 Oct 2012 19:52:22 +0000 (12:52 -0700)
commit2b674b0158897b8848636b55a807d0245a4cee2e
tree8afb9260c5826e09e95d72dce440d04a48d67f71
parent033de87f380b64bf9f558f5d5c412d31230040c0
parent667f6f1513bb7f13b7b6bb7c1acaeed6f8f9c6dd
[Merge] utf8 caches and overload; other bug fixes

I began by trying to fix the remaining issues in ticket #114410,
namely, overloading interacting badly with utf8 caching.  I discovered
other bugs along the way (some of which touch on #114690 and #80190),
fixing them in the process.

The core no longer uses length magic on scalars.  mg_length is depre-
cated (see its docs for why).  The PERL_MAGIC_scalar vtable no longer
contains a length function, and Perl_magic_len is gone.  mg_length has
been corrected always to return a byte count, as it did originally,
instead of characters for scalars without length magic and bytes
otherwise.

sv_pos_u2b and sv_len_utf8 now only store utf8 caches on non-magical
PVs.  They used to cause bugs not only on tied and overloaded values,
but also typeglobs and non-overloaded references.

sv_or_pv_len_utf8 and sv_or_pv_pos_u2b are two new macros for calling
the non-_or_pv versions on muggle scalars and using the pv directly
for SvGMAGICAL scalars.

sv_len_utf8 now returns a character count, as documented, instead of
assuming that what is passed to it is utf8 (an unreliable assumption,
as the UTF8 flag is meaningful only *after* stringification, and
sv_len_utf8 stringifies).

length, pos, substr and sprintf now avoid triggering overloading or
ties too many times or reading the UTF8 flag at the wrong time, by
following one of these sequences:
If the scalar is going to be stringified:
• Call get-magic.
• Stringify the scalar in place.
• Check the UTF8 flag.
• Use the non-magical variants of the above functions:
  sv_pos_u2b_flags without SV_GMAGIC, and sv_len_utf8_nomg.
If the scalar is not going to be modified:
• Call get-magic.
• Stringify the scalar without coercing it, and save the string.
• Check the UTF8 flag.
• Use sv_or_pv_ macros.

sysread, syswrite and pack no longer need to be as complicated any
more, now that sv_pos_u2b and sv_len_utf8 (and their _or_pv variants)
are more friendly, so they have been simplified.

utf8::encode now calls FETCH and STORE on tied variables.  It stopped
calling fetch with the magic flags patch.  It had never called STORE.
utf8::decode now calls STORE, too.  It likewise had never called it.
This means it no longer preserves pos.