summaryrefslogtreecommitdiff
path: root/universal.c
diff options
context:
space:
mode:
authorMarcus Holland-Moritz <mhx-perl@gmx.net>2008-07-18 06:36:09 +0000
committerMarcus Holland-Moritz <mhx-perl@gmx.net>2008-07-18 06:36:09 +0000
commitec83ea38ebd7a9cbfbb0209243d3f52270074917 (patch)
treefa070f6949f1a80e883e7c81cbeecda5592952ad /universal.c
parent4271b52731a6686853855c0f41ce04f915a2e02e (diff)
downloadperl-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.c23
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 {