summaryrefslogtreecommitdiff
path: root/perl.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2013-05-19 09:38:23 +0100
committerDavid Mitchell <davem@iabyn.com>2013-06-02 22:28:51 +0100
commit8adc0f72b0398cece49d44d4acc0962d03543ea9 (patch)
tree44698d175bd412fed0431a239e971e146cac91c2 /perl.c
parenta46737de7eb272b1765c352593c3e3627bccdad5 (diff)
downloadperl-8adc0f72b0398cece49d44d4acc0962d03543ea9.tar.gz
add regmatch_eval_state struct
Replace several PL_reg* vars with a new struct. This is part of the goal of removing all global regex state. These particular vars are used in the case of a regex with (?{}) code blocks. In this case, when the code in a block is called, various bits of state (such as $1, pos($_)) are temporarily set up, even though the match has not yet completed. This involves updating the current PL_curpm to point to a fake PMOP which points to the regex currently being executed. That regex has all its current fields that are associated with captures (such as subbeg) temporarily saved and overwritten with the current partial match results. Similarly, $_ is temporarily aliased to the current match string, and any old pos() position is saved. This saving was formerly done to the various PL_reg* vars. When the regex has finished executing (or if the code block croaks), its fields are restored to the original values. Since this can happen in a croak, it may be done using SAVEDESTRUCTOR_X() on the save stack. This precludes just moving the PL_reg* vars into the regmatch_info struct, since that is just allocated as a local var in regexec_flags(), and would have already been abandoned and possibly overwritten after the croak and longjmp, but before the SAVEDESTRUCTOR_X() action is taken. So instead we put all the vars into new struct, and malloc that on entry to the regex engine when we know we need to copy the various fields. We save a pointer to that in the regmatch_info struct, as well as passing it to SAVEDESTRUCTOR_X(). The destructor may get called up to twice in the non-croak case: first it's called explicitly at the end of regexec_flags(), which restores subbeg etc; then again from the savestack, which just free()s the struct. In the croak case, it's called just once, and does both the restoring and the freeing. The vars / PL_reg_state fields this commit eliminates are: re_state_eval_setup_done PL_reg_oldsaved PL_reg_oldsavedlen PL_reg_oldsavedoffset PL_reg_oldsavedcoffset PL_reg_magic PL_reg_oldpos PL_nrs PL_reg_oldcurpm
Diffstat (limited to 'perl.c')
-rw-r--r--perl.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/perl.c b/perl.c
index 6611a7aed8..06953c6dbf 100644
--- a/perl.c
+++ b/perl.c
@@ -3625,7 +3625,7 @@ S_init_interp(pTHX)
/* As these are inside a structure, PERLVARI isn't capable of initialising
them */
- PL_reg_oldcurpm = PL_reg_curpm = NULL;
+ PL_reg_curpm = NULL;
PL_reg_poscache = PL_reg_starttry = NULL;
}