zexus 1.7.1 → 1.7.2

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 (159) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/src/__init__.py +7 -0
  4. package/src/zexus/__init__.py +1 -1
  5. package/src/zexus/__pycache__/__init__.cpython-312.pyc +0 -0
  6. package/src/zexus/__pycache__/capability_system.cpython-312.pyc +0 -0
  7. package/src/zexus/__pycache__/debug_sanitizer.cpython-312.pyc +0 -0
  8. package/src/zexus/__pycache__/environment.cpython-312.pyc +0 -0
  9. package/src/zexus/__pycache__/error_reporter.cpython-312.pyc +0 -0
  10. package/src/zexus/__pycache__/input_validation.cpython-312.pyc +0 -0
  11. package/src/zexus/__pycache__/lexer.cpython-312.pyc +0 -0
  12. package/src/zexus/__pycache__/module_cache.cpython-312.pyc +0 -0
  13. package/src/zexus/__pycache__/module_manager.cpython-312.pyc +0 -0
  14. package/src/zexus/__pycache__/object.cpython-312.pyc +0 -0
  15. package/src/zexus/__pycache__/security.cpython-312.pyc +0 -0
  16. package/src/zexus/__pycache__/security_enforcement.cpython-312.pyc +0 -0
  17. package/src/zexus/__pycache__/syntax_validator.cpython-312.pyc +0 -0
  18. package/src/zexus/__pycache__/zexus_ast.cpython-312.pyc +0 -0
  19. package/src/zexus/__pycache__/zexus_token.cpython-312.pyc +0 -0
  20. package/src/zexus/access_control_system/__pycache__/__init__.cpython-312.pyc +0 -0
  21. package/src/zexus/access_control_system/__pycache__/access_control.cpython-312.pyc +0 -0
  22. package/src/zexus/advanced_types.py +17 -2
  23. package/src/zexus/blockchain/__init__.py +411 -0
  24. package/src/zexus/blockchain/accelerator.py +1160 -0
  25. package/src/zexus/blockchain/chain.py +660 -0
  26. package/src/zexus/blockchain/consensus.py +821 -0
  27. package/src/zexus/blockchain/contract_vm.py +1019 -0
  28. package/src/zexus/blockchain/crypto.py +79 -14
  29. package/src/zexus/blockchain/events.py +526 -0
  30. package/src/zexus/blockchain/loadtest.py +721 -0
  31. package/src/zexus/blockchain/monitoring.py +350 -0
  32. package/src/zexus/blockchain/mpt.py +716 -0
  33. package/src/zexus/blockchain/multichain.py +951 -0
  34. package/src/zexus/blockchain/multiprocess_executor.py +338 -0
  35. package/src/zexus/blockchain/network.py +886 -0
  36. package/src/zexus/blockchain/node.py +666 -0
  37. package/src/zexus/blockchain/rpc.py +1203 -0
  38. package/src/zexus/blockchain/rust_bridge.py +421 -0
  39. package/src/zexus/blockchain/storage.py +423 -0
  40. package/src/zexus/blockchain/tokens.py +750 -0
  41. package/src/zexus/blockchain/upgradeable.py +1004 -0
  42. package/src/zexus/blockchain/verification.py +1602 -0
  43. package/src/zexus/blockchain/wallet.py +621 -0
  44. package/src/zexus/cli/__pycache__/main.cpython-312.pyc +0 -0
  45. package/src/zexus/cli/main.py +300 -20
  46. package/src/zexus/cli/zpm.py +1 -1
  47. package/src/zexus/compiler/__pycache__/bytecode.cpython-312.pyc +0 -0
  48. package/src/zexus/compiler/__pycache__/lexer.cpython-312.pyc +0 -0
  49. package/src/zexus/compiler/__pycache__/parser.cpython-312.pyc +0 -0
  50. package/src/zexus/compiler/__pycache__/semantic.cpython-312.pyc +0 -0
  51. package/src/zexus/compiler/__pycache__/zexus_ast.cpython-312.pyc +0 -0
  52. package/src/zexus/compiler/lexer.py +10 -5
  53. package/src/zexus/concurrency_system.py +79 -0
  54. package/src/zexus/config.py +54 -0
  55. package/src/zexus/crypto_bridge.py +244 -8
  56. package/src/zexus/dap/__init__.py +10 -0
  57. package/src/zexus/dap/__main__.py +4 -0
  58. package/src/zexus/dap/dap_server.py +391 -0
  59. package/src/zexus/dap/debug_engine.py +298 -0
  60. package/src/zexus/environment.py +10 -1
  61. package/src/zexus/evaluator/__pycache__/bytecode_compiler.cpython-312.pyc +0 -0
  62. package/src/zexus/evaluator/__pycache__/core.cpython-312.pyc +0 -0
  63. package/src/zexus/evaluator/__pycache__/expressions.cpython-312.pyc +0 -0
  64. package/src/zexus/evaluator/__pycache__/functions.cpython-312.pyc +0 -0
  65. package/src/zexus/evaluator/__pycache__/resource_limiter.cpython-312.pyc +0 -0
  66. package/src/zexus/evaluator/__pycache__/statements.cpython-312.pyc +0 -0
  67. package/src/zexus/evaluator/__pycache__/unified_execution.cpython-312.pyc +0 -0
  68. package/src/zexus/evaluator/__pycache__/utils.cpython-312.pyc +0 -0
  69. package/src/zexus/evaluator/bytecode_compiler.py +441 -37
  70. package/src/zexus/evaluator/core.py +560 -49
  71. package/src/zexus/evaluator/expressions.py +122 -49
  72. package/src/zexus/evaluator/functions.py +417 -16
  73. package/src/zexus/evaluator/statements.py +521 -118
  74. package/src/zexus/evaluator/unified_execution.py +573 -72
  75. package/src/zexus/evaluator/utils.py +14 -2
  76. package/src/zexus/event_loop.py +186 -0
  77. package/src/zexus/lexer.py +742 -486
  78. package/src/zexus/lsp/__init__.py +1 -1
  79. package/src/zexus/lsp/definition_provider.py +163 -9
  80. package/src/zexus/lsp/server.py +22 -8
  81. package/src/zexus/lsp/symbol_provider.py +182 -9
  82. package/src/zexus/module_cache.py +237 -9
  83. package/src/zexus/object.py +64 -6
  84. package/src/zexus/parser/__pycache__/parser.cpython-312.pyc +0 -0
  85. package/src/zexus/parser/__pycache__/strategy_context.cpython-312.pyc +0 -0
  86. package/src/zexus/parser/__pycache__/strategy_structural.cpython-312.pyc +0 -0
  87. package/src/zexus/parser/parser.py +786 -285
  88. package/src/zexus/parser/strategy_context.py +407 -66
  89. package/src/zexus/parser/strategy_structural.py +117 -19
  90. package/src/zexus/persistence.py +15 -1
  91. package/src/zexus/renderer/__init__.py +15 -0
  92. package/src/zexus/renderer/__pycache__/__init__.cpython-312.pyc +0 -0
  93. package/src/zexus/renderer/__pycache__/backend.cpython-312.pyc +0 -0
  94. package/src/zexus/renderer/__pycache__/canvas.cpython-312.pyc +0 -0
  95. package/src/zexus/renderer/__pycache__/color_system.cpython-312.pyc +0 -0
  96. package/src/zexus/renderer/__pycache__/layout.cpython-312.pyc +0 -0
  97. package/src/zexus/renderer/__pycache__/main_renderer.cpython-312.pyc +0 -0
  98. package/src/zexus/renderer/__pycache__/painter.cpython-312.pyc +0 -0
  99. package/src/zexus/renderer/tk_backend.py +208 -0
  100. package/src/zexus/renderer/web_backend.py +260 -0
  101. package/src/zexus/runtime/__pycache__/__init__.cpython-312.pyc +0 -0
  102. package/src/zexus/runtime/__pycache__/async_runtime.cpython-312.pyc +0 -0
  103. package/src/zexus/runtime/__pycache__/load_manager.cpython-312.pyc +0 -0
  104. package/src/zexus/runtime/file_flags.py +137 -0
  105. package/src/zexus/safety/__pycache__/__init__.cpython-312.pyc +0 -0
  106. package/src/zexus/safety/__pycache__/memory_safety.cpython-312.pyc +0 -0
  107. package/src/zexus/security.py +424 -34
  108. package/src/zexus/stdlib/fs.py +23 -18
  109. package/src/zexus/stdlib/http.py +289 -186
  110. package/src/zexus/stdlib/sockets.py +207 -163
  111. package/src/zexus/stdlib/websockets.py +282 -0
  112. package/src/zexus/stdlib_integration.py +369 -2
  113. package/src/zexus/strategy_recovery.py +6 -3
  114. package/src/zexus/type_checker.py +423 -0
  115. package/src/zexus/virtual_filesystem.py +189 -2
  116. package/src/zexus/vm/__init__.py +113 -3
  117. package/src/zexus/vm/__pycache__/async_optimizer.cpython-312.pyc +0 -0
  118. package/src/zexus/vm/__pycache__/bytecode.cpython-312.pyc +0 -0
  119. package/src/zexus/vm/__pycache__/bytecode_converter.cpython-312.pyc +0 -0
  120. package/src/zexus/vm/__pycache__/cache.cpython-312.pyc +0 -0
  121. package/src/zexus/vm/__pycache__/compiler.cpython-312.pyc +0 -0
  122. package/src/zexus/vm/__pycache__/gas_metering.cpython-312.pyc +0 -0
  123. package/src/zexus/vm/__pycache__/jit.cpython-312.pyc +0 -0
  124. package/src/zexus/vm/__pycache__/parallel_vm.cpython-312.pyc +0 -0
  125. package/src/zexus/vm/__pycache__/vm.cpython-312.pyc +0 -0
  126. package/src/zexus/vm/async_optimizer.py +14 -1
  127. package/src/zexus/vm/binary_bytecode.py +659 -0
  128. package/src/zexus/vm/bytecode.py +28 -1
  129. package/src/zexus/vm/bytecode_converter.py +26 -12
  130. package/src/zexus/vm/cabi.c +1985 -0
  131. package/src/zexus/vm/cabi.cpython-312-x86_64-linux-gnu.so +0 -0
  132. package/src/zexus/vm/cabi.h +127 -0
  133. package/src/zexus/vm/cache.py +557 -17
  134. package/src/zexus/vm/compiler.py +703 -5
  135. package/src/zexus/vm/fastops.c +15743 -0
  136. package/src/zexus/vm/fastops.cpython-312-x86_64-linux-gnu.so +0 -0
  137. package/src/zexus/vm/fastops.pyx +288 -0
  138. package/src/zexus/vm/gas_metering.py +50 -9
  139. package/src/zexus/vm/jit.py +83 -2
  140. package/src/zexus/vm/native_jit_backend.py +1816 -0
  141. package/src/zexus/vm/native_runtime.cpp +1388 -0
  142. package/src/zexus/vm/native_runtime.cpython-312-x86_64-linux-gnu.so +0 -0
  143. package/src/zexus/vm/optimizer.py +161 -11
  144. package/src/zexus/vm/parallel_vm.py +118 -42
  145. package/src/zexus/vm/peephole_optimizer.py +82 -4
  146. package/src/zexus/vm/profiler.py +38 -18
  147. package/src/zexus/vm/register_allocator.py +16 -5
  148. package/src/zexus/vm/register_vm.py +8 -5
  149. package/src/zexus/vm/vm.py +3411 -573
  150. package/src/zexus/vm/wasm_compiler.py +658 -0
  151. package/src/zexus/zexus_ast.py +63 -11
  152. package/src/zexus/zexus_token.py +13 -5
  153. package/src/zexus/zpm/installer.py +55 -15
  154. package/src/zexus/zpm/package_manager.py +1 -1
  155. package/src/zexus/zpm/registry.py +257 -28
  156. package/src/zexus.egg-info/PKG-INFO +7 -4
  157. package/src/zexus.egg-info/SOURCES.txt +116 -9
  158. package/src/zexus.egg-info/entry_points.txt +1 -0
  159. package/src/zexus.egg-info/requires.txt +4 -0
