@salang/sa 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/bin/sa.js +19 -1
  2. package/package.json +8 -7
  3. package/sa_std/alloc/layout.sal +12 -0
  4. package/sa_std/alloc/prelude.sa +1 -0
  5. package/sa_std/alloc/prelude.sal +1 -0
  6. package/sa_std/alloc/string.sa +3 -0
  7. package/sa_std/alloc/vec.sa +684 -0
  8. package/sa_std/alloc/vec.sal +4 -0
  9. package/sa_std/any.sa +130 -0
  10. package/sa_std/any.sal +23 -0
  11. package/sa_std/array.sa +1876 -0
  12. package/sa_std/ascii.sa +2 -0
  13. package/sa_std/ascii.sal +1 -0
  14. package/sa_std/async.sla +116 -0
  15. package/sa_std/binary_heap.sa +3003 -0
  16. package/sa_std/binary_heap.sal +7 -0
  17. package/sa_std/borrow.sa +171 -0
  18. package/sa_std/borrow.sal +13 -0
  19. package/sa_std/btree_map.sa +2210 -0
  20. package/sa_std/btree_map.sal +11 -0
  21. package/sa_std/btree_set.sa +1072 -0
  22. package/sa_std/btree_set.sal +6 -0
  23. package/sa_std/char.sa +1309 -0
  24. package/sa_std/char.sal +50 -0
  25. package/sa_std/cmp.sa +554 -0
  26. package/sa_std/cmp.sal +14 -0
  27. package/sa_std/collections/binary_heap.sa +1 -0
  28. package/sa_std/collections/btree_map.sa +1 -0
  29. package/sa_std/collections/btree_set.sa +1 -0
  30. package/sa_std/collections/hashmap.sa +1 -0
  31. package/sa_std/collections/hashset.sa +1 -0
  32. package/sa_std/collections/linked_list.sa +1120 -0
  33. package/sa_std/collections/linked_list.sal +10 -0
  34. package/sa_std/collections/prelude.sa +7 -0
  35. package/sa_std/collections/prelude.sal +1 -0
  36. package/sa_std/collections/vec_deque.sa +1 -0
  37. package/sa_std/collections.sal +13 -0
  38. package/sa_std/convert.sa +1115 -0
  39. package/sa_std/convert.sal +24 -0
  40. package/sa_std/core/arc.sa +233 -0
  41. package/sa_std/core/arc.sal +4 -0
  42. package/sa_std/core/ascii.sa +784 -0
  43. package/sa_std/core/ascii.sal +34 -0
  44. package/sa_std/core/bit.sa +41 -0
  45. package/sa_std/core/box.sa +1 -0
  46. package/sa_std/core/box.sal +2 -0
  47. package/sa_std/core/cell.sa +108 -0
  48. package/sa_std/core/cell.sal +5 -0
  49. package/sa_std/core/cleanup.sa +26 -0
  50. package/sa_std/core/control.sa +20 -0
  51. package/sa_std/core/derive.sa +60 -0
  52. package/sa_std/core/derive.sal +1 -0
  53. package/sa_std/core/dispatch.sa +7 -0
  54. package/sa_std/core/dispatch.sal +5 -0
  55. package/sa_std/core/future.sa +777 -0
  56. package/sa_std/core/future.sal +73 -0
  57. package/sa_std/core/hash.sa +48 -0
  58. package/sa_std/core/iter.sa +2805 -0
  59. package/sa_std/core/iter.sal +4 -0
  60. package/sa_std/core/loop.sa +60 -0
  61. package/sa_std/core/mem.sa +220 -0
  62. package/sa_std/core/option.sa +825 -0
  63. package/sa_std/core/option.sal +11 -0
  64. package/sa_std/core/panic.sa +23 -0
  65. package/sa_std/core/panic.sal +12 -0
  66. package/sa_std/core/prelude.sa +18 -0
  67. package/sa_std/core/prelude.sal +18 -0
  68. package/sa_std/core/rc.sa +225 -0
  69. package/sa_std/core/rc.sal +4 -0
  70. package/sa_std/core/refcell.sa +283 -0
  71. package/sa_std/core/refcell.sal +13 -0
  72. package/sa_std/core/result.sa +708 -0
  73. package/sa_std/core/result.sal +6 -0
  74. package/sa_std/core/rust_patterns.sal +295 -0
  75. package/sa_std/core/sa_core.sa +84 -0
  76. package/sa_std/core/slice.sa +4021 -0
  77. package/sa_std/core/slice.sal +7 -0
  78. package/sa_std/core/task.sa +112 -0
  79. package/sa_std/core/task.sal +15 -0
  80. package/sa_std/core/trait_object.sa +26 -0
  81. package/sa_std/core/trait_object.sal +4 -0
  82. package/sa_std/core/waker.sa +289 -0
  83. package/sa_std/core/waker.sal +31 -0
  84. package/sa_std/core/weak.sa +2 -0
  85. package/sa_std/core/weak.sal +4 -0
  86. package/sa_std/cow.sa +3 -0
  87. package/sa_std/cow.sal +2 -0
  88. package/sa_std/cstring.sa +3 -0
  89. package/sa_std/cstring.sal +2 -0
  90. package/sa_std/default.sa +99 -0
  91. package/sa_std/duration.sa +3 -0
  92. package/sa_std/duration.sal +2 -0
  93. package/sa_std/encoding/json.sa +259 -0
  94. package/sa_std/encoding/json.sai +54 -0
  95. package/sa_std/encoding/json.sal +35 -0
  96. package/sa_std/encoding/prelude.sa +1 -0
  97. package/sa_std/encoding/prelude.sal +0 -0
  98. package/sa_std/env.sa +390 -0
  99. package/sa_std/env.sai +25 -0
  100. package/sa_std/error.sa +253 -0
  101. package/sa_std/error.sal +44 -0
  102. package/sa_std/ffi/cstring.sa +3 -0
  103. package/sa_std/ffi/cstring.sal +1 -0
  104. package/sa_std/ffi/prelude.sa +2 -0
  105. package/sa_std/ffi/prelude.sal +2 -0
  106. package/sa_std/ffi.sa +635 -0
  107. package/sa_std/ffi.sal +51 -0
  108. package/sa_std/fmt.sa +2 -0
  109. package/sa_std/fmt.sai +18 -0
  110. package/sa_std/fmt.sal +35 -0
  111. package/sa_std/fs.sa +1023 -0
  112. package/sa_std/fs.sai +127 -0
  113. package/sa_std/fs.sal +51 -0
  114. package/sa_std/future.sa +2 -0
  115. package/sa_std/future.sal +1 -0
  116. package/sa_std/hash.sa +1486 -0
  117. package/sa_std/hash.sal +13 -0
  118. package/sa_std/hashmap.sa +1962 -0
  119. package/sa_std/hashmap.sal +20 -0
  120. package/sa_std/hashset.sa +1004 -0
  121. package/sa_std/hashset.sal +18 -0
  122. package/sa_std/http2.sa +78 -0
  123. package/sa_std/http2.sai +26 -0
  124. package/sa_std/http2.sal +36 -0
  125. package/sa_std/instant.sa +3 -0
  126. package/sa_std/instant.sal +2 -0
  127. package/sa_std/io/buf_reader.sa +43 -0
  128. package/sa_std/io/buf_writer.sa +35 -0
  129. package/sa_std/io/bufio.sa +4 -0
  130. package/sa_std/io/bufio.sal +4 -0
  131. package/sa_std/io/prelude.sa +1 -0
  132. package/sa_std/io/prelude.sal +1 -0
  133. package/sa_std/io/print.sa +2 -0
  134. package/sa_std/io/print.sai +3 -0
  135. package/sa_std/io.sa +925 -0
  136. package/sa_std/io.sai +25 -0
  137. package/sa_std/io.sal +84 -0
  138. package/sa_std/iter.sa +2 -0
  139. package/sa_std/iter.sal +1 -0
  140. package/sa_std/join_handle.sa +3 -0
  141. package/sa_std/join_handle.sal +2 -0
  142. package/sa_std/libsa_async.sa +80 -0
  143. package/sa_std/m_async.sa +137 -0
  144. package/sa_std/m_async.sal +30 -0
  145. package/sa_std/m_async.sla +2 -0
  146. package/sa_std/manually_drop.sa +3 -0
  147. package/sa_std/manually_drop.sal +2 -0
  148. package/sa_std/marker/phantom_data.sa +3 -0
  149. package/sa_std/marker/phantom_data.sal +1 -0
  150. package/sa_std/marker/prelude.sa +4 -0
  151. package/sa_std/marker/prelude.sal +4 -0
  152. package/sa_std/marker.sa +220 -0
  153. package/sa_std/marker.sal +15 -0
  154. package/sa_std/math.sa +84 -0
  155. package/sa_std/math.sai +10 -0
  156. package/sa_std/mem/manually_drop.sa +3 -0
  157. package/sa_std/mem/manually_drop.sal +1 -0
  158. package/sa_std/mem/prelude.sa +2 -0
  159. package/sa_std/mem/prelude.sal +2 -0
  160. package/sa_std/mem.sa +564 -0
  161. package/sa_std/mem.sal +40 -0
  162. package/sa_std/modstate.sai +19 -0
  163. package/sa_std/net.sa +4227 -0
  164. package/sa_std/net.sai +239 -0
  165. package/sa_std/net.sal +159 -0
  166. package/sa_std/netx.sa +85 -0
  167. package/sa_std/netx.sai +11 -0
  168. package/sa_std/netx.sal +39 -0
  169. package/sa_std/nonzero.sa +3 -0
  170. package/sa_std/nonzero.sal +2 -0
  171. package/sa_std/num/nonzero.sa +3 -0
  172. package/sa_std/num/nonzero.sal +1 -0
  173. package/sa_std/num/prelude.sa +3 -0
  174. package/sa_std/num/prelude.sal +3 -0
  175. package/sa_std/num.sa +17302 -0
  176. package/sa_std/num.sai +11 -0
  177. package/sa_std/num.sal +341 -0
  178. package/sa_std/ops.sa +1884 -0
  179. package/sa_std/ops.sal +68 -0
  180. package/sa_std/option.sa +2 -0
  181. package/sa_std/option.sal +1 -0
  182. package/sa_std/os/fd.sa +96 -0
  183. package/sa_std/os/fd.sai +7 -0
  184. package/sa_std/os/fd.sal +11 -0
  185. package/sa_std/os/prelude.sa +2 -0
  186. package/sa_std/os/prelude.sal +1 -0
  187. package/sa_std/os/unix_ffi.sa +271 -0
  188. package/sa_std/panic.sa +1 -0
  189. package/sa_std/panic.sal +1 -0
  190. package/sa_std/path.sa +3170 -0
  191. package/sa_std/path.sal +12 -0
  192. package/sa_std/phantom_data.sa +3 -0
  193. package/sa_std/phantom_data.sal +2 -0
  194. package/sa_std/pin.sa +79 -0
  195. package/sa_std/pin.sal +5 -0
  196. package/sa_std/plugin_async.sa +90 -0
  197. package/sa_std/plugin_async.sal +29 -0
  198. package/sa_std/plugin_async.sla +4 -0
  199. package/sa_std/plugin_http_async.sa +46 -0
  200. package/sa_std/plugin_http_server.sa +61 -0
  201. package/sa_std/plugin_http_server.sla +2 -0
  202. package/sa_std/plugin_sqlite.sa +106 -0
  203. package/sa_std/plugin_sqlite.sla +2 -0
  204. package/sa_std/prelude.sa +60 -0
  205. package/sa_std/prelude.sal +55 -0
  206. package/sa_std/process.sa +916 -0
  207. package/sa_std/process.sai +57 -0
  208. package/sa_std/process.sal +27 -0
  209. package/sa_std/ptr.sa +503 -0
  210. package/sa_std/ptr.sal +2 -0
  211. package/sa_std/result.sa +2 -0
  212. package/sa_std/result.sal +1 -0
  213. package/sa_std/rust_core.sa +51 -0
  214. package/sa_std/rust_core.sal +26 -0
  215. package/sa_std/sa.mod +7 -0
  216. package/sa_std/sort.sa +156 -0
  217. package/sa_std/str.sla +13 -0
  218. package/sa_std/string.sa +12240 -0
  219. package/sa_std/string.sai +25 -0
  220. package/sa_std/string.sal +17 -0
  221. package/sa_std/string_format.sa +269 -0
  222. package/sa_std/sync/atomic.sa +1500 -0
  223. package/sa_std/sync/atomic.sal +45 -0
  224. package/sa_std/sync/barrier.sa +105 -0
  225. package/sa_std/sync/barrier.sal +7 -0
  226. package/sa_std/sync/condvar.sa +240 -0
  227. package/sa_std/sync/condvar.sal +4 -0
  228. package/sa_std/sync/mpsc.sa +758 -0
  229. package/sa_std/sync/mpsc.sal +42 -0
  230. package/sa_std/sync/mpsc_list.sa +255 -0
  231. package/sa_std/sync/mpsc_list.sal +3 -0
  232. package/sa_std/sync/mutex.sa +182 -0
  233. package/sa_std/sync/mutex.sal +7 -0
  234. package/sa_std/sync/once.sa +371 -0
  235. package/sa_std/sync/once.sal +31 -0
  236. package/sa_std/sync/poison.sa +36 -0
  237. package/sa_std/sync/poison.sal +11 -0
  238. package/sa_std/sync/prelude.sa +8 -0
  239. package/sa_std/sync/prelude.sal +7 -0
  240. package/sa_std/sync/rwlock.sa +369 -0
  241. package/sa_std/sync/rwlock.sal +13 -0
  242. package/sa_std/task.sa +2 -0
  243. package/sa_std/task.sal +1 -0
  244. package/sa_std/term.sa +2 -0
  245. package/sa_std/term.sai +10 -0
  246. package/sa_std/term.sal +33 -0
  247. package/sa_std/testing/assert.sai +4 -0
  248. package/sa_std/testing/mock_io.sa +174 -0
  249. package/sa_std/testing/mock_io.sal +5 -0
  250. package/sa_std/testing/prelude.sa +2 -0
  251. package/sa_std/testing/prelude.sal +1 -0
  252. package/sa_std/text/prelude.sa +1 -0
  253. package/sa_std/text/prelude.sal +1 -0
  254. package/sa_std/text/regex.sa +2 -0
  255. package/sa_std/text/regex.sai +9 -0
  256. package/sa_std/text/regex.sal +33 -0
  257. package/sa_std/thread/join_handle.sa +3 -0
  258. package/sa_std/thread/join_handle.sal +1 -0
  259. package/sa_std/thread/prelude.sa +4 -0
  260. package/sa_std/thread/prelude.sal +3 -0
  261. package/sa_std/thread.sa +160 -0
  262. package/sa_std/thread.sai +11 -0
  263. package/sa_std/thread.sal +4 -0
  264. package/sa_std/thread_local.sa +45 -0
  265. package/sa_std/thread_local.sai +9 -0
  266. package/sa_std/time/duration.sa +3 -0
  267. package/sa_std/time/duration.sal +1 -0
  268. package/sa_std/time/instant.sa +3 -0
  269. package/sa_std/time/instant.sal +1 -0
  270. package/sa_std/time/prelude.sa +4 -0
  271. package/sa_std/time/prelude.sal +4 -0
  272. package/sa_std/time.sa +850 -0
  273. package/sa_std/time.sai +37 -0
  274. package/sa_std/time.sal +35 -0
  275. package/sa_std/time.sla +67 -0
  276. package/sa_std/tls_client.sai +39 -0
  277. package/sa_std/vec.sa +5754 -0
  278. package/sa_std/vec.sal +1 -0
  279. package/sa_std/vec_deque.sa +4925 -0
  280. package/sa_std/vec_deque.sal +8 -0
  281. package/sa_std/vec_runtime_macros.sa +11 -0
  282. package/sa_std/ws_client.sai +57 -0
