Pooh program example 04-strace-test.p
# show stack trace of deep nested function (showstack function) println( ~msg recurse( ~num 5 ) ) sub recurse( num ) loc = num * num if num > 0 return loc + recurse( ~num num - 1 ) else showstack() return 1 end end
56Trace output for 04-strace-test.p
005|println( ~msg recurse( ~num 5 )... 008| loc = (num:5 * num:5):25 009| if (num:5 > 0):true 010| return (loc:25 + recurse( ~num (num:5 - 1):4 )... 008| loc = (num:4 * num:4):16 009| if (num:4 > 0):true 010| return (loc:16 + recurse( ~num (num:4 - 1):3 )... 008| loc = (num:3 * num:3):9 009| if (num:3 > 0):true 010| return (loc:9 + recurse( ~num (num:3 - 1):2 )... 008| loc = (num:2 * num:2):4 009| if (num:2 > 0):true 010| return (loc:4 + recurse( ~num (num:2 - 1):1 )... 008| loc = (num:1 * num:1):1 009| if (num:1 > 0):true 010| return (loc:1 + recurse( ~num (num:1 - 1):0 )... 008| loc = (num:0 * num:0):0 009| if (num:0 > 0):false 010| else 012| showstack( )... #1 showstack() 12 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | showstack() | #2 recurse(~num 0) Locals: loc = 0 10 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | return loc + recurse( ~num num - 1 ) | #3 recurse(~num 1) Locals: loc = 1 10 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | return loc + recurse( ~num num - 1 ) | #4 recurse(~num 2) Locals: loc = 4 10 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | return loc + recurse( ~num num - 1 ) | #5 recurse(~num 3) Locals: loc = 9 10 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | return loc + recurse( ~num num - 1 ) | #6 recurse(~num 4) Locals: loc = 16 10 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... | return loc + recurse( ~num num - 1 ) | #7 recurse(~num 5) Locals: loc = 25 5 |:....+....:....+....:....+....:....+....:....+....:....+....:....+....:....+.... |println( ~msg recurse( ~num 5 ) ) | 013| return 1 013| end # if 010| return (loc:1 + recurse( ~num (num:1 - 1):0 ):1):2 010| end # if 010| return (loc:4 + recurse( ~num (num:2 - 1):1 ):2):6 010| end # if 010| return (loc:9 + recurse( ~num (num:3 - 1):2 ):6):15 010| end # if 010| return (loc:16 + recurse( ~num (num:4 - 1):3 ):15):31 010| end # if 010| return (loc:25 + recurse( ~num (num:5 - 1):4 ):31):56 010| end # if 005|println( ~msg recurse( ~num 5 ):56 )...