@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.
- package/bin/sa.js +19 -1
- package/package.json +8 -7
- package/sa_std/alloc/layout.sal +12 -0
- package/sa_std/alloc/prelude.sa +1 -0
- package/sa_std/alloc/prelude.sal +1 -0
- package/sa_std/alloc/string.sa +3 -0
- package/sa_std/alloc/vec.sa +684 -0
- package/sa_std/alloc/vec.sal +4 -0
- package/sa_std/any.sa +130 -0
- package/sa_std/any.sal +23 -0
- package/sa_std/array.sa +1876 -0
- package/sa_std/ascii.sa +2 -0
- package/sa_std/ascii.sal +1 -0
- package/sa_std/async.sla +116 -0
- package/sa_std/binary_heap.sa +3003 -0
- package/sa_std/binary_heap.sal +7 -0
- package/sa_std/borrow.sa +171 -0
- package/sa_std/borrow.sal +13 -0
- package/sa_std/btree_map.sa +2210 -0
- package/sa_std/btree_map.sal +11 -0
- package/sa_std/btree_set.sa +1072 -0
- package/sa_std/btree_set.sal +6 -0
- package/sa_std/char.sa +1309 -0
- package/sa_std/char.sal +50 -0
- package/sa_std/cmp.sa +554 -0
- package/sa_std/cmp.sal +14 -0
- package/sa_std/collections/binary_heap.sa +1 -0
- package/sa_std/collections/btree_map.sa +1 -0
- package/sa_std/collections/btree_set.sa +1 -0
- package/sa_std/collections/hashmap.sa +1 -0
- package/sa_std/collections/hashset.sa +1 -0
- package/sa_std/collections/linked_list.sa +1120 -0
- package/sa_std/collections/linked_list.sal +10 -0
- package/sa_std/collections/prelude.sa +7 -0
- package/sa_std/collections/prelude.sal +1 -0
- package/sa_std/collections/vec_deque.sa +1 -0
- package/sa_std/collections.sal +13 -0
- package/sa_std/convert.sa +1115 -0
- package/sa_std/convert.sal +24 -0
- package/sa_std/core/arc.sa +233 -0
- package/sa_std/core/arc.sal +4 -0
- package/sa_std/core/ascii.sa +784 -0
- package/sa_std/core/ascii.sal +34 -0
- package/sa_std/core/bit.sa +41 -0
- package/sa_std/core/box.sa +1 -0
- package/sa_std/core/box.sal +2 -0
- package/sa_std/core/cell.sa +108 -0
- package/sa_std/core/cell.sal +5 -0
- package/sa_std/core/cleanup.sa +26 -0
- package/sa_std/core/control.sa +20 -0
- package/sa_std/core/derive.sa +60 -0
- package/sa_std/core/derive.sal +1 -0
- package/sa_std/core/dispatch.sa +7 -0
- package/sa_std/core/dispatch.sal +5 -0
- package/sa_std/core/future.sa +777 -0
- package/sa_std/core/future.sal +73 -0
- package/sa_std/core/hash.sa +48 -0
- package/sa_std/core/iter.sa +2805 -0
- package/sa_std/core/iter.sal +4 -0
- package/sa_std/core/loop.sa +60 -0
- package/sa_std/core/mem.sa +220 -0
- package/sa_std/core/option.sa +825 -0
- package/sa_std/core/option.sal +11 -0
- package/sa_std/core/panic.sa +23 -0
- package/sa_std/core/panic.sal +12 -0
- package/sa_std/core/prelude.sa +18 -0
- package/sa_std/core/prelude.sal +18 -0
- package/sa_std/core/rc.sa +225 -0
- package/sa_std/core/rc.sal +4 -0
- package/sa_std/core/refcell.sa +283 -0
- package/sa_std/core/refcell.sal +13 -0
- package/sa_std/core/result.sa +708 -0
- package/sa_std/core/result.sal +6 -0
- package/sa_std/core/rust_patterns.sal +295 -0
- package/sa_std/core/sa_core.sa +84 -0
- package/sa_std/core/slice.sa +4021 -0
- package/sa_std/core/slice.sal +7 -0
- package/sa_std/core/task.sa +112 -0
- package/sa_std/core/task.sal +15 -0
- package/sa_std/core/trait_object.sa +26 -0
- package/sa_std/core/trait_object.sal +4 -0
- package/sa_std/core/waker.sa +289 -0
- package/sa_std/core/waker.sal +31 -0
- package/sa_std/core/weak.sa +2 -0
- package/sa_std/core/weak.sal +4 -0
- package/sa_std/cow.sa +3 -0
- package/sa_std/cow.sal +2 -0
- package/sa_std/cstring.sa +3 -0
- package/sa_std/cstring.sal +2 -0
- package/sa_std/default.sa +99 -0
- package/sa_std/duration.sa +3 -0
- package/sa_std/duration.sal +2 -0
- package/sa_std/encoding/json.sa +259 -0
- package/sa_std/encoding/json.sai +54 -0
- package/sa_std/encoding/json.sal +35 -0
- package/sa_std/encoding/prelude.sa +1 -0
- package/sa_std/encoding/prelude.sal +0 -0
- package/sa_std/env.sa +390 -0
- package/sa_std/env.sai +25 -0
- package/sa_std/error.sa +253 -0
- package/sa_std/error.sal +44 -0
- package/sa_std/ffi/cstring.sa +3 -0
- package/sa_std/ffi/cstring.sal +1 -0
- package/sa_std/ffi/prelude.sa +2 -0
- package/sa_std/ffi/prelude.sal +2 -0
- package/sa_std/ffi.sa +635 -0
- package/sa_std/ffi.sal +51 -0
- package/sa_std/fmt.sa +2 -0
- package/sa_std/fmt.sai +18 -0
- package/sa_std/fmt.sal +35 -0
- package/sa_std/fs.sa +1023 -0
- package/sa_std/fs.sai +127 -0
- package/sa_std/fs.sal +51 -0
- package/sa_std/future.sa +2 -0
- package/sa_std/future.sal +1 -0
- package/sa_std/hash.sa +1486 -0
- package/sa_std/hash.sal +13 -0
- package/sa_std/hashmap.sa +1962 -0
- package/sa_std/hashmap.sal +20 -0
- package/sa_std/hashset.sa +1004 -0
- package/sa_std/hashset.sal +18 -0
- package/sa_std/http2.sa +78 -0
- package/sa_std/http2.sai +26 -0
- package/sa_std/http2.sal +36 -0
- package/sa_std/instant.sa +3 -0
- package/sa_std/instant.sal +2 -0
- package/sa_std/io/buf_reader.sa +43 -0
- package/sa_std/io/buf_writer.sa +35 -0
- package/sa_std/io/bufio.sa +4 -0
- package/sa_std/io/bufio.sal +4 -0
- package/sa_std/io/prelude.sa +1 -0
- package/sa_std/io/prelude.sal +1 -0
- package/sa_std/io/print.sa +2 -0
- package/sa_std/io/print.sai +3 -0
- package/sa_std/io.sa +925 -0
- package/sa_std/io.sai +25 -0
- package/sa_std/io.sal +84 -0
- package/sa_std/iter.sa +2 -0
- package/sa_std/iter.sal +1 -0
- package/sa_std/join_handle.sa +3 -0
- package/sa_std/join_handle.sal +2 -0
- package/sa_std/libsa_async.sa +80 -0
- package/sa_std/m_async.sa +137 -0
- package/sa_std/m_async.sal +30 -0
- package/sa_std/m_async.sla +2 -0
- package/sa_std/manually_drop.sa +3 -0
- package/sa_std/manually_drop.sal +2 -0
- package/sa_std/marker/phantom_data.sa +3 -0
- package/sa_std/marker/phantom_data.sal +1 -0
- package/sa_std/marker/prelude.sa +4 -0
- package/sa_std/marker/prelude.sal +4 -0
- package/sa_std/marker.sa +220 -0
- package/sa_std/marker.sal +15 -0
- package/sa_std/math.sa +84 -0
- package/sa_std/math.sai +10 -0
- package/sa_std/mem/manually_drop.sa +3 -0
- package/sa_std/mem/manually_drop.sal +1 -0
- package/sa_std/mem/prelude.sa +2 -0
- package/sa_std/mem/prelude.sal +2 -0
- package/sa_std/mem.sa +564 -0
- package/sa_std/mem.sal +40 -0
- package/sa_std/modstate.sai +19 -0
- package/sa_std/net.sa +4227 -0
- package/sa_std/net.sai +239 -0
- package/sa_std/net.sal +159 -0
- package/sa_std/netx.sa +85 -0
- package/sa_std/netx.sai +11 -0
- package/sa_std/netx.sal +39 -0
- package/sa_std/nonzero.sa +3 -0
- package/sa_std/nonzero.sal +2 -0
- package/sa_std/num/nonzero.sa +3 -0
- package/sa_std/num/nonzero.sal +1 -0
- package/sa_std/num/prelude.sa +3 -0
- package/sa_std/num/prelude.sal +3 -0
- package/sa_std/num.sa +17302 -0
- package/sa_std/num.sai +11 -0
- package/sa_std/num.sal +341 -0
- package/sa_std/ops.sa +1884 -0
- package/sa_std/ops.sal +68 -0
- package/sa_std/option.sa +2 -0
- package/sa_std/option.sal +1 -0
- package/sa_std/os/fd.sa +96 -0
- package/sa_std/os/fd.sai +7 -0
- package/sa_std/os/fd.sal +11 -0
- package/sa_std/os/prelude.sa +2 -0
- package/sa_std/os/prelude.sal +1 -0
- package/sa_std/os/unix_ffi.sa +271 -0
- package/sa_std/panic.sa +1 -0
- package/sa_std/panic.sal +1 -0
- package/sa_std/path.sa +3170 -0
- package/sa_std/path.sal +12 -0
- package/sa_std/phantom_data.sa +3 -0
- package/sa_std/phantom_data.sal +2 -0
- package/sa_std/pin.sa +79 -0
- package/sa_std/pin.sal +5 -0
- package/sa_std/plugin_async.sa +90 -0
- package/sa_std/plugin_async.sal +29 -0
- package/sa_std/plugin_async.sla +4 -0
- package/sa_std/plugin_http_async.sa +46 -0
- package/sa_std/plugin_http_server.sa +61 -0
- package/sa_std/plugin_http_server.sla +2 -0
- package/sa_std/plugin_sqlite.sa +106 -0
- package/sa_std/plugin_sqlite.sla +2 -0
- package/sa_std/prelude.sa +60 -0
- package/sa_std/prelude.sal +55 -0
- package/sa_std/process.sa +916 -0
- package/sa_std/process.sai +57 -0
- package/sa_std/process.sal +27 -0
- package/sa_std/ptr.sa +503 -0
- package/sa_std/ptr.sal +2 -0
- package/sa_std/result.sa +2 -0
- package/sa_std/result.sal +1 -0
- package/sa_std/rust_core.sa +51 -0
- package/sa_std/rust_core.sal +26 -0
- package/sa_std/sa.mod +7 -0
- package/sa_std/sort.sa +156 -0
- package/sa_std/str.sla +13 -0
- package/sa_std/string.sa +12240 -0
- package/sa_std/string.sai +25 -0
- package/sa_std/string.sal +17 -0
- package/sa_std/string_format.sa +269 -0
- package/sa_std/sync/atomic.sa +1500 -0
- package/sa_std/sync/atomic.sal +45 -0
- package/sa_std/sync/barrier.sa +105 -0
- package/sa_std/sync/barrier.sal +7 -0
- package/sa_std/sync/condvar.sa +240 -0
- package/sa_std/sync/condvar.sal +4 -0
- package/sa_std/sync/mpsc.sa +758 -0
- package/sa_std/sync/mpsc.sal +42 -0
- package/sa_std/sync/mpsc_list.sa +255 -0
- package/sa_std/sync/mpsc_list.sal +3 -0
- package/sa_std/sync/mutex.sa +182 -0
- package/sa_std/sync/mutex.sal +7 -0
- package/sa_std/sync/once.sa +371 -0
- package/sa_std/sync/once.sal +31 -0
- package/sa_std/sync/poison.sa +36 -0
- package/sa_std/sync/poison.sal +11 -0
- package/sa_std/sync/prelude.sa +8 -0
- package/sa_std/sync/prelude.sal +7 -0
- package/sa_std/sync/rwlock.sa +369 -0
- package/sa_std/sync/rwlock.sal +13 -0
- package/sa_std/task.sa +2 -0
- package/sa_std/task.sal +1 -0
- package/sa_std/term.sa +2 -0
- package/sa_std/term.sai +10 -0
- package/sa_std/term.sal +33 -0
- package/sa_std/testing/assert.sai +4 -0
- package/sa_std/testing/mock_io.sa +174 -0
- package/sa_std/testing/mock_io.sal +5 -0
- package/sa_std/testing/prelude.sa +2 -0
- package/sa_std/testing/prelude.sal +1 -0
- package/sa_std/text/prelude.sa +1 -0
- package/sa_std/text/prelude.sal +1 -0
- package/sa_std/text/regex.sa +2 -0
- package/sa_std/text/regex.sai +9 -0
- package/sa_std/text/regex.sal +33 -0
- package/sa_std/thread/join_handle.sa +3 -0
- package/sa_std/thread/join_handle.sal +1 -0
- package/sa_std/thread/prelude.sa +4 -0
- package/sa_std/thread/prelude.sal +3 -0
- package/sa_std/thread.sa +160 -0
- package/sa_std/thread.sai +11 -0
- package/sa_std/thread.sal +4 -0
- package/sa_std/thread_local.sa +45 -0
- package/sa_std/thread_local.sai +9 -0
- package/sa_std/time/duration.sa +3 -0
- package/sa_std/time/duration.sal +1 -0
- package/sa_std/time/instant.sa +3 -0
- package/sa_std/time/instant.sal +1 -0
- package/sa_std/time/prelude.sa +4 -0
- package/sa_std/time/prelude.sal +4 -0
- package/sa_std/time.sa +850 -0
- package/sa_std/time.sai +37 -0
- package/sa_std/time.sal +35 -0
- package/sa_std/time.sla +67 -0
- package/sa_std/tls_client.sai +39 -0
- package/sa_std/vec.sa +5754 -0
- package/sa_std/vec.sal +1 -0
- package/sa_std/vec_deque.sa +4925 -0
- package/sa_std/vec_deque.sal +8 -0
- package/sa_std/vec_runtime_macros.sa +11 -0
- 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
|