This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
list cxt hash assign with dups gives garbage
authorDavid Mitchell <davem@iabyn.com>
Sat, 11 Sep 2010 22:30:44 +0000 (23:30 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sat, 11 Sep 2010 22:42:02 +0000 (23:42 +0100)
commit4596056478d3ae4ae183d2821eb95156aff83924
tree579af715364085f5c077feea7895be4061f8d110
parent37f6eaa490d61972fa887e4e7bbeaf0de90b3ee9
list cxt hash assign with dups gives garbage

Fix for #31865: weird results from reverse( %x = reverse %h )

Basically, anything of the form
    @a = %h = (list with some duplicate keys)
may have left @a containing weird and/or freed values.

There was a partial fix for this with ca65944e, but it was broken
(it did one big block move on the stack at the end to remove duplicates,
but duplicates weren't necessarily all in one block.)

The new fix is a two-stage process. First, while pulling key/value pairs
of the stack and assigning them to the hash, each key/val pair is written
back to the stack - possibly at a lower position if there are duplicates to
be skipped.

Finally at the end if any duplicates have been detected, then in list
context, a single pass is made through the stack, and for each key/val
pair, the key is looked up and the val on the stack is overwritten with
the new value (replacing possibly freed or other garbage values).
pp_hot.c
t/op/hashassign.t