forked from min-lang/min
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcall.m
30 lines (21 loc) · 763 Bytes
/
call.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# call stacks, stack trace
https://en.wikipedia.org/wiki/Stack_trace
rows = %0 : %*(N,S)
row_size = 96
name_size = row_size - 1 - 8 : N
add spot:Spot mem:N fun:S call:S =
# todo - string pool, strings of variable length
Trap.bit & Ref.seq_add Call.rows (mem, S.fill '$s:$,$s$,$s' [spot.Spot.str1, fun, call])
if mem:N base:0 : B =
n = Mem.base base 0
# todo - print non-call addresses as local variables on stack
mem == n &
Log.main (Mem.str (base + 8).Mem.of)
1
main mem:N =
n = !Sys.call_size
N.any (_ i:N : B = if mem (!Sys.call_head + i*Call.row_size)) n . Z
add_flow_at flow:Flow base,call:N,S =
Flow.nat3 flow base
Flow.str_size_nil flow call name_size
add_flow flow:Flow = Trap.bit & List.do !rows (add_flow_at flow)