3 # Check that lines from eval are correctly retained by the debugger
7 # Uncomment this for testing, but don't leave it in for "production", as
8 # we've not yet verified that use works.
15 my @before = grep { /eval/ } keys %::;
17 is ((scalar @before), 0, "No evals");
21 sub check_retained_lines {
22 my ($prog, $name) = @_;
23 # Is there a more efficient way to write this?
24 my @expect_lines = (undef, map ({"$_\n"} split "\n", $prog), "\n", ';');
26 my @keys = grep {!$seen{$_}} grep { /eval/ } keys %::;
28 is ((scalar @keys), 1, "1 new eval");
30 my @got_lines = @{$::{$keys[0]}};
32 is ((scalar @got_lines),
33 (scalar @expect_lines), "Right number of lines for $name");
35 for (0..$#expect_lines) {
36 is ($got_lines[$_], $expect_lines[$_], "Line $_ is correct");
43 for my $sep (' ', "\0") {
45 my $prog = "sub $name {
52 check_retained_lines($prog, ord $sep);
57 # This contains a syntax error
58 my $prog = "sub $name {
66 is (eval "$name()", "This is $name", "Subroutine was compiled, despite error")
69 check_retained_lines($prog,
70 'eval that defines subroutine but has syntax error');
74 foreach my $flags (0x0, 0x800, 0x1000, 0x1800) {
75 local $^P = $^P | $flags;
76 # This is easier if we accept that the guts eval will add a trailing \n
78 my $prog = "1 + 1 + 1\n";
81 is (eval $prog, 3, 'String eval works');
83 check_retained_lines($prog, sprintf "%#X", $^P);
85 my @after = grep { /eval/ } keys %::;
87 is (scalar @after, 0 + keys %seen,
88 "evals that don't define subroutines are correctly cleaned up");
91 is (eval $fail, undef, 'Failed string eval fails');
93 if ($flags & 0x1000) {
94 check_retained_lines($fail, sprintf "%#X", $^P);
96 my @after = grep { /eval/ } keys %::;
98 is (scalar @after, 0 + keys %seen,
99 "evals that fail are correctly cleaned up");