Pooh program example 04-strace-test.p

Test 04-strace-test.p

Source of programm

# 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



Standard output for 04-strace-test.p

56

Trace 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 )...