/src/WasmEdge/thirdparty/wasm/wasm.h
Line | Count | Source |
1 | | // SPDX-License-Identifier: Apache-2.0 |
2 | | // SPDX-FileCopyrightText: Copyright The WebAssembly wasm-c-api Authors |
3 | | |
4 | | // Vendored verbatim from the WebAssembly C API proposal: |
5 | | // <https://github.com/WebAssembly/wasm-c-api/blob/9d6b93764ac96cdd9db51081c363e09d2d488b4d/include/wasm.h> |
6 | | // |
7 | | // Do not edit this file in-tree. Update it by re-copying the header from a |
8 | | // newer upstream revision. |
9 | | |
10 | | // WebAssembly C API |
11 | | |
12 | | #ifndef WASM_H |
13 | | #define WASM_H |
14 | | |
15 | | #include <stddef.h> |
16 | | #include <stdint.h> |
17 | | #include <stdbool.h> |
18 | | #include <string.h> |
19 | | #include <assert.h> |
20 | | |
21 | | #ifndef WASM_API_EXTERN |
22 | | #if defined(_WIN32) && !defined(__MINGW32__) && !defined(LIBWASM_STATIC) |
23 | | #define WASM_API_EXTERN __declspec(dllimport) |
24 | | #else |
25 | | #define WASM_API_EXTERN |
26 | | #endif |
27 | | #endif |
28 | | |
29 | | #ifdef __cplusplus |
30 | | extern "C" { |
31 | | #endif |
32 | | |
33 | | /////////////////////////////////////////////////////////////////////////////// |
34 | | // Auxiliaries |
35 | | |
36 | | // Machine types |
37 | | |
38 | 0 | inline void assertions(void) { |
39 | 0 | static_assert(sizeof(float) == sizeof(uint32_t), "incompatible float type"); |
40 | 0 | static_assert(sizeof(double) == sizeof(uint64_t), "incompatible double type"); |
41 | 0 | static_assert(sizeof(intptr_t) == sizeof(uint32_t) || |
42 | 0 | sizeof(intptr_t) == sizeof(uint64_t), |
43 | 0 | "incompatible pointer type"); |
44 | 0 | } |
45 | | |
46 | | typedef char byte_t; |
47 | | typedef float float32_t; |
48 | | typedef double float64_t; |
49 | | |
50 | | |
51 | | // Ownership |
52 | | |
53 | | #define own |
54 | | |
55 | | // The qualifier `own` is used to indicate ownership of data in this API. |
56 | | // It is intended to be interpreted similar to a `const` qualifier: |
57 | | // |
58 | | // - `own wasm_xxx_t*` owns the pointed-to data |
59 | | // - `own wasm_xxx_t` distributes to all fields of a struct or union `xxx` |
60 | | // - `own wasm_xxx_vec_t` owns the vector as well as its elements(!) |
61 | | // - an `own` function parameter passes ownership from caller to callee |
62 | | // - an `own` function result passes ownership from callee to caller |
63 | | // - an exception are `own` pointer parameters named `out`, which are copy-back |
64 | | // output parameters passing back ownership from callee to caller |
65 | | // |
66 | | // Own data is created by `wasm_xxx_new` functions and some others. |
67 | | // It must be released with the corresponding `wasm_xxx_delete` function. |
68 | | // |
69 | | // Deleting a reference does not necessarily delete the underlying object, |
70 | | // it merely indicates that this owner no longer uses it. |
71 | | // |
72 | | // For vectors, `const wasm_xxx_vec_t` is used informally to indicate that |
73 | | // neither the vector nor its elements should be modified. |
74 | | // TODO: introduce proper `wasm_xxx_const_vec_t`? |
75 | | |
76 | | |
77 | | #define WASM_DECLARE_OWN(name) \ |
78 | | typedef struct wasm_##name##_t wasm_##name##_t; \ |
79 | | \ |
80 | | WASM_API_EXTERN void wasm_##name##_delete(own wasm_##name##_t*); |
81 | | |
82 | | |
83 | | // Vectors |
84 | | |
85 | | #define WASM_DECLARE_VEC(name, ptr_or_none) \ |
86 | | typedef struct wasm_##name##_vec_t { \ |
87 | | size_t size; \ |
88 | | wasm_##name##_t ptr_or_none* data; \ |
89 | | } wasm_##name##_vec_t; \ |
90 | | \ |
91 | | WASM_API_EXTERN void wasm_##name##_vec_new_empty(own wasm_##name##_vec_t* out); \ |
92 | | WASM_API_EXTERN void wasm_##name##_vec_new_uninitialized( \ |
93 | | own wasm_##name##_vec_t* out, size_t); \ |
94 | | WASM_API_EXTERN void wasm_##name##_vec_new( \ |
95 | | own wasm_##name##_vec_t* out, \ |
96 | | size_t, own wasm_##name##_t ptr_or_none const[]); \ |
97 | | WASM_API_EXTERN void wasm_##name##_vec_copy( \ |
98 | | own wasm_##name##_vec_t* out, const wasm_##name##_vec_t*); \ |
99 | | WASM_API_EXTERN void wasm_##name##_vec_delete(own wasm_##name##_vec_t*); |
100 | | |
101 | | |
102 | | // Byte vectors |
103 | | |
104 | | typedef byte_t wasm_byte_t; |
105 | | WASM_DECLARE_VEC(byte, ) |
106 | | |
107 | | typedef wasm_byte_vec_t wasm_name_t; |
108 | | |
109 | | #define wasm_name wasm_byte_vec |
110 | | #define wasm_name_new wasm_byte_vec_new |
111 | | #define wasm_name_new_empty wasm_byte_vec_new_empty |
112 | | #define wasm_name_new_uninitialized wasm_byte_vec_new_uninitialized |
113 | | #define wasm_name_copy wasm_byte_vec_copy |
114 | | #define wasm_name_delete wasm_byte_vec_delete |
115 | | |
116 | | static inline void wasm_name_new_from_string( |
117 | | own wasm_name_t* out, const char* s |
118 | 0 | ) { |
119 | 0 | wasm_name_new(out, strlen(s), s); |
120 | 0 | } |
121 | | |
122 | | static inline void wasm_name_new_from_string_nt( |
123 | | own wasm_name_t* out, const char* s |
124 | 0 | ) { |
125 | 0 | wasm_name_new(out, strlen(s) + 1, s); |
126 | 0 | } |
127 | | |
128 | | |
129 | | /////////////////////////////////////////////////////////////////////////////// |
130 | | // Runtime Environment |
131 | | |
132 | | // Configuration |
133 | | |
134 | | WASM_DECLARE_OWN(config) |
135 | | |
136 | | WASM_API_EXTERN own wasm_config_t* wasm_config_new(void); |
137 | | |
138 | | // Embedders may provide custom functions for manipulating configs. |
139 | | |
140 | | |
141 | | // Engine |
142 | | |
143 | | WASM_DECLARE_OWN(engine) |
144 | | |
145 | | WASM_API_EXTERN own wasm_engine_t* wasm_engine_new(void); |
146 | | WASM_API_EXTERN own wasm_engine_t* wasm_engine_new_with_config(own wasm_config_t*); |
147 | | |
148 | | |
149 | | // Store |
150 | | |
151 | | WASM_DECLARE_OWN(store) |
152 | | |
153 | | WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); |
154 | | |
155 | | |
156 | | /////////////////////////////////////////////////////////////////////////////// |
157 | | // Type Representations |
158 | | |
159 | | // Type attributes |
160 | | |
161 | | typedef uint8_t wasm_mutability_t; |
162 | | enum wasm_mutability_enum { |
163 | | WASM_CONST, |
164 | | WASM_VAR, |
165 | | }; |
166 | | |
167 | | typedef struct wasm_limits_t { |
168 | | uint32_t min; |
169 | | uint32_t max; |
170 | | } wasm_limits_t; |
171 | | |
172 | | static const uint32_t wasm_limits_max_default = 0xffffffff; |
173 | | |
174 | | |
175 | | // Generic |
176 | | |
177 | | #define WASM_DECLARE_TYPE(name) \ |
178 | | WASM_DECLARE_OWN(name) \ |
179 | | WASM_DECLARE_VEC(name, *) \ |
180 | | \ |
181 | | WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_copy(const wasm_##name##_t*); |
182 | | |
183 | | |
184 | | // Value Types |
185 | | |
186 | | WASM_DECLARE_TYPE(valtype) |
187 | | |
188 | | typedef uint8_t wasm_valkind_t; |
189 | | enum wasm_valkind_enum { |
190 | | WASM_I32, |
191 | | WASM_I64, |
192 | | WASM_F32, |
193 | | WASM_F64, |
194 | | WASM_EXTERNREF = 128, |
195 | | WASM_FUNCREF, |
196 | | }; |
197 | | |
198 | | WASM_API_EXTERN own wasm_valtype_t* wasm_valtype_new(wasm_valkind_t); |
199 | | |
200 | | WASM_API_EXTERN wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t*); |
201 | | |
202 | 0 | static inline bool wasm_valkind_is_num(wasm_valkind_t k) { |
203 | 0 | return k < WASM_EXTERNREF; |
204 | 0 | } |
205 | 0 | static inline bool wasm_valkind_is_ref(wasm_valkind_t k) { |
206 | 0 | return k >= WASM_EXTERNREF; |
207 | 0 | } |
208 | | |
209 | 0 | static inline bool wasm_valtype_is_num(const wasm_valtype_t* t) { |
210 | 0 | return wasm_valkind_is_num(wasm_valtype_kind(t)); |
211 | 0 | } |
212 | 0 | static inline bool wasm_valtype_is_ref(const wasm_valtype_t* t) { |
213 | 0 | return wasm_valkind_is_ref(wasm_valtype_kind(t)); |
214 | 0 | } |
215 | | |
216 | | |
217 | | // Function Types |
218 | | |
219 | | WASM_DECLARE_TYPE(functype) |
220 | | |
221 | | WASM_API_EXTERN own wasm_functype_t* wasm_functype_new( |
222 | | own wasm_valtype_vec_t* params, own wasm_valtype_vec_t* results); |
223 | | |
224 | | WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_params(const wasm_functype_t*); |
225 | | WASM_API_EXTERN const wasm_valtype_vec_t* wasm_functype_results(const wasm_functype_t*); |
226 | | |
227 | | |
228 | | // Global Types |
229 | | |
230 | | WASM_DECLARE_TYPE(globaltype) |
231 | | |
232 | | WASM_API_EXTERN own wasm_globaltype_t* wasm_globaltype_new( |
233 | | own wasm_valtype_t*, wasm_mutability_t); |
234 | | |
235 | | WASM_API_EXTERN const wasm_valtype_t* wasm_globaltype_content(const wasm_globaltype_t*); |
236 | | WASM_API_EXTERN wasm_mutability_t wasm_globaltype_mutability(const wasm_globaltype_t*); |
237 | | |
238 | | |
239 | | // Table Types |
240 | | |
241 | | WASM_DECLARE_TYPE(tabletype) |
242 | | |
243 | | WASM_API_EXTERN own wasm_tabletype_t* wasm_tabletype_new( |
244 | | own wasm_valtype_t*, const wasm_limits_t*); |
245 | | |
246 | | WASM_API_EXTERN const wasm_valtype_t* wasm_tabletype_element(const wasm_tabletype_t*); |
247 | | WASM_API_EXTERN const wasm_limits_t* wasm_tabletype_limits(const wasm_tabletype_t*); |
248 | | |
249 | | |
250 | | // Memory Types |
251 | | |
252 | | WASM_DECLARE_TYPE(memorytype) |
253 | | |
254 | | WASM_API_EXTERN own wasm_memorytype_t* wasm_memorytype_new(const wasm_limits_t*); |
255 | | |
256 | | WASM_API_EXTERN const wasm_limits_t* wasm_memorytype_limits(const wasm_memorytype_t*); |
257 | | |
258 | | |
259 | | // Tag Types |
260 | | |
261 | | WASM_DECLARE_TYPE(tagtype) |
262 | | |
263 | | WASM_API_EXTERN own wasm_tagtype_t* wasm_tagtype_new(own wasm_functype_t*); |
264 | | |
265 | | WASM_API_EXTERN const wasm_functype_t* wasm_tagtype_functype(const wasm_tagtype_t*); |
266 | | |
267 | | |
268 | | // Extern Types |
269 | | |
270 | | WASM_DECLARE_TYPE(externtype) |
271 | | |
272 | | typedef uint8_t wasm_externkind_t; |
273 | | enum wasm_externkind_enum { |
274 | | WASM_EXTERN_FUNC, |
275 | | WASM_EXTERN_GLOBAL, |
276 | | WASM_EXTERN_TABLE, |
277 | | WASM_EXTERN_MEMORY, |
278 | | WASM_EXTERN_TAG, |
279 | | }; |
280 | | |
281 | | WASM_API_EXTERN wasm_externkind_t wasm_externtype_kind(const wasm_externtype_t*); |
282 | | |
283 | | WASM_API_EXTERN wasm_externtype_t* wasm_functype_as_externtype(wasm_functype_t*); |
284 | | WASM_API_EXTERN wasm_externtype_t* wasm_globaltype_as_externtype(wasm_globaltype_t*); |
285 | | WASM_API_EXTERN wasm_externtype_t* wasm_tabletype_as_externtype(wasm_tabletype_t*); |
286 | | WASM_API_EXTERN wasm_externtype_t* wasm_memorytype_as_externtype(wasm_memorytype_t*); |
287 | | WASM_API_EXTERN wasm_externtype_t* wasm_tagtype_as_externtype(wasm_tagtype_t*); |
288 | | |
289 | | WASM_API_EXTERN wasm_functype_t* wasm_externtype_as_functype(wasm_externtype_t*); |
290 | | WASM_API_EXTERN wasm_globaltype_t* wasm_externtype_as_globaltype(wasm_externtype_t*); |
291 | | WASM_API_EXTERN wasm_tabletype_t* wasm_externtype_as_tabletype(wasm_externtype_t*); |
292 | | WASM_API_EXTERN wasm_memorytype_t* wasm_externtype_as_memorytype(wasm_externtype_t*); |
293 | | WASM_API_EXTERN wasm_tagtype_t* wasm_externtype_as_tagtype(wasm_externtype_t*); |
294 | | |
295 | | WASM_API_EXTERN const wasm_externtype_t* wasm_functype_as_externtype_const(const wasm_functype_t*); |
296 | | WASM_API_EXTERN const wasm_externtype_t* wasm_globaltype_as_externtype_const(const wasm_globaltype_t*); |
297 | | WASM_API_EXTERN const wasm_externtype_t* wasm_tabletype_as_externtype_const(const wasm_tabletype_t*); |
298 | | WASM_API_EXTERN const wasm_externtype_t* wasm_memorytype_as_externtype_const(const wasm_memorytype_t*); |
299 | | WASM_API_EXTERN const wasm_externtype_t* wasm_tagtype_as_externtype_const(const wasm_tagtype_t*); |
300 | | |
301 | | WASM_API_EXTERN const wasm_functype_t* wasm_externtype_as_functype_const(const wasm_externtype_t*); |
302 | | WASM_API_EXTERN const wasm_globaltype_t* wasm_externtype_as_globaltype_const(const wasm_externtype_t*); |
303 | | WASM_API_EXTERN const wasm_tabletype_t* wasm_externtype_as_tabletype_const(const wasm_externtype_t*); |
304 | | WASM_API_EXTERN const wasm_memorytype_t* wasm_externtype_as_memorytype_const(const wasm_externtype_t*); |
305 | | WASM_API_EXTERN const wasm_tagtype_t* wasm_externtype_as_tagtype_const(const wasm_externtype_t*); |
306 | | |
307 | | |
308 | | // Import Types |
309 | | |
310 | | WASM_DECLARE_TYPE(importtype) |
311 | | |
312 | | WASM_API_EXTERN own wasm_importtype_t* wasm_importtype_new( |
313 | | own wasm_name_t* module, own wasm_name_t* name, own wasm_externtype_t*); |
314 | | |
315 | | WASM_API_EXTERN const wasm_name_t* wasm_importtype_module(const wasm_importtype_t*); |
316 | | WASM_API_EXTERN const wasm_name_t* wasm_importtype_name(const wasm_importtype_t*); |
317 | | WASM_API_EXTERN const wasm_externtype_t* wasm_importtype_type(const wasm_importtype_t*); |
318 | | |
319 | | |
320 | | // Export Types |
321 | | |
322 | | WASM_DECLARE_TYPE(exporttype) |
323 | | |
324 | | WASM_API_EXTERN own wasm_exporttype_t* wasm_exporttype_new( |
325 | | own wasm_name_t*, own wasm_externtype_t*); |
326 | | |
327 | | WASM_API_EXTERN const wasm_name_t* wasm_exporttype_name(const wasm_exporttype_t*); |
328 | | WASM_API_EXTERN const wasm_externtype_t* wasm_exporttype_type(const wasm_exporttype_t*); |
329 | | |
330 | | |
331 | | /////////////////////////////////////////////////////////////////////////////// |
332 | | // Runtime Objects |
333 | | |
334 | | // Values |
335 | | |
336 | | struct wasm_ref_t; |
337 | | |
338 | | typedef struct wasm_val_t { |
339 | | wasm_valkind_t kind; |
340 | | union { |
341 | | int32_t i32; |
342 | | int64_t i64; |
343 | | float32_t f32; |
344 | | float64_t f64; |
345 | | struct wasm_ref_t* ref; |
346 | | } of; |
347 | | } wasm_val_t; |
348 | | |
349 | | WASM_API_EXTERN void wasm_val_delete(own wasm_val_t* v); |
350 | | WASM_API_EXTERN void wasm_val_copy(own wasm_val_t* out, const wasm_val_t*); |
351 | | |
352 | | WASM_DECLARE_VEC(val, ) |
353 | | |
354 | | |
355 | | // References |
356 | | |
357 | | #define WASM_DECLARE_REF_BASE(name) \ |
358 | | WASM_DECLARE_OWN(name) \ |
359 | | \ |
360 | | WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_copy(const wasm_##name##_t*); \ |
361 | | WASM_API_EXTERN bool wasm_##name##_same(const wasm_##name##_t*, const wasm_##name##_t*); \ |
362 | | \ |
363 | | WASM_API_EXTERN void* wasm_##name##_get_host_info(const wasm_##name##_t*); \ |
364 | | WASM_API_EXTERN void wasm_##name##_set_host_info(wasm_##name##_t*, void*); \ |
365 | | WASM_API_EXTERN void wasm_##name##_set_host_info_with_finalizer( \ |
366 | | wasm_##name##_t*, void*, void (*)(void*)); |
367 | | |
368 | | #define WASM_DECLARE_REF(name) \ |
369 | | WASM_DECLARE_REF_BASE(name) \ |
370 | | \ |
371 | | WASM_API_EXTERN wasm_ref_t* wasm_##name##_as_ref(wasm_##name##_t*); \ |
372 | | WASM_API_EXTERN wasm_##name##_t* wasm_ref_as_##name(wasm_ref_t*); \ |
373 | | WASM_API_EXTERN const wasm_ref_t* wasm_##name##_as_ref_const(const wasm_##name##_t*); \ |
374 | | WASM_API_EXTERN const wasm_##name##_t* wasm_ref_as_##name##_const(const wasm_ref_t*); |
375 | | |
376 | | #define WASM_DECLARE_SHARABLE_REF(name) \ |
377 | | WASM_DECLARE_REF(name) \ |
378 | | WASM_DECLARE_OWN(shared_##name) \ |
379 | | \ |
380 | | WASM_API_EXTERN own wasm_shared_##name##_t* wasm_##name##_share(const wasm_##name##_t*); \ |
381 | | WASM_API_EXTERN own wasm_##name##_t* wasm_##name##_obtain(wasm_store_t*, const wasm_shared_##name##_t*); |
382 | | |
383 | | |
384 | | WASM_DECLARE_REF_BASE(ref) |
385 | | |
386 | | |
387 | | // Frames |
388 | | |
389 | | WASM_DECLARE_OWN(frame) |
390 | | WASM_DECLARE_VEC(frame, *) |
391 | | WASM_API_EXTERN own wasm_frame_t* wasm_frame_copy(const wasm_frame_t*); |
392 | | |
393 | | WASM_API_EXTERN struct wasm_instance_t* wasm_frame_instance(const wasm_frame_t*); |
394 | | WASM_API_EXTERN uint32_t wasm_frame_func_index(const wasm_frame_t*); |
395 | | WASM_API_EXTERN size_t wasm_frame_func_offset(const wasm_frame_t*); |
396 | | WASM_API_EXTERN size_t wasm_frame_module_offset(const wasm_frame_t*); |
397 | | |
398 | | |
399 | | // Traps |
400 | | |
401 | | typedef wasm_name_t wasm_message_t; // null terminated |
402 | | |
403 | | WASM_DECLARE_REF(trap) |
404 | | |
405 | | WASM_API_EXTERN own wasm_trap_t* wasm_trap_new(wasm_store_t* store, const wasm_message_t*); |
406 | | |
407 | | WASM_API_EXTERN void wasm_trap_message(const wasm_trap_t*, own wasm_message_t* out); |
408 | | WASM_API_EXTERN own wasm_frame_t* wasm_trap_origin(const wasm_trap_t*); |
409 | | WASM_API_EXTERN void wasm_trap_trace(const wasm_trap_t*, own wasm_frame_vec_t* out); |
410 | | |
411 | | |
412 | | // Foreign Objects |
413 | | |
414 | | WASM_DECLARE_REF(foreign) |
415 | | |
416 | | WASM_API_EXTERN own wasm_foreign_t* wasm_foreign_new(wasm_store_t*); |
417 | | |
418 | | |
419 | | // Modules |
420 | | |
421 | | WASM_DECLARE_SHARABLE_REF(module) |
422 | | |
423 | | WASM_API_EXTERN own wasm_module_t* wasm_module_new( |
424 | | wasm_store_t*, const wasm_byte_vec_t* binary); |
425 | | |
426 | | WASM_API_EXTERN bool wasm_module_validate(wasm_store_t*, const wasm_byte_vec_t* binary); |
427 | | |
428 | | WASM_API_EXTERN void wasm_module_imports(const wasm_module_t*, own wasm_importtype_vec_t* out); |
429 | | WASM_API_EXTERN void wasm_module_exports(const wasm_module_t*, own wasm_exporttype_vec_t* out); |
430 | | |
431 | | WASM_API_EXTERN void wasm_module_serialize(const wasm_module_t*, own wasm_byte_vec_t* out); |
432 | | WASM_API_EXTERN own wasm_module_t* wasm_module_deserialize(wasm_store_t*, const wasm_byte_vec_t*); |
433 | | |
434 | | |
435 | | // Function Instances |
436 | | |
437 | | WASM_DECLARE_REF(func) |
438 | | |
439 | | typedef own wasm_trap_t* (*wasm_func_callback_t)( |
440 | | const wasm_val_vec_t* args, own wasm_val_vec_t* results); |
441 | | typedef own wasm_trap_t* (*wasm_func_callback_with_env_t)( |
442 | | void* env, const wasm_val_vec_t* args, wasm_val_vec_t* results); |
443 | | |
444 | | WASM_API_EXTERN own wasm_func_t* wasm_func_new( |
445 | | wasm_store_t*, const wasm_functype_t*, wasm_func_callback_t); |
446 | | WASM_API_EXTERN own wasm_func_t* wasm_func_new_with_env( |
447 | | wasm_store_t*, const wasm_functype_t* type, wasm_func_callback_with_env_t, |
448 | | void* env, void (*finalizer)(void*)); |
449 | | |
450 | | WASM_API_EXTERN own wasm_functype_t* wasm_func_type(const wasm_func_t*); |
451 | | WASM_API_EXTERN size_t wasm_func_param_arity(const wasm_func_t*); |
452 | | WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); |
453 | | |
454 | | WASM_API_EXTERN own wasm_trap_t* wasm_func_call( |
455 | | const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); |
456 | | |
457 | | |
458 | | // Global Instances |
459 | | |
460 | | WASM_DECLARE_REF(global) |
461 | | |
462 | | WASM_API_EXTERN own wasm_global_t* wasm_global_new( |
463 | | wasm_store_t*, const wasm_globaltype_t*, const wasm_val_t*); |
464 | | |
465 | | WASM_API_EXTERN own wasm_globaltype_t* wasm_global_type(const wasm_global_t*); |
466 | | |
467 | | WASM_API_EXTERN void wasm_global_get(const wasm_global_t*, own wasm_val_t* out); |
468 | | WASM_API_EXTERN void wasm_global_set(wasm_global_t*, const wasm_val_t*); |
469 | | |
470 | | |
471 | | // Table Instances |
472 | | |
473 | | WASM_DECLARE_REF(table) |
474 | | |
475 | | typedef uint32_t wasm_table_size_t; |
476 | | |
477 | | WASM_API_EXTERN own wasm_table_t* wasm_table_new( |
478 | | wasm_store_t*, const wasm_tabletype_t*, wasm_ref_t* init); |
479 | | |
480 | | WASM_API_EXTERN own wasm_tabletype_t* wasm_table_type(const wasm_table_t*); |
481 | | |
482 | | WASM_API_EXTERN own wasm_ref_t* wasm_table_get(const wasm_table_t*, wasm_table_size_t index); |
483 | | WASM_API_EXTERN bool wasm_table_set(wasm_table_t*, wasm_table_size_t index, wasm_ref_t*); |
484 | | |
485 | | WASM_API_EXTERN wasm_table_size_t wasm_table_size(const wasm_table_t*); |
486 | | WASM_API_EXTERN bool wasm_table_grow(wasm_table_t*, wasm_table_size_t delta, wasm_ref_t* init); |
487 | | |
488 | | |
489 | | // Memory Instances |
490 | | |
491 | | WASM_DECLARE_REF(memory) |
492 | | |
493 | | typedef uint32_t wasm_memory_pages_t; |
494 | | |
495 | | static const size_t MEMORY_PAGE_SIZE = 0x10000; |
496 | | |
497 | | WASM_API_EXTERN own wasm_memory_t* wasm_memory_new(wasm_store_t*, const wasm_memorytype_t*); |
498 | | |
499 | | WASM_API_EXTERN own wasm_memorytype_t* wasm_memory_type(const wasm_memory_t*); |
500 | | |
501 | | WASM_API_EXTERN byte_t* wasm_memory_data(wasm_memory_t*); |
502 | | WASM_API_EXTERN size_t wasm_memory_data_size(const wasm_memory_t*); |
503 | | |
504 | | WASM_API_EXTERN wasm_memory_pages_t wasm_memory_size(const wasm_memory_t*); |
505 | | WASM_API_EXTERN bool wasm_memory_grow(wasm_memory_t*, wasm_memory_pages_t delta); |
506 | | |
507 | | |
508 | | // Externals |
509 | | |
510 | | WASM_DECLARE_REF(extern) |
511 | | WASM_DECLARE_VEC(extern, *) |
512 | | |
513 | | WASM_API_EXTERN wasm_externkind_t wasm_extern_kind(const wasm_extern_t*); |
514 | | WASM_API_EXTERN own wasm_externtype_t* wasm_extern_type(const wasm_extern_t*); |
515 | | |
516 | | WASM_API_EXTERN wasm_extern_t* wasm_func_as_extern(wasm_func_t*); |
517 | | WASM_API_EXTERN wasm_extern_t* wasm_global_as_extern(wasm_global_t*); |
518 | | WASM_API_EXTERN wasm_extern_t* wasm_table_as_extern(wasm_table_t*); |
519 | | WASM_API_EXTERN wasm_extern_t* wasm_memory_as_extern(wasm_memory_t*); |
520 | | |
521 | | WASM_API_EXTERN wasm_func_t* wasm_extern_as_func(wasm_extern_t*); |
522 | | WASM_API_EXTERN wasm_global_t* wasm_extern_as_global(wasm_extern_t*); |
523 | | WASM_API_EXTERN wasm_table_t* wasm_extern_as_table(wasm_extern_t*); |
524 | | WASM_API_EXTERN wasm_memory_t* wasm_extern_as_memory(wasm_extern_t*); |
525 | | |
526 | | WASM_API_EXTERN const wasm_extern_t* wasm_func_as_extern_const(const wasm_func_t*); |
527 | | WASM_API_EXTERN const wasm_extern_t* wasm_global_as_extern_const(const wasm_global_t*); |
528 | | WASM_API_EXTERN const wasm_extern_t* wasm_table_as_extern_const(const wasm_table_t*); |
529 | | WASM_API_EXTERN const wasm_extern_t* wasm_memory_as_extern_const(const wasm_memory_t*); |
530 | | |
531 | | WASM_API_EXTERN const wasm_func_t* wasm_extern_as_func_const(const wasm_extern_t*); |
532 | | WASM_API_EXTERN const wasm_global_t* wasm_extern_as_global_const(const wasm_extern_t*); |
533 | | WASM_API_EXTERN const wasm_table_t* wasm_extern_as_table_const(const wasm_extern_t*); |
534 | | WASM_API_EXTERN const wasm_memory_t* wasm_extern_as_memory_const(const wasm_extern_t*); |
535 | | |
536 | | |
537 | | // Module Instances |
538 | | |
539 | | WASM_DECLARE_REF(instance) |
540 | | |
541 | | WASM_API_EXTERN own wasm_instance_t* wasm_instance_new( |
542 | | wasm_store_t*, const wasm_module_t*, const wasm_extern_vec_t* imports, |
543 | | own wasm_trap_t** |
544 | | ); |
545 | | |
546 | | WASM_API_EXTERN void wasm_instance_exports(const wasm_instance_t*, own wasm_extern_vec_t* out); |
547 | | |
548 | | |
549 | | /////////////////////////////////////////////////////////////////////////////// |
550 | | // Convenience |
551 | | |
552 | | // Vectors |
553 | | |
554 | | #define WASM_EMPTY_VEC {0, NULL} |
555 | | #define WASM_ARRAY_VEC(array) {sizeof(array)/sizeof(*(array)), array} |
556 | | |
557 | | |
558 | | // Value Type construction short-hands |
559 | | |
560 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_i32(void) { |
561 | 0 | return wasm_valtype_new(WASM_I32); |
562 | 0 | } |
563 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_i64(void) { |
564 | 0 | return wasm_valtype_new(WASM_I64); |
565 | 0 | } |
566 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_f32(void) { |
567 | 0 | return wasm_valtype_new(WASM_F32); |
568 | 0 | } |
569 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_f64(void) { |
570 | 0 | return wasm_valtype_new(WASM_F64); |
571 | 0 | } |
572 | | |
573 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_externref(void) { |
574 | 0 | return wasm_valtype_new(WASM_EXTERNREF); |
575 | 0 | } |
576 | 0 | static inline own wasm_valtype_t* wasm_valtype_new_funcref(void) { |
577 | 0 | return wasm_valtype_new(WASM_FUNCREF); |
578 | 0 | } |
579 | | |
580 | | |
581 | | // Function Types construction short-hands |
582 | | |
583 | 0 | static inline own wasm_functype_t* wasm_functype_new_0_0(void) { |
584 | 0 | wasm_valtype_vec_t params, results; |
585 | 0 | wasm_valtype_vec_new_empty(¶ms); |
586 | 0 | wasm_valtype_vec_new_empty(&results); |
587 | 0 | return wasm_functype_new(¶ms, &results); |
588 | 0 | } |
589 | | |
590 | | static inline own wasm_functype_t* wasm_functype_new_1_0( |
591 | | own wasm_valtype_t* p |
592 | 0 | ) { |
593 | 0 | wasm_valtype_t* ps[1] = {p}; |
594 | 0 | wasm_valtype_vec_t params, results; |
595 | 0 | wasm_valtype_vec_new(¶ms, 1, ps); |
596 | 0 | wasm_valtype_vec_new_empty(&results); |
597 | 0 | return wasm_functype_new(¶ms, &results); |
598 | 0 | } |
599 | | |
600 | | static inline own wasm_functype_t* wasm_functype_new_2_0( |
601 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2 |
602 | 0 | ) { |
603 | 0 | wasm_valtype_t* ps[2] = {p1, p2}; |
604 | 0 | wasm_valtype_vec_t params, results; |
605 | 0 | wasm_valtype_vec_new(¶ms, 2, ps); |
606 | 0 | wasm_valtype_vec_new_empty(&results); |
607 | 0 | return wasm_functype_new(¶ms, &results); |
608 | 0 | } |
609 | | |
610 | | static inline own wasm_functype_t* wasm_functype_new_3_0( |
611 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3 |
612 | 0 | ) { |
613 | 0 | wasm_valtype_t* ps[3] = {p1, p2, p3}; |
614 | 0 | wasm_valtype_vec_t params, results; |
615 | 0 | wasm_valtype_vec_new(¶ms, 3, ps); |
616 | 0 | wasm_valtype_vec_new_empty(&results); |
617 | 0 | return wasm_functype_new(¶ms, &results); |
618 | 0 | } |
619 | | |
620 | | static inline own wasm_functype_t* wasm_functype_new_0_1( |
621 | | own wasm_valtype_t* r |
622 | 0 | ) { |
623 | 0 | wasm_valtype_t* rs[1] = {r}; |
624 | 0 | wasm_valtype_vec_t params, results; |
625 | 0 | wasm_valtype_vec_new_empty(¶ms); |
626 | 0 | wasm_valtype_vec_new(&results, 1, rs); |
627 | 0 | return wasm_functype_new(¶ms, &results); |
628 | 0 | } |
629 | | |
630 | | static inline own wasm_functype_t* wasm_functype_new_1_1( |
631 | | own wasm_valtype_t* p, own wasm_valtype_t* r |
632 | 0 | ) { |
633 | 0 | wasm_valtype_t* ps[1] = {p}; |
634 | 0 | wasm_valtype_t* rs[1] = {r}; |
635 | 0 | wasm_valtype_vec_t params, results; |
636 | 0 | wasm_valtype_vec_new(¶ms, 1, ps); |
637 | 0 | wasm_valtype_vec_new(&results, 1, rs); |
638 | 0 | return wasm_functype_new(¶ms, &results); |
639 | 0 | } |
640 | | |
641 | | static inline own wasm_functype_t* wasm_functype_new_2_1( |
642 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* r |
643 | 0 | ) { |
644 | 0 | wasm_valtype_t* ps[2] = {p1, p2}; |
645 | 0 | wasm_valtype_t* rs[1] = {r}; |
646 | 0 | wasm_valtype_vec_t params, results; |
647 | 0 | wasm_valtype_vec_new(¶ms, 2, ps); |
648 | 0 | wasm_valtype_vec_new(&results, 1, rs); |
649 | 0 | return wasm_functype_new(¶ms, &results); |
650 | 0 | } |
651 | | |
652 | | static inline own wasm_functype_t* wasm_functype_new_3_1( |
653 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3, |
654 | | own wasm_valtype_t* r |
655 | 0 | ) { |
656 | 0 | wasm_valtype_t* ps[3] = {p1, p2, p3}; |
657 | 0 | wasm_valtype_t* rs[1] = {r}; |
658 | 0 | wasm_valtype_vec_t params, results; |
659 | 0 | wasm_valtype_vec_new(¶ms, 3, ps); |
660 | 0 | wasm_valtype_vec_new(&results, 1, rs); |
661 | 0 | return wasm_functype_new(¶ms, &results); |
662 | 0 | } |
663 | | |
664 | | static inline own wasm_functype_t* wasm_functype_new_0_2( |
665 | | own wasm_valtype_t* r1, own wasm_valtype_t* r2 |
666 | 0 | ) { |
667 | 0 | wasm_valtype_t* rs[2] = {r1, r2}; |
668 | 0 | wasm_valtype_vec_t params, results; |
669 | 0 | wasm_valtype_vec_new_empty(¶ms); |
670 | 0 | wasm_valtype_vec_new(&results, 2, rs); |
671 | 0 | return wasm_functype_new(¶ms, &results); |
672 | 0 | } |
673 | | |
674 | | static inline own wasm_functype_t* wasm_functype_new_1_2( |
675 | | own wasm_valtype_t* p, own wasm_valtype_t* r1, own wasm_valtype_t* r2 |
676 | 0 | ) { |
677 | 0 | wasm_valtype_t* ps[1] = {p}; |
678 | 0 | wasm_valtype_t* rs[2] = {r1, r2}; |
679 | 0 | wasm_valtype_vec_t params, results; |
680 | 0 | wasm_valtype_vec_new(¶ms, 1, ps); |
681 | 0 | wasm_valtype_vec_new(&results, 2, rs); |
682 | 0 | return wasm_functype_new(¶ms, &results); |
683 | 0 | } |
684 | | |
685 | | static inline own wasm_functype_t* wasm_functype_new_2_2( |
686 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2, |
687 | | own wasm_valtype_t* r1, own wasm_valtype_t* r2 |
688 | 0 | ) { |
689 | 0 | wasm_valtype_t* ps[2] = {p1, p2}; |
690 | 0 | wasm_valtype_t* rs[2] = {r1, r2}; |
691 | 0 | wasm_valtype_vec_t params, results; |
692 | 0 | wasm_valtype_vec_new(¶ms, 2, ps); |
693 | 0 | wasm_valtype_vec_new(&results, 2, rs); |
694 | 0 | return wasm_functype_new(¶ms, &results); |
695 | 0 | } |
696 | | |
697 | | static inline own wasm_functype_t* wasm_functype_new_3_2( |
698 | | own wasm_valtype_t* p1, own wasm_valtype_t* p2, own wasm_valtype_t* p3, |
699 | | own wasm_valtype_t* r1, own wasm_valtype_t* r2 |
700 | 0 | ) { |
701 | 0 | wasm_valtype_t* ps[3] = {p1, p2, p3}; |
702 | 0 | wasm_valtype_t* rs[2] = {r1, r2}; |
703 | 0 | wasm_valtype_vec_t params, results; |
704 | 0 | wasm_valtype_vec_new(¶ms, 3, ps); |
705 | 0 | wasm_valtype_vec_new(&results, 2, rs); |
706 | 0 | return wasm_functype_new(¶ms, &results); |
707 | 0 | } |
708 | | |
709 | | |
710 | | // Value construction short-hands |
711 | | |
712 | 0 | static inline void wasm_val_init_ptr(own wasm_val_t* out, void* p) { |
713 | 0 | #if UINTPTR_MAX == UINT32_MAX |
714 | 0 | out->kind = WASM_I32; |
715 | 0 | out->of.i32 = (intptr_t)p; |
716 | 0 | #elif UINTPTR_MAX == UINT64_MAX |
717 | 0 | out->kind = WASM_I64; |
718 | 0 | out->of.i64 = (intptr_t)p; |
719 | 0 | #endif |
720 | 0 | } |
721 | | |
722 | 0 | static inline void* wasm_val_ptr(const wasm_val_t* val) { |
723 | 0 | #if UINTPTR_MAX == UINT32_MAX |
724 | 0 | return (void*)(intptr_t)val->of.i32; |
725 | 0 | #elif UINTPTR_MAX == UINT64_MAX |
726 | 0 | return (void*)(intptr_t)val->of.i64; |
727 | 0 | #endif |
728 | 0 | } |
729 | | |
730 | | #define WASM_I32_VAL(i) {.kind = WASM_I32, .of = {.i32 = i}} |
731 | | #define WASM_I64_VAL(i) {.kind = WASM_I64, .of = {.i64 = i}} |
732 | | #define WASM_F32_VAL(z) {.kind = WASM_F32, .of = {.f32 = z}} |
733 | | #define WASM_F64_VAL(z) {.kind = WASM_F64, .of = {.f64 = z}} |
734 | | #define WASM_REF_VAL(r) {.kind = WASM_EXTERNREF, .of = {.ref = r}} |
735 | | #define WASM_INIT_VAL {.kind = WASM_EXTERNREF, .of = {.ref = NULL}} |
736 | | |
737 | | |
738 | | /////////////////////////////////////////////////////////////////////////////// |
739 | | |
740 | | #undef own |
741 | | |
742 | | #ifdef __cplusplus |
743 | | } // extern "C" |
744 | | #endif |
745 | | |
746 | | #endif // #ifdef WASM_H |