Commit | Line | Data |
---|---|---|
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 | ) |