diff options
author | Marcus Holland-Moritz <mhx-perl@gmx.net> | 2008-07-18 06:36:09 +0000 |
---|---|---|
committer | Marcus Holland-Moritz <mhx-perl@gmx.net> | 2008-07-18 06:36:09 +0000 |
commit | ec83ea38ebd7a9cbfbb0209243d3f52270074917 (patch) | |
tree | fa070f6949f1a80e883e7c81cbeecda5592952ad /universal.c | |
parent | 4271b52731a6686853855c0f41ce04f915a2e02e (diff) | |
download | perl-ec83ea38ebd7a9cbfbb0209243d3f52270074917.tar.gz |
Welcome to refcount hell. Fix the leaks reported by #57024
along with a bunch other named capture related leaks.
p4raw-id: //depot/perl@34151
Diffstat (limited to 'universal.c')
-rw-r--r-- | universal.c | 23 |
1 files changed, 10 insertions, 13 deletions
diff --git a/universal.c b/universal.c index 84d13fca9b..be58760099 100644 --- a/universal.c +++ b/universal.c @@ -1116,7 +1116,7 @@ XS(XS_re_regnames_count) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); PUTBACK; return; } else { @@ -1150,10 +1150,7 @@ XS(XS_re_regname) ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME)); if (ret) { - if (SvROK(ret)) - XPUSHs(ret); - else - XPUSHs(SvREFCNT_inc(ret)); + mXPUSHs(ret); XSRETURN(1); } XSRETURN_UNDEF; @@ -1206,8 +1203,11 @@ XS(XS_re_regnames) if (!entry) Perl_croak(aTHX_ "NULL array element in re::regnames()"); - XPUSHs(*entry); + mXPUSHs(SvREFCNT_inc_simple_NN(*entry)); } + + SvREFCNT_dec(ret); + PUTBACK; return; } @@ -1326,10 +1326,7 @@ XS(XS_Tie_Hash_NamedCapture_FETCH) SPAGAIN; if (ret) { - if (SvROK(ret)) - XPUSHs(ret); - else - XPUSHs(SvREFCNT_inc(ret)); + mXPUSHs(ret); PUTBACK; return; } @@ -1453,7 +1450,7 @@ XS(XS_Tie_Hash_NamedCapture_FIRSTK) SPAGAIN; if (ret) { - XPUSHs(SvREFCNT_inc(ret)); + mXPUSHs(ret); PUTBACK; } else { XSRETURN_UNDEF; @@ -1485,7 +1482,7 @@ XS(XS_Tie_Hash_NamedCapture_NEXTK) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); } else { XSRETURN_UNDEF; } @@ -1516,7 +1513,7 @@ XS(XS_Tie_Hash_NamedCapture_SCALAR) SPAGAIN; if (ret) { - XPUSHs(ret); + mXPUSHs(ret); PUTBACK; return; } else { |