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