@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,4 @@
1
+ // Stable thread namespace aggregation.
2
+ @import "join_handle.sa"
3
+ @import "../thread.sa"
4
+ @import "../thread_local.sa"
@@ -0,0 +1,3 @@
1
+ // ABI/layout companion for thread namespace aggregation.
2
+ @import "join_handle.sal"
3
+ @import "../thread.sai"
@@ -0,0 +1,160 @@
1
+ @import "thread.sai"
2
+ @import "time.sa"
3
+
4
+ [MACRO] THREAD_SPAWN %out_handle, %entry_ptr, %arg_ptr
5
+ %out_handle = call @pthread_spawn(%entry_ptr, %arg_ptr)
6
+ [END_MACRO]
7
+
8
+ [MACRO] THREAD_SPAWN_DETACHED %out_handle, %entry_ptr, %arg_ptr
9
+ %out_handle = call @pthread_spawn_detached(%entry_ptr, %arg_ptr)
10
+ [END_MACRO]
11
+
12
+ [MACRO] THREAD_JOIN_STATUS %out_status, %handle, %out_ptr
13
+ %out_status = call @pthread_join(%handle, *%out_ptr)
14
+ [END_MACRO]
15
+
16
+ [MACRO] THREAD_DROP %handle
17
+ call @pthread_drop(%handle)
18
+ [END_MACRO]
19
+
20
+ [MACRO] THREAD_CURRENT_ID %out_id
21
+ %out_id = call @sa_thread_current_id()
22
+ [END_MACRO]
23
+
24
+ // Rust-named aliases for current-thread identity and cooperative yield.
25
+
26
+ [MACRO] THREAD_CURRENT %out_id
27
+ EXPAND THREAD_CURRENT_ID %out_id
28
+ [END_MACRO]
29
+
30
+ [MACRO] THREAD_YIELD %out_status
31
+ EXPAND THREAD_YIELD_NOW %out_status
32
+ [END_MACRO]
33
+
34
+ [MACRO] THREAD_YIELD_NOW %out_status
35
+ %out_status = call @sa_thread_yield_now()
36
+ [END_MACRO]
37
+
38
+ [MACRO] THREAD_AS_PTHREAD_T %out_status, %out_raw, %handle
39
+ __thread_as_pthread_slot_%out_raw = stack_alloc 8
40
+ %out_status = call @sa_thread_as_pthread_t(%handle, &__thread_as_pthread_slot_%out_raw)
41
+ %out_raw = load __thread_as_pthread_slot_%out_raw+0 as u64
42
+ [END_MACRO]
43
+
44
+ [MACRO] THREAD_INTO_PTHREAD_T %out_status, %out_raw, %handle
45
+ __thread_into_pthread_slot_%out_raw = stack_alloc 8
46
+ %out_status = call @sa_thread_into_pthread_t(%handle, &__thread_into_pthread_slot_%out_raw)
47
+ %out_raw = load __thread_into_pthread_slot_%out_raw+0 as u64
48
+ [END_MACRO]
49
+
50
+ [MACRO] THREAD_RAW_PTHREAD_JOIN_STATUS %out_status, %raw, %out_ptr
51
+ %out_status = call @sa_thread_raw_pthread_join(%raw, *%out_ptr)
52
+ [END_MACRO]
53
+
54
+ // Builder-style SSA facade over existing spawn helpers.
55
+ // State is a single detached flag (0/1); no stack-size/name runtime ABI yet.
56
+
57
+ [MACRO] THREAD_BUILDER_NEW %out_detached
58
+ %out_detached = add 0, 0
59
+ [END_MACRO]
60
+
61
+ [MACRO] THREAD_BUILDER_WITH_DETACHED %out_detached, %in_detached, %flag
62
+ __thread_builder_zero_%out_detached = eq %flag, 0
63
+ br __thread_builder_zero_%out_detached -> L_THREAD_BUILDER_DETACHED_OFF_%out_detached, L_THREAD_BUILDER_DETACHED_ON_%out_detached
64
+ L_THREAD_BUILDER_DETACHED_OFF_%out_detached:
65
+ %out_detached = add 0, 0
66
+ !__thread_builder_zero_%out_detached
67
+ !%in_detached
68
+ jmp L_THREAD_BUILDER_DETACHED_END_%out_detached
69
+ L_THREAD_BUILDER_DETACHED_ON_%out_detached:
70
+ %out_detached = add 0, 1
71
+ !__thread_builder_zero_%out_detached
72
+ !%in_detached
73
+ jmp L_THREAD_BUILDER_DETACHED_END_%out_detached
74
+ L_THREAD_BUILDER_DETACHED_END_%out_detached:
75
+ [END_MACRO]
76
+
77
+ [MACRO] THREAD_BUILDER_SPAWN %out_handle, %detached, %entry_ptr, %arg_ptr
78
+ __thread_builder_spawn_detached_%out_handle = ne %detached, 0
79
+ br __thread_builder_spawn_detached_%out_handle -> L_THREAD_BUILDER_SPAWN_DETACHED_%out_handle, L_THREAD_BUILDER_SPAWN_JOINABLE_%out_handle
80
+ L_THREAD_BUILDER_SPAWN_DETACHED_%out_handle:
81
+ EXPAND THREAD_SPAWN_DETACHED %out_handle, %entry_ptr, %arg_ptr
82
+ !__thread_builder_spawn_detached_%out_handle
83
+ jmp L_THREAD_BUILDER_SPAWN_END_%out_handle
84
+ L_THREAD_BUILDER_SPAWN_JOINABLE_%out_handle:
85
+ EXPAND THREAD_SPAWN %out_handle, %entry_ptr, %arg_ptr
86
+ !__thread_builder_spawn_detached_%out_handle
87
+ jmp L_THREAD_BUILDER_SPAWN_END_%out_handle
88
+ L_THREAD_BUILDER_SPAWN_END_%out_handle:
89
+ [END_MACRO]
90
+
91
+ // Sleep helpers aliased over the existing time facade.
92
+
93
+ [MACRO] THREAD_SLEEP_NS %ns
94
+ EXPAND TIME_SLEEP_NS %ns
95
+ [END_MACRO]
96
+
97
+ [MACRO] THREAD_SLEEP_MS %ms
98
+ EXPAND TIME_SLEEP_MS %ms
99
+ [END_MACRO]
100
+
101
+ // Sleep for a concrete Duration-like nanosecond scalar.
102
+ [MACRO] THREAD_SLEEP_DURATION_NS %duration_ns
103
+ EXPAND THREAD_SLEEP_NS %duration_ns
104
+ [END_MACRO]
105
+
106
+ // JoinHandle value facade over the pthread-backed thread handle.
107
+ [MACRO] JOIN_HANDLE_NEW %out_join_handle, %raw_handle
108
+ %out_join_handle = alloc JoinHandle_SIZE
109
+ store %out_join_handle+JoinHandle_handle, %raw_handle as i32
110
+ store %out_join_handle+JoinHandle_result, 0 as u64
111
+ [END_MACRO]
112
+
113
+ [MACRO] JOIN_HANDLE_JOIN_STATUS %out_status, %join_handle, %out_ptr
114
+ __join_handle_raw_%out_status = load %join_handle+JoinHandle_handle as i32
115
+ __join_handle_joinable_%out_status = ne __join_handle_raw_%out_status, 0
116
+ br __join_handle_joinable_%out_status -> L_JOIN_HANDLE_JOIN_CALL_%out_status, L_JOIN_HANDLE_JOINED_%out_status
117
+ L_JOIN_HANDLE_JOIN_CALL_%out_status:
118
+ %out_status = call @pthread_join(__join_handle_raw_%out_status, *%out_ptr)
119
+ store %join_handle+JoinHandle_result, %out_status as u64
120
+ store %join_handle+JoinHandle_handle, 0 as i32
121
+ !__join_handle_joinable_%out_status
122
+ !__join_handle_raw_%out_status
123
+ jmp L_JOIN_HANDLE_JOIN_DONE_%out_status
124
+ L_JOIN_HANDLE_JOINED_%out_status:
125
+ %out_status = load %join_handle+JoinHandle_result as i32
126
+ !__join_handle_joinable_%out_status
127
+ !__join_handle_raw_%out_status
128
+ L_JOIN_HANDLE_JOIN_DONE_%out_status:
129
+ [END_MACRO]
130
+
131
+ [MACRO] JOIN_HANDLE_IS_FINISHED %out_done, %join_handle
132
+ __join_handle_state_%out_done = load %join_handle+JoinHandle_handle as i32
133
+ %out_done = eq __join_handle_state_%out_done, 0
134
+ !__join_handle_state_%out_done
135
+ [END_MACRO]
136
+
137
+ [MACRO] JOIN_HANDLE_JOIN %out_status, %join_handle, %out_ptr
138
+ EXPAND JOIN_HANDLE_JOIN_STATUS %out_status, %join_handle, %out_ptr
139
+ [END_MACRO]
140
+
141
+ [MACRO] JOIN_HANDLE_DROP %join_handle
142
+ __join_handle_drop_raw_%join_handle = load %join_handle+JoinHandle_handle as i32
143
+ __join_handle_drop_live_%join_handle = ne __join_handle_drop_raw_%join_handle, 0
144
+ br __join_handle_drop_live_%join_handle -> L_JOIN_HANDLE_DROP_CALL_%join_handle, L_JOIN_HANDLE_DROP_DONE_%join_handle
145
+ L_JOIN_HANDLE_DROP_CALL_%join_handle:
146
+ call @pthread_drop(__join_handle_drop_raw_%join_handle)
147
+ L_JOIN_HANDLE_DROP_DONE_%join_handle:
148
+ store %join_handle+JoinHandle_handle, 0 as i32
149
+ !__join_handle_drop_raw_%join_handle
150
+ !__join_handle_drop_live_%join_handle
151
+ !%join_handle
152
+ [END_MACRO]
153
+
154
+ [MACRO] JOIN_HANDLE_AS_RAW %out_raw, %join_handle
155
+ %out_raw = load %join_handle+JoinHandle_handle as u64
156
+ [END_MACRO]
157
+
158
+ [MACRO] JOIN_HANDLE_RESULT_STATUS %out_status, %join_handle
159
+ %out_status = load %join_handle+JoinHandle_result as i32
160
+ [END_MACRO]
@@ -0,0 +1,11 @@
1
+ // SA-facing contracts for the std::thread runtime facade.
2
+ // Handles are opaque i32 slots owned by the Zig-backed sa_std runtime.
3
+ @extern pthread_spawn(*entry: ptr, *arg: ptr) -> i32
4
+ @extern pthread_spawn_detached(*entry: ptr, *arg: ptr) -> i32
5
+ @extern pthread_join(handle: i32, *out: ptr) -> i32
6
+ @extern pthread_drop(handle: i32) -> void
7
+ @extern sa_thread_current_id() -> u64
8
+ @extern sa_thread_yield_now() -> i32
9
+ @extern sa_thread_as_pthread_t(handle: i32, &out_raw: ptr) -> i32
10
+ @extern sa_thread_into_pthread_t(handle: i32, &out_raw: ptr) -> i32
11
+ @extern sa_thread_raw_pthread_join(raw: u64, *out: ptr) -> i32
@@ -0,0 +1,4 @@
1
+ #def JoinHandle_SIZE = 16
2
+ #def JoinHandle_handle = +0
3
+ #def JoinHandle_result = +8
4
+ #def THREAD_DEFAULT_ID = 0
@@ -0,0 +1,45 @@
1
+ // Rust `thread_local!` / `LocalKey<T>` storage over the sa_thread_local_slot
2
+ // registry (src/runtime/sa_thread_local.zig). No second implementation lives
3
+ // here: this file is a thin macro facade, reusing only existing SA core
4
+ // (`alloc`/`load`/`store`, `call @extern`) plus the Cell u32/u64 width
5
+ // convention from sa_std/core/cell.sa.
6
+ //
7
+ // Rust mapping (see sarust/STD_MAP.md):
8
+ // thread_local! { static K: Cell<u32> } -> key = FNV1a(DefPath), slot u64
9
+ // LocalKey::with(|c| …) -> THREAD_LOCAL_SLOT + call indirect
10
+ // EagerStorage::get (internal accessor) -> THREAD_LOCAL_SLOT (the lowered
11
+ // ThreadLocal rvalue shape)
12
+ // Cell::get / Cell::set -> THREAD_LOCAL_U32_GET / SET
13
+ // Cell<u64> variants -> THREAD_LOCAL_U64_GET / SET
14
+ @import "thread_local.sai"
15
+
16
+ // Resolve (or lazily create) the calling thread's u64 slot for %key.
17
+ // Loud on OOM (registry returns null) via panic(1403), same family as the
18
+ // mpsc 1401/1402 allocation-failure codes.
19
+ [MACRO] THREAD_LOCAL_SLOT %out_slot, %key
20
+ %out_slot = call @sa_thread_local_slot(%key)
21
+ __tls_slot_ok_%out_slot = ne %out_slot, 0
22
+ br __tls_slot_ok_%out_slot -> L_TLS_SLOT_OK_%out_slot, L_TLS_SLOT_OOM_%out_slot
23
+ L_TLS_SLOT_OOM_%out_slot:
24
+ panic(1403)
25
+ L_TLS_SLOT_OK_%out_slot:
26
+ !__tls_slot_ok_%out_slot
27
+ [END_MACRO]
28
+
29
+ // Cell<u32> view of a resolved slot (the TLS_N corpus shape).
30
+ [MACRO] THREAD_LOCAL_U32_GET %out_value, %slot_reg
31
+ %out_value = load %slot_reg+0 as u32
32
+ [END_MACRO]
33
+
34
+ [MACRO] THREAD_LOCAL_U32_SET %slot_reg, %value
35
+ store %slot_reg+0, %value as u32
36
+ [END_MACRO]
37
+
38
+ // Cell<u64> view of a resolved slot.
39
+ [MACRO] THREAD_LOCAL_U64_GET %out_value, %slot_reg
40
+ %out_value = load %slot_reg+0 as u64
41
+ [END_MACRO]
42
+
43
+ [MACRO] THREAD_LOCAL_U64_SET %slot_reg, %value
44
+ store %slot_reg+0, %value as u64
45
+ [END_MACRO]
@@ -0,0 +1,9 @@
1
+ // SA-facing contracts for Rust `thread_local!` storage.
2
+ //
3
+ // Backed by the pure-Zig registry in src/runtime/sa_thread_local.zig:
4
+ // slots are keyed by (OS thread id, key), zero-initialized, never freed.
5
+ // Each `thread_local!` static maps to one u64 key (FNV-1a of its rustc
6
+ // DefPath, computed by the sarust rsc driver so .sa stays string-free).
7
+ // A slot holds raw u64 bits; Cell<u32>/Cell<u64> narrow/widen at the macros.
8
+ @extern sa_thread_local_slot(key: u64) -> ptr
9
+ @extern sa_thread_local_supported(&out_supported: ptr) -> i32
@@ -0,0 +1,3 @@
1
+ // Duration namespace facade.
2
+ @import "../time.sal"
3
+ @import "../time.sa"
@@ -0,0 +1 @@
1
+ @import "../time.sal"
@@ -0,0 +1,3 @@
1
+ // Instant namespace facade.
2
+ @import "../time.sal"
3
+ @import "../time.sa"
@@ -0,0 +1 @@
1
+ @import "../time.sal"
@@ -0,0 +1,4 @@
1
+ // Stable time namespace aggregation.
2
+ @import "duration.sa"
3
+ @import "instant.sa"
4
+ @import "../time.sa"
@@ -0,0 +1,4 @@
1
+ // ABI/layout companion for time namespace aggregation.
2
+ @import "duration.sal"
3
+ @import "instant.sal"
4
+ @import "../time.sai"