This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Reënable qr caching for (??{}) retval where possible
authorFather Chrysostomos <sprout@cpan.org>
Mon, 25 Nov 2013 07:11:57 +0000 (23:11 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 25 Nov 2013 07:24:03 +0000 (23:24 -0800)
commit237da80732005e84a2def6552964d928f0fc014f
treeeff19b40becbb71755a55f5ddae7faa4faef2481
parente66ad3503cde2847fa749cda083ec75dea5c7343
Reënable qr caching for (??{}) retval where possible

When a scalar is returned from (??{...}) inside a regexp, it gets com-
piled into a regexp if it is not one already.  Then the regexp is sup-
posed to be cached on that scalar (in magic), so that the same scalar
returned again will not require another compilation.

Commit e4bfbed39b disabled caching except on references to overloaded
objects.  But in that one case the caching caused erroneous behaviour,
which was just fixed by 636209429f and this commit’s parent, effect-
ively disabling the cache altogether.

The cache is disabled because it does not apply to TEMP variables
(those about to be freed anyway, for which caching would be a waste
of CPU), and all non-overloaded non-qr thingies get copied into
new mortal (TEMP) scalars (as of e4bfbed39b) before reaching the
caching code.

This commit skips the copy if the return value is already a non-magi-
cal string or number.  It also allows the caching to happen on con-
stants, which has never been permitted before.  (There is actually no
reason for disallowing qr magic on read-only variables.)
mg_raw.h
regen/mg_vtable.pl
regexec.c
t/re/recompile.t