This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perlhacktips: PERL_DEBUG_READONLY_OPS update
authorFather Chrysostomos <sprout@cpan.org>
Thu, 12 Jul 2012 19:52:07 +0000 (12:52 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 12 Jul 2012 20:20:11 +0000 (13:20 -0700)
I don’t know when this changed, but I *can* build F<perl> with
PERL_DEBUG_READONLY_OPS, and I could before I rewrote it to use the
new slab allocator.  So that particular note in perlhacktips may have
been wrong for quite some time.  I assume it had to do with redefini-
tion sub warnings that try to set the line number of the current cop
(which is still a problem).

pod/perlhacktips.pod

index dba0d40..3032bb2 100644 (file)
@@ -1460,11 +1460,9 @@ L<perlclib>.
 
 Under ithreads the optree is read only. If you want to enforce this, to
 check for write accesses from buggy code, compile with
-C<-DPL_OP_SLAB_ALLOC> to enable the old OP slab allocator and
 C<-DPERL_DEBUG_READONLY_OPS> to enable code that allocates op memory
-via C<mmap>, and sets it read-only at run time. (PERL_DEBUG_READONLY_OPS
-has not been rewritten for the new slab allocator, so op trees may leak.)
-Any write access to an op results in a C<SIGBUS> and abort.
+via C<mmap>, and sets it read-only when it is attached to a subroutine. Any
+write access to an op results in a C<SIGBUS> and abort.
 
 This code is intended for development only, and may not be portable
 even to all Unix variants. Also, it is an 80% solution, in that it
@@ -1474,13 +1472,14 @@ isn't able to make all ops read only. Specifically it
 
 =item * 1
 
-Only sets read-only on all slabs of ops at C<CHECK> time, hence ops
-allocated later via C<require> or C<eval> will be re-write
+Does not apply to op slabs belonging to C<BEGIN> blocks.
 
 =item * 2
 
 Turns an entire slab of ops read-write if the refcount of any op in the
-slab needs to be decreased.
+slab needs to be increased or decreased.  This means that anonymous
+closures will never have read-only ops, and thread creation will make all
+existing ops read-write.
 
 =item * 3
 
@@ -1493,9 +1492,8 @@ It's not possible to turn the slabs to read-only after an action
 requiring read-write access, as either can happen during op tree
 building time, so there may still be legitimate write access.
 
-However, as an 80% solution it is still effective, as currently it
-catches a write access during the generation of F<Config.pm>, which
-means that we can't yet build F<perl> with this enabled.
+However, as an 80% solution it is still effective, as currently it catches
+the setting of breakpoints in the debugger and some XSUB definitions.
 
 =head2 The .i Targets