@@ -0,0 +1,684 @@
1
+ @import "../core/mem.sa"
2
+ @import "../core/slice.sal"
3
+ @import "../core/slice.sa"
4
+ @import "../num.sa"
5
+ @import "vec.sal"
6
+
7
+ @export sa_vec_new() -> ^ptr:
8
+ vec = alloc Vec_SIZE
9
+ store vec+Vec_ptr, 0 as ptr
10
+ store vec+Vec_cap, 0 as u64
11
+ store vec+Vec_len, 0 as u64
12
+ return vec
13
+
14
+ @export sa_vec_with_capacity(cap: u64, elem_size: u64) -> ^ptr:
15
+ L_ENTRY:
16
+ vec = alloc Vec_SIZE
17
+ EXPAND NUM_U64_CHECKED_MUL bytes_ok, bytes, cap, elem_size
18
+ br bytes_ok -> L_SIZE_OK, L_SIZE_OVERFLOW
19
+ L_SIZE_OVERFLOW:
20
+ panic(1201)
21
+ L_SIZE_OK:
22
+ has_bytes = ne bytes, 0
23
+ br has_bytes -> L_ALLOC, L_EMPTY
24
+ L_ALLOC:
25
+ buf = alloc bytes
26
+ call @sa_mem_set(&buf, 0, bytes)
27
+ store vec+Vec_ptr, buf as ptr
28
+ store vec+Vec_cap, cap as u64
29
+ store vec+Vec_len, 0 as u64
30
+ ^buf
31
+ !bytes
32
+ !bytes_ok
33
+ !has_bytes
34
+ !cap
35
+ return vec
36
+ L_EMPTY:
37
+ store vec+Vec_ptr, 0 as ptr
38
+ store vec+Vec_cap, cap as u64
39
+ store vec+Vec_len, 0 as u64
40
+ !bytes
41
+ !bytes_ok
42
+ !has_bytes
43
+ !cap
44
+ return vec
45
+
46
+ @export sa_vec_len(&vec: ptr) -> u64:
47
+ L_ENTRY:
48
+ len = load vec+Vec_len as u64
49
+ !vec
50
+ return len
51
+
52
+ @export sa_vec_capacity(&vec: ptr) -> u64:
53
+ L_ENTRY:
54
+ cap = load vec+Vec_cap as u64
55
+ !vec
56
+ return cap
57
+
58
+ @export sa_vec_is_empty(&vec: ptr) -> i32:
59
+ L_ENTRY:
60
+ len = load vec+Vec_len as u64
61
+ empty = eq len, 0
62
+ result = empty as i32
63
+ !len
64
+ !vec
65
+ return result
66
+
67
+ @export sa_vec_clear(&vec: ptr) -> void:
68
+ L_ENTRY:
69
+ store vec+Vec_len, 0 as u64
70
+ !vec
71
+ return
72
+
73
+ @export sa_vec_truncate(&vec: ptr, new_len: u64) -> void:
74
+ L_ENTRY:
75
+ len = load vec+Vec_len as u64
76
+ should_shrink = ult new_len, len
77
+ br should_shrink -> L_TRUNCATE, L_DONE
78
+ L_TRUNCATE:
79
+ store vec+Vec_len, new_len as u64
80
+ !should_shrink
81
+ !len
82
+ !new_len
83
+ !vec
84
+ return
85
+ L_DONE:
86
+ !should_shrink
87
+ !len
88
+ !new_len
89
+ !vec
90
+ return
91
+
92
+ @export sa_vec_reserve(^vec: ptr, additional: u64, elem_size: u64) -> ^ptr:
93
+ L_ENTRY:
94
+ len = load vec+Vec_len as u64
95
+ cap = load vec+Vec_cap as u64
96
+ EXPAND NUM_U64_CHECKED_ADD needed_ok, needed, len, additional
97
+ br needed_ok -> L_RESERVE_NEED_OK, L_RESERVE_OVERFLOW
98
+
99
+ L_RESERVE_OVERFLOW:
100
+ panic(1202)
101
+
102
+ L_RESERVE_NEED_OK:
103
+ has_room = uge cap, needed
104
+ br has_room -> L_RESERVE_DONE, L_RESERVE_GROW
105
+
106
+ L_RESERVE_GROW:
107
+ old_buf = take vec+Vec_ptr
108
+ EXPAND NUM_U64_CHECKED_MUL new_bytes_ok, new_bytes, needed, elem_size
109
+ br new_bytes_ok -> L_RESERVE_ALLOC, L_RESERVE_ALLOC_OVERFLOW
110
+
111
+ L_RESERVE_ALLOC_OVERFLOW:
112
+ panic(1203)
113
+
114
+ L_RESERVE_ALLOC:
115
+ new_buf = alloc new_bytes
116
+ call @sa_mem_set(&new_buf, 0, new_bytes)
117
+ EXPAND NUM_U64_CHECKED_MUL copy_bytes_ok, copy_bytes, len, elem_size
118
+ br copy_bytes_ok -> L_RESERVE_COPY, L_RESERVE_COPY_OVERFLOW
119
+
120
+ L_RESERVE_COPY_OVERFLOW:
121
+ panic(1204)
122
+
123
+ L_RESERVE_COPY:
124
+ call @sa_mem_copy(&new_buf, &old_buf, copy_bytes)
125
+ store vec+Vec_ptr, new_buf as ptr
126
+ store vec+Vec_cap, needed as u64
127
+ !copy_bytes_ok
128
+ !copy_bytes
129
+ !new_bytes_ok
130
+ !new_bytes
131
+ !old_buf
132
+ ^new_buf
133
+ !has_room
134
+ !needed
135
+ !needed_ok
136
+ !cap
137
+ !len
138
+ !elem_size
139
+ !additional
140
+ return vec
141
+
142
+ L_RESERVE_DONE:
143
+ !has_room
144
+ !needed
145
+ !needed_ok
146
+ !cap
147
+ !len
148
+ !elem_size
149
+ !additional
150
+ return vec
151
+
152
+ @export sa_vec_push(^vec: ptr, value: u64, elem_size: u64) -> ^ptr:
153
+ L_ENTRY:
154
+ buf = take vec+Vec_ptr
155
+ len = load vec+Vec_len as u64
156
+ cap = load vec+Vec_cap as u64
157
+ needs_grow = eq len, cap
158
+ br needs_grow -> L_GROW, L_REUSE
159
+ L_GROW:
160
+ cap_is_zero = eq cap, 0
161
+ br cap_is_zero -> L_GROW_FROM_ZERO, L_GROW_DOUBLE
162
+
163
+ L_GROW_FROM_ZERO:
164
+ next_cap = add 0, 1
165
+ next_cap_ok = add 0, 1
166
+ jmp L_GROW_ALLOC
167
+
168
+ L_GROW_DOUBLE:
169
+ EXPAND NUM_U64_CHECKED_ADD next_cap_ok, next_cap, cap, cap
170
+ br next_cap_ok -> L_GROW_ALLOC, L_GROW_CAP_OVERFLOW
171
+
172
+ L_GROW_CAP_OVERFLOW:
173
+ panic(1205)
174
+
175
+ L_GROW_ALLOC:
176
+ EXPAND NUM_U64_CHECKED_MUL next_cap_bytes_ok, next_cap_bytes, next_cap, elem_size
177
+ br next_cap_bytes_ok -> L_GROW_COPY_SIZE, L_GROW_BYTES_OVERFLOW
178
+
179
+ L_GROW_BYTES_OVERFLOW:
180
+ panic(1206)
181
+
182
+ L_GROW_COPY_SIZE:
183
+ next_ptr = alloc next_cap_bytes
184
+ EXPAND NUM_U64_CHECKED_MUL copy_bytes_ok, copy_bytes, len, elem_size
185
+ br copy_bytes_ok -> L_GROW_COPY, L_GROW_COPY_OVERFLOW
186
+
187
+ L_GROW_COPY_OVERFLOW:
188
+ panic(1207)
189
+
190
+ L_GROW_COPY:
191
+ call @sa_mem_copy(&next_ptr, &buf, copy_bytes)
192
+ store vec+Vec_ptr, next_ptr as ptr
193
+ store vec+Vec_cap, next_cap as u64
194
+ jmp L_WRITE_GROW
195
+ L_REUSE:
196
+ store vec+Vec_ptr, buf as ptr
197
+ jmp L_WRITE_REUSE
198
+ L_WRITE_GROW:
199
+ write_off = mul len, elem_size
200
+ write_ptr = ptr_add next_ptr, write_off
201
+ store write_ptr+0, value as u64
202
+ next_len = add len, 1
203
+ store vec+Vec_len, next_len as u64
204
+ !write_ptr
205
+ !write_off
206
+ !next_len
207
+ !copy_bytes_ok
208
+ !copy_bytes
209
+ !next_cap_bytes_ok
210
+ !next_cap_bytes
211
+ !next_cap_ok
212
+ !next_cap
213
+ !cap_is_zero
214
+ !buf
215
+ !value
216
+ !elem_size
217
+ !cap
218
+ !len
219
+ !needs_grow
220
+ return vec
221
+ L_WRITE_REUSE:
222
+ write_off = mul len, elem_size
223
+ write_ptr = ptr_add buf, write_off
224
+ store write_ptr+0, value as u64
225
+ next_len = add len, 1
226
+ store vec+Vec_len, next_len as u64
227
+ !write_ptr
228
+ !write_off
229
+ !next_len
230
+ !buf
231
+ !value
232
+ !elem_size
233
+ !cap
234
+ !len
235
+ !needs_grow
236
+ return vec
237
+
238
+ @export sa_vec_try_pop(&vec: ptr, &out_value_slot: ptr) -> i32:
239
+ L_ENTRY:
240
+ len = load vec+Vec_len as u64
241
+ empty = eq len, 0
242
+ br empty -> L_EMPTY, L_READY
243
+ L_READY:
244
+ buf = load vec+Vec_ptr as ptr
245
+ last_index = sub len, 1
246
+ last_off = mul last_index, 8
247
+ last_ptr = ptr_add buf, last_off
248
+ value = load last_ptr+0 as u64
249
+ next_len = sub len, 1
250
+ store out_value_slot+0, value as u64
251
+ store vec+Vec_len, next_len as u64
252
+ !last_ptr
253
+ !last_off
254
+ !last_index
255
+ !value
256
+ !next_len
257
+ !buf
258
+ !len
259
+ !empty
260
+ !out_value_slot
261
+ !vec
262
+ return 1
263
+ L_EMPTY:
264
+ store out_value_slot+0, 0 as ptr
265
+ !len
266
+ !empty
267
+ !out_value_slot
268
+ !vec
269
+ return 0
270
+
271
+ @export sa_vec_extend_from_slice(^vec: ptr, &slice: ptr, elem_size: u64) -> ^ptr:
272
+ L_ENTRY:
273
+ add_len = load slice+Slice_len as u64
274
+ add_zero = eq add_len, 0
275
+ br add_zero -> L_DONE, L_GROW
276
+
277
+ L_GROW:
278
+ len = load vec+Vec_len as u64
279
+ cap = load vec+Vec_cap as u64
280
+ EXPAND NUM_U64_CHECKED_ADD needed_ok, needed, len, add_len
281
+ br needed_ok -> L_EXTEND_NEEDED_OK, L_EXTEND_NEEDED_OVERFLOW
282
+
283
+ L_EXTEND_NEEDED_OVERFLOW:
284
+ panic(1208)
285
+
286
+ L_EXTEND_NEEDED_OK:
287
+ has_room = uge cap, needed
288
+ br has_room -> L_COPY, L_REALLOC
289
+
290
+ L_REALLOC:
291
+ old_buf = take vec+Vec_ptr
292
+ EXPAND NUM_U64_CHECKED_MUL new_bytes_ok, new_bytes, needed, elem_size
293
+ br new_bytes_ok -> L_EXTEND_ALLOC, L_EXTEND_ALLOC_OVERFLOW
294
+
295
+ L_EXTEND_ALLOC_OVERFLOW:
296
+ panic(1209)
297
+
298
+ L_EXTEND_ALLOC:
299
+ new_buf = alloc new_bytes
300
+ call @sa_mem_set(&new_buf, 0, new_bytes)
301
+ EXPAND NUM_U64_CHECKED_MUL copy_old_bytes_ok, copy_old_bytes, len, elem_size
302
+ br copy_old_bytes_ok -> L_EXTEND_COPY_OLD, L_EXTEND_COPY_OLD_OVERFLOW
303
+
304
+ L_EXTEND_COPY_OLD_OVERFLOW:
305
+ panic(1210)
306
+
307
+ L_EXTEND_COPY_OLD:
308
+ call @sa_mem_copy(&new_buf, &old_buf, copy_old_bytes)
309
+ store vec+Vec_ptr, new_buf as ptr
310
+ store vec+Vec_cap, needed as u64
311
+ ^new_buf
312
+ !copy_old_bytes_ok
313
+ !copy_old_bytes
314
+ !new_bytes_ok
315
+ !new_bytes
316
+ !old_buf
317
+
318
+ L_COPY:
319
+ dst_buf = load vec+Vec_ptr as ptr
320
+ src_buf = load slice+Slice_ptr as ptr
321
+ EXPAND NUM_U64_CHECKED_MUL dst_off_ok, dst_off, len, elem_size
322
+ br dst_off_ok -> L_EXTEND_COPY_ADD_SIZE, L_EXTEND_DST_OVERFLOW
323
+
324
+ L_EXTEND_DST_OVERFLOW:
325
+ panic(1211)
326
+
327
+ L_EXTEND_COPY_ADD_SIZE:
328
+ dst_ptr = ptr_add dst_buf, dst_off
329
+ EXPAND NUM_U64_CHECKED_MUL copy_add_bytes_ok, copy_add_bytes, add_len, elem_size
330
+ br copy_add_bytes_ok -> L_EXTEND_COPY_ADD, L_EXTEND_COPY_ADD_OVERFLOW
331
+
332
+ L_EXTEND_COPY_ADD_OVERFLOW:
333
+ panic(1212)
334
+
335
+ L_EXTEND_COPY_ADD:
336
+ call @sa_mem_copy(&dst_ptr, &src_buf, copy_add_bytes)
337
+ store vec+Vec_len, needed as u64
338
+ !copy_add_bytes_ok
339
+ !copy_add_bytes
340
+ !dst_ptr
341
+ !dst_off_ok
342
+ !dst_off
343
+ !src_buf
344
+ !dst_buf
345
+ !has_room
346
+ !needed
347
+ !needed_ok
348
+ !cap
349
+ !len
350
+ !add_len
351
+ !add_zero
352
+ !elem_size
353
+ !slice
354
+ return vec
355
+
356
+ L_DONE:
357
+ !add_len
358
+ !add_zero
359
+ !elem_size
360
+ !slice
361
+ return vec
362
+
363
+ @export sa_vec_append(^dst_vec: ptr, &src_vec: ptr, elem_size: u64) -> ^ptr:
364
+ L_ENTRY:
365
+ src_slice = alloc Slice_SIZE
366
+ src_ptr = load src_vec+Vec_ptr as ptr
367
+ src_len = load src_vec+Vec_len as u64
368
+ EXPAND SLICE_NEW src_slice, src_ptr, src_len
369
+ dst_vec = call @sa_vec_extend_from_slice(^dst_vec, &src_slice, elem_size)
370
+ store src_vec+Vec_len, 0 as u64
371
+ !src_slice
372
+ !src_ptr
373
+ !src_len
374
+ !elem_size
375
+ !src_vec
376
+ return dst_vec
377
+
378
+ @export sa_vec_try_swap_remove(&vec: ptr, index: u64, &out_value_slot: ptr) -> i32:
379
+ L_ENTRY:
380
+ len = load vec+Vec_len as u64
381
+ in_bounds = ult index, len
382
+ br in_bounds -> L_READY, L_MISS
383
+
384
+ L_READY:
385
+ buf = load vec+Vec_ptr as ptr
386
+ last_index = sub len, 1
387
+ remove_off = mul index, 8
388
+ remove_ptr = ptr_add buf, remove_off
389
+ removed = load remove_ptr+0 as u64
390
+ last_off = mul last_index, 8
391
+ last_ptr = ptr_add buf, last_off
392
+ last_value = load last_ptr+0 as u64
393
+ store remove_ptr+0, last_value as u64
394
+ next_len = sub len, 1
395
+ store out_value_slot+0, removed as u64
396
+ store vec+Vec_len, next_len as u64
397
+ !next_len
398
+ !last_value
399
+ !last_ptr
400
+ !last_off
401
+ !removed
402
+ !remove_ptr
403
+ !remove_off
404
+ !last_index
405
+ !buf
406
+ !in_bounds
407
+ !len
408
+ !index
409
+ !out_value_slot
410
+ !vec
411
+ return 1
412
+
413
+ L_MISS:
414
+ store out_value_slot+0, 0 as ptr
415
+ !in_bounds
416
+ !len
417
+ !index
418
+ !out_value_slot
419
+ !vec
420
+ return 0
421
+
422
+ @export sa_vec_try_remove(&vec: ptr, index: u64, &out_value_slot: ptr, elem_size: u64) -> i32:
423
+ L_ENTRY:
424
+ len = load vec+Vec_len as u64
425
+ in_bounds = ult index, len
426
+ br in_bounds -> L_READY, L_MISS
427
+
428
+ L_READY:
429
+ buf = load vec+Vec_ptr as ptr
430
+ remove_off = mul index, elem_size
431
+ remove_ptr = ptr_add buf, remove_off
432
+ removed = load remove_ptr+0 as u64
433
+ trailing = sub len, index
434
+ trailing_after = sub trailing, 1
435
+ move_bytes = mul trailing_after, elem_size
436
+ move_zero = eq move_bytes, 0
437
+ br move_zero -> L_STORE_RESULT, L_SHIFT_INIT
438
+
439
+ L_SHIFT_INIT:
440
+ src_ptr = ptr_add remove_ptr, elem_size
441
+ move_off_slot = stack_alloc 8
442
+ store move_off_slot+0, 0 as u64
443
+ jmp L_SHIFT_HEAD
444
+
445
+ L_SHIFT_HEAD:
446
+ move_off = load move_off_slot+0 as u64
447
+ done = eq move_off, move_bytes
448
+ br done -> L_STORE_RESULT, L_SHIFT_BODY
449
+
450
+ L_SHIFT_BODY:
451
+ src_byte_ptr = ptr_add src_ptr, move_off
452
+ dst_byte_ptr = ptr_add remove_ptr, move_off
453
+ byte = load src_byte_ptr+0 as u8
454
+ store dst_byte_ptr+0, byte as u8
455
+ next_move_off = add move_off, 1
456
+ store move_off_slot+0, next_move_off as u64
457
+ !next_move_off
458
+ !byte
459
+ !dst_byte_ptr
460
+ !src_byte_ptr
461
+ !done
462
+ !move_off
463
+ jmp L_SHIFT_HEAD
464
+
465
+ L_STORE_RESULT:
466
+ next_len = sub len, 1
467
+ store out_value_slot+0, removed as u64
468
+ store vec+Vec_len, next_len as u64
469
+ !next_len
470
+ !move_zero
471
+ !move_bytes
472
+ !trailing_after
473
+ !trailing
474
+ !removed
475
+ !remove_ptr
476
+ !remove_off
477
+ !buf
478
+ !in_bounds
479
+ !len
480
+ !elem_size
481
+ !index
482
+ !out_value_slot
483
+ !vec
484
+ return 1
485
+
486
+ L_MISS:
487
+ store out_value_slot+0, 0 as ptr
488
+ !in_bounds
489
+ !len
490
+ !elem_size
491
+ !index
492
+ !out_value_slot
493
+ !vec
494
+ return 0
495
+
496
+ @export sa_vec_try_split_off(^vec: ptr, index: u64, elem_size: u64, &out_vec_slot: ptr) -> ^ptr:
497
+ L_ENTRY:
498
+ len = load vec+Vec_len as u64
499
+ in_bounds = ule index, len
500
+ br in_bounds -> L_READY, L_MISS
501
+
502
+ L_READY:
503
+ tail_len = sub len, index
504
+ out_vec = call @sa_vec_with_capacity(tail_len, elem_size)
505
+ tail_zero = eq tail_len, 0
506
+ br tail_zero -> L_STORE_VEC, L_COPY_TAIL
507
+
508
+ L_COPY_TAIL:
509
+ src_buf = load vec+Vec_ptr as ptr
510
+ src_off = mul index, elem_size
511
+ src_ptr = ptr_add src_buf, src_off
512
+ dst_buf = load out_vec+Vec_ptr as ptr
513
+ copy_bytes = mul tail_len, elem_size
514
+ call @sa_mem_copy(&dst_buf, &src_ptr, copy_bytes)
515
+ !copy_bytes
516
+ !dst_buf
517
+ !src_ptr
518
+ !src_off
519
+ !src_buf
520
+
521
+ L_STORE_VEC:
522
+ store out_vec+Vec_len, tail_len as u64
523
+ store vec+Vec_len, index as u64
524
+ store out_vec_slot+0, out_vec as ptr
525
+ !tail_zero
526
+ !tail_len
527
+ !out_vec
528
+ !in_bounds
529
+ !len
530
+ !elem_size
531
+ !index
532
+ !out_vec_slot
533
+ return vec
534
+
535
+ L_MISS:
536
+ store out_vec_slot+0, 0 as ptr
537
+ !in_bounds
538
+ !len
539
+ !elem_size
540
+ !index
541
+ !out_vec_slot
542
+ return vec
543
+
544
+ @export sa_vec_shrink_to(^vec: ptr, min_cap: u64, elem_size: u64) -> ^ptr:
545
+ L_ENTRY:
546
+ len = load vec+Vec_len as u64
547
+ cap = load vec+Vec_cap as u64
548
+ keep_len = uge len, min_cap
549
+ br keep_len -> L_TARGET_LEN, L_TARGET_MIN
550
+
551
+ L_TARGET_LEN:
552
+ target_cap = add len, 0
553
+ jmp L_CHECK
554
+
555
+ L_TARGET_MIN:
556
+ target_cap = add min_cap, 0
557
+
558
+ L_CHECK:
559
+ needs_shrink = ult target_cap, cap
560
+ br needs_shrink -> L_SHRINK, L_DONE
561
+
562
+ L_SHRINK:
563
+ target_zero = eq target_cap, 0
564
+ br target_zero -> L_ZERO, L_ALLOC
565
+
566
+ L_ZERO:
567
+ store vec+Vec_ptr, 0 as ptr
568
+ store vec+Vec_cap, 0 as u64
569
+ !target_zero
570
+ !needs_shrink
571
+ !target_cap
572
+ !keep_len
573
+ !cap
574
+ !len
575
+ !elem_size
576
+ !min_cap
577
+ return vec
578
+
579
+ L_ALLOC:
580
+ old_buf = take vec+Vec_ptr
581
+ EXPAND NUM_U64_CHECKED_MUL shrink_new_bytes_ok, new_bytes, target_cap, elem_size
582
+ br shrink_new_bytes_ok -> L_SHRINK_ALLOC, L_SHRINK_ALLOC_OVERFLOW
583
+
584
+ L_SHRINK_ALLOC_OVERFLOW:
585
+ panic(1213)
586
+
587
+ L_SHRINK_ALLOC:
588
+ new_buf = alloc new_bytes
589
+ call @sa_mem_set(&new_buf, 0, new_bytes)
590
+ EXPAND NUM_U64_CHECKED_MUL shrink_copy_bytes_ok, copy_bytes, len, elem_size
591
+ br shrink_copy_bytes_ok -> L_SHRINK_COPY, L_SHRINK_COPY_OVERFLOW
592
+
593
+ L_SHRINK_COPY_OVERFLOW:
594
+ panic(1214)
595
+
596
+ L_SHRINK_COPY:
597
+ call @sa_mem_copy(&new_buf, &old_buf, copy_bytes)
598
+ store vec+Vec_ptr, new_buf as ptr
599
+ store vec+Vec_cap, target_cap as u64
600
+ !shrink_copy_bytes_ok
601
+ !copy_bytes
602
+ !shrink_new_bytes_ok
603
+ !new_bytes
604
+ !old_buf
605
+ ^new_buf
606
+ !target_zero
607
+ !needs_shrink
608
+ !target_cap
609
+ !keep_len
610
+ !cap
611
+ !len
612
+ !elem_size
613
+ !min_cap
614
+ return vec
615
+
616
+ L_DONE:
617
+ !needs_shrink
618
+ !target_cap
619
+ !keep_len
620
+ !cap
621
+ !len
622
+ !elem_size
623
+ !min_cap
624
+ return vec
625
+
626
+ @export sa_vec_shrink_to_fit(^vec: ptr, elem_size: u64) -> ^ptr:
627
+ L_ENTRY:
628
+ len = load vec+Vec_len as u64
629
+ vec = call @sa_vec_shrink_to(^vec, len, elem_size)
630
+ !len
631
+ return vec
632
+
633
+ @export sa_vec_resize(^vec: ptr, new_len: u64, fill_value: u64, elem_size: u64) -> ^ptr:
634
+ L_ENTRY:
635
+ len = load vec+Vec_len as u64
636
+ should_shrink = ule new_len, len
637
+ br should_shrink -> L_SHRINK, L_GROW
638
+
639
+ L_SHRINK:
640
+ store vec+Vec_len, new_len as u64
641
+ !should_shrink
642
+ !len
643
+ !fill_value
644
+ !elem_size
645
+ !new_len
646
+ return vec
647
+
648
+ L_GROW:
649
+ additional = sub new_len, len
650
+ vec = call @sa_vec_reserve(^vec, additional, elem_size)
651
+ remaining_slot = stack_alloc 8
652
+ store remaining_slot+0, additional as u64
653
+ jmp L_GROW_HEAD
654
+
655
+ L_GROW_HEAD:
656
+ remaining = load remaining_slot+0 as u64
657
+ done = eq remaining, 0
658
+ br done -> L_GROW_DONE, L_GROW_BODY
659
+
660
+ L_GROW_BODY:
661
+ vec = call @sa_vec_push(^vec, fill_value, elem_size)
662
+ next_remaining = sub remaining, 1
663
+ store remaining_slot+0, next_remaining as u64
664
+ !next_remaining
665
+ !done
666
+ !remaining
667
+ jmp L_GROW_HEAD
668
+
669
+ L_GROW_DONE:
670
+ !done
671
+ !remaining
672
+ !should_shrink
673
+ !additional
674
+ !len
675
+ !fill_value
676
+ !elem_size
677
+ !new_len
678
+ return vec
679
+
680
+ @export sa_vec_free(^vec: ptr) -> void:
681
+ inner_ptr = take vec+Vec_ptr
682
+ !inner_ptr
683
+ !vec
684
+ return
@@ -0,0 +1,4 @@
1
+ #def Vec_SIZE = 24
2
+ #def Vec_ptr = +0
3
+ #def Vec_cap = +8
4
+ #def Vec_len = +16