Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › debug/ › SelfInfo/ › Windows.zig › unwindFrame
unwindFrame
Windows.unwindFrame
pub fn unwindFrame (si : *SelfInfo , io : Io , context : *UnwindContext ) Error !usize
File
Code
pub fn unwindFrame (si : *SelfInfo , io : Io , context : *UnwindContext ) Error !usize {
_ = si ;
_ = io ;
const current_regs = context .cur .getRegs ();
var image_base : usize = undefined ;
if (windows .ntdll .RtlLookupFunctionEntry (current_regs .ip , &image_base , &context .history_table )) |runtime_function | {
var handler_data : ?*anyopaque = null ;
var establisher_frame : usize = undefined ;
_ = windows .ntdll .RtlVirtualUnwind (
windows .UNW_FLAG_NHANDLER ,
image_base ,
current_regs .ip ,
runtime_function ,
&context .cur ,
&handler_data ,
&establisher_frame ,
null ,
);
} else {
context .cur .setIp (@as (*const usize , @ptrFromInt (current_regs .sp )).*);
context .cur .setSp (current_regs .sp + @sizeOf (usize ));
}
const next_regs = context .cur .getRegs ();
const tib = &windows .teb ().NtTib ;
if (next_regs .sp < @intFromPtr (tib .StackLimit ) or next_regs .sp > @intFromPtr (tib .StackBase )) {
context .pc = 0 ;
return 0 ;
}
// function's last instruction making `next_regs.ip` one byte past its end.
context .pc = next_regs .ip -| 1 ;
return next_regs .ip ;
}