xref: /openbsd-src/gnu/usr.bin/perl/t/op/eval.t (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6    require './test.pl';
7}
8
9plan(tests => 130);
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}
612
613# [perl #114658] Line numbers at end of string eval
614for("{;", "{") {
615    eval $_; is $@ =~ s/eval \d+/eval 1/rag, <<'EOE',
616Missing right curly or square bracket at (eval 1) line 1, at end of line
617syntax error at (eval 1) line 1, at EOF
618EOE
619	qq'Right line number for eval "$_"';
620}
621
622{
623    my $w;
624    local $SIG{__WARN__} = sub { $w .= shift };
625
626    eval "\${\nfoobar\n} = 10; warn q{should be line 3}";
627    is(
628        $w =~ s/eval \d+/eval 1/ra,
629        "should be line 3 at (eval 1) line 3.\n",
630        'eval qq{\${\nfoo\n}; warn} updates the line number correctly'
631    );
632}
633
634sub _117941 { package _117941; eval '$a' }
635delete $::{"_117941::"};
636_117941();
637pass("eval in freed package does not crash");
638