123456789101112131415161718192021222324252627282930313233343536373839 |
- import std/stackframes
- # line 5
- var count = 0
- proc main1(n: int) =
- setFrameMsg $("main1", n)
- if n > 0:
- main1(n-1)
- proc main2(n: int) =
- count.inc
- setFrameMsg $("main2", n, count)
- proc bar() =
- setFrameMsg $("bar ",)
- if n < 3: raise newException(CatchableError, "on purpose")
- bar()
- main2(n-1)
- proc main() =
- var z = 0
- setFrameMsg "\n z: " & $z, prefix = ""
- # multiple calls inside a frame are possible
- z.inc
- setFrameMsg "\n z: " & $z, prefix = ""
- try:
- main2(5)
- except CatchableError:
- main1(10) # goes deep and then unwinds; sanity check to ensure `setFrameMsg` from inside
- # `main1` won't invalidate the stacktrace; if StackTraceEntry.frameMsg
- # were a reference instead of a copy, this would fail.
- let e = getCurrentException()
- let trace = e.getStackTrace
- echo trace
- main()
|