Skip to content

Commit

Permalink
stop T_IN/OUT/INOUT/STDIO typemaps leaking
Browse files Browse the repository at this point in the history
These typemaps (which are ancient; mostly going back to 1994 or so)
each leaked a GV and an RV.
  • Loading branch information
iabyn committed Dec 12, 2014
1 parent 35ffb08 commit 50e5165
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions lib/ExtUtils/typemap
Expand Up @@ -388,32 +388,48 @@ T_STDIO
{
GV *gv = newGVgen("$Package");
PerlIO *fp = PerlIO_importFILE($var,0);
if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) ) {
SV *rv = newRV_noinc((SV*)gv);
rv = sv_bless(rv, gv_stashpv("$Package",1));
sv_setsv($arg, rv);
SvREFCNT_dec_NN(rv);
}
else
$arg = &PL_sv_undef;
}
T_IN
{
GV *gv = newGVgen("$Package");
if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) ) {
SV *rv = newRV_noinc((SV*)gv);
rv = sv_bless(rv, gv_stashpv("$Package",1));
sv_setsv($arg, rv);
SvREFCNT_dec_NN(rv);
}
else
$arg = &PL_sv_undef;
}
T_INOUT
{
GV *gv = newGVgen("$Package");
if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) ) {
SV *rv = newRV_noinc((SV*)gv);
rv = sv_bless(rv, gv_stashpv("$Package",1));
sv_setsv($arg, rv);
SvREFCNT_dec_NN(rv);
}
else
$arg = &PL_sv_undef;
}
T_OUT
{
GV *gv = newGVgen("$Package");
if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) ) {
SV *rv = newRV_noinc((SV*)gv);
rv = sv_bless(rv, gv_stashpv("$Package",1));
sv_setsv($arg, rv);
SvREFCNT_dec_NN(rv);
}
else
$arg = &PL_sv_undef;
}

0 comments on commit 50e5165

Please sign in to comment.