6 use Test::More tests => ((3 * 4) / 2) * 2 * 2 + 8;
8 use Scope::Upper qw<uplevel HERE CALLER>;
11 my ($check_args) = @_;
15 my @c = $check_args ? do {
16 my $frame = ("$]" >= 5.037_010) ? ($i + 1) : $i;
22 my $args = $c[4] ? [ @DB::args ] : undef;
34 my ($depth, $code) = @_;
35 $stacks[0] = callstack(1);
36 &uplevel($code, 'three', CALLER($depth));
40 $stacks[1] = callstack(1);
45 $stacks[2] = callstack(1);
49 sub tester_sub { callstack(1) }
51 my $tester_anon = sub { callstack(1) };
53 my @subs = (\&three, $two, \&one);
55 for my $height (0 .. 2) {
56 my $base = $subs[$height];
59 my $code = $anon ? $tester_anon : \&tester_sub;
61 for my $depth (0 .. $height) {
62 my $desc = "callstack at depth $depth/$height";
63 $desc .= $anon ? ' (anonymous callback)' : ' (named callback)';
66 my $result = eval { $base->($depth, $code, 'zero') };
67 is $@, '', "$desc: no error";
68 is_deeply $result, $stacks[$depth], "$desc: correct call stack";
75 &uplevel($cb, 1, HERE);
79 my $desc = "recalling in the coderef passed to uplevel (anonymous)";
81 $cb = sub { $_[0] ? $cb->(0) : callstack(0) };
83 my ($expected, $got) = eval { $cb->(1), four($cb) };
84 is $@, '', "$desc: no error";
85 $expected->[1]->[3] = 'main::four';
86 is_deeply $got, $expected, "$desc: correct call stack";
89 sub test_named_recall { $_[0] ? test_named_recall(0) : callstack(0) }
92 my $desc = "recalling in the coderef passed to uplevel (named)";
94 my ($expected, $got) = eval { test_named_recall(1),four(\&test_named_recall) };
95 is $@, '', "$desc: no error";
96 $expected->[1]->[3] = 'main::four';
97 is_deeply $got, $expected, "$desc: correct call stack";
101 sub test_mixed_recall_1 {
108 $mixed_recall_1 = \&test_mixed_recall_1;
111 my $desc = "recalling in the coderef passed to uplevel (mixed 1)";
113 my ($expected, $got) = eval { test_mixed_recall_1(1), four($mixed_recall_1) };
114 is $@, '', "$desc: no error";
115 $expected->[1]->[3] = 'main::four';
116 is_deeply $got, $expected, "$desc: correct call stack";
119 my $mixed_recall_2_bis = do {
131 sub test_mixed_recall_2 {
145 $mixed_recall_2 = \&test_mixed_recall_2;
149 my $desc = "recalling in the coderef passed to uplevel (mixed 2)";
151 my ($expected, $got) = eval { test_mixed_recall_2(1), four($mixed_recall_2_bis) };
152 is $@, '', "$desc: no error";
153 $expected->[1]->[3] = 'main::four';
154 is_deeply $got, $expected, "$desc: correct call stack";