DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / wasm / debug.wam
1 (module $debug
2
3 (func $checkpoint_user_memory
4 (global.set $mem_user_start (global.get $mem_unused_start))
5 (global.set $string_mem_user_start (global.get $string_mem_next))
6 )
7
8 (func $CHECK_FREE_LIST (result i32)
9 (LET $first (i32.add
10 (global.get $mem)
11 (i32.mul (global.get $mem_free_list) 4))
12 $count 0)
13
14 (block $done
15 (loop $loop
16 (br_if $done
17 (i32.ge_s $first
18 (i32.add (global.get $mem)
19 (i32.mul (global.get $mem_unused_start)
20 4))))
21 (local.set $count (i32.add $count ($MalVal_size $first)))
22 (local.set $first (i32.add (global.get $mem) (i32.mul 4 ($VAL0 $first))))
23 (br $loop)
24 )
25 )
26 $count
27 )
28
29 (func $PR_MEMORY_SUMMARY_SMALL
30 (LET $free (i32.sub (global.get $MEM_SIZE)
31 (i32.mul (global.get $mem_unused_start) 4))
32 $free_list_count ($CHECK_FREE_LIST)
33 $mv (global.get $NIL)
34 $mem_ref_count 0)
35
36 (block $done
37 (loop $loop
38 (br_if $done (i32.ge_s $mv (i32.add
39 (global.get $mem)
40 (i32.mul (global.get $mem_unused_start)
41 4))))
42 (if (i32.ne ($TYPE $mv) (global.get $FREE_T))
43 (local.set $mem_ref_count (i32.add $mem_ref_count
44 (i32.shr_u
45 (i32.load $mv)
46 5))))
47 (local.set $mv (i32.add $mv (i32.mul 4 ($MalVal_size $mv))))
48 (br $loop)
49 )
50 )
51
52 ($printf_3 "Free: %d, Values: %d (refs: %d), Emptys: "
53 $free
54 (i32.sub
55 (i32.sub (global.get $mem_unused_start) 1)
56 $free_list_count)
57 $mem_ref_count)
58 (local.set $mv (global.get $NIL))
59 (block $done
60 (loop $loop
61 (br_if $done (i32.gt_s $mv (global.get $TRUE)))
62 ($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
63 (local.set $mv (i32.add $mv 8))
64 (br $loop)
65 )
66 )
67 (local.set $mv (global.get $EMPTY_LIST))
68 (block $done
69 (loop $loop
70 (br_if $done (i32.gt_s $mv (global.get $EMPTY_HASHMAP)))
71 ($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
72 (local.set $mv (i32.add $mv 12))
73 (br $loop)
74 )
75 )
76 ($print "\n")
77 )
78
79 (func $PR_VALUE (param $fmt i32 $mv i32)
80 (LET $temp ($pr_str $mv 1))
81 ($printf_1 $fmt ($to_String $temp))
82 ($RELEASE $temp)
83 )
84
85 (func $PR_MEMORY_VALUE (param $idx i32) (result i32)
86 ;;; mv = mem + idx
87 (LET $mv ($MalVal_ptr $idx)
88 $type ($TYPE $mv)
89 $size ($MalVal_size $mv)
90 $val0 ($MalVal_val $idx 0))
91
92 ($printf_2 "%4d: type %2d" $idx $type)
93
94 (if (i32.eq $type 15)
95 (then ($printf_1 ", size %2d" $size))
96 (else ($printf_1 ", refs %2d" ($REFS $mv))))
97
98 (if (OR (i32.eq $type (global.get $STRING_T))
99 (i32.eq $type (global.get $SYMBOL_T)))
100 ;; for strings/symbolx pointers, print hex values
101 (then ($printf_2 " [%4d|%3ds" ($MalVal_refcnt_type $idx) $val0))
102 (else ($printf_2 " [%4d|%4d" ($MalVal_refcnt_type $idx) $val0)))
103
104 (if (i32.eq $size 2)
105 (then
106 ($print "|----|----]"))
107 (else
108 ($printf_1 "|%4d" ($MalVal_val $idx 1))
109 (if (i32.eq $size 3)
110 (then ($print "|----]"))
111 (else ($printf_1 "|%4d]" ($MalVal_val $idx 2))))))
112
113 ;;; printf(" >> ")
114 ($print " >> ")
115
116 (block $done (block $unknown
117 (block (block (block (block (block (block (block (block
118 (block (block (block (block (block (block (block (block
119 (br_table 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
120 $unknown $type))
121 ;; 0: nil
122 ($print "nil")
123 (br $done))
124 ;; 1: boolean
125 (if (i32.eq $val0 0)
126 ;; true
127 ($print "false")
128 ;; false
129 ($print "true"))
130 (br $done))
131 ;; 2: integer
132 ($printf_1 "%d" $val0)
133 (br $done))
134 ;; 3: float/ERROR
135 ($print " *** GOT FLOAT *** ")
136 (br $done))
137 ;; 4: string/kw
138 ($printf_1 "'%s'" ($to_String $mv))
139 (br $done))
140 ;; 5: symbol
141 ($print ($to_String $mv))
142 (br $done))
143 ;; 6: list
144 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
145 (then
146 ($print "()"))
147 (else
148 ;;; printf("(... %d ...), next: %d\n", mv->val[1], mv->val[0])
149 ($printf_2 "(... %d ...), next: %d"
150 ($MalVal_val $idx 1)
151 ($MalVal_val $idx 0))))
152 (br $done))
153 ;; 7: vector
154 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
155 (then
156 ($print "[]"))
157 (else
158 ;;; printf("[... %d ...], next: %d\n", mv->val[1], mv->val[0])val
159 ($printf_2 "[... %d ...], next: %d"
160 ($MalVal_val $idx 1)
161 ($MalVal_val $idx 0))))
162 (br $done))
163 ;; 8: hashmap
164 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
165 (then
166 ($print "{}"))
167 (else
168 ;;; printf("{... '%s'(%d) : %d ...}\n",
169 ;; to_String(mem + mv->val[1]), mv->val[1], mv->val[2])
170 ($printf_3 "{... '%s'(%d) : %d ...}"
171 ($to_String ($MalVal_ptr ($MalVal_val $idx 1)))
172 ($MalVal_val $idx 1)
173 ($MalVal_val $idx 2))))
174 (br $done))
175 ;; 9: function
176 ($print "function")
177 (br $done))
178 ;; 10: mal function
179 ($print "mal function")
180 (br $done))
181 ;; 11: macro fn
182 ($print "macro fn")
183 (br $done))
184 ;; 12: atom
185 ($print "atom")
186 (br $done))
187 ;; 13: environment
188 ($print "environment")
189 (br $done))
190 ;; 14: metadata
191 ($print "metadata")
192 (br $done))
193 ;; 15: FREE
194 ($printf_1 "FREE next: 0x%x" $val0)
195 (if (i32.eq $idx (global.get $mem_free_list))
196 ($print " (free start)"))
197 (if (i32.eq $val0 (global.get $mem_unused_start))
198 ($print " (free end)"))
199 (br $done))
200 ;; 16: unknown
201 ($print "unknown")
202 )
203
204 ($print "\n")
205
206 (i32.add $size $idx)
207 )
208
209 (func $PR_STRINGS (param $start i32)
210 (LET $ms 0
211 $idx 0)
212 ($printf_2 "String - showing %d -> %d:\n"
213 $start (i32.sub (global.get $string_mem_next)
214 (global.get $string_mem)))
215 (if (i32.le_s (i32.sub (global.get $string_mem_next)
216 (global.get $string_mem))
217 $start)
218 (then ($print " ---\n"))
219 (else
220 (local.set $ms (global.get $string_mem))
221 (block $done
222 (loop $loop
223 (br_if $done (i32.ge_u $ms (global.get $string_mem_next)))
224 (local.set $idx (i32.sub $ms (global.get $string_mem)))
225 (if (i32.ge_s $idx $start)
226 ($printf_4 "%4d: refs %2d, size %2d >> '%s'\n"
227 $idx
228 (i32.load16_u $ms)
229 (i32.load16_u (i32.add $ms 2))
230 (i32.add $ms 4)))
231
232 (local.set $ms (i32.add $ms (i32.load16_u (i32.add $ms 2))))
233 (br $loop)
234 )
235 )))
236 )
237
238 (func $PR_MEMORY (param $start i32 $end i32)
239 (LET $string_start 0
240 $idx 0)
241 (if (i32.lt_s $start 0)
242 (then
243 (local.set $start (global.get $mem_user_start))
244 (local.set $string_start (i32.sub (global.get $string_mem_user_start)
245 (global.get $string_mem)))))
246 (if (i32.lt_s $end 0)
247 (local.set $end (global.get $mem_unused_start)))
248 ;;; printf("Values - (mem) showing %d -> %d", start, end)
249 ;;; printf(" (unused start: %d, free list: %d):\n",
250 ;;; mem_unused_start, mem_free_list)
251 ($printf_4 "Values - (mem) showing 0x%x -> 0x%x (unused start: 0x%x, free list: 0x%x):\n"
252 $start
253 $end
254 (global.get $mem_unused_start)
255 (global.get $mem_free_list))
256
257 (if (i32.le_s $end $start)
258 (then
259 ($print " ---\n")
260 (local.set $end (global.get $mem_unused_start)))
261 (else
262 (local.set $idx $start)
263 ;;; while (idx < end)
264 (block $loopvals_exit
265 (loop $loopvals
266 (br_if $loopvals_exit (i32.ge_s $idx $end))
267 (local.set $idx ($PR_MEMORY_VALUE $idx))
268 (br $loopvals)
269 )
270 )))
271 ($PR_STRINGS $string_start)
272 ($PR_MEMORY_SUMMARY_SMALL)
273 )
274
275 (func $PR_MEMORY_RAW (param $start i32 $end i32)
276 (block $loop_exit
277 (loop $loop
278 (br_if $loop_exit (i32.ge_u $start $end))
279 ($printf_2 "0x%x 0x%x\n" $start (i32.load $start))
280 (local.set $start (i32.add 4 $start))
281 (br $loop)
282 )
283 )
284 )
285 )