@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,6 @@
1
+ #def Result_SIZE = 24
2
+ #def Result_tag = +0
3
+ #def Result_ok = +8
4
+ #def Result_err = +16
5
+ #def Result_OK = 0
6
+ #def Result_ERR = 1
@@ -0,0 +1,295 @@
1
+ // rust_patterns.sal — SA 标准宏库:Rust 风格模式
2
+ // 提供 match guard、range pattern、or-pattern、@-binding、
3
+ // while-let、for-each、try block、generator、tail call 等宏
4
+ // 所有宏均为纯文本展开,零运行时开销
5
+
6
+ // ═══════════════════════════════════════════════════
7
+ // 1. MATCH GUARD PATTERNS
8
+ // ═══════════════════════════════════════════════════
9
+
10
+ // MATCH_GUARD_LT: if val < bound → yes/no
11
+ [MACRO] MATCH_GUARD_LT %val, %bound, %label_yes, %label_no
12
+ _mgl = slt %val, %bound
13
+ br _mgl -> %label_yes, %label_no
14
+ [END_MACRO]
15
+
16
+ // MATCH_GUARD_LE: if val <= bound → yes/no
17
+ [MACRO] MATCH_GUARD_LE %val, %bound, %label_yes, %label_no
18
+ _mgle = sle %val, %bound
19
+ br _mgle -> %label_yes, %label_no
20
+ [END_MACRO]
21
+
22
+ // MATCH_GUARD_EQ: if val == bound → yes/no
23
+ [MACRO] MATCH_GUARD_EQ %val, %bound, %label_yes, %label_no
24
+ _mgeq = eq %val, %bound
25
+ br _mgeq -> %label_yes, %label_no
26
+ [END_MACRO]
27
+
28
+ // MATCH_GUARD_NE: if val != bound → yes/no
29
+ [MACRO] MATCH_GUARD_NE %val, %bound, %label_yes, %label_no
30
+ _mgne = ne %val, %bound
31
+ br _mgne -> %label_yes, %label_no
32
+ [END_MACRO]
33
+
34
+ // ═══════════════════════════════════════════════════
35
+ // 2. RANGE PATTERN
36
+ // ═══════════════════════════════════════════════════
37
+
38
+ // RANGE_IN: if lo <= val <= hi → yes/no
39
+ [MACRO] RANGE_IN %val, %lo, %hi, %label_yes, %label_no
40
+ _rlo = sle %lo, %val
41
+ _rhi = sle %val, %hi
42
+ _rin = and _rlo, _rhi
43
+ !_rlo
44
+ !_rhi
45
+ br _rin -> %label_yes, %label_no
46
+ [END_MACRO]
47
+
48
+ // BIND_RANGE: bind val to %bound AND check range
49
+ [MACRO] BIND_RANGE %bound, %val, %lo, %hi, %label_yes, %label_no
50
+ %bound = add %val, 0
51
+ _br_lo = sle %lo, %bound
52
+ _br_hi = sle %bound, %hi
53
+ _br_in = and _br_lo, _br_hi
54
+ !_br_lo
55
+ !_br_hi
56
+ br _br_in -> %label_yes, %label_no
57
+ [END_MACRO]
58
+
59
+ // ═══════════════════════════════════════════════════
60
+ // 3. OR-PATTERN (TAG MATCHING)
61
+ // ═══════════════════════════════════════════════════
62
+
63
+ // OR_TAG_2: tag == t1 || tag == t2 → bool
64
+ [MACRO] OR_TAG_2 %out, %tag, %t1, %t2
65
+ _ot2a = eq %tag, %t1
66
+ _ot2b = eq %tag, %t2
67
+ %out = or _ot2a, _ot2b
68
+ !_ot2a
69
+ !_ot2b
70
+ [END_MACRO]
71
+
72
+ // OR_TAG_3: tag == t1 || t2 || t3 → bool
73
+ [MACRO] OR_TAG_3 %out, %tag, %t1, %t2, %t3
74
+ _ot3a = eq %tag, %t1
75
+ _ot3b = eq %tag, %t2
76
+ _ot3c = eq %tag, %t3
77
+ _ot3ab = or _ot3a, _ot3b
78
+ %out = or _ot3ab, _ot3c
79
+ !_ot3a
80
+ !_ot3b
81
+ !_ot3c
82
+ !_ot3ab
83
+ [END_MACRO]
84
+
85
+ // OR_TAG_4: tag == t1 || t2 || t3 || t4 → bool
86
+ [MACRO] OR_TAG_4 %out, %tag, %t1, %t2, %t3, %t4
87
+ _ot4a = eq %tag, %t1
88
+ _ot4b = eq %tag, %t2
89
+ _ot4c = eq %tag, %t3
90
+ _ot4d = eq %tag, %t4
91
+ _ot4ab = or _ot4a, _ot4b
92
+ _ot4cd = or _ot4c, _ot4d
93
+ %out = or _ot4ab, _ot4cd
94
+ !_ot4a
95
+ !_ot4b
96
+ !_ot4c
97
+ !_ot4d
98
+ !_ot4ab
99
+ !_ot4cd
100
+ [END_MACRO]
101
+
102
+ // ═══════════════════════════════════════════════════
103
+ // 4. MATCHES! MACRO
104
+ // ═══════════════════════════════════════════════════
105
+
106
+ // MATCHES_TAG: tag == target → bool
107
+ [MACRO] MATCHES_TAG %out, %tag, %target
108
+ %out = eq %tag, %target
109
+ [END_MACRO]
110
+
111
+ // MATCHES_TAG_AND: tag == target AND extra_cond → bool
112
+ [MACRO] MATCHES_TAG_AND %out, %tag, %target, %extra_cond
113
+ _mta = eq %tag, %target
114
+ %out = and _mta, %extra_cond
115
+ !_mta
116
+ [END_MACRO]
117
+
118
+ // ═══════════════════════════════════════════════════
119
+ // 5. WHILE-LET / FOR-EACH
120
+ // ═══════════════════════════════════════════════════
121
+
122
+ // WHILE_SOME: check option is Some → body/exit
123
+ [MACRO] WHILE_SOME %opt_ptr, %out_val, %label_body, %label_exit
124
+ _ws = eq 0, 0
125
+ EXPAND OPTION_IS_SOME _ws, %opt_ptr
126
+ br _ws -> %label_body, %label_exit
127
+ [END_MACRO]
128
+
129
+ // ═══════════════════════════════════════════════════
130
+ // 6. TRY BLOCK
131
+ // ═══════════════════════════════════════════════════
132
+
133
+ // TRY_CHECK: check result is ok → unwrap/err
134
+ [MACRO] TRY_CHECK %result, %out_val, %label_ok, %label_err
135
+ EXPAND RESULT_IS_OK _tc_ok, %result
136
+ br _tc_ok -> %label_ok, %label_err
137
+ [END_MACRO]
138
+
139
+ // ═══════════════════════════════════════════════════
140
+ // 7. TAIL CALL
141
+ // ═══════════════════════════════════════════════════
142
+
143
+ // TAIL_CALL_2: update 2 params and jump back
144
+ [MACRO] TAIL_CALL_2 %p1, %p2, %new_p1, %new_p2, %label_loop
145
+ !%p1
146
+ !%p2
147
+ %p1 = add %new_p1, 0
148
+ %p2 = add %new_p2, 0
149
+ jmp %label_loop
150
+ [END_MACRO]
151
+
152
+ // TAIL_CALL_3: update 3 params and jump back
153
+ [MACRO] TAIL_CALL_3 %p1, %p2, %p3, %new_p1, %new_p2, %new_p3, %label_loop
154
+ !%p1
155
+ !%p2
156
+ !%p3
157
+ %p1 = add %new_p1, 0
158
+ %p2 = add %new_p2, 0
159
+ %p3 = add %new_p3, 0
160
+ jmp %label_loop
161
+ [END_MACRO]
162
+
163
+ // ═══════════════════════════════════════════════════
164
+ // 8. LOOP BREAK VALUE
165
+ // ═══════════════════════════════════════════════════
166
+
167
+ // LOOP_FIND: loop pattern with break value
168
+ // (specific implementations are per-use-case)
169
+
170
+ // ═══════════════════════════════════════════════════
171
+ // 9. STRUCT PATTERNS
172
+ // ═══════════════════════════════════════════════════
173
+
174
+ // DESTRUCT_PAIR: extract first two i32 from base
175
+ [MACRO] DESTRUCT_PAIR %out_a, %out_b, %base
176
+ %out_a = load %base+0 as i32
177
+ %out_b = load %base+4 as i32
178
+ [END_MACRO]
179
+
180
+ // DESTRUCT_FIRST: extract first field at offset
181
+ [MACRO] DESTRUCT_FIRST %out, %base, %offset
182
+ %out = load %base+%offset as i32
183
+ [END_MACRO]
184
+
185
+ // ═══════════════════════════════════════════════════
186
+ // 10. LAZY / ONCE
187
+ // ═══════════════════════════════════════════════════
188
+
189
+ #def LAZY_NOT_INIT = 0
190
+ #def LAZY_IS_INIT = 1
191
+
192
+ // LAZY_GET_OR_INIT: check init flag, init if needed, return value
193
+ [MACRO] LAZY_GET_OR_INIT %out, %lock, %init_value
194
+ _lgi_flag = load %lock+0 as u32
195
+ _lgi_inited = eq _lgi_flag, LAZY_IS_INIT
196
+ br _lgi_inited -> L_LGI_CACHED, L_LGI_INIT
197
+
198
+ L_LGI_INIT:
199
+ !_lgi_flag
200
+ !_lgi_inited
201
+ store %lock+4, %init_value as i32
202
+ store %lock+0, LAZY_IS_INIT as u32
203
+ %out = %init_value
204
+ jmp L_LGI_DONE
205
+
206
+ L_LGI_CACHED:
207
+ !_lgi_flag
208
+ !_lgi_inited
209
+ %out = load %lock+4 as i32
210
+ jmp L_LGI_DONE
211
+
212
+ L_LGI_DONE:
213
+ [END_MACRO]
214
+
215
+ // ═══════════════════════════════════════════════════
216
+ // 11. ASSERT WITH MESSAGE
217
+ // ═══════════════════════════════════════════════════
218
+
219
+ // ASSERT_NE_ZERO: assert val != 0, else panic(code)
220
+ [MACRO] ASSERT_NE_ZERO %val, %panic_code, %label_ok
221
+ _anz = ne %val, 0
222
+ br _anz -> %label_ok, L_ANZ_FAIL
223
+
224
+ L_ANZ_FAIL:
225
+ !_anz
226
+ panic(%panic_code)
227
+ [END_MACRO]
228
+
229
+ // ASSERT_GE_ZERO: assert val >= 0, else panic(code)
230
+ [MACRO] ASSERT_GE_ZERO %val, %panic_code, %label_ok
231
+ _agz = sge %val, 0
232
+ br _agz -> %label_ok, L_AGZ_FAIL
233
+
234
+ L_AGZ_FAIL:
235
+ !_agz
236
+ panic(%panic_code)
237
+ [END_MACRO]
238
+
239
+ // ASSERT_TRUE: assert cond is true, else panic(code)
240
+ [MACRO] ASSERT_TRUE_MSG %cond, %panic_code, %label_ok
241
+ br %cond -> %label_ok, L_ATM_FAIL
242
+
243
+ L_ATM_FAIL:
244
+ panic(%panic_code)
245
+ [END_MACRO]
246
+
247
+ // ═══════════════════════════════════════════════════
248
+ // 12. RAII GUARD
249
+ // ═══════════════════════════════════════════════════
250
+
251
+ // RAII_ALLOC: alloc resource at scope begin
252
+ [MACRO] RAII_ALLOC %resource, %size
253
+ %resource = alloc %size
254
+ [END_MACRO]
255
+
256
+ // RAII_FREE: free resource at scope end
257
+ [MACRO] RAII_FREE %resource
258
+ !%resource
259
+ [END_MACRO]
260
+
261
+ // ═══════════════════════════════════════════════════
262
+ // 13. C-STRING
263
+ // ═══════════════════════════════════════════════════
264
+
265
+ // CSTR_LEN: compute length of null-terminated string
266
+ [MACRO] CSTR_LEN %out_len, %base
267
+ _cl_slot = stack_alloc 8
268
+ store _cl_slot+0, 0 as u64
269
+ jmp L_CL_LP
270
+
271
+ L_CL_LP:
272
+ _cl_i = load _cl_slot+0 as u64
273
+ _cl_p = ptr_add %base, _cl_i
274
+ _cl_b = load _cl_p+0 as u8
275
+ _cl_end = eq _cl_b, 0
276
+ br _cl_end -> L_CL_DONE, L_CL_NEXT
277
+
278
+ L_CL_NEXT:
279
+ _cl_n = add _cl_i, 1
280
+ store _cl_slot+0, _cl_n as u64
281
+ !_cl_i
282
+ !_cl_p
283
+ !_cl_b
284
+ !_cl_end
285
+ !_cl_n
286
+ jmp L_CL_LP
287
+
288
+ L_CL_DONE:
289
+ !_cl_end
290
+ !_cl_b
291
+ !_cl_p
292
+ !_cl_i
293
+ %out_len = load _cl_slot+0 as u64
294
+ !_cl_slot
295
+ [END_MACRO]
@@ -0,0 +1,84 @@
1
+ // Standard assertion macros for smoke tests and examples.
2
+ // Callers supply explicit temporary condition registers so repeated
3
+ // macro expansions remain hygienic.
4
+
5
+ @import "cell.sal"
6
+ @import "cell.sa"
7
+ @import "refcell.sal"
8
+ @import "refcell.sa"
9
+ @import "rc.sal"
10
+ @import "rc.sa"
11
+ @import "weak.sal"
12
+ @import "weak.sa"
13
+ @import "trait_object.sal"
14
+ @import "trait_object.sa"
15
+ @import "waker.sal"
16
+ @import "waker.sa"
17
+ @import "future.sal"
18
+ @import "future.sa"
19
+ @import "task.sal"
20
+ @import "task.sa"
21
+ @import "result.sal"
22
+ @import "result.sa"
23
+ @import "box.sal"
24
+ @import "box.sa"
25
+ @import "derive.sal"
26
+ @import "derive.sa"
27
+ @import "dispatch.sal"
28
+ @import "dispatch.sa"
29
+ @import "arc.sal"
30
+ @import "arc.sa"
31
+ @import "bit.sa"
32
+ @import "loop.sa"
33
+ @import "control.sa"
34
+ @import "hash.sa"
35
+ @import "cleanup.sa"
36
+ @import "../sync/rwlock.sal"
37
+ @import "../sync/rwlock.sa"
38
+
39
+ [MACRO] ASSERT_EQ %cond, %actual, %expected, %ok_label, %fail_label
40
+ %cond = eq %actual, %expected
41
+ br %cond -> %ok_label, %fail_label
42
+ [END_MACRO]
43
+
44
+ [MACRO] ASSERT_TRUE %cond, %ok_label, %fail_label
45
+ br %cond -> %ok_label, %fail_label
46
+ [END_MACRO]
47
+
48
+ [MACRO] ASSERT_NE %cond, %actual, %unexpected, %ok_label, %fail_label
49
+ %cond = ne %actual, %unexpected
50
+ br %cond -> %ok_label, %fail_label
51
+ [END_MACRO]
52
+
53
+ // Diagnostic assertion variants for `sa test`.
54
+ // The message is caller-owned static text so macro expansion stays Zero-AST:
55
+ // callers can include file, line, expected, and got details in one const.
56
+ [MACRO] ASSERT_TRUE_MSG %cond, %msg_ptr, %msg_len
57
+ br %cond -> L_ASSERT_TRUE_MSG_OK_%cond, L_ASSERT_TRUE_MSG_FAIL_%cond
58
+ L_ASSERT_TRUE_MSG_FAIL_%cond:
59
+ panic_msg(103, *%msg_ptr, %msg_len)
60
+ L_ASSERT_TRUE_MSG_OK_%cond:
61
+ [END_MACRO]
62
+
63
+ [MACRO] ASSERT_EQ_MSG %cond, %actual, %expected, %msg_ptr, %msg_len
64
+ %cond = eq %actual, %expected
65
+ EXPAND ASSERT_TRUE_MSG %cond, %msg_ptr, %msg_len
66
+ [END_MACRO]
67
+
68
+ [MACRO] ASSERT_NE_MSG %cond, %actual, %unexpected, %msg_ptr, %msg_len
69
+ %cond = ne %actual, %unexpected
70
+ EXPAND ASSERT_TRUE_MSG %cond, %msg_ptr, %msg_len
71
+ [END_MACRO]
72
+
73
+ [MACRO] DROP_AND_RETURN %resource_reg, %value
74
+ !%resource_reg
75
+ return %value
76
+ [END_MACRO]
77
+
78
+ [MACRO] CFG %out_bool, %flag
79
+ [IF %flag]
80
+ %out_bool = add 0, 1
81
+ [ELSE]
82
+ %out_bool = add 0, 0
83
+ [END_IF]
84
+ [END_MACRO]