[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)
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.


Trivial merge