This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Magic flags harmonization.
[perl5.git] / t / op / eval.t
... / ...
CommitLineData
1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6 require './test.pl';
7}
8
9plan(tests => 126);
10
11eval 'pass();';
12
13is($@, '');
14
15eval "\$foo\n = # this is a comment\n'ok 3';";
16is($foo, 'ok 3');
17
18eval "\$foo\n = # this is a comment\n'ok 4\n';";
19is($foo, "ok 4\n");
20
21print eval '
22$foo =;'; # this tests for a call through yyerror()
23like($@, qr/line 2/);
24
25print eval '$foo = /'; # this tests for a call through fatal()
26like($@, qr/Search/);
27
28is scalar(eval '++'), undef, 'eval syntax error in scalar context';
29is scalar(eval 'die'), undef, 'eval run-time error in scalar context';
30is +()=eval '++', 0, 'eval syntax error in list context';
31is +()=eval 'die', 0, 'eval run-time error in list context';
32
33is(eval '"ok 7\n";', "ok 7\n");
34
35$foo = 5;
36$fact = 'if ($foo <= 1) {1;} else {push(@x,$foo--); (eval $fact) * pop(@x);}';
37$ans = eval $fact;
38is($ans, 120, 'calculate a factorial with recursive evals');
39
40$foo = 5;
41$fact = 'local($foo)=$foo; $foo <= 1 ? 1 : $foo-- * (eval $fact);';
42$ans = eval $fact;
43is($ans, 120, 'calculate a factorial with recursive evals');
44
45my $curr_test = curr_test();
46my $tempfile = tempfile();
47open(try,'>',$tempfile);
48print try 'print "ok $curr_test\n";',"\n";
49close try;
50
51do "./$tempfile"; print $@;
52
53# Test the singlequoted eval optimizer
54
55$i = $curr_test + 1;
56for (1..3) {
57 eval 'print "ok ", $i++, "\n"';
58}
59
60$curr_test += 4;
61
62eval {
63 print "ok $curr_test\n";
64 die sprintf "ok %d\n", $curr_test + 2;
65 1;
66} || printf "ok %d\n$@", $curr_test + 1;
67
68curr_test($curr_test + 3);
69
70# check whether eval EXPR determines value of EXPR correctly
71
72{
73 my @a = qw(a b c d);
74 my @b = eval @a;
75 is("@b", '4');
76 is($@, '');
77
78 my $a = q[defined(wantarray) ? (wantarray ? ($b='A') : ($b='S')) : ($b='V')];
79 my $b;
80 @a = eval $a;
81 is("@a", 'A');
82 is( $b, 'A');
83 $_ = eval $a;
84 is( $b, 'S');
85 eval $a;
86 is( $b, 'V');
87
88 $b = 'wrong';
89 $x = sub {
90 my $b = "right";
91 is(eval('"$b"'), $b);
92 };
93 &$x();
94}
95
96{
97 my $b = 'wrong';
98 my $X = sub {
99 my $b = "right";
100 is(eval('"$b"'), $b);
101 };
102 &$X();
103}
104
105# check navigation of multiple eval boundaries to find lexicals
106
107my $x = 'aa';
108eval <<'EOT'; die if $@;
109 print "# $x\n"; # clone into eval's pad
110 sub do_eval1 {
111 eval $_[0]; die if $@;
112 }
113EOT
114do_eval1('is($x, "aa")');
115$x++;
116do_eval1('eval q[is($x, "ab")]');
117$x++;
118do_eval1('sub { print "# $x\n"; eval q[is($x, "ac")] }->()');
119$x++;
120
121# calls from within eval'' should clone outer lexicals
122
123eval <<'EOT'; die if $@;
124 sub do_eval2 {
125 eval $_[0]; die if $@;
126 }
127do_eval2('is($x, "ad")');
128$x++;
129do_eval2('eval q[is($x, "ae")]');
130$x++;
131do_eval2('sub { print "# $x\n"; eval q[is($x, "af")] }->()');
132EOT
133
134# calls outside eval'' should NOT clone lexicals from called context
135
136$main::ok = 'not ok';
137my $ok = 'ok';
138eval <<'EOT'; die if $@;
139 # $x unbound here
140 sub do_eval3 {
141 eval $_[0]; die if $@;
142 }
143EOT
144{
145 my $ok = 'not ok';
146 do_eval3('is($ok, q{ok})');
147 do_eval3('eval q[is($ok, q{ok})]');
148 do_eval3('sub { eval q[is($ok, q{ok})] }->()');
149}
150
151{
152 my $x = curr_test();
153 my $got;
154 sub recurse {
155 my $l = shift;
156 if ($l < $x) {
157 ++$l;
158 eval 'print "# level $l\n"; recurse($l);';
159 die if $@;
160 }
161 else {
162 $got = "ok $l";
163 }
164 }
165 local $SIG{__WARN__} = sub { fail() if $_[0] =~ /^Deep recurs/ };
166 recurse(curr_test() - 5);
167
168 is($got, "ok $x",
169 "recursive subroutine-call inside eval'' see its own lexicals");
170}
171
172
173eval <<'EOT';
174 sub create_closure {
175 my $self = shift;
176 return sub {
177 return $self;
178 };
179 }
180EOT
181is(create_closure("good")->(), "good",
182 'closures created within eval bind correctly');
183
184$main::r = "good";
185sub terminal { eval '$r . q{!}' }
186is(do {
187 my $r = "bad";
188 eval 'terminal($r)';
189}, 'good!', 'lexical search terminates correctly at subroutine boundary');
190
191{
192 # Have we cured panic which occurred with require/eval in die handler ?
193 local $SIG{__DIE__} = sub { eval {1}; die shift };
194 eval { die "wham_eth\n" };
195 is($@, "wham_eth\n");
196}
197
198{
199 my $c = eval "(1,2)x10";
200 is($c, '2222222222', 'scalar eval"" pops stack correctly');
201}
202
203# return from eval {} should clear $@ correctly
204{
205 my $status = eval {
206 eval { die };
207 print "# eval { return } test\n";
208 return; # removing this changes behavior
209 };
210 is($@, '', 'return from eval {} should clear $@ correctly');
211}
212
213# ditto for eval ""
214{
215 my $status = eval q{
216 eval q{ die };
217 print "# eval q{ return } test\n";
218 return; # removing this changes behavior
219 };
220 is($@, '', 'return from eval "" should clear $@ correctly');
221}
222
223# Check that eval catches bad goto calls
224# (BUG ID 20010305.003)
225{
226 eval {
227 eval { goto foo; };
228 like($@, qr/Can't "goto" into the middle of a foreach loop/,
229 'eval catches bad goto calls');
230 last;
231 foreach my $i (1) {
232 foo: fail('jumped into foreach');
233 }
234 };
235 fail("Outer eval didn't execute the last");
236 diag($@);
237}
238
239# Make sure that "my $$x" is forbidden
240# 20011224 MJD
241{
242 foreach (qw($$x @$x %$x $$$x)) {
243 eval 'my ' . $_;
244 isnt($@, '', "my $_ is forbidden");
245 }
246}
247
248{
249 $@ = 5;
250 eval q{};
251 cmp_ok(length $@, '==', 0, '[ID 20020623.002] eval "" doesn\'t clear $@');
252}
253
254# DAPM Nov-2002. Perl should now capture the full lexical context during
255# evals.
256
257$::zzz = $::zzz = 0;
258my $zzz = 1;
259
260eval q{
261 sub fred1 {
262 eval q{ is(eval '$zzz', 1); }
263 }
264 fred1(47);
265 { my $zzz = 2; fred1(48) }
266};
267
268eval q{
269 sub fred2 {
270 is(eval('$zzz'), 1);
271 }
272};
273fred2(49);
274{ my $zzz = 2; fred2(50) }
275
276# sort() starts a new context stack. Make sure we can still find
277# the lexically enclosing sub
278
279sub do_sort {
280 my $zzz = 2;
281 my @a = sort
282 { is(eval('$zzz'), 2); $a <=> $b }
283 2, 1;
284}
285do_sort();
286
287# more recursion and lexical scope leak tests
288
289eval q{
290 my $r = -1;
291 my $yyy = 9;
292 sub fred3 {
293 my $l = shift;
294 my $r = -2;
295 return 1 if $l < 1;
296 return 0 if eval '$zzz' != 1;
297 return 0 if $yyy != 9;
298 return 0 if eval '$yyy' != 9;
299 return 0 if eval '$l' != $l;
300 return $l * fred3($l-1);
301 }
302 my $r = fred3(5);
303 is($r, 120);
304 $r = eval'fred3(5)';
305 is($r, 120);
306 $r = 0;
307 eval '$r = fred3(5)';
308 is($r, 120);
309 $r = 0;
310 { my $yyy = 4; my $zzz = 5; my $l = 6; $r = eval 'fred3(5)' };
311 is($r, 120);
312};
313my $r = fred3(5);
314is($r, 120);
315$r = eval'fred3(5)';
316is($r, 120);
317$r = 0;
318eval'$r = fred3(5)';
319is($r, 120);
320$r = 0;
321{ my $yyy = 4; my $zzz = 5; my $l = 6; $r = eval 'fred3(5)' };
322is($r, 120);
323
324# check that goto &sub within evals doesn't leak lexical scope
325
326my $yyy = 2;
327
328sub fred4 {
329 my $zzz = 3;
330 is($zzz, 3);
331 is(eval '$zzz', 3);
332 is(eval '$yyy', 2);
333}
334
335eval q{
336 fred4();
337 sub fred5 {
338 my $zzz = 4;
339 is($zzz, 4);
340 is(eval '$zzz', 4);
341 is(eval '$yyy', 2);
342 goto &fred4;
343 }
344 fred5();
345};
346fred5();
347{ my $yyy = 88; my $zzz = 99; fred5(); }
348eval q{ my $yyy = 888; my $zzz = 999; fred5(); };
349
350{
351 $eval = eval 'sub { eval "sub { %S }" }';
352 $eval->({});
353 pass('[perl #9728] used to dump core');
354}
355
356# evals that appear in the DB package should see the lexical scope of the
357# thing outside DB that called them (usually the debugged code), rather
358# than the usual surrounding scope
359
360our $x = 1;
361{
362 my $x=2;
363 sub db1 { $x; eval '$x' }
364 sub DB::db2 { $x; eval '$x' }
365 package DB;
366 sub db3 { eval '$x' }
367 sub DB::db4 { eval '$x' }
368 sub db5 { my $x=4; eval '$x' }
369 package main;
370 sub db6 { my $x=4; eval '$x' }
371}
372{
373 my $x = 3;
374 is(db1(), 2);
375 is(DB::db2(), 2);
376 is(DB::db3(), 3);
377 is(DB::db4(), 3);
378 is(DB::db5(), 3);
379 is(db6(), 4);
380}
381
382# [perl #19022] used to end up with shared hash warnings
383# The program should generate no output, so anything we see is on stderr
384my $got = runperl (prog => '$h{a}=1; foreach my $k (keys %h) {eval qq{\$k}}',
385 stderr => 1);
386is ($got, '');
387
388# And a buggy way of fixing #19022 made this fail - $k became undef after the
389# eval for a build with copy on write
390{
391 my %h;
392 $h{a}=1;
393 foreach my $k (keys %h) {
394 is($k, 'a');
395
396 eval "\$k";
397
398 is($k, 'a');
399 }
400}
401
402sub Foo {} print Foo(eval {});
403pass('#20798 (used to dump core)');
404
405# check for context in string eval
406{
407 my(@r,$r,$c);
408 sub context { defined(wantarray) ? (wantarray ? ($c='A') : ($c='S')) : ($c='V') }
409
410 my $code = q{ context() };
411 @r = qw( a b );
412 $r = 'ab';
413 @r = eval $code;
414 is("@r$c", 'AA', 'string eval list context');
415 $r = eval $code;
416 is("$r$c", 'SS', 'string eval scalar context');
417 eval $code;
418 is("$c", 'V', 'string eval void context');
419}
420
421# [perl #34682] escaping an eval with last could coredump or dup output
422
423$got = runperl (
424 prog =>
425 'sub A::TIEARRAY { L: { eval { last L } } } tie @a, A; warn qq(ok\n)',
426stderr => 1);
427
428is($got, "ok\n", 'eval and last');
429
430# eval undef should be the same as eval "" barring any warnings
431
432{
433 local $@ = "foo";
434 eval undef;
435 is($@, "", 'eval undef');
436}
437
438{
439 no warnings;
440 eval "&& $b;";
441 like($@, qr/^syntax error/, 'eval syntax error, no warnings');
442}
443
444# a syntax error in an eval called magically (eg via tie or overload)
445# resulted in an assertion failure in S_docatch, since doeval had already
446# popped the EVAL context due to the failure, but S_docatch expected the
447# context to still be there.
448
449{
450 my $ok = 0;
451 package Eval1;
452 sub STORE { eval '('; $ok = 1 }
453 sub TIESCALAR { bless [] }
454
455 my $x;
456 tie $x, bless [];
457 $x = 1;
458 ::is($ok, 1, 'eval docatch');
459}
460
461# [perl #51370] eval { die "\x{a10d}" } followed by eval { 1 } did not reset
462# length $@
463$@ = "";
464eval { die "\x{a10d}"; };
465$_ = length $@;
466eval { 1 };
467
468cmp_ok($@, 'eq', "", 'length of $@ after eval');
469cmp_ok(length $@, '==', 0, 'length of $@ after eval');
470
471# Check if eval { 1 }; completely resets $@
472SKIP: {
473 skip_if_miniperl('no dynamic loading on miniperl, no Devel::Peek', 2);
474 require Config;
475 skip('Devel::Peek was not built', 2)
476 unless $Config::Config{extensions} =~ /\bDevel\/Peek\b/;
477
478 my $tempfile = tempfile();
479 open $prog, ">", $tempfile or die "Can't create test file";
480 print $prog <<'END_EVAL_TEST';
481 use Devel::Peek;
482 $! = 0;
483 $@ = $!;
484 Dump($@);
485 print STDERR "******\n";
486 eval { die "\x{a10d}"; };
487 $_ = length $@;
488 eval { 1 };
489 Dump($@);
490 print STDERR "******\n";
491 print STDERR "Done\n";
492END_EVAL_TEST
493 close $prog or die "Can't close $tempfile: $!";
494 my $got = runperl(progfile => $tempfile, stderr => 1);
495 my ($first, $second, $tombstone) = split (/\*\*\*\*\*\*\n/, $got);
496
497 is($tombstone, "Done\n", 'Program completed successfully');
498
499 $first =~ s/p?[NI]OK,//g;
500 s/ PV = 0x[0-9a-f]+/ PV = 0x/ foreach $first, $second;
501 s/ LEN = [0-9]+/ LEN = / foreach $first, $second;
502 # Dump may double newlines through pipes, though not files
503 # which is what this test used to use.
504 $second =~ s/ IV = 0\n\n/ IV = 0\n/ if $^O eq 'VMS';
505
506 is($second, $first, 'eval { 1 } completely resets $@');
507}
508
509# Test that "use feature" and other hint transmission in evals and s///ee
510# don't leak memory
511{
512 use feature qw(:5.10);
513 my $count_expected = ($^H & 0x20000) ? 2 : 1;
514 my $t;
515 my $s = "a";
516 $s =~ s/a/$t = \%^H; qq( qq() );/ee;
517 is(Internals::SvREFCNT(%$t), $count_expected, 'RT 63110');
518}
519
520{
521 # test that the CV compiled for the eval is freed by checking that no additional
522 # reference to outside lexicals are made.
523 my $x;
524 is(Internals::SvREFCNT($x), 1, "originally only 1 reference");
525 eval '$x';
526 is(Internals::SvREFCNT($x), 1, "execution eval doesn't create new references");
527}
528
529fresh_perl_is(<<'EOP', "ok\n", undef, 'RT #70862');
530$::{'@'}='';
531eval {};
532print "ok\n";
533EOP
534
535fresh_perl_is(<<'EOP', "ok\n", undef, 'variant of RT #70862');
536eval {
537 $::{'@'}='';
538};
539print "ok\n";
540EOP
541
542fresh_perl_is(<<'EOP', "ok\n", undef, 'related to RT #70862');
543$::{'@'}=\3;
544eval {};
545print "ok\n";
546EOP
547
548fresh_perl_is(<<'EOP', "ok\n", undef, 'related to RT #70862');
549eval {
550 $::{'@'}=\3;
551};
552print "ok\n";
553EOP
554
555 fresh_perl_is(<<'EOP', "ok\n", undef, 'segfault on syntax errors in block evals');
556# localize the hits hash so the eval ends up with the pad offset of a copy of it in its targ
557BEGIN { $^H |= 0x00020000 }
558eval q{ eval { + } };
559print "ok\n";
560EOP
561
562fresh_perl_is(<<'EOP', "ok\n", undef, 'assert fail on non-string in Perl_lex_start');
563use overload '""' => sub { '1;' };
564my $ov = bless [];
565eval $ov;
566print "ok\n";
567EOP
568
569for my $k (!0) {
570 eval 'my $do_something_with = $k';
571 eval { $k = 'mon' };
572 is "a" =~ /a/, "1",
573 "string eval leaves readonly lexicals readonly [perl #19135]";
574}
575
576# [perl #68750]
577fresh_perl_is(<<'EOP', "ok\nok\nok\n", undef, 'eval clears %^H');
578 BEGIN {
579 require re; re->import('/x'); # should only affect surrounding scope
580 eval '
581 print "a b" =~ /a b/ ? "ok\n" : "nokay\n";
582 use re "/m";
583 print "a b" =~ /a b/ ? "ok\n" : "nokay\n";
584 ';
585 }
586 print "ab" =~ /a b/ ? "ok\n" : "nokay\n";
587EOP
588
589# [perl #70151]
590{
591 BEGIN { eval 'require re; import re "/x"' }
592 ok "ab" =~ /a b/, 'eval does not localise %^H at run time';
593}
594
595# The fix for perl #70151 caused an assertion failure that broke
596# SNMP::Trapinfo, when toke.c finds no syntax errors but perly.y fails.
597eval(q|""!=!~//|);
598pass("phew! dodged the assertion after a parsing (not lexing) error");
599
600# [perl #111462]
601{
602 local $ENV{PERL_DESTRUCT_LEVEL} = 1;
603 unlike
604 runperl(
605 prog => 'BEGIN { $^H{foo} = bar }'
606 .'our %FIELDS; my main $x; eval q[$x->{foo}]',
607 stderr => 1,
608 ),
609 qr/Unbalanced string table/,
610 'Errors in finalize_optree do not leak string eval op tree';
611}