diff options
-rw-r--r-- | regexec.c | 7 | ||||
-rw-r--r-- | t/re/reg_eval_scope.t | 7 |
2 files changed, 13 insertions, 1 deletions
@@ -4214,6 +4214,12 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog) PL_op = (OP_4tree*)rexi->data->data[n]; DEBUG_STATE_r( PerlIO_printf(Perl_debug_log, " re_eval 0x%"UVxf"\n", PTR2UV(PL_op)) ); + /* wrap the call in two SAVECOMPPADs. This ensures that + * when the save stack is eventually unwound, all the + * accumulated SAVEt_CLEARSV's will be processed with + * interspersed SAVEt_COMPPAD's to ensure that lexicals + * are cleared in the right pad */ + SAVECOMPPAD(); PAD_SAVE_LOCAL(old_comppad, (PAD*)rexi->data->data[n + 2]); PL_regoffs[0].end = PL_reg_magic->mg_len = locinput - PL_bostr; @@ -4234,6 +4240,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog) Copy(&saved_state, &PL_reg_state, 1, struct re_save_state); PL_op = oop; + SAVECOMPPAD(); PAD_RESTORE_LOCAL(old_comppad); PL_curcop = ocurcop; PL_regeol = saved_regeol; diff --git a/t/re/reg_eval_scope.t b/t/re/reg_eval_scope.t index 860b4c80f7..a23321f2d2 100644 --- a/t/re/reg_eval_scope.t +++ b/t/re/reg_eval_scope.t @@ -16,7 +16,6 @@ plan 17; sub on { $::TODO = "(?{}) implementation is screwy" } sub off { undef $::TODO } -on; fresh_perl_is <<'CODE', '781745', {}, '(?{}) has its own lexical scope'; my $x = 7; my $a = 4; my $b = 5; @@ -24,6 +23,8 @@ fresh_perl_is <<'CODE', '781745', {}, '(?{}) has its own lexical scope'; print $x,$a,$b; CODE +on; + fresh_perl_is <<'CODE', for my $x("a".."c") { $y = 1; @@ -43,6 +44,8 @@ CODE {}, 'multiple (?{})s in loop with lexicals'; +off; + fresh_perl_is <<'CODE', '781745', {}, 'run-time re-eval has its own scope'; use re qw(eval); my $x = 7; my $a = 4; my $b = 5; @@ -85,6 +88,8 @@ fresh_perl_is <<'CODE', '178279371047857967101745', {}, CODE 'multiple (?{})s in "foo" =~ /$string/x'; +on; + fresh_perl_is <<'CODE', '123123', {}, for my $x(1..3) { push @regexps = qr/(?{ print $x })a/; |