constructor returning undef
opened this issue · comments
I am getting similar failures to this test report:
http://www.cpantesters.org/cpan/report/ad018ad4-b567-11e2-8c80-50d7c5c10595
Somehow this managed to install fine with cpanm when I upgraded to the latest version, but now it always dies with the error Can't call method "parse" on an undefined value
.
Reverting back to 2.1.4 fixes the problem.
I'm on OS X 10.7.5 with Perl 5.16.3.
I'm guessing this is related to the latest patch provided by @bleargh45
So, this is introduced by the change I mentioned earlier, but it's triggered by Moo 1.002000, which handles weak_ref differently. Running it under Moo 1.001000 is fine. I'll see what I can find out about this.
ilmari: oalders: that use of weak_ref is bogus. it's the $self you close over in the HTML::Parser callbacks that needs to be weakened
[11:11am] oalders: ilmari: i will fix that
[11:11am] oalders: thanks for your help
[11:12am] ilmari: just add weaken($self) before return HTML::Parser->new(...) in _build_parser
[11:13am] oalders: great. i'll try that today
[11:14am] haarg: oalders: i mentioned on the ticket, but that was an explicit change to bring weak_ref+lazy in line with how Moose behaves.
[11:15am] oalders: haarg: thanks. i wasn't aware of that
[11:15am] haarg: i agree with ilmari that your usage looks wrong anyway. pretty sure parser would get re-calculated every time it was requested anyway.
[11:16am] oalders: well, there is an accompanying test for that change and it did pass
[11:16am] ilmari: haarg: no, it'd stay alive because of the closure
[11:16am] oalders: https://github.com/oalders/html-restrict/blob/master/t/memory-leak.t
[11:16am] ilmari: it's usually the attribute's reference to the owner that should be weakened
[11:16am] oalders: is it not the correct test?
[11:17am] haarg: ilmari: which closure?
[11:17am] ilmari: oalders: that passes with moving the weakening from the attribute to the closure
[11:17am] oalders: ok
[11:17am] ilmari: haarg: the ones passed to HTML::Parser->new in _build_parser
[11:18am] haarg: but that's a reference to $self from the parser. with the weak ref it wouldn't have any other references to the parser itself.
[11:20am] ilmari: haarg: yeah, you're right
[11:22am] haarg: ah, now i remember why it would have worked before. weak_ref+lazy was broken differently before. it would always recalculate.
[11:22am] haarg: i had a fix for that (if you stored the return value somewhere) but we decided to just break (imo) weak_ref+lazy in the same way as moose.
[11:24am] haarg: either way the old behavior was wrong and relying on it like HTML::Restrict did was invalid.
Fixed in 2.1.6