Stop attribute errors from leaking op trees
authorFather Chrysostomos <sprout@cpan.org>
Tue, 11 Oct 2011 05:30:18 +0000 (22:30 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 11 Oct 2011 05:31:38 +0000 (22:31 -0700)
commitfb834abdeb17d8cf13dd7590edf8842a8be6e8d7
treecd35b9e9da6782503560245540e56921ef623488
parent7a776c5a2a628b85aa74437f49111c0a28ff2ff1
Stop attribute errors from leaking op trees

This commit moves attribute handling in newATTRSUB so that it happens
after the op tree is attached to the sub.  So when the sub is freed,
the op tree goes with it, instead af leaking when an attribute han-
dler dies.

Witness what happens without that:

$ PERL_DESTRUCT_LEVEL=2 ./perl -Ilib -le 'BEGIN {$^H{a}="b"}; sub foo:bar{1}'
Invalid CODE attribute: bar at -e line 1
BEGIN failed--compilation aborted at -e line 1.
Unbalanced string table refcount: (1) for "a" at (null) line 1 during global destruction.

It was the ‘Unbalanced string table’ warnings that alerted me to the
problem.  The fairly new t/uni/attrs.t happens to trigger this bug.

Not that this told me anything, but I did a binary search which lead
me to this commit:

commit b3ca2e834c3607fd8aa8736a51aa3a2b8bba1044
Author: Nicholas Clark <nick@ccl4.org>
Date:   Fri Mar 31 13:45:57 2006 +0000

    Serialise changes to %^H onto the current COP. Return the compile time
    state of %^H as an eleventh value from caller. This allows users to
    write pragmas.

That commit started indirectly storing HEKs in cops (in the hints
hash), which means we have an easy way to tell when ops are leaking.
op.c
t/op/attrs.t