Something went wrong. Try again.
A Bluesky Playdate client
Something went wrong. Try again.
2.8 kB · 74 lines
Zig
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475const std = @import("std");const pdapi = @import("playdate_api_definitions.zig");const builtin = @import("builtin");
var global_playdate: *pdapi.PlaydateAPI = undefined;pub fn init(playdate: *pdapi.PlaydateAPI) void { global_playdate = playdate;}
pub fn panic( msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, return_address: ?usize,) noreturn { _ = error_return_trace; _ = return_address;
switch (comptime builtin.os.tag) { .freestanding => { //Playdate hardware
//TODO: The Zig std library does not yet support stacktraces on Playdate hardware. //We will need to do this manually. Some notes on trying to get it working: //Frame pointer is R7 //Next Frame pointer is *R7 //Return address is *(R7+4) //To print out the trace corrently, //We need to know the load address and it doesn't seem to be exactly //0x6000_0000 as originally thought
global_playdate.system.logToConsole("PANIC: %s", msg.ptr); global_playdate.system.@"error"("PANIC: %s", msg.ptr); }, else => { //playdate simulator var stack_trace_buffer = [_]u8{0} ** 4096; var buffer = [_]u8{0} ** 4096; var stream = std.io.fixedBufferStream(&stack_trace_buffer);
const stack_trace_string = b: { if (builtin.strip_debug_info) { break :b "Unable to dump stack trace: Debug info stripped"; } const debug_info = std.debug.getSelfDebugInfo() catch |err| { const to_print = std.fmt.bufPrintZ( &buffer, "Unable to dump stack trace: Unable to open debug info: {s}\n", .{@errorName(err)}, ) catch break :b "Unable to dump stack trace: Unable to open debug info due unknown error"; break :b to_print; }; std.debug.writeCurrentStackTrace( stream.writer(), debug_info, .no_color, null, ) catch break :b "Unable to dump stack trace: Unknown error writng stack trace";
//NOTE: playdate.system.error (and all Playdate APIs that deal with strings) require a null termination const null_char_index = @min(stream.pos, stack_trace_buffer.len - 1); stack_trace_buffer[null_char_index] = 0;
break :b &stack_trace_buffer; }; global_playdate.system.@"error"( "PANIC: %s\n\n%s", msg.ptr, stack_trace_string.ptr, ); }, }
while (true) {}}