3 # Check that lines from eval are correctly retained by the debugger
5 # Uncomment this for testing, but don't leave it in for "production", as
6 # we've not yet verified that use works.
13 my ($got, $expected, $name) = @_;
15 print "not ok $test - $name\n";
16 my @caller = caller(1);
17 print "# Failed test at $caller[1] line $caller[2]\n";
19 print "# Got '$got'\n";
21 print "# Got undef\n";
23 print "# Expected $expected\n";
28 my ($got, $expect, $name) = @_;
30 if (defined $expect) {
31 if (defined $got && $got eq $expect) {
32 print "ok $test - $name\n";
35 failed($got, "'$expect'", $name);
38 print "ok $test - $name\n";
41 failed($got, 'undef', $name);
47 my @before = grep { /eval/ } keys %::;
49 is ((scalar @before), 0, "No evals");
53 sub check_retained_lines {
54 my ($prog, $name) = @_;
55 # Is there a more efficient way to write this?
56 my @expect_lines = (undef, map ({"$_\n"} split "\n", $prog), "\n", ';');
58 my @keys = grep {!$seen{$_}} grep { /eval/ } keys %::;
60 is ((scalar @keys), 1, "1 new eval");
62 my @got_lines = @{$::{$keys[0]}};
64 is ((scalar @got_lines),
65 (scalar @expect_lines), "Right number of lines for $name");
67 for (0..$#expect_lines) {
68 is ($got_lines[$_], $expect_lines[$_], "Line $_ is correct");
75 for my $sep (' ', "\0") {
77 my $prog = "sub $name {
84 check_retained_lines($prog, ord $sep);
89 # This contains a syntax error
90 my $prog = "sub $name {
98 is (eval "$name()", "This is $name", "Subroutine was compiled, despite error")
99 or print STDERR "# $@\n";
101 check_retained_lines($prog,
102 'eval that defines subroutine but has syntax error');
106 foreach my $flags (0x0, 0x800, 0x1000, 0x1800) {
107 local $^P = $^P | $flags;
108 # This is easier if we accept that the guts eval will add a trailing \n
110 my $prog = "1 + 1 + 1\n";
113 is (eval $prog, 3, 'String eval works');
114 if ($flags & 0x800) {
115 check_retained_lines($prog, sprintf "%#X", $^P);
117 my @after = grep { /eval/ } keys %::;
119 is (scalar @after, 0 + keys %seen,
120 "evals that don't define subroutines are correctly cleaned up");
123 is (eval $fail, undef, 'Failed string eval fails');
125 if ($flags & 0x1000) {
126 check_retained_lines($fail, sprintf "%#X", $^P);
128 my @after = grep { /eval/ } keys %::;
130 is (scalar @after, 0 + keys %seen,
131 "evals that fail are correctly cleaned up");