@@ -0,0 +1,1985 @@
1
+ #define PY_SSIZE_T_CLEAN
2
+ #include <Python.h>
3
+ #include "cabi.h"
4
+
5
+ static PyObject *zx_get_attr(PyObject *obj, const char *name) {
6
+ if (!obj) return NULL;
7
+ return PyObject_GetAttrString(obj, name);
8
+ }
9
+
10
+ static int zx_is_awaitable(PyObject *obj) {
11
+ if (!obj) return 0;
12
+ int has = PyObject_HasAttrString(obj, "__await__");
13
+ return has > 0;
14
+ }
15
+
16
+ static PyObject *zx_to_bytes(PyObject *obj) {
17
+ if (!obj) {
18
+ return PyBytes_FromString("");
19
+ }
20
+ if (PyBytes_Check(obj)) {
21
+ Py_INCREF(obj);
22
+ return obj;
23
+ }
24
+ if (PyUnicode_Check(obj)) {
25
+ return PyUnicode_AsEncodedString(obj, "utf-8", "strict");
26
+ }
27
+ if (PyDict_Check(obj)) {
28
+ PyObject *json = PyImport_ImportModule("json");
29
+ if (!json) { PyErr_Clear(); goto fallback; }
30
+ PyObject *dumps = PyObject_GetAttrString(json, "dumps");
31
+ Py_DECREF(json);
32
+ if (!dumps) { PyErr_Clear(); goto fallback; }
33
+ PyObject *kwargs = Py_BuildValue("{s:O}", "sort_keys", Py_True);
34
+ PyObject *args = PyTuple_Pack(1, obj);
35
+ PyObject *s = PyObject_Call(dumps, args, kwargs);
36
+ Py_DECREF(args);
37
+ Py_DECREF(kwargs);
38
+ Py_DECREF(dumps);
39
+ if (!s) { PyErr_Clear(); goto fallback; }
40
+ PyObject *bytes = PyUnicode_AsEncodedString(s, "utf-8", "strict");
41
+ Py_DECREF(s);
42
+ return bytes;
43
+ }
44
+ fallback:
45
+ {
46
+ PyObject *s = PyObject_Str(obj);
47
+ if (!s) { PyErr_Clear(); return PyBytes_FromString(""); }
48
+ PyObject *bytes = PyUnicode_AsEncodedString(s, "utf-8", "strict");
49
+ Py_DECREF(s);
50
+ return bytes;
51
+ }
52
+ }
53
+
54
+ static PyObject *zx_sha256_hex(PyObject *bytes_obj) {
55
+ PyObject *hashlib = PyImport_ImportModule("hashlib");
56
+ if (!hashlib) { PyErr_Clear(); Py_RETURN_NONE; }
57
+ PyObject *sha256 = PyObject_GetAttrString(hashlib, "sha256");
58
+ Py_DECREF(hashlib);
59
+ if (!sha256) { PyErr_Clear(); Py_RETURN_NONE; }
60
+ PyObject *empty = NULL;
61
+ PyObject *arg_obj = bytes_obj ? bytes_obj : (empty = PyBytes_FromString(""));
62
+ PyObject *args = PyTuple_Pack(1, arg_obj);
63
+ Py_XDECREF(empty);
64
+ PyObject *hash = PyObject_CallObject(sha256, args);
65
+ Py_DECREF(args);
66
+ Py_DECREF(sha256);
67
+ if (!hash) { PyErr_Clear(); Py_RETURN_NONE; }
68
+ PyObject *hex = PyObject_CallMethod(hash, "hexdigest", NULL);
69
+ Py_DECREF(hash);
70
+ if (!hex) { PyErr_Clear(); Py_RETURN_NONE; }
71
+ return hex;
72
+ }
73
+
74
+ static PyObject *zx_env_get_dict(PyObject *env, const char *key, int create) {
75
+ if (!env || !PyDict_Check(env)) return NULL;
76
+ PyObject *k = PyUnicode_FromString(key);
77
+ if (!k) return NULL;
78
+ PyObject *val = PyDict_GetItem(env, k);
79
+ if (!val && create) {
80
+ PyObject *d = PyDict_New();
81
+ if (d) {
82
+ PyDict_SetItem(env, k, d);
83
+ val = d;
84
+ Py_DECREF(d);
85
+ }
86
+ }
87
+ Py_DECREF(k);
88
+ return val;
89
+ }
90
+
91
+ static PyObject *zx_env_get_bool(PyObject *env, const char *key) {
92
+ if (!env || !PyDict_Check(env)) return NULL;
93
+ PyObject *k = PyUnicode_FromString(key);
94
+ if (!k) return NULL;
95
+ PyObject *val = PyDict_GetItem(env, k);
96
+ Py_DECREF(k);
97
+ return val;
98
+ }
99
+
100
+ static void zx_env_set(PyObject *env, const char *key, PyObject *value) {
101
+ if (!env || !PyDict_Check(env)) return;
102
+ PyObject *k = PyUnicode_FromString(key);
103
+ if (!k) return;
104
+ PyDict_SetItem(env, k, value ? value : Py_None);
105
+ Py_DECREF(k);
106
+ }
107
+
108
+ static PyObject *zx_env_get_list(PyObject *env, const char *key, int create) {
109
+ if (!env || !PyDict_Check(env)) return NULL;
110
+ PyObject *k = PyUnicode_FromString(key);
111
+ if (!k) return NULL;
112
+ PyObject *val = PyDict_GetItem(env, k);
113
+ if (!val && create) {
114
+ PyObject *lst = PyList_New(0);
115
+ if (lst) {
116
+ PyDict_SetItem(env, k, lst);
117
+ val = lst;
118
+ Py_DECREF(lst);
119
+ }
120
+ }
121
+ Py_DECREF(k);
122
+ return val;
123
+ }
124
+
125
+ static PyObject *zx_unwrap_value(PyObject *obj) {
126
+ if (!obj) {
127
+ Py_RETURN_NONE;
128
+ }
129
+ PyObject *attr = PyObject_GetAttrString(obj, "value");
130
+ if (attr) {
131
+ if (!PyCallable_Check(attr)) {
132
+ return attr;
133
+ }
134
+ Py_DECREF(attr);
135
+ } else {
136
+ PyErr_Clear();
137
+ }
138
+ Py_INCREF(obj);
139
+ return obj;
140
+ }
141
+
142
+ // ---- C ABI functions (callable from native JIT) ----
143
+ PyObject *zexus_cabi_call_callable(PyObject *callable, PyObject *arg_tuple) {
144
+ if (!callable || !PyCallable_Check(callable)) {
145
+ Py_RETURN_NONE;
146
+ }
147
+ return PyObject_CallObject(callable, arg_tuple);
148
+ }
149
+
150
+ PyObject *zexus_cabi_call_method(PyObject *obj, PyObject *method_name, PyObject *arg_tuple) {
151
+ if (!obj || !method_name) {
152
+ Py_RETURN_NONE;
153
+ }
154
+ PyObject *method = PyObject_GetAttr(obj, method_name);
155
+ if (!method) {
156
+ PyErr_Clear();
157
+ Py_RETURN_NONE;
158
+ }
159
+ if (!PyCallable_Check(method)) {
160
+ Py_DECREF(method);
161
+ Py_RETURN_NONE;
162
+ }
163
+ PyObject *result = PyObject_CallObject(method, arg_tuple);
164
+ Py_DECREF(method);
165
+ return result;
166
+ }
167
+
168
+ PyObject *zexus_cabi_call_name(PyObject *env, PyObject *builtins, PyObject *name, PyObject *arg_tuple) {
169
+ PyObject *callable = NULL;
170
+ if (env && name) {
171
+ callable = PyObject_GetItem(env, name);
172
+ if (!callable) {
173
+ PyErr_Clear();
174
+ }
175
+ }
176
+ if (!callable && builtins && name) {
177
+ callable = PyObject_GetItem(builtins, name);
178
+ if (!callable) {
179
+ PyErr_Clear();
180
+ }
181
+ }
182
+ if (!callable || !PyCallable_Check(callable)) {
183
+ Py_XDECREF(callable);
184
+ Py_RETURN_NONE;
185
+ }
186
+ PyObject *result = PyObject_CallObject(callable, arg_tuple);
187
+ Py_DECREF(callable);
188
+ return result;
189
+ }
190
+
191
+ PyObject *zexus_cabi_build_list_from_array(PyObject **items, Py_ssize_t count) {
192
+ PyObject *list = PyList_New(count);
193
+ if (!list) {
194
+ return NULL;
195
+ }
196
+ for (Py_ssize_t i = 0; i < count; i++) {
197
+ PyObject *item = items[i] ? items[i] : Py_None;
198
+ Py_INCREF(item);
199
+ PyList_SetItem(list, i, item);
200
+ }
201
+ return list;
202
+ }
203
+
204
+ PyObject *zexus_cabi_build_map_from_array(PyObject **items, Py_ssize_t count) {
205
+ PyObject *dict = PyDict_New();
206
+ if (!dict) {
207
+ return NULL;
208
+ }
209
+ for (Py_ssize_t i = 0; i + 1 < count; i += 2) {
210
+ PyObject *k = items[i] ? items[i] : Py_None;
211
+ PyObject *v = items[i + 1] ? items[i + 1] : Py_None;
212
+ PyDict_SetItem(dict, k, v);
213
+ }
214
+ return dict;
215
+ }
216
+
217
+ PyObject *zexus_cabi_iter_next(PyObject *iterator) {
218
+ if (!iterator) { return NULL; }
219
+ PyObject *val = PyIter_Next(iterator);
220
+ if (!val) {
221
+ if (PyErr_Occurred()) {
222
+ PyErr_Clear();
223
+ }
224
+ return NULL;
225
+ }
226
+ return val;
227
+ }
228
+
229
+ PyObject *zexus_cabi_build_set_from_array(PyObject **items, Py_ssize_t count) {
230
+ PyObject *set = PySet_New(NULL);
231
+ if (!set) {
232
+ return NULL;
233
+ }
234
+ for (Py_ssize_t i = 0; i < count; i++) {
235
+ PyObject *item = items[i] ? items[i] : Py_None;
236
+ PySet_Add(set, item);
237
+ }
238
+ return set;
239
+ }
240
+
241
+ PyObject *zexus_cabi_env_get(PyObject *env, PyObject *name) {
242
+ if (!env || !name) {
243
+ Py_RETURN_NONE;
244
+ }
245
+ PyObject *val = PyObject_GetItem(env, name);
246
+ if (!val) {
247
+ PyErr_Clear();
248
+ Py_RETURN_NONE;
249
+ }
250
+ return val;
251
+ }
252
+
253
+ int zexus_cabi_env_set(PyObject *env, PyObject *name, PyObject *value) {
254
+ if (!env || !name) {
255
+ return 0;
256
+ }
257
+ if (PyObject_SetItem(env, name, value) == 0) {
258
+ return 1;
259
+ }
260
+ PyErr_Clear();
261
+ return 0;
262
+ }
263
+
264
+ PyObject *zexus_cabi_export(PyObject *env, PyObject *name, PyObject *value) {
265
+ if (!env || !name) { Py_RETURN_NONE; }
266
+ PyObject *val = value;
267
+ if (!val || val == Py_None) {
268
+ val = PyObject_GetItem(env, name);
269
+ if (!val) {
270
+ PyErr_Clear();
271
+ val = Py_None;
272
+ Py_INCREF(val);
273
+ }
274
+ } else {
275
+ Py_INCREF(val);
276
+ }
277
+
278
+ PyObject *export_fn = PyObject_GetAttrString(env, "export");
279
+ if (export_fn && PyCallable_Check(export_fn)) {
280
+ PyObject *args = PyTuple_Pack(2, name, val);
281
+ if (args) {
282
+ PyObject *res = PyObject_CallObject(export_fn, args);
283
+ Py_XDECREF(res);
284
+ Py_DECREF(args);
285
+ }
286
+ Py_DECREF(export_fn);
287
+ } else {
288
+ Py_XDECREF(export_fn);
289
+ if (PyObject_SetItem(env, name, val) != 0) {
290
+ PyErr_Clear();
291
+ }
292
+ }
293
+
294
+ Py_DECREF(val);
295
+ Py_RETURN_NONE;
296
+ }
297
+
298
+ PyObject *zexus_cabi_number_add(PyObject *a, PyObject *b) { return PyNumber_Add(a, b); }
299
+ PyObject *zexus_cabi_number_sub(PyObject *a, PyObject *b) { return PyNumber_Subtract(a, b); }
300
+ PyObject *zexus_cabi_number_mul(PyObject *a, PyObject *b) { return PyNumber_Multiply(a, b); }
301
+ PyObject *zexus_cabi_number_div(PyObject *a, PyObject *b) { return PyNumber_TrueDivide(a, b); }
302
+ PyObject *zexus_cabi_number_mod(PyObject *a, PyObject *b) { return PyNumber_Remainder(a, b); }
303
+ PyObject *zexus_cabi_number_pow(PyObject *a, PyObject *b) { return PyNumber_Power(a, b, Py_None); }
304
+ PyObject *zexus_cabi_number_neg(PyObject *a) { return PyNumber_Negative(a); }
305
+
306
+ PyObject *zexus_cabi_compare_eq(PyObject *a, PyObject *b) {
307
+ int r = PyObject_RichCompareBool(a, b, Py_EQ);
308
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
309
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
310
+ }
311
+ PyObject *zexus_cabi_compare_ne(PyObject *a, PyObject *b) {
312
+ int r = PyObject_RichCompareBool(a, b, Py_NE);
313
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
314
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
315
+ }
316
+ PyObject *zexus_cabi_compare_lt(PyObject *a, PyObject *b) {
317
+ int r = PyObject_RichCompareBool(a, b, Py_LT);
318
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
319
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
320
+ }
321
+ PyObject *zexus_cabi_compare_gt(PyObject *a, PyObject *b) {
322
+ int r = PyObject_RichCompareBool(a, b, Py_GT);
323
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
324
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
325
+ }
326
+ PyObject *zexus_cabi_compare_lte(PyObject *a, PyObject *b) {
327
+ int r = PyObject_RichCompareBool(a, b, Py_LE);
328
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
329
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
330
+ }
331
+ PyObject *zexus_cabi_compare_gte(PyObject *a, PyObject *b) {
332
+ int r = PyObject_RichCompareBool(a, b, Py_GE);
333
+ if (r < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
334
+ if (r) Py_RETURN_TRUE; else Py_RETURN_FALSE;
335
+ }
336
+
337
+ int zexus_cabi_truthy_int(PyObject *a) {
338
+ int t = PyObject_IsTrue(a);
339
+ if (t < 0) {
340
+ PyErr_Clear();
341
+ return 0;
342
+ }
343
+ return t ? 1 : 0;
344
+ }
345
+
346
+ PyObject *zexus_cabi_not(PyObject *a) {
347
+ int t = PyObject_IsTrue(a);
348
+ if (t < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
349
+ if (!t) Py_RETURN_TRUE; else Py_RETURN_FALSE;
350
+ }
351
+
352
+ PyObject *zexus_cabi_bool_and(PyObject *a, PyObject *b) {
353
+ int ta = zexus_cabi_truthy_int(a);
354
+ int tb = zexus_cabi_truthy_int(b);
355
+ if (ta && tb) Py_RETURN_TRUE; else Py_RETURN_FALSE;
356
+ }
357
+
358
+ PyObject *zexus_cabi_bool_or(PyObject *a, PyObject *b) {
359
+ int ta = zexus_cabi_truthy_int(a);
360
+ int tb = zexus_cabi_truthy_int(b);
361
+ if (ta || tb) Py_RETURN_TRUE; else Py_RETURN_FALSE;
362
+ }
363
+
364
+ PyObject *zexus_cabi_index(PyObject *obj, PyObject *idx) {
365
+ if (!obj || !idx) { Py_RETURN_NONE; }
366
+ PyObject *val = PyObject_GetItem(obj, idx);
367
+ if (!val) { PyErr_Clear(); Py_RETURN_NONE; }
368
+ return val;
369
+ }
370
+
371
+ PyObject *zexus_cabi_slice(PyObject *obj, PyObject *start, PyObject *end) {
372
+ if (!obj) { Py_RETURN_NONE; }
373
+ PyObject *slice = PySlice_New(start ? start : Py_None, end ? end : Py_None, Py_None);
374
+ if (!slice) { PyErr_Clear(); Py_RETURN_NONE; }
375
+ PyObject *res = PyObject_GetItem(obj, slice);
376
+ Py_DECREF(slice);
377
+ if (res) {
378
+ return res;
379
+ }
380
+ PyErr_Clear();
381
+
382
+ PyObject *elements = PyObject_GetAttrString(obj, "elements");
383
+ if (!elements) {
384
+ PyErr_Clear();
385
+ Py_RETURN_NONE;
386
+ }
387
+ Py_ssize_t s = 0;
388
+ Py_ssize_t e = PyList_Check(elements) ? PyList_Size(elements) : PySequence_Size(elements);
389
+ if (start && start != Py_None) {
390
+ s = PyLong_AsSsize_t(start);
391
+ }
392
+ if (end && end != Py_None) {
393
+ e = PyLong_AsSsize_t(end);
394
+ }
395
+ if (PyErr_Occurred()) {
396
+ PyErr_Clear();
397
+ s = 0;
398
+ e = PySequence_Size(elements);
399
+ }
400
+ PyObject *slice_list = PySequence_GetSlice(elements, s, e);
401
+ Py_DECREF(elements);
402
+ if (!slice_list) { PyErr_Clear(); Py_RETURN_NONE; }
403
+ return slice_list;
404
+ }
405
+
406
+ PyObject *zexus_cabi_get_attr(PyObject *obj, PyObject *attr) {
407
+ if (!obj || !attr) { Py_RETURN_NONE; }
408
+ PyObject *val = PyObject_GetAttr(obj, attr);
409
+ if (!val) { PyErr_Clear(); Py_RETURN_NONE; }
410
+ return val;
411
+ }
412
+
413
+ PyObject *zexus_cabi_get_length(PyObject *obj) {
414
+ if (!obj) { Py_RETURN_NONE; }
415
+ Py_ssize_t len = PyObject_Length(obj);
416
+ if (len < 0) { PyErr_Clear(); Py_RETURN_NONE; }
417
+ return PyLong_FromSsize_t(len);
418
+ }
419
+
420
+ PyObject *zexus_cabi_print(PyObject *obj) {
421
+ if (!obj) {
422
+ PySys_WriteStdout("%s", "null");
423
+ PySys_WriteStdout("\n");
424
+ Py_RETURN_NONE;
425
+ }
426
+ PyObject *str = PyObject_Str(obj);
427
+ if (str) {
428
+ const char *cstr = PyUnicode_AsUTF8(str);
429
+ if (cstr) {
430
+ PySys_WriteStdout("%s", cstr);
431
+ }
432
+ Py_DECREF(str);
433
+ }
434
+ PySys_WriteStdout("\n");
435
+ Py_RETURN_NONE;
436
+ }
437
+
438
+ PyObject *zexus_cabi_read(PyObject *path) {
439
+ if (!path) { Py_RETURN_NONE; }
440
+ PyObject *io = PyImport_ImportModule("io");
441
+ if (!io) { PyErr_Clear(); Py_RETURN_NONE; }
442
+ PyObject *open_fn = PyObject_GetAttrString(io, "open");
443
+ Py_DECREF(io);
444
+ if (!open_fn) { PyErr_Clear(); Py_RETURN_NONE; }
445
+ PyObject *args = PyTuple_Pack(2, path, PyUnicode_FromString("r"));
446
+ PyObject *file = PyObject_CallObject(open_fn, args);
447
+ Py_DECREF(args);
448
+ Py_DECREF(open_fn);
449
+ if (!file) { PyErr_Clear(); Py_RETURN_NONE; }
450
+ PyObject *read_fn = PyObject_GetAttrString(file, "read");
451
+ if (!read_fn) { PyErr_Clear(); Py_DECREF(file); Py_RETURN_NONE; }
452
+ PyObject *content = PyObject_CallObject(read_fn, NULL);
453
+ Py_DECREF(read_fn);
454
+ PyObject *close_fn = PyObject_GetAttrString(file, "close");
455
+ if (close_fn) {
456
+ PyObject_CallObject(close_fn, NULL);
457
+ Py_DECREF(close_fn);
458
+ }
459
+ Py_DECREF(file);
460
+ if (!content) { PyErr_Clear(); Py_RETURN_NONE; }
461
+ return content;
462
+ }
463
+
464
+ PyObject *zexus_cabi_write(PyObject *path, PyObject *content) {
465
+ if (!path) { Py_RETURN_NONE; }
466
+ PyObject *io = PyImport_ImportModule("io");
467
+ if (!io) { PyErr_Clear(); Py_RETURN_NONE; }
468
+ PyObject *open_fn = PyObject_GetAttrString(io, "open");
469
+ Py_DECREF(io);
470
+ if (!open_fn) { PyErr_Clear(); Py_RETURN_NONE; }
471
+ PyObject *args = PyTuple_Pack(2, path, PyUnicode_FromString("w"));
472
+ PyObject *file = PyObject_CallObject(open_fn, args);
473
+ Py_DECREF(args);
474
+ Py_DECREF(open_fn);
475
+ if (!file) { PyErr_Clear(); Py_RETURN_NONE; }
476
+ PyObject *write_fn = PyObject_GetAttrString(file, "write");
477
+ if (!write_fn) { PyErr_Clear(); Py_DECREF(file); Py_RETURN_NONE; }
478
+ PyObject *text = content ? PyObject_Str(content) : PyUnicode_FromString("null");
479
+ PyObject *write_args = PyTuple_Pack(1, text ? text : PyUnicode_FromString(""));
480
+ PyObject *write_res = PyObject_CallObject(write_fn, write_args);
481
+ Py_XDECREF(write_res);
482
+ Py_DECREF(write_args);
483
+ Py_XDECREF(text);
484
+ Py_DECREF(write_fn);
485
+ PyObject *close_fn = PyObject_GetAttrString(file, "close");
486
+ if (close_fn) {
487
+ PyObject_CallObject(close_fn, NULL);
488
+ Py_DECREF(close_fn);
489
+ }
490
+ Py_DECREF(file);
491
+ Py_RETURN_NONE;
492
+ }
493
+
494
+ PyObject *zexus_cabi_import(PyObject *name) {
495
+ if (!name) { Py_RETURN_NONE; }
496
+ PyObject *module = PyImport_Import(name);
497
+ if (!module) { PyErr_Clear(); Py_RETURN_NONE; }
498
+ return module;
499
+ }
500
+
501
+ PyObject *zexus_cabi_int_from_long(long long value) {
502
+ return PyLong_FromLongLong(value);
503
+ }
504
+
505
+ static PyObject *zexus_int_from_long(PyObject *self, PyObject *args) {
506
+ long long value = 0;
507
+ if (!PyArg_ParseTuple(args, "L", &value)) {
508
+ return NULL;
509
+ }
510
+ return zexus_cabi_int_from_long(value);
511
+ }
512
+
513
+ PyObject *zexus_cabi_hash_block(PyObject *obj) {
514
+ PyObject *bytes = zx_to_bytes(obj);
515
+ if (!bytes) { PyErr_Clear(); Py_RETURN_NONE; }
516
+ PyObject *hex = zx_sha256_hex(bytes);
517
+ Py_DECREF(bytes);
518
+ return hex ? hex : Py_None;
519
+ }
520
+
521
+ PyObject *zexus_cabi_merkle_root_from_array(PyObject **items, Py_ssize_t count) {
522
+ if (count <= 0) {
523
+ return PyUnicode_FromString("");
524
+ }
525
+ PyObject *hashes = PyList_New(0);
526
+ if (!hashes) { Py_RETURN_NONE; }
527
+ for (Py_ssize_t i = 0; i < count; i++) {
528
+ PyObject *leaf = items[i] ? items[i] : Py_None;
529
+ PyObject *bytes = zx_to_bytes(leaf);
530
+ if (!bytes) { PyErr_Clear(); continue; }
531
+ PyObject *hex = zx_sha256_hex(bytes);
532
+ Py_DECREF(bytes);
533
+ if (!hex) { PyErr_Clear(); continue; }
534
+ PyList_Append(hashes, hex);
535
+ Py_DECREF(hex);
536
+ }
537
+ while (PyList_Size(hashes) > 1) {
538
+ Py_ssize_t n = PyList_Size(hashes);
539
+ if (n % 2 != 0) {
540
+ PyObject *last = PyList_GetItem(hashes, n - 1);
541
+ PyList_Append(hashes, last);
542
+ n += 1;
543
+ }
544
+ PyObject *new_hashes = PyList_New(0);
545
+ for (Py_ssize_t i = 0; i < n; i += 2) {
546
+ PyObject *h1 = PyList_GetItem(hashes, i);
547
+ PyObject *h2 = PyList_GetItem(hashes, i + 1);
548
+ PyObject *combined = PyUnicode_Concat(h1, h2);
549
+ if (!combined) { PyErr_Clear(); continue; }
550
+ PyObject *bytes = PyUnicode_AsEncodedString(combined, "utf-8", "strict");
551
+ Py_DECREF(combined);
552
+ if (!bytes) { PyErr_Clear(); continue; }
553
+ PyObject *hex = zx_sha256_hex(bytes);
554
+ Py_DECREF(bytes);
555
+ if (!hex) { PyErr_Clear(); continue; }
556
+ PyList_Append(new_hashes, hex);
557
+ Py_DECREF(hex);
558
+ }
559
+ Py_DECREF(hashes);
560
+ hashes = new_hashes;
561
+ }
562
+ PyObject *result = PyList_Size(hashes) > 0 ? PyList_GetItem(hashes, 0) : PyUnicode_FromString("");
563
+ Py_XINCREF(result);
564
+ Py_DECREF(hashes);
565
+ return result;
566
+ }
567
+
568
+ PyObject *zexus_cabi_verify_signature(PyObject *env, PyObject *builtins, PyObject *sig, PyObject *msg, PyObject *pk) {
569
+ PyObject *verify = NULL;
570
+ if (builtins && PyDict_Check(builtins)) {
571
+ verify = PyDict_GetItemString(builtins, "verify_sig");
572
+ }
573
+ if (!verify && env && PyDict_Check(env)) {
574
+ verify = PyDict_GetItemString(env, "verify_sig");
575
+ }
576
+ if (verify && PyCallable_Check(verify)) {
577
+ PyObject *res = PyObject_CallFunctionObjArgs(verify, sig, msg, pk, NULL);
578
+ if (!res) { PyErr_Clear(); Py_RETURN_FALSE; }
579
+ return res;
580
+ }
581
+ PyObject *bytes = zx_to_bytes(msg);
582
+ if (!bytes) { PyErr_Clear(); Py_RETURN_FALSE; }
583
+ PyObject *expected = zx_sha256_hex(bytes);
584
+ Py_DECREF(bytes);
585
+ if (!expected) { PyErr_Clear(); Py_RETURN_FALSE; }
586
+ int eq = PyObject_RichCompareBool(sig, expected, Py_EQ);
587
+ Py_DECREF(expected);
588
+ if (eq < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
589
+ if (eq) Py_RETURN_TRUE; else Py_RETURN_FALSE;
590
+ }
591
+
592
+ PyObject *zexus_cabi_state_read(PyObject *env, PyObject *key) {
593
+ PyObject *state = zx_env_get_dict(env, "_blockchain_state", 1);
594
+ if (!state || !PyDict_Check(state) || !key) { Py_RETURN_NONE; }
595
+ PyObject *val = PyDict_GetItem(state, key);
596
+ if (!val) Py_RETURN_NONE;
597
+ Py_INCREF(val);
598
+ return val;
599
+ }
600
+
601
+ PyObject *zexus_cabi_state_write(PyObject *env, PyObject *key, PyObject *value) {
602
+ if (!key) { Py_RETURN_NONE; }
603
+ PyObject *in_tx = zx_env_get_bool(env, "_in_transaction");
604
+ int in_transaction = in_tx ? PyObject_IsTrue(in_tx) : 0;
605
+ PyObject *target = NULL;
606
+ if (in_transaction) {
607
+ target = zx_env_get_dict(env, "_tx_pending_state", 1);
608
+ } else {
609
+ target = zx_env_get_dict(env, "_blockchain_state", 1);
610
+ }
611
+ if (target && PyDict_Check(target)) {
612
+ PyDict_SetItem(target, key, value ? value : Py_None);
613
+ }
614
+ Py_RETURN_NONE;
615
+ }
616
+
617
+ PyObject *zexus_cabi_tx_begin(PyObject *env) {
618
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
619
+ zx_env_set(env, "_in_transaction", Py_True);
620
+ PyObject *pending = PyDict_New();
621
+ if (pending) {
622
+ zx_env_set(env, "_tx_pending_state", pending);
623
+ Py_DECREF(pending);
624
+ }
625
+ PyObject *state = zx_env_get_dict(env, "_blockchain_state", 1);
626
+ if (state) {
627
+ PyObject *snapshot = PyDict_Copy(state);
628
+ if (snapshot) {
629
+ zx_env_set(env, "_tx_snapshot", snapshot);
630
+ Py_DECREF(snapshot);
631
+ }
632
+ }
633
+ Py_RETURN_NONE;
634
+ }
635
+
636
+ PyObject *zexus_cabi_tx_commit(PyObject *env) {
637
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
638
+ PyObject *in_tx = zx_env_get_bool(env, "_in_transaction");
639
+ int in_transaction = in_tx ? PyObject_IsTrue(in_tx) : 0;
640
+ if (!in_transaction) { Py_RETURN_NONE; }
641
+ PyObject *state = zx_env_get_dict(env, "_blockchain_state", 1);
642
+ PyObject *pending = zx_env_get_dict(env, "_tx_pending_state", 0);
643
+ if (state && pending && PyDict_Check(state) && PyDict_Check(pending)) {
644
+ PyDict_Update(state, pending);
645
+ }
646
+ zx_env_set(env, "_in_transaction", Py_False);
647
+ PyObject *empty = PyDict_New();
648
+ if (empty) {
649
+ zx_env_set(env, "_tx_pending_state", empty);
650
+ Py_DECREF(empty);
651
+ }
652
+ Py_RETURN_NONE;
653
+ }
654
+
655
+ PyObject *zexus_cabi_tx_revert(PyObject *env) {
656
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
657
+ PyObject *in_tx = zx_env_get_bool(env, "_in_transaction");
658
+ int in_transaction = in_tx ? PyObject_IsTrue(in_tx) : 0;
659
+ if (!in_transaction) { Py_RETURN_NONE; }
660
+ PyObject *snapshot = zx_env_get_dict(env, "_tx_snapshot", 0);
661
+ if (snapshot && PyDict_Check(snapshot)) {
662
+ zx_env_set(env, "_blockchain_state", snapshot);
663
+ }
664
+ zx_env_set(env, "_in_transaction", Py_False);
665
+ PyObject *empty = PyDict_New();
666
+ if (empty) {
667
+ zx_env_set(env, "_tx_pending_state", empty);
668
+ Py_DECREF(empty);
669
+ }
670
+ Py_RETURN_NONE;
671
+ }
672
+
673
+ PyObject *zexus_cabi_gas_charge(PyObject *env, PyObject *amount) {
674
+ if (!env || !PyDict_Check(env)) return NULL;
675
+ PyObject *k = PyUnicode_FromString("_gas_remaining");
676
+ if (!k) return NULL;
677
+ PyObject *cur = PyDict_GetItem(env, k);
678
+ Py_DECREF(k);
679
+ if (!cur) return NULL;
680
+ if (!PyFloat_Check(cur) && !PyLong_Check(cur)) return NULL;
681
+ if (PyFloat_Check(cur) && PyFloat_AsDouble(cur) == Py_HUGE_VAL) return NULL;
682
+ PyObject *zero = PyLong_FromLong(0);
683
+ PyObject *subtrahend = amount ? amount : zero;
684
+ PyObject *new_gas = PyNumber_Subtract(cur, subtrahend);
685
+ Py_DECREF(zero);
686
+ if (!new_gas) { PyErr_Clear(); return NULL; }
687
+ PyObject *cmp_zero = PyLong_FromLong(0);
688
+ int neg = PyObject_RichCompareBool(new_gas, cmp_zero, Py_LT);
689
+ Py_DECREF(cmp_zero);
690
+ if (neg) {
691
+ Py_DECREF(new_gas);
692
+ PyObject *in_tx = zx_env_get_bool(env, "_in_transaction");
693
+ int in_transaction = in_tx ? PyObject_IsTrue(in_tx) : 0;
694
+ if (in_transaction) {
695
+ PyObject *snapshot = zx_env_get_dict(env, "_tx_snapshot", 0);
696
+ if (snapshot && PyDict_Check(snapshot)) {
697
+ zx_env_set(env, "_blockchain_state", snapshot);
698
+ }
699
+ zx_env_set(env, "_in_transaction", Py_False);
700
+ }
701
+ PyObject *err = PyDict_New();
702
+ if (!err) return NULL;
703
+ PyDict_SetItemString(err, "error", PyUnicode_FromString("OutOfGas"));
704
+ if (amount) {
705
+ PyDict_SetItemString(err, "required", amount);
706
+ } else {
707
+ PyObject *zero_req = PyLong_FromLong(0);
708
+ if (zero_req) {
709
+ PyDict_SetItemString(err, "required", zero_req);
710
+ Py_DECREF(zero_req);
711
+ }
712
+ }
713
+ PyDict_SetItemString(err, "remaining", cur);
714
+ return err;
715
+ }
716
+ PyObject *gas_key = PyUnicode_FromString("_gas_remaining");
717
+ if (gas_key) {
718
+ PyDict_SetItem(env, gas_key, new_gas);
719
+ Py_DECREF(gas_key);
720
+ }
721
+ Py_DECREF(new_gas);
722
+ return NULL;
723
+ }
724
+
725
+ PyObject *zexus_cabi_require(PyObject *env, PyObject *condition, PyObject *message) {
726
+ int ok = condition ? PyObject_IsTrue(condition) : 0;
727
+ if (ok > 0) {
728
+ return NULL;
729
+ }
730
+ if (ok < 0) {
731
+ PyErr_Clear();
732
+ }
733
+
734
+ if (env && PyDict_Check(env)) {
735
+ PyObject *in_tx = zx_env_get_bool(env, "_in_transaction");
736
+ int in_transaction = in_tx ? PyObject_IsTrue(in_tx) : 0;
737
+ if (in_transaction) {
738
+ PyObject *snapshot = zx_env_get_dict(env, "_tx_snapshot", 0);
739
+ if (snapshot && PyDict_Check(snapshot)) {
740
+ zx_env_set(env, "_blockchain_state", snapshot);
741
+ }
742
+ zx_env_set(env, "_in_transaction", Py_False);
743
+ PyObject *empty = PyDict_New();
744
+ if (empty) {
745
+ zx_env_set(env, "_tx_pending_state", empty);
746
+ Py_DECREF(empty);
747
+ }
748
+ }
749
+ }
750
+
751
+ PyObject *err = PyDict_New();
752
+ if (!err) return NULL;
753
+ PyDict_SetItemString(err, "error", PyUnicode_FromString("RequirementFailed"));
754
+ PyObject *msg_obj = message && message != Py_None ? PyObject_Str(message) : PyUnicode_FromString("Requirement failed");
755
+ if (msg_obj) {
756
+ PyDict_SetItemString(err, "message", msg_obj);
757
+ Py_DECREF(msg_obj);
758
+ }
759
+ return err;
760
+ }
761
+
762
+ PyObject *zexus_cabi_ledger_append(PyObject *env, PyObject *entry) {
763
+ PyObject *ledger = zx_env_get_list(env, "_ledger", 1);
764
+ if (!ledger || !PyList_Check(ledger)) { Py_RETURN_NONE; }
765
+ if (entry && PyDict_Check(entry)) {
766
+ PyObject *ts_key = PyUnicode_FromString("timestamp");
767
+ int has_ts = ts_key ? PyDict_Contains(entry, ts_key) : 0;
768
+ Py_XDECREF(ts_key);
769
+ if (!has_ts) {
770
+ PyObject *time_mod = PyImport_ImportModule("time");
771
+ if (time_mod) {
772
+ PyObject *time_fn = PyObject_GetAttrString(time_mod, "time");
773
+ Py_DECREF(time_mod);
774
+ if (time_fn) {
775
+ PyObject *ts = PyObject_CallObject(time_fn, NULL);
776
+ Py_DECREF(time_fn);
777
+ if (ts) {
778
+ PyDict_SetItemString(entry, "timestamp", ts);
779
+ Py_DECREF(ts);
780
+ }
781
+ }
782
+ }
783
+ }
784
+ }
785
+ if (ledger && PyList_Check(ledger)) {
786
+ PyList_Append(ledger, entry ? entry : Py_None);
787
+ }
788
+ Py_RETURN_NONE;
789
+ }
790
+
791
+ PyObject *zexus_cabi_register_event(PyObject *vm, PyObject *name, PyObject *handler) {
792
+ if (!vm || !name) { Py_RETURN_NONE; }
793
+ PyObject *events = zx_get_attr(vm, "_events");
794
+ if (!events || !PyDict_Check(events)) { Py_XDECREF(events); Py_RETURN_NONE; }
795
+ PyObject *lst = PyDict_GetItem(events, name);
796
+ if (!lst) {
797
+ lst = PyList_New(0);
798
+ if (lst) {
799
+ PyDict_SetItem(events, name, lst);
800
+ Py_DECREF(lst);
801
+ }
802
+ }
803
+ if (handler && handler != Py_None && lst && PyList_Check(lst)) {
804
+ int contains = PySequence_Contains(lst, handler);
805
+ if (contains == 0) {
806
+ PyList_Append(lst, handler);
807
+ }
808
+ }
809
+ Py_DECREF(events);
810
+ Py_RETURN_NONE;
811
+ }
812
+
813
+ PyObject *zexus_cabi_emit_event(PyObject *vm, PyObject *env, PyObject *builtins, PyObject *name, PyObject *payload) {
814
+ if (!vm || !name) { Py_RETURN_NONE; }
815
+ PyObject *events = zx_get_attr(vm, "_events");
816
+ if (!events || !PyDict_Check(events)) { Py_XDECREF(events); Py_RETURN_NONE; }
817
+ PyObject *handlers = PyDict_GetItem(events, name);
818
+ if (!handlers || !PyList_Check(handlers)) { Py_DECREF(events); Py_RETURN_NONE; }
819
+ PyObject *builtins_dict = builtins;
820
+ PyObject *env_dict = env;
821
+ Py_ssize_t n = PyList_Size(handlers);
822
+ for (Py_ssize_t i = 0; i < n; i++) {
823
+ PyObject *h = PyList_GetItem(handlers, i);
824
+ PyObject *fn = NULL;
825
+ if (h && PyUnicode_Check(h)) {
826
+ if (builtins_dict && PyDict_Check(builtins_dict)) fn = PyDict_GetItem(builtins_dict, h);
827
+ if (!fn && env_dict && PyDict_Check(env_dict)) fn = PyDict_GetItem(env_dict, h);
828
+ } else {
829
+ fn = h;
830
+ }
831
+ if (!fn) continue;
832
+ PyObject *args_list = PyList_New(1);
833
+ if (!args_list) continue;
834
+ PyObject *payload_obj = payload ? payload : Py_None;
835
+ Py_INCREF(payload_obj);
836
+ PyList_SetItem(args_list, 0, payload_obj);
837
+ PyObject *res = PyObject_CallMethod(vm, "_call_builtin_async_obj", "OOO", fn, args_list, Py_False);
838
+ Py_DECREF(args_list);
839
+ if (!res) { PyErr_Clear(); continue; }
840
+ if (zx_is_awaitable(res)) {
841
+ PyObject *awaited = PyObject_CallMethod(vm, "_run_coroutine_sync", "O", res);
842
+ Py_XDECREF(awaited);
843
+ }
844
+ Py_DECREF(res);
845
+ }
846
+ Py_DECREF(events);
847
+ Py_RETURN_NONE;
848
+ }
849
+
850
+ static PyObject *zx_spawn_task(PyObject *vm, PyObject *coro) {
851
+ if (!vm || !coro) return NULL;
852
+ PyObject *asyncio = PyImport_ImportModule("asyncio");
853
+ PyObject *task = NULL;
854
+ if (asyncio) {
855
+ PyObject *loop = PyObject_CallMethod(asyncio, "get_running_loop", NULL);
856
+ if (!loop) {
857
+ PyErr_Clear();
858
+ } else {
859
+ task = PyObject_CallMethod(loop, "create_task", "O", coro);
860
+ Py_DECREF(loop);
861
+ }
862
+ Py_DECREF(asyncio);
863
+ }
864
+ if (!task) {
865
+ PyObject *res = PyObject_CallMethod(vm, "_run_coroutine_sync", "O", coro);
866
+ task = res ? res : Py_None;
867
+ Py_XINCREF(task);
868
+ }
869
+
870
+ PyObject *tasks = zx_get_attr(vm, "_tasks");
871
+ PyObject *counter = zx_get_attr(vm, "_task_counter");
872
+ long next_id = 1;
873
+ if (counter && PyLong_Check(counter)) {
874
+ next_id = PyLong_AsLong(counter) + 1;
875
+ }
876
+ PyObject *new_counter = PyLong_FromLong(next_id);
877
+ if (new_counter) {
878
+ PyObject_SetAttrString(vm, "_task_counter", new_counter);
879
+ Py_DECREF(new_counter);
880
+ }
881
+ if (tasks && PyDict_Check(tasks)) {
882
+ PyObject *tid = PyUnicode_FromFormat("task_%ld", next_id);
883
+ if (tid) {
884
+ PyDict_SetItem(tasks, tid, task);
885
+ Py_DECREF(task);
886
+ Py_DECREF(tasks);
887
+ return tid;
888
+ }
889
+ }
890
+ Py_XDECREF(tasks);
891
+ Py_XDECREF(task);
892
+ Py_RETURN_NONE;
893
+ }
894
+
895
+ PyObject *zexus_cabi_spawn_name(PyObject *vm, PyObject *env, PyObject *builtins, PyObject *name, PyObject *args_tuple) {
896
+ if (!vm || !name) { Py_RETURN_NONE; }
897
+ PyObject *callable = NULL;
898
+ if (env && PyDict_Check(env)) callable = PyDict_GetItem(env, name);
899
+ if (!callable && builtins && PyDict_Check(builtins)) callable = PyDict_GetItem(builtins, name);
900
+ if (!callable) { Py_RETURN_NONE; }
901
+ PyObject *empty = NULL;
902
+ PyObject *args_source = args_tuple ? args_tuple : (empty = PyTuple_New(0));
903
+ PyObject *args_list = PySequence_List(args_source);
904
+ Py_XDECREF(empty);
905
+ if (!args_list) { PyErr_Clear(); Py_RETURN_NONE; }
906
+ PyObject *coro = PyObject_CallMethod(vm, "_to_coro", "OO", callable, args_list);
907
+ Py_DECREF(args_list);
908
+ if (!coro) { PyErr_Clear(); Py_RETURN_NONE; }
909
+ PyObject *tid = zx_spawn_task(vm, coro);
910
+ Py_DECREF(coro);
911
+ return tid ? tid : Py_None;
912
+ }
913
+
914
+ PyObject *zexus_cabi_spawn_call(PyObject *vm, PyObject *callable, PyObject *args_tuple) {
915
+ if (!vm || !callable) { Py_RETURN_NONE; }
916
+ PyObject *empty = NULL;
917
+ PyObject *args_source = args_tuple ? args_tuple : (empty = PyTuple_New(0));
918
+ PyObject *args_list = PySequence_List(args_source);
919
+ Py_XDECREF(empty);
920
+ if (!args_list) { PyErr_Clear(); Py_RETURN_NONE; }
921
+ PyObject *coro = PyObject_CallMethod(vm, "_to_coro", "OO", callable, args_list);
922
+ Py_DECREF(args_list);
923
+ if (!coro) { PyErr_Clear(); Py_RETURN_NONE; }
924
+ PyObject *tid = zx_spawn_task(vm, coro);
925
+ Py_DECREF(coro);
926
+ return tid ? tid : Py_None;
927
+ }
928
+
929
+ PyObject *zexus_cabi_await(PyObject *vm, PyObject *task_or_coro) {
930
+ if (!vm || !task_or_coro) { Py_RETURN_NONE; }
931
+ PyObject *tasks = zx_get_attr(vm, "_tasks");
932
+ if (tasks && PyDict_Check(tasks) && PyUnicode_Check(task_or_coro)) {
933
+ PyObject *obj = PyDict_GetItem(tasks, task_or_coro);
934
+ if (obj) {
935
+ if (zx_is_awaitable(obj)) {
936
+ PyObject *res = PyObject_CallMethod(vm, "_run_coroutine_sync", "O", obj);
937
+ Py_DECREF(tasks);
938
+ return res ? res : Py_None;
939
+ }
940
+ Py_INCREF(obj);
941
+ Py_DECREF(tasks);
942
+ return obj;
943
+ }
944
+ }
945
+ Py_XDECREF(tasks);
946
+ if (zx_is_awaitable(task_or_coro)) {
947
+ PyObject *res = PyObject_CallMethod(vm, "_run_coroutine_sync", "O", task_or_coro);
948
+ return res ? res : Py_None;
949
+ }
950
+ Py_INCREF(task_or_coro);
951
+ return task_or_coro;
952
+ }
953
+
954
+ static PyObject *zx_get_or_create_lock(PyObject *env, PyObject *key) {
955
+ if (!env || !PyDict_Check(env) || !key) return NULL;
956
+ PyObject *locks = zx_env_get_dict(env, "_locks", 1);
957
+ if (!locks || !PyDict_Check(locks)) return NULL;
958
+ PyObject *lock = PyDict_GetItem(locks, key);
959
+ if (lock) return lock;
960
+
961
+ PyObject *threading = PyImport_ImportModule("threading");
962
+ if (!threading) { PyErr_Clear(); return NULL; }
963
+ PyObject *lock_cls = PyObject_GetAttrString(threading, "Lock");
964
+ Py_DECREF(threading);
965
+ if (!lock_cls) { PyErr_Clear(); return NULL; }
966
+ PyObject *new_lock = PyObject_CallObject(lock_cls, NULL);
967
+ Py_DECREF(lock_cls);
968
+ if (!new_lock) { PyErr_Clear(); return NULL; }
969
+ PyDict_SetItem(locks, key, new_lock);
970
+ Py_DECREF(new_lock);
971
+ return PyDict_GetItem(locks, key);
972
+ }
973
+
974
+ PyObject *zexus_cabi_lock_acquire(PyObject *env, PyObject *key) {
975
+ if (!env || !key) { Py_RETURN_NONE; }
976
+ PyObject *lock = zx_get_or_create_lock(env, key);
977
+ if (!lock) { Py_RETURN_NONE; }
978
+ PyObject *res = PyObject_CallMethod(lock, "acquire", NULL);
979
+ if (!res) { PyErr_Clear(); Py_RETURN_NONE; }
980
+ Py_DECREF(res);
981
+ Py_RETURN_NONE;
982
+ }
983
+
984
+ PyObject *zexus_cabi_lock_release(PyObject *env, PyObject *key) {
985
+ if (!env || !key) { Py_RETURN_NONE; }
986
+ PyObject *lock = zx_get_or_create_lock(env, key);
987
+ if (!lock) { Py_RETURN_NONE; }
988
+ PyObject *res = PyObject_CallMethod(lock, "release", NULL);
989
+ if (!res) { PyErr_Clear(); Py_RETURN_NONE; }
990
+ Py_DECREF(res);
991
+ Py_RETURN_NONE;
992
+ }
993
+
994
+ PyObject *zexus_cabi_barrier_wait(PyObject *barrier, PyObject *timeout) {
995
+ if (!barrier) { Py_RETURN_NONE; }
996
+ PyObject *res = NULL;
997
+ if (timeout && timeout != Py_None) {
998
+ res = PyObject_CallMethod(barrier, "wait", "O", timeout);
999
+ } else {
1000
+ res = PyObject_CallMethod(barrier, "wait", NULL);
1001
+ }
1002
+ if (!res) { PyErr_Clear(); Py_RETURN_NONE; }
1003
+ return res;
1004
+ }
1005
+
1006
+ static PyObject *zx_get_or_create_atomic_lock(PyObject *env) {
1007
+ if (!env || !PyDict_Check(env)) return NULL;
1008
+ PyObject *lock = PyDict_GetItemString(env, "_atomic_lock");
1009
+ if (lock) return lock;
1010
+ PyObject *threading = PyImport_ImportModule("threading");
1011
+ if (!threading) { PyErr_Clear(); return NULL; }
1012
+ PyObject *lock_cls = PyObject_GetAttrString(threading, "Lock");
1013
+ Py_DECREF(threading);
1014
+ if (!lock_cls) { PyErr_Clear(); return NULL; }
1015
+ PyObject *new_lock = PyObject_CallObject(lock_cls, NULL);
1016
+ Py_DECREF(lock_cls);
1017
+ if (!new_lock) { PyErr_Clear(); return NULL; }
1018
+ PyDict_SetItemString(env, "_atomic_lock", new_lock);
1019
+ Py_DECREF(new_lock);
1020
+ return PyDict_GetItemString(env, "_atomic_lock");
1021
+ }
1022
+
1023
+ PyObject *zexus_cabi_atomic_add(PyObject *env, PyObject *key, PyObject *delta) {
1024
+ if (!env || !PyDict_Check(env) || !key) { Py_RETURN_NONE; }
1025
+ PyObject *lock = zx_get_or_create_atomic_lock(env);
1026
+ if (!lock) { Py_RETURN_NONE; }
1027
+ PyObject *acq = PyObject_CallMethod(lock, "acquire", NULL);
1028
+ Py_XDECREF(acq);
1029
+ PyObject *state = zx_env_get_dict(env, "_atomic_state", 1);
1030
+ PyObject *current = state ? PyDict_GetItem(state, key) : NULL;
1031
+ if (!current) current = PyLong_FromLong(0);
1032
+ else Py_INCREF(current);
1033
+ PyObject *delta_val = delta ? delta : PyLong_FromLong(0);
1034
+ if (!delta) Py_DECREF(delta_val);
1035
+ PyObject *new_val = PyNumber_Add(current, delta_val);
1036
+ if (new_val && state) {
1037
+ PyDict_SetItem(state, key, new_val);
1038
+ }
1039
+ Py_DECREF(current);
1040
+ PyObject *rel = PyObject_CallMethod(lock, "release", NULL);
1041
+ Py_XDECREF(rel);
1042
+ if (!new_val) { PyErr_Clear(); Py_RETURN_NONE; }
1043
+ return new_val;
1044
+ }
1045
+
1046
+ PyObject *zexus_cabi_atomic_cas(PyObject *env, PyObject *key, PyObject *expected, PyObject *new_value) {
1047
+ if (!env || !PyDict_Check(env) || !key) { Py_RETURN_FALSE; }
1048
+ PyObject *lock = zx_get_or_create_atomic_lock(env);
1049
+ if (!lock) { Py_RETURN_FALSE; }
1050
+ PyObject *acq = PyObject_CallMethod(lock, "acquire", NULL);
1051
+ Py_XDECREF(acq);
1052
+ PyObject *state = zx_env_get_dict(env, "_atomic_state", 1);
1053
+ PyObject *current = state ? PyDict_GetItem(state, key) : NULL;
1054
+ int eq = PyObject_RichCompareBool(current ? current : Py_None, expected ? expected : Py_None, Py_EQ);
1055
+ if (eq > 0 && state) {
1056
+ PyDict_SetItem(state, key, new_value ? new_value : Py_None);
1057
+ }
1058
+ PyObject *rel = PyObject_CallMethod(lock, "release", NULL);
1059
+ Py_XDECREF(rel);
1060
+ if (eq < 0) { PyErr_Clear(); Py_RETURN_FALSE; }
1061
+ if (eq) Py_RETURN_TRUE; else Py_RETURN_FALSE;
1062
+ }
1063
+
1064
+ PyObject *zexus_cabi_get_iter(PyObject *obj) {
1065
+ if (!obj) { Py_RETURN_NONE; }
1066
+ PyObject *iter = PyObject_GetIter(obj);
1067
+ if (!iter) { PyErr_Clear(); Py_RETURN_NONE; }
1068
+ return iter;
1069
+ }
1070
+
1071
+ PyObject *zexus_cabi_iter_next_pair(PyObject *iterator) {
1072
+ if (!iterator) { Py_RETURN_NONE; }
1073
+ PyObject *value = PyIter_Next(iterator);
1074
+ if (!value) {
1075
+ if (PyErr_Occurred()) { PyErr_Clear(); }
1076
+ PyObject *none = Py_None; Py_INCREF(none);
1077
+ PyObject *flag = Py_False; Py_INCREF(flag);
1078
+ PyObject *tpl = PyTuple_Pack(2, none, flag);
1079
+ Py_DECREF(none); Py_DECREF(flag);
1080
+ return tpl ? tpl : Py_None;
1081
+ }
1082
+ PyObject *flag = Py_True; Py_INCREF(flag);
1083
+ PyObject *tpl = PyTuple_Pack(2, value, flag);
1084
+ Py_DECREF(value);
1085
+ Py_DECREF(flag);
1086
+ return tpl ? tpl : Py_None;
1087
+ }
1088
+
1089
+ PyObject *zexus_cabi_define_enum(PyObject *env, PyObject *name, PyObject *spec) {
1090
+ if (!env || !PyDict_Check(env) || !name) { Py_RETURN_NONE; }
1091
+ PyObject *enums = zx_env_get_dict(env, "enums", 1);
1092
+ if (enums && PyDict_Check(enums)) {
1093
+ PyDict_SetItem(enums, name, spec ? spec : Py_None);
1094
+ }
1095
+ PyDict_SetItem(env, name, spec ? spec : Py_None);
1096
+ Py_RETURN_NONE;
1097
+ }
1098
+
1099
+ PyObject *zexus_cabi_define_protocol(PyObject *env, PyObject *name, PyObject *spec) {
1100
+ if (!env || !PyDict_Check(env) || !name) { Py_RETURN_NONE; }
1101
+ PyObject *protocols = zx_env_get_dict(env, "protocols", 1);
1102
+ if (protocols && PyDict_Check(protocols)) {
1103
+ PyDict_SetItem(protocols, name, spec ? spec : Py_None);
1104
+ }
1105
+ PyDict_SetItem(env, name, spec ? spec : Py_None);
1106
+ Py_RETURN_NONE;
1107
+ }
1108
+
1109
+ PyObject *zexus_cabi_assert_protocol(PyObject *env, PyObject *name, PyObject *spec) {
1110
+ if (!env || !PyDict_Check(env) || !name || !spec) {
1111
+ PyObject *empty = PyList_New(0);
1112
+ return PyTuple_Pack(2, Py_False, empty ? empty : PyList_New(0));
1113
+ }
1114
+ PyObject *obj = PyDict_GetItem(env, name);
1115
+ PyObject *methods = PyDict_GetItemString(spec, "methods");
1116
+ PyObject *missing = PyList_New(0);
1117
+ int ok = 1;
1118
+ if (methods && PySequence_Check(methods)) {
1119
+ Py_ssize_t n = PySequence_Size(methods);
1120
+ for (Py_ssize_t i = 0; i < n; i++) {
1121
+ PyObject *m = PySequence_GetItem(methods, i);
1122
+ if (!m) { PyErr_Clear(); continue; }
1123
+ int has = obj ? PyObject_HasAttr(obj, m) : 0;
1124
+ if (has <= 0) {
1125
+ ok = 0;
1126
+ PyList_Append(missing, m);
1127
+ }
1128
+ Py_DECREF(m);
1129
+ }
1130
+ }
1131
+ PyObject *ok_obj = ok ? Py_True : Py_False;
1132
+ Py_INCREF(ok_obj);
1133
+ PyObject *result = PyTuple_Pack(2, ok_obj, missing ? missing : PyList_New(0));
1134
+ Py_DECREF(ok_obj);
1135
+ Py_XDECREF(missing);
1136
+ return result;
1137
+ }
1138
+
1139
+ PyObject *zexus_cabi_define_capability(PyObject *env, PyObject *name, PyObject *definition) {
1140
+ if (!env || !PyDict_Check(env) || !name) { Py_RETURN_NONE; }
1141
+ PyObject *caps = zx_env_get_dict(env, "_capabilities", 1);
1142
+ PyObject *key = zx_unwrap_value(name);
1143
+ if (caps && PyDict_Check(caps)) {
1144
+ PyDict_SetItem(caps, key, definition ? definition : Py_None);
1145
+ }
1146
+ Py_DECREF(key);
1147
+ Py_RETURN_NONE;
1148
+ }
1149
+
1150
+ static PyObject *zx_get_or_create_set(PyObject *mapping, PyObject *key) {
1151
+ if (!mapping || !PyDict_Check(mapping) || !key) return NULL;
1152
+ PyObject *val = PyDict_GetItem(mapping, key);
1153
+ if (val && PySet_Check(val)) {
1154
+ return val;
1155
+ }
1156
+ PyObject *set_obj = PySet_New(NULL);
1157
+ if (!set_obj) return NULL;
1158
+ PyDict_SetItem(mapping, key, set_obj);
1159
+ Py_DECREF(set_obj);
1160
+ return PyDict_GetItem(mapping, key);
1161
+ }
1162
+
1163
+ static PyObject *zx_to_string_key(PyObject *obj) {
1164
+ PyObject *val = zx_unwrap_value(obj);
1165
+ PyObject *s = PyObject_Str(val);
1166
+ Py_DECREF(val);
1167
+ if (!s) { PyErr_Clear(); return PyUnicode_FromString(""); }
1168
+ return s;
1169
+ }
1170
+
1171
+ PyObject *zexus_cabi_grant_capability(PyObject *env, PyObject *entity, PyObject **caps, Py_ssize_t count) {
1172
+ if (!env || !PyDict_Check(env) || !entity) { Py_RETURN_NONE; }
1173
+ PyObject *grants = zx_env_get_dict(env, "_grants", 1);
1174
+ PyObject *entity_key = zx_to_string_key(entity);
1175
+ PyObject *entity_grants = zx_get_or_create_set(grants, entity_key);
1176
+ Py_DECREF(entity_key);
1177
+ if (entity_grants && PySet_Check(entity_grants)) {
1178
+ for (Py_ssize_t i = 0; i < count; i++) {
1179
+ PyObject *cap_key = zx_to_string_key(caps[i] ? caps[i] : Py_None);
1180
+ PySet_Add(entity_grants, cap_key);
1181
+ Py_DECREF(cap_key);
1182
+ }
1183
+ }
1184
+ Py_RETURN_NONE;
1185
+ }
1186
+
1187
+ PyObject *zexus_cabi_revoke_capability(PyObject *env, PyObject *entity, PyObject **caps, Py_ssize_t count) {
1188
+ if (!env || !PyDict_Check(env) || !entity) { Py_RETURN_NONE; }
1189
+ PyObject *grants = zx_env_get_dict(env, "_grants", 0);
1190
+ PyObject *entity_key = zx_to_string_key(entity);
1191
+ PyObject *entity_grants = grants ? PyDict_GetItem(grants, entity_key) : NULL;
1192
+ Py_DECREF(entity_key);
1193
+ if (entity_grants && PySet_Check(entity_grants)) {
1194
+ for (Py_ssize_t i = 0; i < count; i++) {
1195
+ PyObject *cap_key = zx_to_string_key(caps[i] ? caps[i] : Py_None);
1196
+ PySet_Discard(entity_grants, cap_key);
1197
+ Py_DECREF(cap_key);
1198
+ }
1199
+ }
1200
+ Py_RETURN_NONE;
1201
+ }
1202
+
1203
+ PyObject *zexus_cabi_audit_log(PyObject *env, PyObject *ts, PyObject *action, PyObject *data) {
1204
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
1205
+ PyObject *log_list = zx_env_get_list(env, "_audit_log", 1);
1206
+ if (!log_list || !PyList_Check(log_list)) { Py_RETURN_NONE; }
1207
+ PyObject *ts_val = zx_unwrap_value(ts ? ts : Py_None);
1208
+ PyObject *action_val = zx_unwrap_value(action ? action : Py_None);
1209
+ PyObject *data_val = zx_unwrap_value(data ? data : Py_None);
1210
+ PyObject *entry = PyDict_New();
1211
+ if (entry) {
1212
+ PyDict_SetItemString(entry, "timestamp", ts_val);
1213
+ PyDict_SetItemString(entry, "action", action_val);
1214
+ PyDict_SetItemString(entry, "data", data_val);
1215
+ PyList_Append(log_list, entry);
1216
+ Py_DECREF(entry);
1217
+ }
1218
+ Py_DECREF(ts_val);
1219
+ Py_DECREF(action_val);
1220
+ Py_DECREF(data_val);
1221
+ Py_RETURN_NONE;
1222
+ }
1223
+
1224
+ static PyObject *zx_get_or_create_dict(PyObject *env, const char *key) {
1225
+ if (!env || !PyDict_Check(env) || !key) return NULL;
1226
+ PyObject *dict = zx_env_get_dict(env, key, 1);
1227
+ if (dict && PyDict_Check(dict)) return dict;
1228
+ return NULL;
1229
+ }
1230
+
1231
+ PyObject *zexus_cabi_define_screen(PyObject *env, PyObject *name, PyObject *props) {
1232
+ PyObject *screens = zx_get_or_create_dict(env, "screens");
1233
+ if (!screens) { Py_RETURN_NONE; }
1234
+ PyObject *key = zx_to_string_key(name ? name : Py_None);
1235
+ PyDict_SetItem(screens, key, props ? props : Py_None);
1236
+ Py_DECREF(key);
1237
+ Py_RETURN_NONE;
1238
+ }
1239
+
1240
+ PyObject *zexus_cabi_define_component(PyObject *env, PyObject *name, PyObject *props) {
1241
+ PyObject *components = zx_get_or_create_dict(env, "components");
1242
+ if (!components) { Py_RETURN_NONE; }
1243
+ PyObject *key = zx_to_string_key(name ? name : Py_None);
1244
+ PyDict_SetItem(components, key, props ? props : Py_None);
1245
+ Py_DECREF(key);
1246
+ Py_RETURN_NONE;
1247
+ }
1248
+
1249
+ PyObject *zexus_cabi_define_theme(PyObject *env, PyObject *name, PyObject *props) {
1250
+ PyObject *themes = zx_get_or_create_dict(env, "themes");
1251
+ if (!themes) { Py_RETURN_NONE; }
1252
+ PyObject *key = zx_to_string_key(name ? name : Py_None);
1253
+ PyDict_SetItem(themes, key, props ? props : Py_None);
1254
+ Py_DECREF(key);
1255
+ Py_RETURN_NONE;
1256
+ }
1257
+
1258
+ PyObject *zexus_cabi_define_contract(PyObject **items, Py_ssize_t count, PyObject *name) {
1259
+ PyObject *members = PyDict_New();
1260
+ if (!members) { Py_RETURN_NONE; }
1261
+ Py_ssize_t total = count * 2;
1262
+ for (Py_ssize_t i = 0; i < count; i++) {
1263
+ Py_ssize_t key_index = total - 1 - (i * 2);
1264
+ Py_ssize_t val_index = total - 2 - (i * 2);
1265
+ PyObject *key_obj = (key_index >= 0 && key_index < total) ? items[key_index] : Py_None;
1266
+ PyObject *val_obj = (val_index >= 0 && val_index < total) ? items[val_index] : Py_None;
1267
+ PyObject *key_val = zx_unwrap_value(key_obj ? key_obj : Py_None);
1268
+ PyObject *key_str = PyObject_Str(key_val);
1269
+ Py_DECREF(key_val);
1270
+ if (key_str) {
1271
+ PyDict_SetItem(members, key_str, val_obj ? val_obj : Py_None);
1272
+ Py_DECREF(key_str);
1273
+ } else {
1274
+ PyErr_Clear();
1275
+ }
1276
+ }
1277
+ return members;
1278
+ }
1279
+
1280
+ PyObject *zexus_cabi_define_entity(PyObject **items, Py_ssize_t count, PyObject *name) {
1281
+ PyObject *members = zexus_cabi_define_contract(items, count, name);
1282
+ if (!members || !PyDict_Check(members)) {
1283
+ return members ? members : Py_None;
1284
+ }
1285
+ PyObject *name_val = zx_unwrap_value(name ? name : Py_None);
1286
+ PyObject *name_str = PyObject_Str(name_val);
1287
+ Py_DECREF(name_val);
1288
+ if (!name_str) { PyErr_Clear(); name_str = PyUnicode_FromString(""); }
1289
+ PyDict_SetItemString(members, "_type", PyUnicode_FromString("entity"));
1290
+ PyDict_SetItemString(members, "_name", name_str);
1291
+ Py_DECREF(name_str);
1292
+ return members;
1293
+ }
1294
+
1295
+ PyObject *zexus_cabi_restrict_access(PyObject *env, PyObject *obj, PyObject *prop, PyObject *restriction) {
1296
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
1297
+ PyObject *restrictions = zx_env_get_dict(env, "_restrictions", 1);
1298
+ if (!restrictions || !PyDict_Check(restrictions)) { Py_RETURN_NONE; }
1299
+ PyObject *obj_str = zx_to_string_key(obj ? obj : Py_None);
1300
+ PyObject *prop_str = prop ? zx_to_string_key(prop) : NULL;
1301
+ PyObject *key = NULL;
1302
+ if (prop_str && PyUnicode_GetLength(prop_str) > 0) {
1303
+ PyObject *dot = PyUnicode_FromString(".");
1304
+ PyObject *tmp = PyUnicode_Concat(obj_str, dot);
1305
+ Py_DECREF(dot);
1306
+ if (tmp) {
1307
+ key = PyUnicode_Concat(tmp, prop_str);
1308
+ Py_DECREF(tmp);
1309
+ }
1310
+ } else {
1311
+ key = obj_str;
1312
+ Py_INCREF(key);
1313
+ }
1314
+ if (key) {
1315
+ PyDict_SetItem(restrictions, key, restriction ? restriction : Py_None);
1316
+ Py_DECREF(key);
1317
+ }
1318
+ Py_DECREF(obj_str);
1319
+ Py_XDECREF(prop_str);
1320
+ Py_RETURN_NONE;
1321
+ }
1322
+
1323
+ PyObject *zexus_cabi_enable_error_mode(PyObject *env) {
1324
+ if (!env || !PyDict_Check(env)) { Py_RETURN_NONE; }
1325
+ zx_env_set(env, "_continue_on_error", Py_True);
1326
+ Py_RETURN_NONE;
1327
+ }
1328
+
1329
+ PyObject *zexus_cabi_build_tuple_from_array(PyObject **items, Py_ssize_t count) {
1330
+ PyObject *tuple = PyTuple_New(count);
1331
+ if (!tuple) return NULL;
1332
+ for (Py_ssize_t i = 0; i < count; i++) {
1333
+ PyObject *item = items[i] ? items[i] : Py_None;
1334
+ Py_INCREF(item);
1335
+ PyTuple_SetItem(tuple, i, item);
1336
+ }
1337
+ return tuple;
1338
+ }
1339
+
1340
+ // ---- Python-callable wrappers (existing) ----
1341
+ // Call a Python callable with args tuple
1342
+ static PyObject *zexus_call_callable(PyObject *self, PyObject *args) {
1343
+ PyObject *callable = NULL;
1344
+ PyObject *arg_tuple = NULL;
1345
+ if (!PyArg_ParseTuple(args, "OO", &callable, &arg_tuple)) {
1346
+ return NULL;
1347
+ }
1348
+ return zexus_cabi_call_callable(callable, arg_tuple);
1349
+ }
1350
+
1351
+ // Call obj.method(*args)
1352
+ static PyObject *zexus_call_method(PyObject *self, PyObject *args) {
1353
+ PyObject *obj = NULL;
1354
+ PyObject *method_name = NULL;
1355
+ PyObject *arg_tuple = NULL;
1356
+ if (!PyArg_ParseTuple(args, "OOO", &obj, &method_name, &arg_tuple)) {
1357
+ return NULL;
1358
+ }
1359
+ return zexus_cabi_call_method(obj, method_name, arg_tuple);
1360
+ }
1361
+
1362
+ // Build a list from a Python sequence
1363
+ static PyObject *zexus_build_list(PyObject *self, PyObject *args) {
1364
+ PyObject *seq = NULL;
1365
+ if (!PyArg_ParseTuple(args, "O", &seq)) {
1366
+ return NULL;
1367
+ }
1368
+ PyObject *list = PySequence_List(seq);
1369
+ if (!list) {
1370
+ Py_RETURN_NONE;
1371
+ }
1372
+ return list;
1373
+ }
1374
+
1375
+ // Build a list from C array of PyObject*
1376
+ static PyObject *zexus_build_list_from_array(PyObject *self, PyObject *args) {
1377
+ PyObject *addr_obj = NULL;
1378
+ Py_ssize_t count = 0;
1379
+ if (!PyArg_ParseTuple(args, "On", &addr_obj, &count)) {
1380
+ return NULL;
1381
+ }
1382
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1383
+ if (!items) {
1384
+ Py_RETURN_NONE;
1385
+ }
1386
+ return zexus_cabi_build_list_from_array(items, count);
1387
+ }
1388
+
1389
+ // Build a dict from a sequence of (k, v)
1390
+ static PyObject *zexus_build_map(PyObject *self, PyObject *args) {
1391
+ PyObject *seq = NULL;
1392
+ if (!PyArg_ParseTuple(args, "O", &seq)) {
1393
+ return NULL;
1394
+ }
1395
+ PyObject *dict = PyDict_New();
1396
+ if (!dict) {
1397
+ return NULL;
1398
+ }
1399
+ PyObject *iter = PyObject_GetIter(seq);
1400
+ if (!iter) {
1401
+ Py_DECREF(dict);
1402
+ Py_RETURN_NONE;
1403
+ }
1404
+ PyObject *item;
1405
+ while ((item = PyIter_Next(iter))) {
1406
+ if (PyTuple_Check(item) && PyTuple_Size(item) == 2) {
1407
+ PyObject *k = PyTuple_GetItem(item, 0);
1408
+ PyObject *v = PyTuple_GetItem(item, 1);
1409
+ if (k && v) {
1410
+ PyDict_SetItem(dict, k, v);
1411
+ }
1412
+ }
1413
+ Py_DECREF(item);
1414
+ }
1415
+ Py_DECREF(iter);
1416
+ return dict;
1417
+ }
1418
+
1419
+ // Build a dict from C array of PyObject* [k0,v0,k1,v1,...]
1420
+ static PyObject *zexus_build_map_from_array(PyObject *self, PyObject *args) {
1421
+ PyObject *addr_obj = NULL;
1422
+ Py_ssize_t count = 0;
1423
+ if (!PyArg_ParseTuple(args, "On", &addr_obj, &count)) {
1424
+ return NULL;
1425
+ }
1426
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1427
+ if (!items) {
1428
+ Py_RETURN_NONE;
1429
+ }
1430
+ return zexus_cabi_build_map_from_array(items, count);
1431
+ }
1432
+
1433
+ static PyObject *zexus_iter_next(PyObject *self, PyObject *args) {
1434
+ PyObject *iterator = NULL; if (!PyArg_ParseTuple(args, "O", &iterator)) return NULL;
1435
+ return zexus_cabi_iter_next(iterator);
1436
+ }
1437
+
1438
+ // Build a set from C array of PyObject*
1439
+ static PyObject *zexus_build_set_from_array(PyObject *self, PyObject *args) {
1440
+ PyObject *addr_obj = NULL;
1441
+ Py_ssize_t count = 0;
1442
+ if (!PyArg_ParseTuple(args, "On", &addr_obj, &count)) {
1443
+ return NULL;
1444
+ }
1445
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1446
+ if (!items) {
1447
+ Py_RETURN_NONE;
1448
+ }
1449
+ return zexus_cabi_build_set_from_array(items, count);
1450
+ }
1451
+
1452
+ // env get/set helpers
1453
+ static PyObject *zexus_env_get(PyObject *self, PyObject *args) {
1454
+ PyObject *env = NULL;
1455
+ PyObject *name = NULL;
1456
+ if (!PyArg_ParseTuple(args, "OO", &env, &name)) {
1457
+ return NULL;
1458
+ }
1459
+ return zexus_cabi_env_get(env, name);
1460
+ }
1461
+
1462
+ static PyObject *zexus_env_set(PyObject *self, PyObject *args) {
1463
+ PyObject *env = NULL;
1464
+ PyObject *name = NULL;
1465
+ PyObject *value = NULL;
1466
+ if (!PyArg_ParseTuple(args, "OOO", &env, &name, &value)) {
1467
+ return NULL;
1468
+ }
1469
+ int ok = zexus_cabi_env_set(env, name, value);
1470
+ if (ok) Py_RETURN_TRUE; else Py_RETURN_FALSE;
1471
+ }
1472
+
1473
+ static PyObject *zexus_export(PyObject *self, PyObject *args) {
1474
+ PyObject *env = NULL;
1475
+ PyObject *name = NULL;
1476
+ PyObject *value = Py_None;
1477
+ if (!PyArg_ParseTuple(args, "OO|O", &env, &name, &value)) {
1478
+ return NULL;
1479
+ }
1480
+ return zexus_cabi_export(env, name, value);
1481
+ }
1482
+
1483
+ // Resolve and call a name from env/builtins
1484
+ static PyObject *zexus_call_name(PyObject *self, PyObject *args) {
1485
+ PyObject *env = NULL;
1486
+ PyObject *builtins = NULL;
1487
+ PyObject *name = NULL;
1488
+ PyObject *arg_tuple = NULL;
1489
+ if (!PyArg_ParseTuple(args, "OOOO", &env, &builtins, &name, &arg_tuple)) {
1490
+ return NULL;
1491
+ }
1492
+ return zexus_cabi_call_name(env, builtins, name, arg_tuple);
1493
+ }
1494
+
1495
+ // Numeric ops via Python C API
1496
+ static PyObject *zexus_number_add(PyObject *self, PyObject *args) {
1497
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1498
+ return zexus_cabi_number_add(a, b);
1499
+ }
1500
+ static PyObject *zexus_number_sub(PyObject *self, PyObject *args) {
1501
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1502
+ return zexus_cabi_number_sub(a, b);
1503
+ }
1504
+ static PyObject *zexus_number_mul(PyObject *self, PyObject *args) {
1505
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1506
+ return zexus_cabi_number_mul(a, b);
1507
+ }
1508
+ static PyObject *zexus_number_div(PyObject *self, PyObject *args) {
1509
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1510
+ return zexus_cabi_number_div(a, b);
1511
+ }
1512
+ static PyObject *zexus_number_mod(PyObject *self, PyObject *args) {
1513
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1514
+ return zexus_cabi_number_mod(a, b);
1515
+ }
1516
+ static PyObject *zexus_number_pow(PyObject *self, PyObject *args) {
1517
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1518
+ return zexus_cabi_number_pow(a, b);
1519
+ }
1520
+ static PyObject *zexus_number_neg(PyObject *self, PyObject *args) {
1521
+ PyObject *a=NULL; if (!PyArg_ParseTuple(args, "O", &a)) return NULL;
1522
+ return zexus_cabi_number_neg(a);
1523
+ }
1524
+ static PyObject *zexus_truthy(PyObject *self, PyObject *args) {
1525
+ PyObject *a=NULL; if (!PyArg_ParseTuple(args, "O", &a)) return NULL;
1526
+ int t = zexus_cabi_truthy_int(a);
1527
+ if (t) Py_RETURN_TRUE; else Py_RETURN_FALSE;
1528
+ }
1529
+ static PyObject *zexus_not(PyObject *self, PyObject *args) {
1530
+ PyObject *a=NULL; if (!PyArg_ParseTuple(args, "O", &a)) return NULL;
1531
+ return zexus_cabi_not(a);
1532
+ }
1533
+
1534
+ // Comparisons
1535
+ static PyObject *zexus_compare_eq(PyObject *self, PyObject *args) {
1536
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1537
+ return zexus_cabi_compare_eq(a, b);
1538
+ }
1539
+ static PyObject *zexus_compare_ne(PyObject *self, PyObject *args) {
1540
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1541
+ return zexus_cabi_compare_ne(a, b);
1542
+ }
1543
+ static PyObject *zexus_compare_lt(PyObject *self, PyObject *args) {
1544
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1545
+ return zexus_cabi_compare_lt(a, b);
1546
+ }
1547
+ static PyObject *zexus_compare_gt(PyObject *self, PyObject *args) {
1548
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1549
+ return zexus_cabi_compare_gt(a, b);
1550
+ }
1551
+ static PyObject *zexus_compare_lte(PyObject *self, PyObject *args) {
1552
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1553
+ return zexus_cabi_compare_lte(a, b);
1554
+ }
1555
+ static PyObject *zexus_compare_gte(PyObject *self, PyObject *args) {
1556
+ PyObject *a=NULL,*b=NULL; if (!PyArg_ParseTuple(args, "OO", &a, &b)) return NULL;
1557
+ return zexus_cabi_compare_gte(a, b);
1558
+ }
1559
+
1560
+ static PyObject *zexus_index(PyObject *self, PyObject *args) {
1561
+ PyObject *obj=NULL,*idx=NULL; if (!PyArg_ParseTuple(args, "OO", &obj, &idx)) return NULL;
1562
+ return zexus_cabi_index(obj, idx);
1563
+ }
1564
+
1565
+ static PyObject *zexus_slice(PyObject *self, PyObject *args) {
1566
+ PyObject *obj=NULL,*start=NULL,*end=Py_None;
1567
+ if (!PyArg_ParseTuple(args, "OO|O", &obj, &start, &end)) return NULL;
1568
+ return zexus_cabi_slice(obj, start, end);
1569
+ }
1570
+
1571
+ static PyObject *zexus_get_attr(PyObject *self, PyObject *args) {
1572
+ PyObject *obj=NULL,*attr=NULL; if (!PyArg_ParseTuple(args, "OO", &obj, &attr)) return NULL;
1573
+ return zexus_cabi_get_attr(obj, attr);
1574
+ }
1575
+
1576
+ static PyObject *zexus_get_length(PyObject *self, PyObject *args) {
1577
+ PyObject *obj=NULL; if (!PyArg_ParseTuple(args, "O", &obj)) return NULL;
1578
+ return zexus_cabi_get_length(obj);
1579
+ }
1580
+
1581
+ static PyObject *zexus_print(PyObject *self, PyObject *args) {
1582
+ PyObject *obj=NULL; if (!PyArg_ParseTuple(args, "O", &obj)) return NULL;
1583
+ return zexus_cabi_print(obj);
1584
+ }
1585
+
1586
+ static PyObject *zexus_read(PyObject *self, PyObject *args) {
1587
+ PyObject *path=NULL; if (!PyArg_ParseTuple(args, "O", &path)) return NULL;
1588
+ return zexus_cabi_read(path);
1589
+ }
1590
+
1591
+ static PyObject *zexus_write(PyObject *self, PyObject *args) {
1592
+ PyObject *path=NULL,*content=NULL;
1593
+ if (!PyArg_ParseTuple(args, "OO", &path, &content)) return NULL;
1594
+ return zexus_cabi_write(path, content);
1595
+ }
1596
+
1597
+ static PyObject *zexus_import(PyObject *self, PyObject *args) {
1598
+ PyObject *name=NULL; if (!PyArg_ParseTuple(args, "O", &name)) return NULL;
1599
+ return zexus_cabi_import(name);
1600
+ }
1601
+
1602
+ static PyObject *zexus_hash_block(PyObject *self, PyObject *args) {
1603
+ PyObject *obj=NULL; if (!PyArg_ParseTuple(args, "O", &obj)) return NULL;
1604
+ return zexus_cabi_hash_block(obj);
1605
+ }
1606
+
1607
+ static PyObject *zexus_merkle_root_from_array(PyObject *self, PyObject *args) {
1608
+ PyObject *addr_obj=NULL; Py_ssize_t count=0;
1609
+ if (!PyArg_ParseTuple(args, "On", &addr_obj, &count)) return NULL;
1610
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1611
+ if (!items) Py_RETURN_NONE;
1612
+ return zexus_cabi_merkle_root_from_array(items, count);
1613
+ }
1614
+
1615
+ static PyObject *zexus_verify_signature(PyObject *self, PyObject *args) {
1616
+ PyObject *env=NULL,*builtins=NULL,*sig=NULL,*msg=NULL,*pk=NULL;
1617
+ if (!PyArg_ParseTuple(args, "OOOOO", &env, &builtins, &sig, &msg, &pk)) return NULL;
1618
+ return zexus_cabi_verify_signature(env, builtins, sig, msg, pk);
1619
+ }
1620
+
1621
+ static PyObject *zexus_state_read(PyObject *self, PyObject *args) {
1622
+ PyObject *env=NULL,*key=NULL; if (!PyArg_ParseTuple(args, "OO", &env, &key)) return NULL;
1623
+ return zexus_cabi_state_read(env, key);
1624
+ }
1625
+
1626
+ static PyObject *zexus_state_write(PyObject *self, PyObject *args) {
1627
+ PyObject *env=NULL,*key=NULL,*value=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &key, &value)) return NULL;
1628
+ return zexus_cabi_state_write(env, key, value);
1629
+ }
1630
+
1631
+ static PyObject *zexus_tx_begin(PyObject *self, PyObject *args) {
1632
+ PyObject *env=NULL; if (!PyArg_ParseTuple(args, "O", &env)) return NULL;
1633
+ return zexus_cabi_tx_begin(env);
1634
+ }
1635
+
1636
+ static PyObject *zexus_tx_commit(PyObject *self, PyObject *args) {
1637
+ PyObject *env=NULL; if (!PyArg_ParseTuple(args, "O", &env)) return NULL;
1638
+ return zexus_cabi_tx_commit(env);
1639
+ }
1640
+
1641
+ static PyObject *zexus_tx_revert(PyObject *self, PyObject *args) {
1642
+ PyObject *env=NULL; if (!PyArg_ParseTuple(args, "O", &env)) return NULL;
1643
+ return zexus_cabi_tx_revert(env);
1644
+ }
1645
+
1646
+ static PyObject *zexus_gas_charge(PyObject *self, PyObject *args) {
1647
+ PyObject *env=NULL,*amount=NULL; if (!PyArg_ParseTuple(args, "OO", &env, &amount)) return NULL;
1648
+ return zexus_cabi_gas_charge(env, amount);
1649
+ }
1650
+
1651
+ static PyObject *zexus_require(PyObject *self, PyObject *args) {
1652
+ PyObject *env=NULL,*condition=NULL,*message=Py_None;
1653
+ if (!PyArg_ParseTuple(args, "OO|O", &env, &condition, &message)) return NULL;
1654
+ return zexus_cabi_require(env, condition, message);
1655
+ }
1656
+
1657
+ static PyObject *zexus_ledger_append(PyObject *self, PyObject *args) {
1658
+ PyObject *env=NULL,*entry=NULL; if (!PyArg_ParseTuple(args, "OO", &env, &entry)) return NULL;
1659
+ return zexus_cabi_ledger_append(env, entry);
1660
+ }
1661
+
1662
+ static PyObject *zexus_register_event(PyObject *self, PyObject *args) {
1663
+ PyObject *vm=NULL,*name=NULL,*handler=NULL; if (!PyArg_ParseTuple(args, "OOO", &vm, &name, &handler)) return NULL;
1664
+ return zexus_cabi_register_event(vm, name, handler);
1665
+ }
1666
+
1667
+ static PyObject *zexus_emit_event(PyObject *self, PyObject *args) {
1668
+ PyObject *vm=NULL,*env=NULL,*builtins=NULL,*name=NULL,*payload=NULL;
1669
+ if (!PyArg_ParseTuple(args, "OOOOO", &vm, &env, &builtins, &name, &payload)) return NULL;
1670
+ return zexus_cabi_emit_event(vm, env, builtins, name, payload);
1671
+ }
1672
+
1673
+ static PyObject *zexus_spawn_name(PyObject *self, PyObject *args) {
1674
+ PyObject *vm=NULL,*env=NULL,*builtins=NULL,*name=NULL,*args_tuple=NULL;
1675
+ if (!PyArg_ParseTuple(args, "OOOOO", &vm, &env, &builtins, &name, &args_tuple)) return NULL;
1676
+ return zexus_cabi_spawn_name(vm, env, builtins, name, args_tuple);
1677
+ }
1678
+
1679
+ static PyObject *zexus_spawn_call(PyObject *self, PyObject *args) {
1680
+ PyObject *vm=NULL,*callable=NULL,*args_tuple=NULL;
1681
+ if (!PyArg_ParseTuple(args, "OOO", &vm, &callable, &args_tuple)) return NULL;
1682
+ return zexus_cabi_spawn_call(vm, callable, args_tuple);
1683
+ }
1684
+
1685
+ static PyObject *zexus_await(PyObject *self, PyObject *args) {
1686
+ PyObject *vm=NULL,*obj=NULL; if (!PyArg_ParseTuple(args, "OO", &vm, &obj)) return NULL;
1687
+ return zexus_cabi_await(vm, obj);
1688
+ }
1689
+
1690
+ static PyObject *zexus_lock_acquire(PyObject *self, PyObject *args) {
1691
+ PyObject *env=NULL,*key=NULL; if (!PyArg_ParseTuple(args, "OO", &env, &key)) return NULL;
1692
+ return zexus_cabi_lock_acquire(env, key);
1693
+ }
1694
+
1695
+ static PyObject *zexus_lock_release(PyObject *self, PyObject *args) {
1696
+ PyObject *env=NULL,*key=NULL; if (!PyArg_ParseTuple(args, "OO", &env, &key)) return NULL;
1697
+ return zexus_cabi_lock_release(env, key);
1698
+ }
1699
+
1700
+ static PyObject *zexus_barrier_wait(PyObject *self, PyObject *args) {
1701
+ PyObject *barrier=NULL,*timeout=Py_None;
1702
+ if (!PyArg_ParseTuple(args, "O|O", &barrier, &timeout)) return NULL;
1703
+ return zexus_cabi_barrier_wait(barrier, timeout);
1704
+ }
1705
+
1706
+ static PyObject *zexus_atomic_add(PyObject *self, PyObject *args) {
1707
+ PyObject *env=NULL,*key=NULL,*delta=NULL;
1708
+ if (!PyArg_ParseTuple(args, "OOO", &env, &key, &delta)) return NULL;
1709
+ return zexus_cabi_atomic_add(env, key, delta);
1710
+ }
1711
+
1712
+ static PyObject *zexus_atomic_cas(PyObject *self, PyObject *args) {
1713
+ PyObject *env=NULL,*key=NULL,*expected=NULL,*new_value=NULL;
1714
+ if (!PyArg_ParseTuple(args, "OOOO", &env, &key, &expected, &new_value)) return NULL;
1715
+ return zexus_cabi_atomic_cas(env, key, expected, new_value);
1716
+ }
1717
+
1718
+ static PyObject *zexus_get_iter(PyObject *self, PyObject *args) {
1719
+ PyObject *obj=NULL; if (!PyArg_ParseTuple(args, "O", &obj)) return NULL;
1720
+ return zexus_cabi_get_iter(obj);
1721
+ }
1722
+
1723
+ static PyObject *zexus_iter_next_pair(PyObject *self, PyObject *args) {
1724
+ PyObject *it=NULL; if (!PyArg_ParseTuple(args, "O", &it)) return NULL;
1725
+ return zexus_cabi_iter_next_pair(it);
1726
+ }
1727
+
1728
+ static PyObject *zexus_define_enum(PyObject *self, PyObject *args) {
1729
+ PyObject *env=NULL,*name=NULL,*spec=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &spec)) return NULL;
1730
+ return zexus_cabi_define_enum(env, name, spec);
1731
+ }
1732
+
1733
+ static PyObject *zexus_define_protocol(PyObject *self, PyObject *args) {
1734
+ PyObject *env=NULL,*name=NULL,*spec=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &spec)) return NULL;
1735
+ return zexus_cabi_define_protocol(env, name, spec);
1736
+ }
1737
+
1738
+ static PyObject *zexus_assert_protocol(PyObject *self, PyObject *args) {
1739
+ PyObject *env=NULL,*name=NULL,*spec=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &spec)) return NULL;
1740
+ return zexus_cabi_assert_protocol(env, name, spec);
1741
+ }
1742
+
1743
+ static PyObject *zexus_define_capability(PyObject *self, PyObject *args) {
1744
+ PyObject *env=NULL,*name=NULL,*definition=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &definition)) return NULL;
1745
+ return zexus_cabi_define_capability(env, name, definition);
1746
+ }
1747
+
1748
+ static PyObject *zexus_define_screen(PyObject *self, PyObject *args) {
1749
+ PyObject *env=NULL,*name=NULL,*props=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &props)) return NULL;
1750
+ return zexus_cabi_define_screen(env, name, props);
1751
+ }
1752
+
1753
+ static PyObject *zexus_define_component(PyObject *self, PyObject *args) {
1754
+ PyObject *env=NULL,*name=NULL,*props=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &props)) return NULL;
1755
+ return zexus_cabi_define_component(env, name, props);
1756
+ }
1757
+
1758
+ static PyObject *zexus_define_theme(PyObject *self, PyObject *args) {
1759
+ PyObject *env=NULL,*name=NULL,*props=NULL; if (!PyArg_ParseTuple(args, "OOO", &env, &name, &props)) return NULL;
1760
+ return zexus_cabi_define_theme(env, name, props);
1761
+ }
1762
+
1763
+ static PyObject *zexus_grant_capability(PyObject *self, PyObject *args) {
1764
+ PyObject *env=NULL,*entity=NULL,*addr_obj=NULL; Py_ssize_t count=0;
1765
+ if (!PyArg_ParseTuple(args, "OOOn", &env, &entity, &addr_obj, &count)) return NULL;
1766
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1767
+ if (!items) Py_RETURN_NONE;
1768
+ return zexus_cabi_grant_capability(env, entity, items, count);
1769
+ }
1770
+
1771
+ static PyObject *zexus_revoke_capability(PyObject *self, PyObject *args) {
1772
+ PyObject *env=NULL,*entity=NULL,*addr_obj=NULL; Py_ssize_t count=0;
1773
+ if (!PyArg_ParseTuple(args, "OOOn", &env, &entity, &addr_obj, &count)) return NULL;
1774
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1775
+ if (!items) Py_RETURN_NONE;
1776
+ return zexus_cabi_revoke_capability(env, entity, items, count);
1777
+ }
1778
+
1779
+ static PyObject *zexus_audit_log(PyObject *self, PyObject *args) {
1780
+ PyObject *env=NULL,*ts=NULL,*action=NULL,*data=NULL; if (!PyArg_ParseTuple(args, "OOOO", &env, &ts, &action, &data)) return NULL;
1781
+ return zexus_cabi_audit_log(env, ts, action, data);
1782
+ }
1783
+
1784
+ static PyObject *zexus_define_contract(PyObject *self, PyObject *args) {
1785
+ PyObject *addr_obj=NULL,*name=NULL; Py_ssize_t count=0;
1786
+ if (!PyArg_ParseTuple(args, "OnO", &addr_obj, &count, &name)) return NULL;
1787
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1788
+ if (!items) Py_RETURN_NONE;
1789
+ return zexus_cabi_define_contract(items, count, name);
1790
+ }
1791
+
1792
+ static PyObject *zexus_define_entity(PyObject *self, PyObject *args) {
1793
+ PyObject *addr_obj=NULL,*name=NULL; Py_ssize_t count=0;
1794
+ if (!PyArg_ParseTuple(args, "OnO", &addr_obj, &count, &name)) return NULL;
1795
+ PyObject **items = (PyObject **)PyLong_AsVoidPtr(addr_obj);
1796
+ if (!items) Py_RETURN_NONE;
1797
+ return zexus_cabi_define_entity(items, count, name);
1798
+ }
1799
+
1800
+ static PyObject *zexus_restrict_access(PyObject *self, PyObject *args) {
1801
+ PyObject *env=NULL,*obj=NULL,*prop=NULL,*restriction=NULL;
1802
+ if (!PyArg_ParseTuple(args, "OOOO", &env, &obj, &prop, &restriction)) return NULL;
1803
+ return zexus_cabi_restrict_access(env, obj, prop, restriction);
1804
+ }
1805
+
1806
+ static PyObject *zexus_enable_error_mode(PyObject *self, PyObject *args) {
1807
+ PyObject *env=NULL; if (!PyArg_ParseTuple(args, "O", &env)) return NULL;
1808
+ return zexus_cabi_enable_error_mode(env);
1809
+ }
1810
+
1811
+ static PyObject *zexus_get_symbols(PyObject *self, PyObject *args) {
1812
+ PyObject *symbols = PyDict_New();
1813
+ if (!symbols) {
1814
+ return NULL;
1815
+ }
1816
+ PyDict_SetItemString(symbols, "zexus_call_callable", PyLong_FromVoidPtr((void *)&zexus_cabi_call_callable));
1817
+ PyDict_SetItemString(symbols, "zexus_call_name", PyLong_FromVoidPtr((void *)&zexus_cabi_call_name));
1818
+ PyDict_SetItemString(symbols, "zexus_call_method", PyLong_FromVoidPtr((void *)&zexus_cabi_call_method));
1819
+ PyDict_SetItemString(symbols, "zexus_build_list", PyLong_FromVoidPtr((void *)&zexus_cabi_build_list_from_array));
1820
+ PyDict_SetItemString(symbols, "zexus_build_map", PyLong_FromVoidPtr((void *)&zexus_cabi_build_map_from_array));
1821
+ PyDict_SetItemString(symbols, "zexus_build_set", PyLong_FromVoidPtr((void *)&zexus_cabi_build_set_from_array));
1822
+ PyDict_SetItemString(symbols, "zexus_build_list_from_array", PyLong_FromVoidPtr((void *)&zexus_cabi_build_list_from_array));
1823
+ PyDict_SetItemString(symbols, "zexus_build_map_from_array", PyLong_FromVoidPtr((void *)&zexus_cabi_build_map_from_array));
1824
+ PyDict_SetItemString(symbols, "zexus_build_set_from_array", PyLong_FromVoidPtr((void *)&zexus_cabi_build_set_from_array));
1825
+ PyDict_SetItemString(symbols, "zexus_iter_next", PyLong_FromVoidPtr((void *)&zexus_cabi_iter_next));
1826
+ PyDict_SetItemString(symbols, "zexus_env_get", PyLong_FromVoidPtr((void *)&zexus_cabi_env_get));
1827
+ PyDict_SetItemString(symbols, "zexus_env_set", PyLong_FromVoidPtr((void *)&zexus_cabi_env_set));
1828
+ PyDict_SetItemString(symbols, "zexus_export", PyLong_FromVoidPtr((void *)&zexus_cabi_export));
1829
+ PyDict_SetItemString(symbols, "zexus_number_add", PyLong_FromVoidPtr((void *)&zexus_cabi_number_add));
1830
+ PyDict_SetItemString(symbols, "zexus_number_sub", PyLong_FromVoidPtr((void *)&zexus_cabi_number_sub));
1831
+ PyDict_SetItemString(symbols, "zexus_number_mul", PyLong_FromVoidPtr((void *)&zexus_cabi_number_mul));
1832
+ PyDict_SetItemString(symbols, "zexus_number_div", PyLong_FromVoidPtr((void *)&zexus_cabi_number_div));
1833
+ PyDict_SetItemString(symbols, "zexus_number_mod", PyLong_FromVoidPtr((void *)&zexus_cabi_number_mod));
1834
+ PyDict_SetItemString(symbols, "zexus_number_pow", PyLong_FromVoidPtr((void *)&zexus_cabi_number_pow));
1835
+ PyDict_SetItemString(symbols, "zexus_number_neg", PyLong_FromVoidPtr((void *)&zexus_cabi_number_neg));
1836
+ PyDict_SetItemString(symbols, "zexus_truthy", PyLong_FromVoidPtr((void *)&zexus_cabi_truthy_int));
1837
+ PyDict_SetItemString(symbols, "zexus_truthy_int", PyLong_FromVoidPtr((void *)&zexus_cabi_truthy_int));
1838
+ PyDict_SetItemString(symbols, "zexus_not", PyLong_FromVoidPtr((void *)&zexus_cabi_not));
1839
+ PyDict_SetItemString(symbols, "zexus_bool_and", PyLong_FromVoidPtr((void *)&zexus_cabi_bool_and));
1840
+ PyDict_SetItemString(symbols, "zexus_bool_or", PyLong_FromVoidPtr((void *)&zexus_cabi_bool_or));
1841
+ PyDict_SetItemString(symbols, "zexus_compare_eq", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_eq));
1842
+ PyDict_SetItemString(symbols, "zexus_compare_ne", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_ne));
1843
+ PyDict_SetItemString(symbols, "zexus_compare_lt", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_lt));
1844
+ PyDict_SetItemString(symbols, "zexus_compare_gt", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_gt));
1845
+ PyDict_SetItemString(symbols, "zexus_compare_lte", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_lte));
1846
+ PyDict_SetItemString(symbols, "zexus_compare_gte", PyLong_FromVoidPtr((void *)&zexus_cabi_compare_gte));
1847
+ PyDict_SetItemString(symbols, "zexus_index", PyLong_FromVoidPtr((void *)&zexus_cabi_index));
1848
+ PyDict_SetItemString(symbols, "zexus_slice", PyLong_FromVoidPtr((void *)&zexus_cabi_slice));
1849
+ PyDict_SetItemString(symbols, "zexus_get_attr", PyLong_FromVoidPtr((void *)&zexus_cabi_get_attr));
1850
+ PyDict_SetItemString(symbols, "zexus_get_length", PyLong_FromVoidPtr((void *)&zexus_cabi_get_length));
1851
+ PyDict_SetItemString(symbols, "zexus_print", PyLong_FromVoidPtr((void *)&zexus_cabi_print));
1852
+ PyDict_SetItemString(symbols, "zexus_read", PyLong_FromVoidPtr((void *)&zexus_cabi_read));
1853
+ PyDict_SetItemString(symbols, "zexus_write", PyLong_FromVoidPtr((void *)&zexus_cabi_write));
1854
+ PyDict_SetItemString(symbols, "zexus_import", PyLong_FromVoidPtr((void *)&zexus_cabi_import));
1855
+ PyDict_SetItemString(symbols, "zexus_int_from_long", PyLong_FromVoidPtr((void *)&zexus_cabi_int_from_long));
1856
+ PyDict_SetItemString(symbols, "zexus_build_tuple_from_array", PyLong_FromVoidPtr((void *)&zexus_cabi_build_tuple_from_array));
1857
+ PyDict_SetItemString(symbols, "zexus_hash_block", PyLong_FromVoidPtr((void *)&zexus_cabi_hash_block));
1858
+ PyDict_SetItemString(symbols, "zexus_merkle_root", PyLong_FromVoidPtr((void *)&zexus_cabi_merkle_root_from_array));
1859
+ PyDict_SetItemString(symbols, "zexus_verify_signature", PyLong_FromVoidPtr((void *)&zexus_cabi_verify_signature));
1860
+ PyDict_SetItemString(symbols, "zexus_state_read", PyLong_FromVoidPtr((void *)&zexus_cabi_state_read));
1861
+ PyDict_SetItemString(symbols, "zexus_state_write", PyLong_FromVoidPtr((void *)&zexus_cabi_state_write));
1862
+ PyDict_SetItemString(symbols, "zexus_tx_begin", PyLong_FromVoidPtr((void *)&zexus_cabi_tx_begin));
1863
+ PyDict_SetItemString(symbols, "zexus_tx_commit", PyLong_FromVoidPtr((void *)&zexus_cabi_tx_commit));
1864
+ PyDict_SetItemString(symbols, "zexus_tx_revert", PyLong_FromVoidPtr((void *)&zexus_cabi_tx_revert));
1865
+ PyDict_SetItemString(symbols, "zexus_gas_charge", PyLong_FromVoidPtr((void *)&zexus_cabi_gas_charge));
1866
+ PyDict_SetItemString(symbols, "zexus_require", PyLong_FromVoidPtr((void *)&zexus_cabi_require));
1867
+ PyDict_SetItemString(symbols, "zexus_ledger_append", PyLong_FromVoidPtr((void *)&zexus_cabi_ledger_append));
1868
+ PyDict_SetItemString(symbols, "zexus_register_event", PyLong_FromVoidPtr((void *)&zexus_cabi_register_event));
1869
+ PyDict_SetItemString(symbols, "zexus_emit_event", PyLong_FromVoidPtr((void *)&zexus_cabi_emit_event));
1870
+ PyDict_SetItemString(symbols, "zexus_spawn_name", PyLong_FromVoidPtr((void *)&zexus_cabi_spawn_name));
1871
+ PyDict_SetItemString(symbols, "zexus_spawn_call", PyLong_FromVoidPtr((void *)&zexus_cabi_spawn_call));
1872
+ PyDict_SetItemString(symbols, "zexus_await", PyLong_FromVoidPtr((void *)&zexus_cabi_await));
1873
+ PyDict_SetItemString(symbols, "zexus_lock_acquire", PyLong_FromVoidPtr((void *)&zexus_cabi_lock_acquire));
1874
+ PyDict_SetItemString(symbols, "zexus_lock_release", PyLong_FromVoidPtr((void *)&zexus_cabi_lock_release));
1875
+ PyDict_SetItemString(symbols, "zexus_barrier_wait", PyLong_FromVoidPtr((void *)&zexus_cabi_barrier_wait));
1876
+ PyDict_SetItemString(symbols, "zexus_atomic_add", PyLong_FromVoidPtr((void *)&zexus_cabi_atomic_add));
1877
+ PyDict_SetItemString(symbols, "zexus_atomic_cas", PyLong_FromVoidPtr((void *)&zexus_cabi_atomic_cas));
1878
+ PyDict_SetItemString(symbols, "zexus_get_iter", PyLong_FromVoidPtr((void *)&zexus_cabi_get_iter));
1879
+ PyDict_SetItemString(symbols, "zexus_iter_next_pair", PyLong_FromVoidPtr((void *)&zexus_cabi_iter_next_pair));
1880
+ PyDict_SetItemString(symbols, "zexus_define_enum", PyLong_FromVoidPtr((void *)&zexus_cabi_define_enum));
1881
+ PyDict_SetItemString(symbols, "zexus_define_protocol", PyLong_FromVoidPtr((void *)&zexus_cabi_define_protocol));
1882
+ PyDict_SetItemString(symbols, "zexus_assert_protocol", PyLong_FromVoidPtr((void *)&zexus_cabi_assert_protocol));
1883
+ PyDict_SetItemString(symbols, "zexus_define_capability", PyLong_FromVoidPtr((void *)&zexus_cabi_define_capability));
1884
+ PyDict_SetItemString(symbols, "zexus_define_screen", PyLong_FromVoidPtr((void *)&zexus_cabi_define_screen));
1885
+ PyDict_SetItemString(symbols, "zexus_define_component", PyLong_FromVoidPtr((void *)&zexus_cabi_define_component));
1886
+ PyDict_SetItemString(symbols, "zexus_define_theme", PyLong_FromVoidPtr((void *)&zexus_cabi_define_theme));
1887
+ PyDict_SetItemString(symbols, "zexus_grant_capability", PyLong_FromVoidPtr((void *)&zexus_cabi_grant_capability));
1888
+ PyDict_SetItemString(symbols, "zexus_revoke_capability", PyLong_FromVoidPtr((void *)&zexus_cabi_revoke_capability));
1889
+ PyDict_SetItemString(symbols, "zexus_audit_log", PyLong_FromVoidPtr((void *)&zexus_cabi_audit_log));
1890
+ PyDict_SetItemString(symbols, "zexus_define_contract", PyLong_FromVoidPtr((void *)&zexus_cabi_define_contract));
1891
+ PyDict_SetItemString(symbols, "zexus_define_entity", PyLong_FromVoidPtr((void *)&zexus_cabi_define_entity));
1892
+ PyDict_SetItemString(symbols, "zexus_restrict_access", PyLong_FromVoidPtr((void *)&zexus_cabi_restrict_access));
1893
+ PyDict_SetItemString(symbols, "zexus_enable_error_mode", PyLong_FromVoidPtr((void *)&zexus_cabi_enable_error_mode));
1894
+ return symbols;
1895
+ }
1896
+
1897
+ static PyMethodDef ZexusCABIMethods[] = {
1898
+ {"call_callable", zexus_call_callable, METH_VARARGS, "Call a Python callable"},
1899
+ {"call_name", zexus_call_name, METH_VARARGS, "Resolve and call a name"},
1900
+ {"call_method", zexus_call_method, METH_VARARGS, "Call a method on a Python object"},
1901
+ {"build_list", zexus_build_list, METH_VARARGS, "Build list from sequence"},
1902
+ {"build_map", zexus_build_map, METH_VARARGS, "Build dict from sequence of pairs"},
1903
+ {"build_list_from_array", zexus_build_list_from_array, METH_VARARGS, "Build list from C array"},
1904
+ {"build_map_from_array", zexus_build_map_from_array, METH_VARARGS, "Build dict from C array"},
1905
+ {"build_set_from_array", zexus_build_set_from_array, METH_VARARGS, "Build set from C array"},
1906
+ {"iter_next", zexus_iter_next, METH_VARARGS, "Iterator next"},
1907
+ {"env_get", zexus_env_get, METH_VARARGS, "Get item from env"},
1908
+ {"env_set", zexus_env_set, METH_VARARGS, "Set item in env"},
1909
+ {"export", zexus_export, METH_VARARGS, "Export value to env"},
1910
+ {"number_add", zexus_number_add, METH_VARARGS, "Add numbers"},
1911
+ {"number_sub", zexus_number_sub, METH_VARARGS, "Subtract numbers"},
1912
+ {"number_mul", zexus_number_mul, METH_VARARGS, "Multiply numbers"},
1913
+ {"number_div", zexus_number_div, METH_VARARGS, "Divide numbers"},
1914
+ {"number_mod", zexus_number_mod, METH_VARARGS, "Modulo"},
1915
+ {"number_pow", zexus_number_pow, METH_VARARGS, "Power"},
1916
+ {"number_neg", zexus_number_neg, METH_VARARGS, "Negate"},
1917
+ {"truthy", zexus_truthy, METH_VARARGS, "Truthiness"},
1918
+ {"not", zexus_not, METH_VARARGS, "Not"},
1919
+ {"compare_eq", zexus_compare_eq, METH_VARARGS, "Compare EQ"},
1920
+ {"compare_ne", zexus_compare_ne, METH_VARARGS, "Compare NE"},
1921
+ {"compare_lt", zexus_compare_lt, METH_VARARGS, "Compare LT"},
1922
+ {"compare_gt", zexus_compare_gt, METH_VARARGS, "Compare GT"},
1923
+ {"compare_lte", zexus_compare_lte, METH_VARARGS, "Compare LTE"},
1924
+ {"compare_gte", zexus_compare_gte, METH_VARARGS, "Compare GTE"},
1925
+ {"index", zexus_index, METH_VARARGS, "Index"},
1926
+ {"slice", zexus_slice, METH_VARARGS, "Slice"},
1927
+ {"get_attr", zexus_get_attr, METH_VARARGS, "Get attr"},
1928
+ {"get_length", zexus_get_length, METH_VARARGS, "Get length"},
1929
+ {"print", zexus_print, METH_VARARGS, "Print"},
1930
+ {"read", zexus_read, METH_VARARGS, "Read file"},
1931
+ {"write", zexus_write, METH_VARARGS, "Write file"},
1932
+ {"import", zexus_import, METH_VARARGS, "Import module"},
1933
+ {"int_from_long", zexus_int_from_long, METH_VARARGS, "Create int from long"},
1934
+ {"hash_block", zexus_hash_block, METH_VARARGS, "Hash block"},
1935
+ {"merkle_root", zexus_merkle_root_from_array, METH_VARARGS, "Merkle root from array"},
1936
+ {"verify_signature", zexus_verify_signature, METH_VARARGS, "Verify signature"},
1937
+ {"state_read", zexus_state_read, METH_VARARGS, "State read"},
1938
+ {"state_write", zexus_state_write, METH_VARARGS, "State write"},
1939
+ {"tx_begin", zexus_tx_begin, METH_VARARGS, "Transaction begin"},
1940
+ {"tx_commit", zexus_tx_commit, METH_VARARGS, "Transaction commit"},
1941
+ {"tx_revert", zexus_tx_revert, METH_VARARGS, "Transaction revert"},
1942
+ {"gas_charge", zexus_gas_charge, METH_VARARGS, "Gas charge"},
1943
+ {"require", zexus_require, METH_VARARGS, "Require condition"},
1944
+ {"ledger_append", zexus_ledger_append, METH_VARARGS, "Ledger append"},
1945
+ {"register_event", zexus_register_event, METH_VARARGS, "Register event"},
1946
+ {"emit_event", zexus_emit_event, METH_VARARGS, "Emit event"},
1947
+ {"spawn_name", zexus_spawn_name, METH_VARARGS, "Spawn named call"},
1948
+ {"spawn_call", zexus_spawn_call, METH_VARARGS, "Spawn callable"},
1949
+ {"await_task", zexus_await, METH_VARARGS, "Await task or coroutine"},
1950
+ {"lock_acquire", zexus_lock_acquire, METH_VARARGS, "Lock acquire"},
1951
+ {"lock_release", zexus_lock_release, METH_VARARGS, "Lock release"},
1952
+ {"barrier_wait", zexus_barrier_wait, METH_VARARGS, "Barrier wait"},
1953
+ {"atomic_add", zexus_atomic_add, METH_VARARGS, "Atomic add"},
1954
+ {"atomic_cas", zexus_atomic_cas, METH_VARARGS, "Atomic CAS"},
1955
+ {"get_iter", zexus_get_iter, METH_VARARGS, "Get iterator"},
1956
+ {"iter_next_pair", zexus_iter_next_pair, METH_VARARGS, "Iter next pair"},
1957
+ {"define_enum", zexus_define_enum, METH_VARARGS, "Define enum"},
1958
+ {"define_protocol", zexus_define_protocol, METH_VARARGS, "Define protocol"},
1959
+ {"assert_protocol", zexus_assert_protocol, METH_VARARGS, "Assert protocol"},
1960
+ {"define_capability", zexus_define_capability, METH_VARARGS, "Define capability"},
1961
+ {"define_screen", zexus_define_screen, METH_VARARGS, "Define screen"},
1962
+ {"define_component", zexus_define_component, METH_VARARGS, "Define component"},
1963
+ {"define_theme", zexus_define_theme, METH_VARARGS, "Define theme"},
1964
+ {"grant_capability", zexus_grant_capability, METH_VARARGS, "Grant capability"},
1965
+ {"revoke_capability", zexus_revoke_capability, METH_VARARGS, "Revoke capability"},
1966
+ {"audit_log", zexus_audit_log, METH_VARARGS, "Audit log"},
1967
+ {"define_contract", zexus_define_contract, METH_VARARGS, "Define contract"},
1968
+ {"define_entity", zexus_define_entity, METH_VARARGS, "Define entity"},
1969
+ {"restrict_access", zexus_restrict_access, METH_VARARGS, "Restrict access"},
1970
+ {"enable_error_mode", zexus_enable_error_mode, METH_VARARGS, "Enable error mode"},
1971
+ {"get_symbols", zexus_get_symbols, METH_VARARGS, "Return symbol addresses for native JIT"},
1972
+ {NULL, NULL, 0, NULL}
1973
+ };
1974
+
1975
+ static struct PyModuleDef zexus_cabi_module = {
1976
+ PyModuleDef_HEAD_INIT,
1977
+ "cabi",
1978
+ "Zexus C ABI bridge",
1979
+ -1,
1980
+ ZexusCABIMethods
1981
+ };
1982
+
1983
+ PyMODINIT_FUNC PyInit_cabi(void) {
1984
+ return PyModule_Create(&zexus_cabi_module);
1985
+ }