Change 34151 by [EMAIL PROTECTED] on 2008/07/18 06:36:09
Welcome to refcount hell. Fix the leaks reported by #57024
along with a bunch other named capture related leaks.
Affected files ...
... //depot/perl/regcomp.c#657 edit
... //depot/perl/universal.c#192 edit
Differences ...
==== //depot/perl/regcomp.c#657 (text) ====
Index: perl/regcomp.c
--- perl/regcomp.c#656~34039~ 2008-06-09 11:43:59.000000000 -0700
+++ perl/regcomp.c 2008-07-17 23:36:09.000000000 -0700
@@ -4985,13 +4985,11 @@
} else {
ret = newSVsv(&PL_sv_undef);
}
- if (retarray) {
- SvREFCNT_inc_simple_void(ret);
+ if (retarray)
av_push(retarray, ret);
- }
}
if (retarray)
- return newRV((SV*)retarray);
+ return newRV_noinc((SV*)retarray);
}
}
return NULL;
@@ -5088,6 +5086,7 @@
ret = CALLREG_NAMED_BUFF_ALL(r, (flags | RXapif_REGNAMES));
av = (AV*)SvRV(ret);
length = av_len(av);
+ SvREFCNT_dec(ret);
return newSViv(length + 1);
} else {
Perl_croak(aTHX_ "panic: Unknown flags %d in named_buff_scalar",
(int)flags);
@@ -5129,7 +5128,7 @@
}
}
- return newRV((SV*)av);
+ return newRV_noinc((SV*)av);
}
void
==== //depot/perl/universal.c#192 (text) ====
Index: perl/universal.c
--- perl/universal.c#191~33910~ 2008-05-22 23:15:37.000000000 -0700
+++ perl/universal.c 2008-07-17 23:36:09.000000000 -0700
@@ -1116,7 +1116,7 @@
SPAGAIN;
if (ret) {
- XPUSHs(ret);
+ mXPUSHs(ret);
PUTBACK;
return;
} else {
@@ -1150,10 +1150,7 @@
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 @@
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 @@
SPAGAIN;
if (ret) {
- if (SvROK(ret))
- XPUSHs(ret);
- else
- XPUSHs(SvREFCNT_inc(ret));
+ mXPUSHs(ret);
PUTBACK;
return;
}
@@ -1453,7 +1450,7 @@
SPAGAIN;
if (ret) {
- XPUSHs(SvREFCNT_inc(ret));
+ mXPUSHs(ret);
PUTBACK;
} else {
XSRETURN_UNDEF;
@@ -1485,7 +1482,7 @@
SPAGAIN;
if (ret) {
- XPUSHs(ret);
+ mXPUSHs(ret);
} else {
XSRETURN_UNDEF;
}
@@ -1516,7 +1513,7 @@
SPAGAIN;
if (ret) {
- XPUSHs(ret);
+ mXPUSHs(ret);
PUTBACK;
return;
} else {
End of Patch.