1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-21 02:27:10 +03:00
mal/wasm/debug.wam

286 lines
8.7 KiB
Plaintext
Raw Normal View History

(module $debug
(func $checkpoint_user_memory
(global.set $mem_user_start (global.get $mem_unused_start))
(global.set $string_mem_user_start (global.get $string_mem_next))
)
(func $CHECK_FREE_LIST (result i32)
2018-11-12 02:55:38 +03:00
(LET $first (i32.add
(global.get $mem)
(i32.mul (global.get $mem_free_list) 4))
2018-11-12 02:55:38 +03:00
$count 0)
(block $done
(loop $loop
2018-11-12 02:55:38 +03:00
(br_if $done
(i32.ge_s $first
(i32.add (global.get $mem)
(i32.mul (global.get $mem_unused_start)
2018-11-12 02:55:38 +03:00
4))))
(local.set $count (i32.add $count ($MalVal_size $first)))
(local.set $first (i32.add (global.get $mem) (i32.mul 4 ($VAL0 $first))))
(br $loop)
)
)
$count
)
(func $PR_MEMORY_SUMMARY_SMALL
(LET $free (i32.sub (global.get $MEM_SIZE)
(i32.mul (global.get $mem_unused_start) 4))
2018-11-12 02:55:38 +03:00
$free_list_count ($CHECK_FREE_LIST)
$mv (global.get $NIL)
2018-11-12 02:55:38 +03:00
$mem_ref_count 0)
(block $done
(loop $loop
2018-11-12 02:55:38 +03:00
(br_if $done (i32.ge_s $mv (i32.add
(global.get $mem)
(i32.mul (global.get $mem_unused_start)
2018-11-12 02:55:38 +03:00
4))))
(if (i32.ne ($TYPE $mv) (global.get $FREE_T))
(local.set $mem_ref_count (i32.add $mem_ref_count
(i32.shr_u
(i32.load $mv)
5))))
(local.set $mv (i32.add $mv (i32.mul 4 ($MalVal_size $mv))))
(br $loop)
)
)
($printf_3 "Free: %d, Values: %d (refs: %d), Emptys: "
$free
(i32.sub
(i32.sub (global.get $mem_unused_start) 1)
$free_list_count)
$mem_ref_count)
(local.set $mv (global.get $NIL))
(block $done
(loop $loop
(br_if $done (i32.gt_s $mv (global.get $TRUE)))
($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
(local.set $mv (i32.add $mv 8))
(br $loop)
)
)
(local.set $mv (global.get $EMPTY_LIST))
(block $done
(loop $loop
(br_if $done (i32.gt_s $mv (global.get $EMPTY_HASHMAP)))
($printf_1 "%d," (i32.div_s (i32.load $mv) 32))
(local.set $mv (i32.add $mv 12))
(br $loop)
)
)
($print "\n")
)
(func $PR_VALUE (param $fmt i32 $mv i32)
2018-11-12 02:55:38 +03:00
(LET $temp ($pr_str $mv 1))
($printf_1 $fmt ($to_String $temp))
($RELEASE $temp)
)
(func $PR_MEMORY_VALUE (param $idx i32) (result i32)
;;; mv = mem + idx
2018-11-12 02:55:38 +03:00
(LET $mv ($MalVal_ptr $idx)
$type ($TYPE $mv)
$size ($MalVal_size $mv)
$val0 ($MalVal_val $idx 0))
($printf_2 "%4d: type %2d" $idx $type)
(if (i32.eq $type 15)
(then ($printf_1 ", size %2d" $size))
(else ($printf_1 ", refs %2d" ($REFS $mv))))
(if (OR (i32.eq $type (global.get $STRING_T))
(i32.eq $type (global.get $SYMBOL_T)))
;; for strings/symbolx pointers, print hex values
(then ($printf_2 " [%4d|%3ds" ($MalVal_refcnt_type $idx) $val0))
(else ($printf_2 " [%4d|%4d" ($MalVal_refcnt_type $idx) $val0)))
(if (i32.eq $size 2)
(then
($print "|----|----]"))
(else
($printf_1 "|%4d" ($MalVal_val $idx 1))
(if (i32.eq $size 3)
(then ($print "|----]"))
(else ($printf_1 "|%4d]" ($MalVal_val $idx 2))))))
;;; printf(" >> ")
($print " >> ")
(block $done (block $unknown
(block (block (block (block (block (block (block (block
(block (block (block (block (block (block (block (block
(br_table 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$unknown $type))
;; 0: nil
($print "nil")
(br $done))
;; 1: boolean
(if (i32.eq $val0 0)
;; true
($print "false")
;; false
($print "true"))
(br $done))
;; 2: integer
($printf_1 "%d" $val0)
(br $done))
;; 3: float/ERROR
($print " *** GOT FLOAT *** ")
(br $done))
;; 4: string/kw
($printf_1 "'%s'" ($to_String $mv))
(br $done))
;; 5: symbol
($print ($to_String $mv))
(br $done))
;; 6: list
(if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
(then
($print "()"))
(else
;;; printf("(... %d ...), next: %d\n", mv->val[1], mv->val[0])
($printf_2 "(... %d ...), next: %d"
($MalVal_val $idx 1)
($MalVal_val $idx 0))))
(br $done))
;; 7: vector
(if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
(then
($print "[]"))
(else
;;; printf("[... %d ...], next: %d\n", mv->val[1], mv->val[0])val
($printf_2 "[... %d ...], next: %d"
($MalVal_val $idx 1)
($MalVal_val $idx 0))))
(br $done))
;; 8: hashmap
(if (i32.le_u $mv (global.get $EMPTY_HASHMAP))
(then
($print "{}"))
(else
;;; printf("{... '%s'(%d) : %d ...}\n",
;; to_String(mem + mv->val[1]), mv->val[1], mv->val[2])
($printf_3 "{... '%s'(%d) : %d ...}"
($to_String ($MalVal_ptr ($MalVal_val $idx 1)))
($MalVal_val $idx 1)
($MalVal_val $idx 2))))
(br $done))
;; 9: function
($print "function")
(br $done))
;; 10: mal function
($print "mal function")
(br $done))
;; 11: macro fn
($print "macro fn")
(br $done))
;; 12: atom
($print "atom")
(br $done))
;; 13: environment
($print "environment")
(br $done))
;; 14: metadata
($print "metadata")
(br $done))
;; 15: FREE
($printf_1 "FREE next: 0x%x" $val0)
(if (i32.eq $idx (global.get $mem_free_list))
($print " (free start)"))
(if (i32.eq $val0 (global.get $mem_unused_start))
($print " (free end)"))
(br $done))
;; 16: unknown
($print "unknown")
)
($print "\n")
(i32.add $size $idx)
)
(func $PR_STRINGS (param $start i32)
2018-11-12 02:55:38 +03:00
(LET $ms 0
$idx 0)
($printf_2 "String - showing %d -> %d:\n"
$start (i32.sub (global.get $string_mem_next)
(global.get $string_mem)))
(if (i32.le_s (i32.sub (global.get $string_mem_next)
(global.get $string_mem))
$start)
(then ($print " ---\n"))
(else
(local.set $ms (global.get $string_mem))
(block $done
(loop $loop
(br_if $done (i32.ge_u $ms (global.get $string_mem_next)))
(local.set $idx (i32.sub $ms (global.get $string_mem)))
(if (i32.ge_s $idx $start)
($printf_4 "%4d: refs %2d, size %2d >> '%s'\n"
$idx
(i32.load16_u $ms)
(i32.load16_u (i32.add $ms 2))
(i32.add $ms 4)))
(local.set $ms (i32.add $ms (i32.load16_u (i32.add $ms 2))))
(br $loop)
)
)))
)
(func $PR_MEMORY (param $start i32 $end i32)
2018-11-12 02:55:38 +03:00
(LET $string_start 0
$idx 0)
(if (i32.lt_s $start 0)
(then
(local.set $start (global.get $mem_user_start))
(local.set $string_start (i32.sub (global.get $string_mem_user_start)
(global.get $string_mem)))))
(if (i32.lt_s $end 0)
(local.set $end (global.get $mem_unused_start)))
;;; printf("Values - (mem) showing %d -> %d", start, end)
;;; printf(" (unused start: %d, free list: %d):\n",
;;; mem_unused_start, mem_free_list)
($printf_4 "Values - (mem) showing 0x%x -> 0x%x (unused start: 0x%x, free list: 0x%x):\n"
$start
$end
(global.get $mem_unused_start)
(global.get $mem_free_list))
(if (i32.le_s $end $start)
(then
($print " ---\n")
(local.set $end (global.get $mem_unused_start)))
(else
(local.set $idx $start)
;;; while (idx < end)
(block $loopvals_exit
(loop $loopvals
2018-11-12 02:55:38 +03:00
(br_if $loopvals_exit (i32.ge_s $idx $end))
(local.set $idx ($PR_MEMORY_VALUE $idx))
(br $loopvals)
)
)))
($PR_STRINGS $string_start)
($PR_MEMORY_SUMMARY_SMALL)
)
(func $PR_MEMORY_RAW (param $start i32 $end i32)
(block $loop_exit
(loop $loop
2018-11-12 02:55:38 +03:00
(br_if $loop_exit (i32.ge_u $start $end))
($printf_2 "0x%x 0x%x\n" $start (i32.load $start))
(local.set $start (i32.add 4 $start))
(br $loop)
)
)
)
)