DISABLE FDs (REMOVE ME).
[jackhill/mal.git] / wasm / printer.wam
CommitLineData
33309c6a
JM
1(module $printer
2
3ea09886
JM
3 (global $printer_buf (mut i32) 0)
4
5 (func $pr_str_val (param $res i32 $mv i32 $print_readably i32) (result i32)
349faa83
JM
6 (LET $type ($TYPE $mv)
7 $val0 ($VAL0 $mv)
8 $sval 0)
33309c6a
JM
9
10 ;;; switch(type)
11 (block $done
12 (block $default
13 (block (block (block (block (block (block (block (block
14 (block (block (block (block (block (block (block (block
15 (br_table 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $type))
16 ;; 0: nil
3ea09886 17 ($memmove $res "nil" 4)
0a19c2f1 18 (local.set $res (i32.add 3 $res))
33309c6a
JM
19 (br $done))
20 ;; 1: boolean
21 (if (i32.eq $val0 0)
22 (then
23 ;; false
3ea09886 24 ($memmove $res "false" 6)
0a19c2f1 25 (local.set $res (i32.add 5 $res)))
33309c6a
JM
26 (else
27 ;; true
3ea09886 28 ($memmove $res "true" 5)
0a19c2f1 29 (local.set $res (i32.add 4 $res))))
33309c6a
JM
30 (br $done))
31 ;; 2: integer
0a19c2f1 32 (local.set $res ($sprintf_1 $res "%d" $val0))
33309c6a
JM
33 (br $done))
34 ;; 3: float/ERROR
0a19c2f1 35 (local.set $res ($sprintf_1 $res "%d" " *** GOT FLOAT *** "))
33309c6a
JM
36 (br $done))
37 ;; 4: string/kw
0a19c2f1 38 (local.set $sval ($to_String $mv))
33309c6a
JM
39 (if (i32.eq (i32.load8_u $sval) (CHR "\x7f"))
40 (then
0a19c2f1 41 (local.set $res ($sprintf_1 $res ":%s" (i32.add $sval 1))))
3ea09886
JM
42 (else (if $print_readably
43 (then
44 ;; escape backslashes, quotes, and newlines
0a19c2f1
JM
45 (local.set $res ($sprintf_1 $res "\"" 0))
46 (local.set $res (i32.add $res ($REPLACE3 $res ($to_String $mv)
3ea09886
JM
47 "\\" "\\\\"
48 "\"" "\\\""
49 "\n" "\\n")))
0a19c2f1 50 (local.set $res ($sprintf_1 $res "\"" 0)))
3ea09886 51 (else
0a19c2f1 52 (local.set $res ($sprintf_1 $res "%s" $sval))))))
33309c6a
JM
53 (br $done))
54 ;; 5: symbol
0a19c2f1 55 (local.set $res ($sprintf_1 $res "%s" ($to_String $mv)))
33309c6a
JM
56 (br $done))
57 ;; 6: list, fallthrouogh
58 )
59 ;; 7: vector, fallthrough
60 )
61 ;; 8: hashmap
0a19c2f1 62 (local.set
33309c6a 63 $res ($sprintf_1 $res "%c"
0a19c2f1 64 (if (result i32) (i32.eq $type (global.get $LIST_T))
77bf4e61 65 (then (CHR "("))
0a19c2f1 66 (else (if (result i32) (i32.eq $type (global.get $VECTOR_T))
77bf4e61 67 (then (CHR "["))
33309c6a
JM
68 (else (CHR "{")))))))
69 ;; PR_SEQ_LOOP
70 ;;; while (VAL0(mv) != 0)
71 (block $done_seq
72 (loop $seq_loop
349faa83 73 (br_if $done_seq (i32.eq ($VAL0 $mv) 0))
33309c6a 74 ;;; res = pr_str_val(res, MEM_VAL1(mv), print_readably)
0a19c2f1 75 (local.set $res ($pr_str_val $res ($MEM_VAL1_ptr $mv) $print_readably))
33309c6a
JM
76
77 ;; if this is a hash-map, print the next element
0a19c2f1 78 (if (i32.eq $type (global.get $HASHMAP_T))
33309c6a
JM
79 (then
80 ;;; res += snprintf(res, 2, " ")
0a19c2f1
JM
81 (local.set $res ($sprintf_1 $res " " 0))
82 (local.set $res ($pr_str_val $res ($MEM_VAL2_ptr $mv)
3ea09886 83 $print_readably))))
33309c6a 84 ;;; mv = MEM_VAL0(mv)
0a19c2f1 85 (local.set $mv ($MEM_VAL0_ptr $mv))
33309c6a
JM
86 ;;; if (VAL0(mv) != 0)
87 (if (i32.ne ($VAL0 $mv) 0)
88 ;;; res += snprintf(res, 2, " ")
0a19c2f1 89 (local.set $res ($sprintf_1 $res " " 0)))
33309c6a
JM
90 (br $seq_loop)
91 )
92 )
93
0a19c2f1 94 (local.set
33309c6a 95 $res ($sprintf_1 $res "%c"
0a19c2f1 96 (if (result i32) (i32.eq $type (global.get $LIST_T))
77bf4e61 97 (then (CHR ")"))
0a19c2f1 98 (else (if (result i32) (i32.eq $type (global.get $VECTOR_T))
77bf4e61 99 (then (CHR "]"))
33309c6a
JM
100 (else (CHR "}")))))))
101 (br $done))
102 ;; 9: function
3ea09886 103 ($memmove $res "#<fn ...>" 10)
0a19c2f1 104 (local.set $res (i32.add 9 $res))
33309c6a
JM
105 (br $done))
106 ;; 10: mal function
3ea09886 107 ($memmove $res "(fn* " 6)
0a19c2f1
JM
108 (local.set $res (i32.add 5 $res))
109 (local.set $res ($pr_str_val $res ($MEM_VAL1_ptr $mv) $print_readably))
3ea09886 110 ($memmove $res " " 2)
0a19c2f1
JM
111 (local.set $res (i32.add 1 $res))
112 (local.set $res ($pr_str_val $res ($MEM_VAL0_ptr $mv) $print_readably))
3ea09886 113 ($memmove $res ")" 2)
0a19c2f1 114 (local.set $res (i32.add 1 $res))
33309c6a
JM
115 (br $done))
116 ;; 11: macro fn
3ea09886 117 ($memmove $res "#<macro ...>" 13)
0a19c2f1 118 (local.set $res (i32.add 12 $res))
33309c6a
JM
119 (br $done))
120 ;; 12: atom
3ea09886 121 ($memmove $res "(atom " 7)
0a19c2f1
JM
122 (local.set $res (i32.add 6 $res))
123 (local.set $res ($pr_str_val $res ($MEM_VAL0_ptr $mv) $print_readably))
3ea09886 124 ($memmove $res ")" 2)
0a19c2f1 125 (local.set $res (i32.add 1 $res))
33309c6a
JM
126 (br $done))
127 ;; 13: environment
3ea09886 128 ($memmove $res "#<mem ...>" 11)
0a19c2f1 129 (local.set $res (i32.add 10 $res))
33309c6a
JM
130 (br $done))
131 ;; 14: metadata
3ea09886 132 ;; recur on object itself
0a19c2f1 133 (local.set $res ($pr_str_val $res ($MEM_VAL0_ptr $mv) $print_readably))
33309c6a
JM
134 (br $done))
135 ;; 15: FREE
3ea09886 136 ($memmove $res "#<free ...>" 12)
0a19c2f1 137 (local.set $res (i32.add 11 $res))
33309c6a
JM
138 (br $done))
139 ;; 16: default
3ea09886 140 ($memmove $res "#<unknown>" 11)
0a19c2f1 141 (local.set $res (i32.add 10 $res))
33309c6a
JM
142 )
143
144 $res
145 )
146
3ea09886
JM
147 (func $pr_str_internal (param $seq i32) (param $mv i32)
148 (param $print_readably i32) (param $sep i32) (result i32)
0a19c2f1 149 (LET $res ($STRING_INIT (global.get $STRING_T))
349faa83 150 $res_str ($to_String $res))
3ea09886
JM
151
152 (if $seq
153 (then
154 (block $done
155 (loop $loop
50eea9ad 156 (br_if $done (i32.eqz ($VAL0 $mv)))
0a19c2f1
JM
157 (local.set $res_str ($pr_str_val $res_str ($MEM_VAL1_ptr $mv) $print_readably))
158 (local.set $mv ($MEM_VAL0_ptr $mv))
3ea09886 159 (if (i32.ne ($VAL0 $mv) 0)
0a19c2f1 160 (local.set $res_str ($sprintf_1 $res_str "%s" $sep)))
3ea09886
JM
161 (br $loop)
162 )
163 ))
164 (else
0a19c2f1 165 (local.set $res_str ($pr_str_val $res_str $mv $print_readably))))
3ea09886 166
0a19c2f1 167 (local.set $res ($STRING_FINALIZE $res (i32.sub $res_str ($to_String $res))))
50eea9ad
JM
168
169 $res
3ea09886
JM
170 )
171
172 (func $pr_str (param $mv i32 $print_readably i32) (result i32)
173 ($pr_str_internal 0 $mv $print_readably "")
174 )
175
176 (func $pr_str_seq (param $mv i32 $print_readably i32 $sep i32) (result i32)
177 ($pr_str_internal 1 $mv $print_readably $sep)
33309c6a
JM
178 )
179
180 (export "pr_str" (func $pr_str))
181
182)