constant.pm: Make elements of list consts read-only
authorFather Chrysostomos <sprout@cpan.org>
Wed, 13 Nov 2013 04:40:11 +0000 (20:40 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 30 Nov 2013 13:53:16 +0000 (05:53 -0800)
Now that Internals::SvREADONLY turns on the PADTMP flag for all the
elements, the read-only flag on the elements themselves will not
actually make the returned elements read-only, because PADTMPs get
copied in all cases where readonliness matters.  What this does is
prevent the original SV from being modified, allowing for more opti-
misations in perl’s internals (e.g., string buffers being stolen from
PADTMPs not marked read-only).

The order of the statements needs to be rearranged, otherwise we end
up setting the flag on a temporary copy of each element due to ‘for’.

dist/constant/lib/constant.pm

index d5fd548..b3d66ff 100644 (file)
@@ -161,9 +161,8 @@ sub import {
            } elsif (@_) {
                my @list = @_;
                if (_CAN_PCS_FOR_ARRAY) {
+                   Internals::SvREADONLY($list[$_], 1) for 0..$#list;
                    Internals::SvREADONLY(@list, 1);
-                   # Disabled for now; see perl #119045:
-                   #Internals::SvREADONLY($list[$_], 1) for 0..$#list;
                    if ($symtab && !exists $symtab->{$name}) {
                        $symtab->{$name} = \@list;
                        $flush_mro++;