summaryrefslogtreecommitdiff
path: root/regexec.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2008-01-10 21:16:01 +0000
committerNicholas Clark <nick@ccl4.org>2008-01-10 21:16:01 +0000
commit92313705724966605b57f67693b747d56f75db80 (patch)
tree28d3c5c43de37dda781ab9cf53fb88c46fe4d18b /regexec.c
parentbfd95973f1e91e9be1076173ba89a5c91f404e09 (diff)
downloadperl-92313705724966605b57f67693b747d56f75db80.tar.gz
The correct solution is to reference count the regexp in PL_reg_curpm,
rather than put in lots of hacks to work round not reference counting it. p4raw-id: //depot/perl@32938
Diffstat (limited to 'regexec.c')
-rw-r--r--regexec.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/regexec.c b/regexec.c
index 9a41f202ca..5ce1ee3de1 100644
--- a/regexec.c
+++ b/regexec.c
@@ -2256,15 +2256,18 @@ S_regtry(pTHX_ regmatch_info *reginfo, char **startpos)
#ifdef USE_ITHREADS
{
SV* const repointer = newSViv(0);
- /* so we know which PL_regex_padav element is PL_reg_curpm
- when clearing up in perl_destruct() */
- SvFLAGS(repointer) |= SVf_BREAK;
+ /* this regexp is also owned by the new PL_reg_curpm, which
+ will try to free it. */
av_push(PL_regex_padav, repointer);
PL_reg_curpm->op_pmoffset = av_len(PL_regex_padav);
PL_regex_pad = AvARRAY(PL_regex_padav);
}
#endif
}
+ /* This is safe against NULLs: */
+ ReREFCNT_dec(PM_GETRE(PL_reg_curpm));
+ /* PM_reg_curpm owns a reference to this regexp. */
+ ReREFCNT_inc(rx);
PM_SETRE(PL_reg_curpm, rx);
PL_reg_oldcurpm = PL_curpm;
PL_curpm = PL_reg_curpm;