summaryrefslogtreecommitdiff
path: root/regexec.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2013-05-31 21:39:01 +0100
committerDavid Mitchell <davem@iabyn.com>2013-06-02 22:28:54 +0100
commitf65e70f560c80556143956eb9980619a9dfbe2f4 (patch)
treed9c327235913d5c127fe44da874c403a668b4022 /regexec.c
parent1cb95af747617861d08c1213f05d8f1e4b55f942 (diff)
downloadperl-f65e70f560c80556143956eb9980619a9dfbe2f4.tar.gz
make PL_reg_curpm global
Currently PL_reg_curpm is actually #deffed to a field within PL_reg_state; promote it into a fully autonomous perl-interpreter variable. PL_reg_curpm points to a fake PMOP that's used to temporarily point PL_curpm to, that we can hang the current regex off, so that this works: "a" =~ /^(.)(?{ print $1 })/ # prints 'a' It turns out that it doesn't need to be saved and restored when we recursively enter the regex engine; that is already handled by saving and restoring which regex is currently attached to PL_reg_curpm. So we just need a single global (per interpreter) placeholder. Since we're shortly going to get rid of PL_reg_state, we need to move it out of that struct.
Diffstat (limited to 'regexec.c')
-rw-r--r--regexec.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/regexec.c b/regexec.c
index a144138dd3..13dce3fb8e 100644
--- a/regexec.c
+++ b/regexec.c
@@ -7576,6 +7576,10 @@ S_setup_eval_state(pTHX_ regmatch_info *const reginfo)
eval_state->pos_magic = NULL;
if (!PL_reg_curpm) {
+ /* PL_reg_curpm is a fake PMOP that we can attach the current
+ * regex to and point PL_curpm at, so that $1 et al are visible
+ * within a /(?{})/. It's just allocated once per interpreter the
+ * first time its needed */
Newxz(PL_reg_curpm, 1, PMOP);
#ifdef USE_ITHREADS
{