| ... | ... | @@ -2,7 +2,7 @@ const std = @import("std"); |
| 2 | 2 | const debug = std.debug; |
| 3 | 3 | const testing = std.testing; |
| 4 | 4 | |
| 5 | | noinline fn frame4(expected: *[4]usize, unwound: *[4]usize) void { |
| 5 | noinline fn frame4(expected: *[5]usize, unwound: *[5]usize) void { |
| 6 | 6 | expected[0] = @returnAddress(); |
| 7 | 7 | |
| 8 | 8 | var context: debug.ThreadContext = undefined; |
| ... | ... | @@ -17,26 +17,27 @@ noinline fn frame4(expected: *[4]usize, unwound: *[4]usize) void { |
| 17 | 17 | } |
| 18 | 18 | } |
| 19 | 19 | |
| 20 | | noinline fn frame3(expected: *[4]usize, unwound: *[4]usize) void { |
| 20 | noinline fn frame3(expected: *[5]usize, unwound: *[5]usize) void { |
| 21 | 21 | expected[1] = @returnAddress(); |
| 22 | 22 | frame4(expected, unwound); |
| 23 | 23 | } |
| 24 | 24 | |
| 25 | | fn frame2(expected: *[4]usize, unwound: *[4]usize) callconv(.C) void { |
| 25 | fn frame2(expected: *[5]usize, unwound: *[5]usize) callconv(.C) void { |
| 26 | expected[2] = @returnAddress(); |
| 26 | 27 | frame3(expected, unwound); |
| 27 | 28 | } |
| 28 | 29 | |
| 29 | 30 | extern fn frame0( |
| 30 | | expected: *[4]usize, |
| 31 | | unwound: *[4]usize, |
| 32 | | frame_2: *const fn (expected: *[4]usize, unwound: *[4]usize) callconv(.C) void, |
| 31 | expected: *[5]usize, |
| 32 | unwound: *[5]usize, |
| 33 | frame_2: *const fn (expected: *[5]usize, unwound: *[5]usize) callconv(.C) void, |
| 33 | 34 | ) void; |
| 34 | 35 | |
| 35 | 36 | pub fn main() !void { |
| 36 | 37 | if (!std.debug.have_ucontext or !std.debug.have_getcontext) return; |
| 37 | 38 | |
| 38 | | var expected: [4]usize = undefined; |
| 39 | | var unwound: [4]usize = undefined; |
| 39 | var expected: [5]usize = undefined; |
| 40 | var unwound: [5]usize = undefined; |
| 40 | 41 | frame0(&expected, &unwound, &frame2); |
| 41 | 42 | try testing.expectEqual(expected, unwound); |
| 42 | 43 | } |