Stop using precomputed SQLite testdb name, fix test-end bug in replicated.t
authorPeter Rabbitson <ribasushi@cpan.org>
Mon, 20 Jan 2014 19:05:00 +0000 (20:05 +0100)
committerPeter Rabbitson <ribasushi@cpan.org>
Tue, 21 Jan 2014 08:56:23 +0000 (09:56 +0100)
commit9e75be929dd698172ee442c6a4a523a29b63b8c5
tree9b03472f48de85c5540dc04a61634402f396b107
parentb35500f1b1b573c013a9368c0cab5602138680ed
Stop using precomputed SQLite testdb name, fix test-end bug in replicated.t

This was an... odd one. Originally the problem manifested as a classic
var-sub-sub closure problem, leading to $db_file being captured and tripping
a more involved testcase that is coming in a subsequent commit. However while
getting rid of the reference itself was easy, this led to the outer coderef
itself being "leaked out".

The reproducing oneliner is:

~$ perl -MScalar::Util=weaken -Mstrict -Mwarnings -e '
 sub foo {
   my $rv = sub { "wtf" }; return $rv;
 }

 my $should_be_gone;

 {
   $should_be_gone = foo();
   weaken ($should_be_gone);
 }

 warn $should_be_gone;  # why is this still defined@!%#$!$#
'

Various tools indicated that it is somehow attached to the PAD of the static
foo() sub, but I could not figure out *why* exactly this is happening, nor
how to properly list it: PadWalker's closed_over() shows nothing for foo()

Thus invoking doge on the whole shebang, and moving on. SUCH WTF, WOW!

Incientally changing things to use the current SQLite filename revealed
a bug in t/storage/replicated.t, which was never noticed as it only
resulted in annoying warnings under Win32 global destroy (test
teardown).
t/lib/DBICTest.pm
t/storage/replicated.t