This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
detect each() after insert and produce warnings when we do
authorYves Orton <demerphq@gmail.com>
Sun, 17 Mar 2013 23:28:03 +0000 (00:28 +0100)
committerYves Orton <demerphq@gmail.com>
Mon, 18 Mar 2013 23:23:12 +0000 (00:23 +0100)
commita7b39f85d7caac0822fdcd78400e131a95f11148
tree98e120c5fda1104125ad53cdd500e2e8f6c2f05c
parentd5fc06cbb416442b7c14833a0e107aa24005a47b
detect each() after insert and produce warnings when we do

Inserting into a hash that is being traversed with each()
has always produced undefined behavior. With hash traversal
randomization this is more pronounced, and at the same
time relatively easy to spot. At the cost of an extra U32
in the xpvhv_aux structure we can detect that the xhv_rand
has changed and then produce a warning if it has.

It was suggested on IRC that this should produce a fatal
error, but I couldn't see a clean way to manage that with
"strict", it was much easier to create a "severe" (internal)
warning, which is enabled by default but suppressible with
C<no warnings "internal";> if people /really/ wanted.
hv.c
hv.h
pod/perldiag.pod
t/op/each.t