#!./perl
-print "1..78\n";
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+
+print "1..93\n";
eval 'print "ok 1\n";';
eval q{};
print length($@) ? "not ok 46\t# \$\@ = '$@'\n" : "ok 46\n";
}
-# [perl #9728] used to dump core
-{
- $eval = eval 'sub { eval "sub { %S }" }';
- $eval->({});
- print "ok 47\n";
-}
# DAPM Nov-2002. Perl should now capture the full lexical context during
# evals.
};
fred5();
{ my $yyy = 88; my $zzz = 99; fred5(); }
-eval q{ my $yyy = 888; my $zzz = 999; fred5(); }
+eval q{ my $yyy = 888; my $zzz = 999; fred5(); };
+
+# [perl #9728] used to dump core
+{
+ $eval = eval 'sub { eval "sub { %S }" }';
+ $eval->({});
+ print "ok $test\n";
+ $test++;
+}
+
+# evals that appear in the DB package should see the lexical scope of the
+# thing outside DB that called them (usually the debugged code), rather
+# than the usual surrounding scope
+
+$test=79;
+our $x = 1;
+{
+ my $x=2;
+ sub db1 { $x; eval '$x' }
+ sub DB::db2 { $x; eval '$x' }
+ package DB;
+ sub db3 { eval '$x' }
+ sub DB::db4 { eval '$x' }
+ sub db5 { my $x=4; eval '$x' }
+ package main;
+ sub db6 { my $x=4; eval '$x' }
+}
+{
+ my $x = 3;
+ print db1() == 2 ? 'ok' : 'not ok', " $test\n"; $test++;
+ print DB::db2() == 2 ? 'ok' : 'not ok', " $test\n"; $test++;
+ print DB::db3() == 3 ? 'ok' : 'not ok', " $test\n"; $test++;
+ print DB::db4() == 3 ? 'ok' : 'not ok', " $test\n"; $test++;
+ print DB::db5() == 3 ? 'ok' : 'not ok', " $test\n"; $test++;
+ print db6() == 4 ? 'ok' : 'not ok', " $test\n"; $test++;
+}
+require './test.pl';
+$NO_ENDING = 1;
+# [perl #19022] used to end up with shared hash warnings
+# The program should generate no output, so anything we see is on stderr
+my $got = runperl (prog => '$h{a}=1; foreach my $k (keys %h) {eval qq{\$k}}',
+ stderr => 1);
+
+if ($got eq '') {
+ print "ok $test\n";
+} else {
+ print "not ok $test\n";
+ _diag ("# Got '$got'\n");
+}
+$test++;
+# And a buggy way of fixing #19022 made this fail - $k became undef after the
+# eval for a build with copy on write
+{
+ my %h;
+ $h{a}=1;
+ foreach my $k (keys %h) {
+ if (defined $k and $k eq 'a') {
+ print "ok $test\n";
+ } else {
+ print "not $test # got ", _q ($k), "\n";
+ }
+ $test++;
+
+ eval "\$k";
+
+ if (defined $k and $k eq 'a') {
+ print "ok $test\n";
+ } else {
+ print "not $test # got ", _q ($k), "\n";
+ }
+ $test++;
+ }
+}
+
+sub Foo {} print Foo(eval {});
+print "ok ",$test++," - #20798 (used to dump core)\n";
+
+# check for context in string eval
+{
+ my(@r,$r,$c);
+ sub context { defined(wantarray) ? (wantarray ? ($c='A') : ($c='S')) : ($c='V') }
+
+ my $code = q{ context() };
+ @r = qw( a b );
+ $r = 'ab';
+ @r = eval $code;
+ print "@r$c" eq 'AA' ? "ok " : "# '@r$c' ne 'AA'\nnot ok ", $test++, "\n";
+ $r = eval $code;
+ print "$r$c" eq 'SS' ? "ok " : "# '$r$c' ne 'SS'\nnot ok ", $test++, "\n";
+ eval $code;
+ print $c eq 'V' ? "ok " : "# '$c' ne 'V'\nnot ok ", $test++, "\n";
+}
+
+# [perl #34682] escaping an eval with last could coredump or dup output
+
+$got = runperl (
+ prog =>
+ 'sub A::TIEARRAY { L: { eval { last L } } } tie @a, A; warn qq(ok\n)',
+stderr => 1);
+
+print "not " unless $got eq "ok\n";
+print "ok $test - eval and last\n"; $test++;
+
+# eval undef should be the same as eval "" barring any warnings
+
+{
+ local $@ = "foo";
+ eval undef;
+ print "not " unless $@ eq "";
+ print "ok $test # eval unef \n"; $test++;
+}