From eb2ce64095383b3ecf9edc492f908bfce3a88beb Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 13 Feb 2024 09:42:41 +0000 Subject: eml: avoid anonymous __WARN__ sub for encode/decode Repeatedly allocating an anonymous sub is an expensive operation and a potential source of leaks in older Perl. Instead, `local'-ize a global and use a permanent sub to workaround the old Encode 2.87..3.12 leak. --- lib/PublicInbox/Eml.pm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/PublicInbox/Eml.pm b/lib/PublicInbox/Eml.pm index 24060ec8..56aec1e5 100644 --- a/lib/PublicInbox/Eml.pm +++ b/lib/PublicInbox/Eml.pm @@ -334,6 +334,11 @@ sub body_set { undef; } +# workaround https://rt.cpan.org/Public/Bug/Display.html?id=139622 +# Encode 2.87..3.12 leaks on croak, so we defer and croak ourselves +our @enc_warn; +my $enc_warn = sub { push @enc_warn, @_ }; + sub body_str_set { my ($self, $str) = @_; my $cs = ct($self)->{attributes}->{charset} // @@ -341,10 +346,10 @@ sub body_str_set { my $enc = find_encoding($cs) // croak "unknown encoding `$cs'"; my $tmp; { - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; + local @enc_warn; + local $SIG{__WARN__} = $enc_warn; $tmp = $enc->encode($str, Encode::FB_WARN); - croak(@w) if @w; + croak(@enc_warn) if @enc_warn; }; body_set($self, \$tmp); } @@ -471,11 +476,10 @@ sub body_str { }; my $enc = find_encoding($cs) or croak "unknown encoding `$cs'"; my $tmp = body($self); - # workaround https://rt.cpan.org/Public/Bug/Display.html?id=139622 - my @w; - local $SIG{__WARN__} = sub { push @w, @_ }; + local @enc_warn; + local $SIG{__WARN__} = $enc_warn; my $ret = $enc->decode($tmp, Encode::FB_WARN); - croak(@w) if @w; + croak(@enc_warn) if @enc_warn; $ret; } -- cgit v1.2.3-24-ge0c7