RosettaCodeData/Task/Stack-traces/Phix/stack-traces-1.phix

57 lines
1.3 KiB
Plaintext

constant W = machine_word(),
{RTN,PREVEBP} = iff(W=4?{8,20}:{16,40})
procedure show_stack()
sequence symtab, symtabN
integer rtn
atom prev_ebp
#ilASM{
[32]
lea edi,[symtab]
call :%opGetST -- [edi]=symtab (ie our local:=the real symtab)
mov edi,[ebp+20] -- prev_ebp
mov eax,[edi+8] -- calling routine no
mov [rtn],eax
mov eax,edi
lea edi,[prev_ebp]
call :%pStoreMint
[64]
lea rdi,[symtab]
call :%opGetST -- [rdi]=symtab (ie our local:=the real symtab)
mov rdi,[rbp+40] -- prev_ebp
mov rax,[rdi+16] -- calling routine no
mov [rtn],rax
mov rax,rdi
lea rdi,[prev_ebp]
call :%pStoreMint
[]
}
while rtn!=21 do -- (T_maintls, main top level routine, always present)
symtabN = symtab[rtn]
?symtabN[1]
prev_ebp = peekNS(prev_ebp+PREVEBP,W,0)
rtn = peekNS(prev_ebp+RTN,W,0)
end while
end procedure
procedure three(bool die)
if die then
?9/0
else
show_stack()
end if
end procedure
procedure two(bool die)
three(die)
end procedure
procedure one(bool die)
two(die)
end procedure
one(0)
?routine_id("dummy") -- see note below
one(1)