diff --git a/runtime/internal/clite/debug/_wrap/debug_wasm.c b/runtime/internal/clite/debug/_wrap/debug_wasm.c new file mode 100644 index 00000000..7e0efcf9 --- /dev/null +++ b/runtime/internal/clite/debug/_wrap/debug_wasm.c @@ -0,0 +1,31 @@ +#ifdef __EMSCRIPTEN__ +//emscripten +#include + +void llgo_print_stack(int skip) { + EM_ASM({ + function getStackTrace() { + var stack; + try { + throw new Error(); + } catch (e) { + stack = e.stack; + } + return stack; + } + + var stack = getStackTrace(); + if (stack) { + var frames = stack.split('\n').slice($0); + frames.forEach(function(frame) { + console.log(frame.trim()); + }); + } + }, skip); +} +#else +// wasi +void llgo_print_stack(int skip){ + +} +#endif diff --git a/runtime/internal/clite/debug/debug.go b/runtime/internal/clite/debug/debug.go index 7a1efc4d..67109984 100644 --- a/runtime/internal/clite/debug/debug.go +++ b/runtime/internal/clite/debug/debug.go @@ -44,3 +44,12 @@ func StackTrace(skip int, fn func(fr *Frame) bool) { return 1 }) } + +func PrintStack(skip int) { + StackTrace(skip+1, func(fr *Frame) bool { + var info Info + Addrinfo(unsafe.Pointer(fr.PC), &info) + c.Fprintf(c.Stderr, c.Str("[0x%08X %s+0x%x, SP = 0x%x]\n"), fr.PC, fr.Name, fr.Offset, fr.SP) + return true + }) +} diff --git a/runtime/internal/clite/debug/debug_wasm.go b/runtime/internal/clite/debug/debug_wasm.go index a4d6e4c6..08bde338 100644 --- a/runtime/internal/clite/debug/debug_wasm.go +++ b/runtime/internal/clite/debug/debug_wasm.go @@ -6,6 +6,10 @@ import ( c "github.com/goplus/llgo/runtime/internal/clite" ) +const ( + LLGoFiles = "_wrap/debug_wasm.c" +) + type Info struct { Fname *c.Char Fbase c.Pointer @@ -31,3 +35,10 @@ type Frame struct { func StackTrace(skip int, fn func(fr *Frame) bool) { panic("not implemented") } + +func PrintStack(skip int) { + print_stack(c.Int(skip + 4)) +} + +//go:linkname print_stack C.llgo_print_stack +func print_stack(skip c.Int) diff --git a/runtime/internal/runtime/z_rt.go b/runtime/internal/runtime/z_rt.go index e2809856..fa29c25d 100644 --- a/runtime/internal/runtime/z_rt.go +++ b/runtime/internal/runtime/z_rt.go @@ -62,13 +62,7 @@ func Rethrow(link *Defer) { if ptr := excepKey.Get(); ptr != nil { if link == nil { TracePanic(*(*any)(ptr)) - debug.StackTrace(0, func(fr *debug.Frame) bool { - var info debug.Info - debug.Addrinfo(unsafe.Pointer(fr.PC), &info) - c.Fprintf(c.Stderr, c.Str("[0x%08X %s+0x%x, SP = 0x%x]\n"), fr.PC, fr.Name, fr.Offset, fr.SP) - return true - }) - + debug.PrintStack(2) c.Free(ptr) c.Exit(2) } else {