3 # Test scoping issues with embedded code in regexps.
13 fresh_perl_is <<'CODE', '781745', {}, '(?{}) has its own lexical scope';
14 my $x = 7; my $a = 4; my $b = 5;
15 print "a" =~ /(?{ print $x; my $x = 8; print $x; my $y })a/;
19 fresh_perl_is <<'CODE',
26 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
27 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
28 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
34 '1a82a93a104a85a96a101a 1b82b93b104b85b96b101b 1c82c93c104c85c96c101c ',
36 'multiple (?{})s in loop with lexicals';
38 fresh_perl_is <<'CODE', '781745', {}, 'run-time re-eval has its own scope';
40 my $x = 7; my $a = 4; my $b = 5;
42 print "a" =~ /(?{ print $x; my $x = 8; print $x; my $y })$rest/;
46 fresh_perl_is <<'CODE', '178279371047857967101745', {},
54 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
55 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
56 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
61 'multiple (?{})s in "foo" =~ $string';
63 fresh_perl_is <<'CODE', '178279371047857967101745', {},
71 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
72 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
73 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
78 'multiple (?{})s in "foo" =~ /$string/x';
80 fresh_perl_is <<'CODE', '123123', {},
82 push @regexps, qr/(?{ print $x })a/;
84 "a" =~ $_ for @regexps;
85 "ba" =~ /b$_/ for @regexps;
87 'qr/(?{})/ is a closure';
89 "a" =~ do { package foo; qr/(?{ $::pack = __PACKAGE__ })a/ };
90 is $pack, 'foo', 'qr// inherits package';
91 "a" =~ do { use re "/x"; qr/(?{ $::re = qr-- })a/ };
92 is $re, '(?^x:)', 'qr// inherits pragmata';
95 "ba" =~ /b${\do { package baz; qr|(?{ $::pack = __PACKAGE__ })a| }}/;
96 is $pack, 'baz', '/text$qr/ inherits package';
97 "ba" =~ m+b${\do { use re "/i"; qr|(?{ $::re = qr-- })a| }}+;
98 is $re, '(?^i:)', '/text$qr/ inherits pragmata';
103 "ba" =~ /${\'(?{ $::pack = __PACKAGE__ })a'}/;
105 is $pack, 'bar', '/$text/ containing (?{}) inherits package';
108 "ba" =~ /${\'(?{ $::re = qr -- })a'}/;
110 is $re, '(?^m:)', '/$text/ containing (?{}) inherits pragmata';
112 fresh_perl_is <<'CODE', '45', { stderr => 1 }, '(?{die})';
113 my $a=4; my $b=5; eval { "a" =~ /(?{die})a/ }; print $a,$b;
116 fresh_perl_is <<'CODE', 'Y45', { stderr => 1 }, '(?{eval{die}})';
118 "a" =~ /(?{eval { die; print "X" }; print "Y"; })a/; print $a,$b;
121 fresh_perl_is <<'CODE',
123 sub f { "a" =~ /(?{print((caller(0))[3], "\n");})a/ };
128 { stderr => 1 }, 'sub f {(?{caller})}';
131 fresh_perl_is <<'CODE',
133 sub f { print ((caller(0))[3], "-", (caller(1))[3], "-\n") };
138 { stderr => 1 }, 'sub f {caller} /(?{f()})/';
141 fresh_perl_is <<'CODE',
144 "a" =~ /(?{print "X"; return; print "Y"; })a/;
151 { stderr => 1 }, 'sub f {(?{return})}';
154 fresh_perl_is <<'CODE',
155 my $a=4; my $b=5; "a" =~ /(?{last})a/; print $a,$b
157 q{Can't "last" outside a loop block at - line 1.},
158 { stderr => 1 }, '(?{last})';
161 fresh_perl_is <<'CODE',
162 my $a=4; my $b=5; "a" =~ /(?{for (1..4) {last}})a/; print $a,$b
165 { stderr => 1 }, '(?{for {last}})';
168 fresh_perl_is <<'CODE',
169 for (1) { my $a=4; my $b=5; "a" =~ /(?{last})a/ }; print $a,$b
171 q{Can't "last" outside a loop block at - line 1.},
172 { stderr => 1 }, 'for (1) {(?{last})}';
175 fresh_perl_is <<'CODE',
176 my $a=4; my $b=5; eval { "a" =~ /(?{last})a/ }; print $a,$b
179 { stderr => 1 }, 'eval {(?{last})}';
182 fresh_perl_is <<'CODE',
183 my $a=4; my $b=5; "a" =~ /(?{next})a/; print $a,$b
185 q{Can't "next" outside a loop block at - line 1.},
186 { stderr => 1 }, '(?{next})';
189 fresh_perl_is <<'CODE',
190 my $a=4; my $b=5; "a" =~ /(?{for (1,2,3) { next} })a/; print $a,$b
193 { stderr => 1 }, '(?{for {next}})';
196 fresh_perl_is <<'CODE',
197 for (1) { my $a=4; my $b=5; "a" =~ /(?{next})a/ }; print $a,$b
199 q{Can't "next" outside a loop block at - line 1.},
200 { stderr => 1 }, 'for (1) {(?{next})}';
203 fresh_perl_is <<'CODE',
204 my $a=4; my $b=5; eval { "a" =~ /(?{next})a/ }; print $a,$b
207 { stderr => 1 }, 'eval {(?{next})}';
210 fresh_perl_is <<'CODE',
212 "a" =~ /(?{ goto FOO; print "X"; })a/;
217 q{Can't "goto" out of a pseudo block at - line 2.},
218 { stderr => 1 }, '{(?{goto})}';
222 local $::TODO = "goto doesn't yet work in pseduo blocks";
223 fresh_perl_is <<'CODE',
225 "a" =~ /(?{ goto FOO; print "X"; FOO: print "Y"; })a/;
231 { stderr => 1 }, '{(?{goto FOO; FOO:})}';
235 fresh_perl_is <<'CODE', '', { stderr => 1 }, '(?{eval{die}})';
236 "$_$_$_"; my $foo; # these consume pad entries and ensure a SEGV on opd perls
237 "" =~ m{(?{exit(0)})};
242 { my $y = "a"; $y =~ /a(?{ undef *_ })/ }
243 pass "undef *_ in a re-eval does not cause a double free";
245 # make sure regexp warnings are reported on the right line
246 # (we don't care what warning; the 32768 limit is just one
247 # that was easy to reproduce) */
251 local $SIG{__WARN__} = sub { $w = "@_" };
252 my $qr = qr/(??{'a'})/;
254 ("a" x 40_000) =~ /^$qr(ab*)+/; my $line = __LINE__;
255 like($w, qr/recursion limit.* line $line\b/, "warning on right line");
258 # on immediate exit from pattern with code blocks, make sure PL_curcop is
268 local $SIG{__WARN__} = sub { $w .= "@_" };
269 $l = __LINE__; "1" =~ /^1$c/x and warn "foo";
270 like($w, qr/foo.+line $l/, 'curcop 1');
273 $l = __LINE__; "4" =~ /^1$c/x or warn "foo";
274 like($w, qr/foo.+line $l/, 'curcop 2');
277 $l = __LINE__; "1" =~ /^$c/x and warn "foo";
278 like($w, qr/foo.+line $l/, 'curcop 3');
281 $l = __LINE__; "4" =~ /^$c/x or warn "foo";
282 like($w, qr/foo.+line $l/, 'curcop 4');
285 # [perl #113928] caller behaving unexpectedly in re-evals
287 # /(?{...})/ should be in the same caller scope as the surrounding code;
288 # qr/(?{...})/ should be in an anon sub
298 while (@c = caller($i++)) {
299 $stack .= "($c[3]:" . ($c[2] - $l) . ')';
306 is (callers(), '', 'callers() null');
307 "" =~ /(?{ $c = callers() })/;
308 is ($c, '', 'callers() //');
311 sub m1 { "" =~ /(?{ $c = callers() })/; }
313 is ($c, '(main::m1:2)', 'callers() m1');
316 my $r1 = qr/(?{ $c = callers() })/;
318 is ($c, '(main::__ANON__:2)', 'callers() r1');
321 sub r1 { "" =~ /$r1/; }
323 is ($c, '(main::__ANON__:1)(main::r1:2)', 'callers() r1/r1');
326 sub c2 { $c = callers() }
327 my $r2 = qr/(?{ c2 })/;
329 is ($c, '(main::c2:2)(main::__ANON__:3)', 'callers() r2/c2');
330 sub r2 { "" =~ /$r2/; }
332 is ($c, '(main::c2:2)(main::__ANON__:5)(main::r2:6)', 'callers() r2/r2/c2');
335 sub c3 { $c = callers() }
336 my $r3 = qr/(?{ c3 })/;
338 "ABC" =~ /A(?{ $c1 = callers() })B${r3}C/;
339 is ($c, '(main::c3:2)(main::__ANON__:4)', 'callers() r3/c3');
340 is ($c1,'', 'callers() r3/c3 part 2');
341 sub r3 { "ABC" =~ /A(?{ $c1 = callers() })B${r3}C/; }
343 is ($c, '(main::c3:2)(main::__ANON__:7)(main::r3:8)', 'callers() r3/r3/c3');
344 is ($c1,'(main::r3:8)', 'callers() r3/r3/c3 part 2');
348 # [perl #113928] caller behaving unexpectedly in re-evals
350 # make sure __SUB__ within a code block returns something safe.
351 # NB waht it actually returns is subject to change
357 sub f1 { /(?{ $s = CORE::__SUB__; })/ }
359 is ($s, \&f1, '__SUB__ direct');
361 my $r = qr/(?{ $s = CORE::__SUB__; })/;
364 is ($s, \&f2, '__SUB__ qr');
366 sub f3 { "AB" =~ /A${r}B/ }
368 is ($s, \&f3, '__SUB__ qr multi');