core: Start on a stack walker

This commit is contained in:
Brian Anderson
2012-06-05 18:47:18 -07:00
parent 231097960c
commit 5f4837ad6a
5 changed files with 94 additions and 5 deletions

54
src/libcore/stackwalk.rs Normal file
View File

@@ -0,0 +1,54 @@
import libc::uintptr_t;
class frame {
let fp: uintptr_t;
new(fp: uintptr_t) {
self.fp = fp;
}
}
fn walk_stack(visit: fn(frame) -> bool) {
frame_address { |frame_pointer|
let frame_address = unsafe {
unsafe::reinterpret_cast(frame_pointer)
};
visit(frame(frame_address));
}
}
#[test]
fn test() {
for walk_stack { |frame|
#debug("frame: %x", frame.fp);
// breakpoint();
}
}
fn breakpoint() {
rustrt::rust_dbg_breakpoint()
}
fn frame_address(f: fn(*u8)) {
rusti::frame_address(f)
}
native mod rustrt {
fn rust_dbg_breakpoint();
}
// FIXME: Unconditionalize after snapshot
#[cfg(stage1)]
#[cfg(stage2)]
#[cfg(stage3)]
#[abi = "rust-intrinsic"]
native mod rusti {
fn frame_address(f: fn(*u8));
}
#[cfg(stage0)]
mod rusti {
fn frame_address(_f: fn(*u8)) {
fail;
}
}