3 # Test scoping issues with embedded code in regexps.
8 set_up_inc(qw(lib ../lib));
11 if ($@) { skip_all("miniperl, no 're'") }
17 fresh_perl_is <<'CODE', '781745', {}, '(?{}) has its own lexical scope';
18 my $x = 7; my $a = 4; my $b = 5;
19 print "a" =~ /(?{ print $x; my $x = 8; print $x; my $y })a/;
23 fresh_perl_is <<'CODE',
30 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
31 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
32 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
38 '1a82a93a104a85a96a101a 1b82b93b104b85b96b101b 1c82c93c104c85c96c101c ',
40 'multiple (?{})s in loop with lexicals';
42 fresh_perl_is <<'CODE', '781745', {}, 'run-time re-eval has its own scope';
44 my $x = 7; my $a = 4; my $b = 5;
46 print "a" =~ /(?{ print $x; my $x = 8; print $x; my $y })$rest/;
50 fresh_perl_is <<'CODE', '178279371047857967101745', {},
58 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
59 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
60 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
65 'multiple (?{})s in "foo" =~ $string';
67 fresh_perl_is <<'CODE', '178279371047857967101745', {},
75 a (?{ print $y; local $y = $y+1; print $x; my $x = 8; print $x })
76 b (?{ print $y; local $y = $y+1; print $x; my $x = 9; print $x })
77 c (?{ print $y; local $y = $y+1; print $x; my $x = 10; print $x })
82 'multiple (?{})s in "foo" =~ /$string/x';
84 fresh_perl_is <<'CODE', '123123', {},
86 push @regexps, qr/(?{ print $x })a/;
88 "a" =~ $_ for @regexps;
89 "ba" =~ /b$_/ for @regexps;
91 'qr/(?{})/ is a closure';
93 "a" =~ do { package foo; qr/(?{ $::pack = __PACKAGE__ })a/ };
94 is $pack, 'foo', 'qr// inherits package';
95 "a" =~ do { use re "/x"; qr/(?{ $::re = qr-- })a/ };
96 is $re, '(?^x:)', 'qr// inherits pragmata';
99 "ba" =~ /b${\do { package baz; qr|(?{ $::pack = __PACKAGE__ })a| }}/;
100 is $pack, 'baz', '/text$qr/ inherits package';
101 "ba" =~ m+b${\do { use re "/i"; qr|(?{ $::re = qr-- })a| }}+;
102 is $re, '(?^i:)', '/text$qr/ inherits pragmata';
107 "ba" =~ /${\'(?{ $::pack = __PACKAGE__ })a'}/;
109 is $pack, 'bar', '/$text/ containing (?{}) inherits package';
112 "ba" =~ /${\'(?{ $::re = qr -- })a'}/;
114 is $re, '(?^m:)', '/$text/ containing (?{}) inherits pragmata';
116 fresh_perl_is <<'CODE', '45', { stderr => 1 }, '(?{die})';
117 my $a=4; my $b=5; eval { "a" =~ /(?{die})a/ }; print $a,$b;
120 fresh_perl_is <<'CODE', 'Y45', { stderr => 1 }, '(?{eval{die}})';
122 "a" =~ /(?{eval { die; print "X" }; print "Y"; })a/; print $a,$b;
125 fresh_perl_is <<'CODE',
127 sub f { "a" =~ /(?{print((caller(0))[3], "\n");})a/ };
132 { stderr => 1 }, 'sub f {(?{caller})}';
135 fresh_perl_is <<'CODE',
137 sub f { print ((caller(0))[3], "-", (caller(1))[3], "-\n") };
142 { stderr => 1 }, 'sub f {caller} /(?{f()})/';
145 fresh_perl_is <<'CODE',
148 "a" =~ /(?{print "X"; return; print "Y"; })a/;
155 { stderr => 1 }, 'sub f {(?{return})}';
158 fresh_perl_is <<'CODE',
159 my $a=4; my $b=5; "a" =~ /(?{last})a/; print $a,$b
161 q{Can't "last" outside a loop block at - line 1.},
162 { stderr => 1 }, '(?{last})';
165 fresh_perl_is <<'CODE',
166 my $a=4; my $b=5; "a" =~ /(?{for (1..4) {last}})a/; print $a,$b
169 { stderr => 1 }, '(?{for {last}})';
172 fresh_perl_is <<'CODE',
173 for (1) { my $a=4; my $b=5; "a" =~ /(?{last})a/ }; print $a,$b
175 q{Can't "last" outside a loop block at - line 1.},
176 { stderr => 1 }, 'for (1) {(?{last})}';
179 fresh_perl_is <<'CODE',
180 my $a=4; my $b=5; eval { "a" =~ /(?{last})a/ }; print $a,$b
183 { stderr => 1 }, 'eval {(?{last})}';
186 fresh_perl_is <<'CODE',
187 my $a=4; my $b=5; "a" =~ /(?{next})a/; print $a,$b
189 q{Can't "next" outside a loop block at - line 1.},
190 { stderr => 1 }, '(?{next})';
193 fresh_perl_is <<'CODE',
194 my $a=4; my $b=5; "a" =~ /(?{for (1,2,3) { next} })a/; print $a,$b
197 { stderr => 1 }, '(?{for {next}})';
200 fresh_perl_is <<'CODE',
201 for (1) { my $a=4; my $b=5; "a" =~ /(?{next})a/ }; print $a,$b
203 q{Can't "next" outside a loop block at - line 1.},
204 { stderr => 1 }, 'for (1) {(?{next})}';
207 fresh_perl_is <<'CODE',
208 my $a=4; my $b=5; eval { "a" =~ /(?{next})a/ }; print $a,$b
211 { stderr => 1 }, 'eval {(?{next})}';
214 fresh_perl_is <<'CODE',
216 "a" =~ /(?{ goto FOO; print "X"; })a/;
221 q{Can't "goto" out of a pseudo block at - line 2.},
222 { stderr => 1 }, '{(?{goto})}';
226 local $::TODO = "goto doesn't yet work in pseudo blocks";
227 fresh_perl_is <<'CODE',
229 "a" =~ /(?{ goto FOO; print "X"; FOO: print "Y"; })a/;
235 { stderr => 1 }, '{(?{goto FOO; FOO:})}';
239 fresh_perl_is <<'CODE', '', { stderr => 1 }, '(?{eval{die}})';
240 "$_$_$_"; my $foo; # these consume pad entries and ensure a SEGV on opd perls
241 "" =~ m{(?{exit(0)})};
246 { my $y = "a"; $y =~ /a(?{ undef *_ })/ }
247 pass "undef *_ in a re-eval does not cause a double free";
249 # make sure regexp warnings are reported on the right line
250 # (we don't care what warning */
252 skip("no \\p{Unassigned} under miniperl", 1) if is_miniperl;
255 local $SIG{__WARN__} = sub { $w = "@_" };
256 my $qr = qr/(??{'a'})/;
258 my $a = "\x{110000}" =~ /\p{Unassigned}/; my $line = __LINE__;
259 like($w, qr/Matched non-Unicode code point .* line $line\b/, "warning on right line");
262 # on immediate exit from pattern with code blocks, make sure PL_curcop is
272 local $SIG{__WARN__} = sub { $w .= "@_" };
273 $l = __LINE__; "1" =~ /^1$c/x and warn "foo";
274 like($w, qr/foo.+line $l/, 'curcop 1');
277 $l = __LINE__; "4" =~ /^1$c/x or warn "foo";
278 like($w, qr/foo.+line $l/, 'curcop 2');
281 $l = __LINE__; "1" =~ /^$c/x and warn "foo";
282 like($w, qr/foo.+line $l/, 'curcop 3');
285 $l = __LINE__; "4" =~ /^$c/x or warn "foo";
286 like($w, qr/foo.+line $l/, 'curcop 4');
289 # [perl #113928] caller behaving unexpectedly in re-evals
291 # /(?{...})/ should be in the same caller scope as the surrounding code;
292 # qr/(?{...})/ should be in an anon sub
302 while (@c = caller($i++)) {
303 $stack .= "($c[3]:" . ($c[2] - $l) . ')';
310 is (callers(), '', 'callers() null');
311 "" =~ /(?{ $c = callers() })/;
312 is ($c, '', 'callers() //');
315 sub m1 { "" =~ /(?{ $c = callers() })/; }
317 is ($c, '(main::m1:2)', 'callers() m1');
320 my $r1 = qr/(?{ $c = callers() })/;
322 is ($c, '(main::__ANON__:2)', 'callers() r1');
325 sub r1 { "" =~ /$r1/; }
327 is ($c, '(main::__ANON__:1)(main::r1:2)', 'callers() r1/r1');
330 sub c2 { $c = callers() }
331 my $r2 = qr/(?{ c2 })/;
333 is ($c, '(main::c2:2)(main::__ANON__:3)', 'callers() r2/c2');
334 sub r2 { "" =~ /$r2/; }
336 is ($c, '(main::c2:2)(main::__ANON__:5)(main::r2:6)', 'callers() r2/r2/c2');
339 sub c3 { $c = callers() }
340 my $r3 = qr/(?{ c3 })/;
342 "ABC" =~ /A(?{ $c1 = callers() })B${r3}C/;
343 is ($c, '(main::c3:2)(main::__ANON__:4)', 'callers() r3/c3');
344 is ($c1,'', 'callers() r3/c3 part 2');
345 sub r3 { "ABC" =~ /A(?{ $c1 = callers() })B${r3}C/; }
347 is ($c, '(main::c3:2)(main::__ANON__:7)(main::r3:8)', 'callers() r3/r3/c3');
348 is ($c1,'(main::r3:8)', 'callers() r3/r3/c3 part 2');
352 # [perl #113928] caller behaving unexpectedly in re-evals
354 # make sure __SUB__ within a code block returns something safe.
355 # NB waht it actually returns is subject to change
361 sub f1 { /(?{ $s = CORE::__SUB__; })/ }
363 is ($s, \&f1, '__SUB__ direct');
365 my $r = qr/(?{ $s = CORE::__SUB__; })/;
368 is ($s, \&f2, '__SUB__ qr');
370 sub f3 { "AB" =~ /A${r}B/ }
372 is ($s, \&f3, '__SUB__ qr multi');
376 # ensure scope is properly restored when there's an error compiling a
377 # "looks a bit like it has (?{}) but doesn't" qr//
379 fresh_perl_like <<'CODE',
380 BEGIN {$^H = 0x10000 }; # HINT_NEW_RE
383 qr/Constant\(qq\) unknown/,