DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / wasm / debug.wam
CommitLineData
33309c6a
JM
1(module $debug
2
456d0a21 3 (func $checkpoint_user_memory
0a19c2f1
JM
4 (global.set $mem_user_start (global.get $mem_unused_start))
5 (global.set $string_mem_user_start (global.get $string_mem_next))
456d0a21
JM
6 )
7
3ea09886 8 (func $CHECK_FREE_LIST (result i32)
349faa83 9 (LET $first (i32.add
0a19c2f1
JM
10 (global.get $mem)
11 (i32.mul (global.get $mem_free_list) 4))
349faa83 12 $count 0)
3ea09886
JM
13
14 (block $done
15 (loop $loop
349faa83
JM
16 (br_if $done
17 (i32.ge_s $first
0a19c2f1
JM
18 (i32.add (global.get $mem)
19 (i32.mul (global.get $mem_unused_start)
349faa83 20 4))))
0a19c2f1
JM
21 (local.set $count (i32.add $count ($MalVal_size $first)))
22 (local.set $first (i32.add (global.get $mem) (i32.mul 4 ($VAL0 $first))))
3ea09886
JM
23 (br $loop)
24 )
25 )
26 $count
27 )
28
29 (func $PR_MEMORY_SUMMARY_SMALL
0a19c2f1
JM
30 (LET $free (i32.sub (global.get $MEM_SIZE)
31 (i32.mul (global.get $mem_unused_start) 4))
349faa83 32 $free_list_count ($CHECK_FREE_LIST)
0a19c2f1 33 $mv (global.get $NIL)
349faa83 34 $mem_ref_count 0)
3ea09886 35
3ea09886
JM
36 (block $done
37 (loop $loop
349faa83 38 (br_if $done (i32.ge_s $mv (i32.add
0a19c2f1
JM
39 (global.get $mem)
40 (i32.mul (global.get $mem_unused_start)
349faa83 41 4))))
0a19c2f1
JM
42 (if (i32.ne ($TYPE $mv) (global.get $FREE_T))
43 (local.set $mem_ref_count (i32.add $mem_ref_count
3ea09886
JM
44 (i32.shr_u
45 (i32.load $mv)
46 5))))
0a19c2f1 47 (local.set $mv (i32.add $mv (i32.mul 4 ($MalVal_size $mv))))
3ea09886
JM
48 (br $loop)
49 )
50 )
51
52 ($printf_3 "Free: %d, Values: %d (refs: %d), Emptys: "
53 $free
0c62f14e 54 (i32.sub
0a19c2f1 55 (i32.sub (global.get $mem_unused_start) 1)
3ea09886
JM
56 $free_list_count)
57 $mem_ref_count)
0a19c2f1 58 (local.set $mv (global.get $NIL))
3ea09886
JM
59 (block $done
60 (loop $loop
0a19c2f1 61 (br_if $done (i32.gt_s $mv (global.get $TRUE)))
3ea09886 62 ($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
0a19c2f1 63 (local.set $mv (i32.add $mv 8))
3ea09886
JM
64 (br $loop)
65 )
66 )
0a19c2f1 67 (local.set $mv (global.get $EMPTY_LIST))
3ea09886
JM
68 (block $done
69 (loop $loop
0a19c2f1 70 (br_if $done (i32.gt_s $mv (global.get $EMPTY_HASHMAP)))
3ea09886 71 ($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
0a19c2f1 72 (local.set $mv (i32.add $mv 12))
3ea09886
JM
73 (br $loop)
74 )
75 )
76 ($print "\n")
77 )
78
79 (func $PR_VALUE (param $fmt i32 $mv i32)
349faa83 80 (LET $temp ($pr_str $mv 1))
33309c6a
JM
81 ($printf_1 $fmt ($to_String $temp))
82 ($RELEASE $temp)
83 )
84
85 (func $PR_MEMORY_VALUE (param $idx i32) (result i32)
33309c6a 86 ;;; mv = mem + idx
349faa83
JM
87 (LET $mv ($MalVal_ptr $idx)
88 $type ($TYPE $mv)
89 $size ($MalVal_size $mv)
90 $val0 ($MalVal_val $idx 0))
33309c6a 91
456d0a21 92 ($printf_2 "%4d: type %2d" $idx $type)
33309c6a
JM
93
94 (if (i32.eq $type 15)
456d0a21
JM
95 (then ($printf_1 ", size %2d" $size))
96 (else ($printf_1 ", refs %2d" ($REFS $mv))))
33309c6a 97
0a19c2f1
JM
98 (if (OR (i32.eq $type (global.get $STRING_T))
99 (i32.eq $type (global.get $SYMBOL_T)))
3ea09886 100 ;; for strings/symbolx pointers, print hex values
456d0a21
JM
101 (then ($printf_2 " [%4d|%3ds" ($MalVal_refcnt_type $idx) $val0))
102 (else ($printf_2 " [%4d|%4d" ($MalVal_refcnt_type $idx) $val0)))
33309c6a
JM
103
104 (if (i32.eq $size 2)
105 (then
456d0a21 106 ($print "|----|----]"))
33309c6a 107 (else
456d0a21 108 ($printf_1 "|%4d" ($MalVal_val $idx 1))
33309c6a 109 (if (i32.eq $size 3)
456d0a21
JM
110 (then ($print "|----]"))
111 (else ($printf_1 "|%4d]" ($MalVal_val $idx 2))))))
33309c6a
JM
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
0a19c2f1 144 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
33309c6a
JM
145 (then
146 ($print "()"))
147 (else
148 ;;; printf("(... %d ...), next: %d\n", mv->val[1], mv->val[0])
456d0a21 149 ($printf_2 "(... %d ...), next: %d"
33309c6a
JM
150 ($MalVal_val $idx 1)
151 ($MalVal_val $idx 0))))
152 (br $done))
153 ;; 7: vector
0a19c2f1 154 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
33309c6a
JM
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
0a19c2f1 164 (if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
33309c6a
JM
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)
0a19c2f1 195 (if (i32.eq $idx (global.get $mem_free_list))
33309c6a 196 ($print " (free start)"))
0a19c2f1 197 (if (i32.eq $val0 (global.get $mem_unused_start))
33309c6a
JM
198 ($print " (free end)"))
199 (br $done))
200 ;; 16: unknown
201 ($print "unknown")
202 )
203
3ea09886 204 ($print "\n")
33309c6a
JM
205
206 (i32.add $size $idx)
207 )
208
50eea9ad 209 (func $PR_STRINGS (param $start i32)
349faa83
JM
210 (LET $ms 0
211 $idx 0)
50eea9ad 212 ($printf_2 "String - showing %d -> %d:\n"
0a19c2f1
JM
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))
50eea9ad
JM
217 $start)
218 (then ($print " ---\n"))
219 (else
0a19c2f1 220 (local.set $ms (global.get $string_mem))
50eea9ad
JM
221 (block $done
222 (loop $loop
0a19c2f1
JM
223 (br_if $done (i32.ge_u $ms (global.get $string_mem_next)))
224 (local.set $idx (i32.sub $ms (global.get $string_mem)))
50eea9ad
JM
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
0a19c2f1 232 (local.set $ms (i32.add $ms (i32.load16_u (i32.add $ms 2))))
50eea9ad
JM
233 (br $loop)
234 )
235 )))
236 )
237
3ea09886 238 (func $PR_MEMORY (param $start i32 $end i32)
349faa83
JM
239 (LET $string_start 0
240 $idx 0)
33309c6a 241 (if (i32.lt_s $start 0)
50eea9ad 242 (then
0a19c2f1
JM
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)))))
33309c6a 246 (if (i32.lt_s $end 0)
0a19c2f1 247 (local.set $end (global.get $mem_unused_start)))
33309c6a
JM
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
0a19c2f1
JM
254 (global.get $mem_unused_start)
255 (global.get $mem_free_list))
33309c6a
JM
256
257 (if (i32.le_s $end $start)
258 (then
259 ($print " ---\n")
0a19c2f1 260 (local.set $end (global.get $mem_unused_start)))
33309c6a 261 (else
0a19c2f1 262 (local.set $idx $start)
33309c6a
JM
263 ;;; while (idx < end)
264 (block $loopvals_exit
265 (loop $loopvals
349faa83 266 (br_if $loopvals_exit (i32.ge_s $idx $end))
0a19c2f1 267 (local.set $idx ($PR_MEMORY_VALUE $idx))
33309c6a
JM
268 (br $loopvals)
269 )
270 )))
50eea9ad 271 ($PR_STRINGS $string_start)
3ea09886 272 ($PR_MEMORY_SUMMARY_SMALL)
33309c6a
JM
273 )
274
3ea09886 275 (func $PR_MEMORY_RAW (param $start i32 $end i32)
33309c6a
JM
276 (block $loop_exit
277 (loop $loop
349faa83 278 (br_if $loop_exit (i32.ge_u $start $end))
33309c6a 279 ($printf_2 "0x%x 0x%x\n" $start (i32.load $start))
0a19c2f1 280 (local.set $start (i32.add 4 $start))
33309c6a
JM
281 (br $loop)
282 )
283 )
284 )
285)