1 /* clang-format off */
2 
3 /**
4  * \file wasm.h
5  *
6  * Upstream Embedding API for WebAssembly.
7  *
8  * This API is defined by the upstream wasm-c-api proposal at
9  * https://github.com/WebAssembly/wasm-c-api. That proposal is in flux but
10  * Wasmtime intends to be active in its development.
11  *
12  * The documentation for this header file is currently defined in the Wasmtime
13  * project, not in the upstream header file. Some behavior here may be
14  * Wasmtime-specific and may not be portable to other engines implementing the
15  * same C API. Also note that not all functionality from the upstream C API is
16  * implemented in Wasmtime. We strive to provide all symbols as to not generate
17  * link errors but some functions are unimplemented and will abort the process
18  * if called.
19  *
20  * ### Memory Management
21  *
22  * Memory management in the wasm C API is intended to be relatively simple. Each
23  * individual object is reference counted unless otherwise noted. You can delete
24  * any object at any time after you no longer need it. Deletion of an object
25  * does not imply that the memory will be deallocated at that time. If another
26  * object still internally references the original object then the memory will
27  * still be alive.
28  *
29  * For example you can delete a #wasm_engine_t after you create a #wasm_store_t
30  * with #wasm_store_new. The engine, however, is still referenced by the
31  * #wasm_store_t so it will not be deallocated. In essence by calling
32  * #wasm_engine_delete you're release your own strong reference on the
33  * #wasm_engine_t, but that's it.
34  *
35  * Additionally APIs like #wasm_memory_copy do not actually copy the underlying
36  * data. Instead they only increment the reference count and return a new
37  * object. You'll need to still call #wasm_memory_delete (or the corresponding
38  * `*_delete` function) for each copy of an object you acquire.
39  *
40  * ### Vectors
41  *
42  * This API provides a number of `wasm_*_vec_t` type definitions and functions
43  * to work with them. Each vector is defined by a pointer and a length.
44  * "Ownership" of a vector refers to the data pointer, not the memory holding
45  * the data pointer and the length. It is safe, for example to create a
46  * #wasm_name_t on the stack and pass it to #wasm_importtype_new. The memory
47  * pointed to by #wasm_name_t must be properly initialized, however, and cannot
48  * reside on the stack.
49  */
50 
51 /**
52  * \typedef byte_t
53  * \brief A type definition for a number that occupies a single byte of data.
54  *
55  * \typedef wasm_byte_t
56  * \brief A type definition for a number that occupies a single byte of data.
57  *
58  * \typedef float32_t
59  * \brief A type definition for a 32-bit float.
60  *
61  * \typedef float64_t
62  * \brief A type definition for a 64-bit float.
63  *
64  * \typedef wasm_name_t
65  * \brief Convenience for hinting that an argument only accepts utf-8 input.
66  */
67 
68 /**
69  * \typedef wasm_config_t
70  * \brief Convenience alias for #wasm_config_t
71  *
72  * \struct wasm_config_t
73  * \brief Global engine configuration
74  *
75  * This structure represents global configuration used when constructing a
76  * #wasm_engine_t. There are now functions to modify this from wasm.h but the
77  * wasmtime/config.h header provides a number of Wasmtime-specific functions to
78  * tweak configuration options.
79  *
80  * This object is created with #wasm_config_new.
81  *
82  * Configuration is safe to share between threads. Typically you'll create a
83  * config object and immediately pass it into #wasm_engine_new_with_config,
84  * however.
85  *
86  * For more information about configuration see the Rust documentation as well
87  * at
88  * https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Config.html.
89  *
90  * \fn wasm_config_t *wasm_config_new(void);
91  * \brief Creates a new empty configuration object.
92  *
93  * The object returned is owned by the caller and will need to be deleted with
94  * #wasm_config_delete. May return `NULL` if a configuration object could not be
95  * allocated.
96  *
97  * \fn void wasm_config_delete(wasm_config_t*);
98  * \brief Deletes a configuration object.
99  */
100 
101 /**
102  * \typedef wasm_engine_t
103  * \brief Convenience alias for #wasm_engine_t
104  *
105  * \struct wasm_engine_t
106  * \brief Compilation environment and configuration.
107  *
108  * An engine is typically global in a program and contains all the configuration
109  * necessary for compiling wasm code. From an engine you'll typically create a
110  * #wasmtime_store_t. Engines are created with #wasm_engine_new or
111  * #wasm_engine_new_with_config.
112  *
113  * An engine is safe to share between threads. Multiple stores can be created
114  * within the same engine with each store living on a separate thread. Typically
115  * you'll create one #wasm_engine_t for the lifetime of your program.
116  *
117  * Engines are reference counted internally so #wasm_engine_delete can be called
118  * at any time after a #wasmtime_store_t has been created from one.
119  *
120  * \fn wasm_engine_t *wasm_engine_new(void);
121  * \brief Creates a new engine with the default configuration.
122  *
123  * The object returned is owned by the caller and will need to be deleted with
124  * #wasm_engine_delete. This may return `NULL` if the engine could not be
125  * allocated.
126  *
127  * \fn wasm_engine_t *wasm_engine_new_with_config(wasm_config_t *);
128  * \brief Creates a new engine with the specified configuration.
129  *
130  * This function will take ownership of the configuration specified regardless
131  * of the outcome of this function. You do not need to call #wasm_config_delete
132  * on the argument. The object returned is owned by the caller and will need to
133  * be deleted with #wasm_engine_delete. This may return `NULL` if the engine
134  * could not be allocated.
135  *
136  * \fn void wasm_engine_delete(wasm_engine_t*);
137  * \brief Deletes an engine.
138  */
139 
140 /**
141  * \typedef wasm_store_t
142  * \brief Convenience alias for #wasm_store_t
143  *
144  * \struct wasm_store_t
145  * \brief A collection of instances and wasm global items.
146  *
147  * A #wasm_store_t corresponds to the concept of an [embedding
148  * store](https://webassembly.github.io/spec/core/exec/runtime.html#store)
149  *
150  * \fn wasm_store_t *wasm_store_new(wasm_engine_t *);
151  * \brief Creates a new store within the specified engine.
152  *
153  * The object returned is owned by the caller and will need to be deleted with
154  * #wasm_store_delete. This may return `NULL` if the store could not be
155  * allocated.
156  *
157  * \fn void wasm_store_delete(wasm_store_t *);
158  * \brief Deletes the specified store.
159  */
160 
161 /**
162  * \struct wasm_byte_vec_t
163  * \brief A list of bytes
164  *
165  * Used to pass data in or pass data out of various functions.  The meaning and
166  * ownership of the bytes is defined by each API that operates on this
167  * datatype.
168  *
169  * \var wasm_byte_vec_t::size
170  * \brief Length of this vector.
171  *
172  * \var wasm_byte_vec_t::data
173  * \brief Pointer to the base of this vector
174  *
175  * \typedef wasm_byte_vec_t
176  * \brief Convenience alias for #wasm_byte_vec_t
177  *
178  * \typedef wasm_message_t
179  * \brief Alias of #wasm_byte_vec_t which always has a trailing 0-byte.
180  *
181  * \fn wasm_name
182  * \brief Unused by Wasmtime
183  *
184  * \fn wasm_name_new
185  * \brief Convenience alias
186  *
187  * \fn wasm_name_new_empty
188  * \brief Convenience alias
189  *
190  * \fn wasm_name_new_new_uninitialized
191  * \brief Convenience alias
192  *
193  * \fn wasm_name_new_from_string
194  * \brief Create a new name from a C string.
195  *
196  * \fn wasm_name_new_from_string_nt
197  * \brief Create a new name from a C string with null terminator.
198  *
199  * \fn wasm_name_copy
200  * \brief Convenience alias
201  *
202  * \fn wasm_name_delete
203  * \brief Convenience alias
204  *
205  * \fn void wasm_byte_vec_new_empty(wasm_byte_vec_t *out);
206  * \brief Initializes an empty byte vector.
207  *
208  * \fn void wasm_byte_vec_new_uninitialized(wasm_byte_vec_t *out, size_t);
209  * \brief Initializes an byte vector with the specified capacity.
210  *
211  * This function will initialize the provided vector with capacity to hold the
212  * specified number of bytes. The `out` parameter must previously not already be
213  * initialized and after this function is called you are then responsible for
214  * ensuring #wasm_byte_vec_delete is called.
215  *
216  * \fn void wasm_byte_vec_new(wasm_byte_vec_t *out, size_t, wasm_byte_t const[]);
217  * \brief Copies the specified data into a new byte vector.
218  *
219  * This function will copy the provided data into this byte vector. The byte
220  * vector should not be previously initialized and the caller is responsible for
221  * calling #wasm_byte_vec_delete after this function returns.
222  *
223  * Note that memory of the initialization vector provided to this function
224  * must be managed externally. This function will copy the contents to the
225  * output vector, but it's up to the caller to properly deallocate the memory.
226  *
227  * \fn void wasm_byte_vec_copy(wasm_byte_vec_t *out, const wasm_byte_vec_t *);
228  * \brief Copies one vector into a new vector.
229  *
230  * Copies the second argument's data into the first argument. The `out` vector
231  * should not be previously initialized and after this function returns you're
232  * responsible for calling #wasm_byte_vec_delete.
233  *
234  * \fn void wasm_byte_vec_delete(wasm_byte_vec_t *);
235  * \brief Deletes a byte vector.
236  *
237  * This function will deallocate the data referenced by the argument provided.
238  * This does not deallocate the memory holding the #wasm_byte_vec_t itself, it's
239  * expected that memory is owned by the caller.
240  */
241 
242 /**
243  * \struct wasm_valtype_t
244  * \brief An object representing the type of a value.
245  *
246  * \typedef wasm_valtype_t
247  * \brief Convenience alias for #wasm_valtype_t
248  *
249  * \struct wasm_valtype_vec_t
250  * \brief A list of #wasm_valtype_t values.
251  *
252  * \var wasm_valtype_vec_t::size
253  * \brief Length of this vector.
254  *
255  * \var wasm_valtype_vec_t::data
256  * \brief Pointer to the base of this vector
257  *
258  * \typedef wasm_valtype_vec_t
259  * \brief Convenience alias for #wasm_valtype_vec_t
260  *
261  * \fn void wasm_valtype_delete(wasm_valtype_t *);
262  * \brief Deletes a type.
263  *
264  * \fn void wasm_valtype_vec_new_empty(wasm_valtype_vec_t *out);
265  * \brief Creates an empty vector.
266  *
267  * See #wasm_byte_vec_new_empty for more information.
268  *
269  * \fn void wasm_valtype_vec_new_uninitialized(wasm_valtype_vec_t *out, size_t);
270  * \brief Creates a vector with the given capacity.
271  *
272  * See #wasm_byte_vec_new_uninitialized for more information.
273  *
274  * \fn void wasm_valtype_vec_new(wasm_valtype_vec_t *out, size_t, wasm_valtype_t *const[]);
275  * \brief Creates a vector with the provided contents.
276  *
277  * See #wasm_byte_vec_new for more information.
278  *
279  * \fn void wasm_valtype_vec_copy(wasm_valtype_vec_t *out, const wasm_valtype_vec_t *)
280  * \brief Copies one vector to another
281  *
282  * See #wasm_byte_vec_copy for more information.
283  *
284  * \fn void wasm_valtype_vec_delete(wasm_valtype_vec_t *out)
285  * \brief Deallocates memory for a vector.
286  *
287  * See #wasm_byte_vec_delete for more information.
288  *
289  * \fn wasm_valtype_t* wasm_valtype_copy(const wasm_valtype_t *)
290  * \brief Creates a new value which matches the provided one.
291  *
292  * The caller is responsible for deleting the returned value.
293  *
294  * \fn wasm_valtype_t* wasm_valtype_new(wasm_valkind_t);
295  * \brief Creates a new value type from the specified kind.
296  *
297  * The caller is responsible for deleting the returned value.
298  *
299  * \fn wasm_valkind_t wasm_valtype_kind(const wasm_valtype_t *);
300  * \brief Returns the associated kind for this value type.
301  */
302 
303 /**
304  * \typedef wasm_valkind_t
305  * \brief Different kinds of types supported in wasm.
306  */
307 
308 /**
309  * \struct wasm_functype_t
310  * \brief An opaque object representing the type of a function.
311  *
312  * \typedef wasm_functype_t
313  * \brief Convenience alias for #wasm_functype_t
314  *
315  * \struct wasm_functype_vec_t
316  * \brief A list of #wasm_functype_t values.
317  *
318  * \var wasm_functype_vec_t::size
319  * \brief Length of this vector.
320  *
321  * \var wasm_functype_vec_t::data
322  * \brief Pointer to the base of this vector
323  *
324  * \typedef wasm_functype_vec_t
325  * \brief Convenience alias for #wasm_functype_vec_t
326  *
327  * \fn void wasm_functype_delete(wasm_functype_t *);
328  * \brief Deletes a type.
329  *
330  * \fn void wasm_functype_vec_new_empty(wasm_functype_vec_t *out);
331  * \brief Creates an empty vector.
332  *
333  * See #wasm_byte_vec_new_empty for more information.
334  *
335  * \fn void wasm_functype_vec_new_uninitialized(wasm_functype_vec_t *out, size_t);
336  * \brief Creates a vector with the given capacity.
337  *
338  * See #wasm_byte_vec_new_uninitialized for more information.
339  *
340  * \fn void wasm_functype_vec_new(wasm_functype_vec_t *out, size_t, wasm_functype_t *const[]);
341  * \brief Creates a vector with the provided contents.
342  *
343  * See #wasm_byte_vec_new for more information.
344  *
345  * \fn void wasm_functype_vec_copy(wasm_functype_vec_t *out, const wasm_functype_vec_t *)
346  * \brief Copies one vector to another
347  *
348  * See #wasm_byte_vec_copy for more information.
349  *
350  * \fn void wasm_functype_vec_delete(wasm_functype_vec_t *out)
351  * \brief Deallocates memory for a vector.
352  *
353  * See #wasm_byte_vec_delete for more information.
354  *
355  * \fn wasm_functype_t* wasm_functype_copy(const wasm_functype_t *)
356  * \brief Creates a new value which matches the provided one.
357  *
358  * The caller is responsible for deleting the returned value.
359  *
360  * \fn wasm_functype_t* wasm_functype_new(wasm_valtype_vec_t *params, wasm_valtype_vec_t *results);
361  * \brief Creates a new function type with the provided parameter and result
362  * types.
363  *
364  * This function takes ownership of the `params` and `results` arguments.
365  *
366  * The caller is responsible for deleting the returned value.
367  *
368  * \fn const wasm_valtype_vec_t* wasm_functype_params(const wasm_functype_t *);
369  * \brief Returns the list of parameters of this function type.
370  *
371  * The returned memory is owned by the #wasm_functype_t argument, the caller
372  * should not deallocate it.
373  *
374  * \fn const wasm_valtype_vec_t* wasm_functype_results(const wasm_functype_t *);
375  * \brief Returns the list of results of this function type.
376  *
377  * The returned memory is owned by the #wasm_functype_t argument, the caller
378  * should not deallocate it.
379  */
380 
381 /**
382  * \struct wasm_globaltype_t
383  * \brief An opaque object representing the type of a global.
384  *
385  * \typedef wasm_globaltype_t
386  * \brief Convenience alias for #wasm_globaltype_t
387  *
388  * \struct wasm_globaltype_vec_t
389  * \brief A list of #wasm_globaltype_t values.
390  *
391  * \var wasm_globaltype_vec_t::size
392  * \brief Length of this vector.
393  *
394  * \var wasm_globaltype_vec_t::data
395  * \brief Pointer to the base of this vector
396  *
397  * \typedef wasm_globaltype_vec_t
398  * \brief Convenience alias for #wasm_globaltype_vec_t
399  *
400  * \fn void wasm_globaltype_delete(wasm_globaltype_t *);
401  * \brief Deletes a type.
402  *
403  * \fn void wasm_globaltype_vec_new_empty(wasm_globaltype_vec_t *out);
404  * \brief Creates an empty vector.
405  *
406  * See #wasm_byte_vec_new_empty for more information.
407  *
408  * \fn void wasm_globaltype_vec_new_uninitialized(wasm_globaltype_vec_t *out, size_t);
409  * \brief Creates a vector with the given capacity.
410  *
411  * See #wasm_byte_vec_new_uninitialized for more information.
412  *
413  * \fn void wasm_globaltype_vec_new(wasm_globaltype_vec_t *out, size_t, wasm_globaltype_t *const[]);
414  * \brief Creates a vector with the provided contents.
415  *
416  * See #wasm_byte_vec_new for more information.
417  *
418  * \fn void wasm_globaltype_vec_copy(wasm_globaltype_vec_t *out, const wasm_globaltype_vec_t *)
419  * \brief Copies one vector to another
420  *
421  * See #wasm_byte_vec_copy for more information.
422  *
423  * \fn void wasm_globaltype_vec_delete(wasm_globaltype_vec_t *out)
424  * \brief Deallocates memory for a vector.
425  *
426  * See #wasm_byte_vec_delete for more information.
427  *
428  * \fn wasm_globaltype_t* wasm_globaltype_copy(const wasm_globaltype_t *)
429  * \brief Creates a new value which matches the provided one.
430  *
431  * The caller is responsible for deleting the returned value.
432  *
433  * \fn wasm_globaltype_t* wasm_globaltype_new(wasm_valtype_t *, wasm_mutability_t)
434  * \brief Creates a new global type.
435  *
436  * This function takes ownership of the #wasm_valtype_t argument.
437  *
438  * The caller is responsible for deleting the returned value.
439  *
440  * \fn const wasm_valtype_t* wasm_globaltype_content(const wasm_globaltype_t *);
441  * \brief Returns the type of value contained in a global.
442  *
443  * The returned memory is owned by the provided #wasm_globaltype_t, the caller
444  * should not deallocate it.
445  *
446  * \fn wasm_mutability_t wasm_globaltype_mutability(const wasm_globaltype_t *);
447  * \brief Returns whether or not a global is mutable.
448  */
449 
450 /**
451  * \typedef wasm_mutability_t
452  * \brief Boolean flag for whether a global is mutable or not.
453  */
454 
455 /**
456  * \struct wasm_tabletype_t
457  * \brief An opaque object representing the type of a table.
458  *
459  * \typedef wasm_tabletype_t
460  * \brief Convenience alias for #wasm_tabletype_t
461  *
462  * \struct wasm_tabletype_vec_t
463  * \brief A list of #wasm_tabletype_t values.
464  *
465  * \var wasm_tabletype_vec_t::size
466  * \brief Length of this vector.
467  *
468  * \var wasm_tabletype_vec_t::data
469  * \brief Pointer to the base of this vector
470  *
471  * \typedef wasm_tabletype_vec_t
472  * \brief Convenience alias for #wasm_tabletype_vec_t
473  *
474  * \fn void wasm_tabletype_delete(wasm_tabletype_t *);
475  * \brief Deletes a type.
476  *
477  * \fn void wasm_tabletype_vec_new_empty(wasm_tabletype_vec_t *out);
478  * \brief Creates an empty vector.
479  *
480  * See #wasm_byte_vec_new_empty for more information.
481  *
482  * \fn void wasm_tabletype_vec_new_uninitialized(wasm_tabletype_vec_t *out, size_t);
483  * \brief Creates a vector with the given capacity.
484  *
485  * See #wasm_byte_vec_new_uninitialized for more information.
486  *
487  * \fn void wasm_tabletype_vec_new(wasm_tabletype_vec_t *out, size_t, wasm_tabletype_t *const[]);
488  * \brief Creates a vector with the provided contents.
489  *
490  * See #wasm_byte_vec_new for more information.
491  *
492  * \fn void wasm_tabletype_vec_copy(wasm_tabletype_vec_t *out, const wasm_tabletype_vec_t *)
493  * \brief Copies one vector to another
494  *
495  * See #wasm_byte_vec_copy for more information.
496  *
497  * \fn void wasm_tabletype_vec_delete(wasm_tabletype_vec_t *out)
498  * \brief Deallocates memory for a vector.
499  *
500  * See #wasm_byte_vec_delete for more information.
501  *
502  * \fn wasm_tabletype_t* wasm_tabletype_copy(const wasm_tabletype_t *)
503  * \brief Creates a new value which matches the provided one.
504  *
505  * The caller is responsible for deleting the returned value.
506  *
507  * \fn wasm_tabletype_t* wasm_tabletype_new(wasm_valtype_t *, const wasm_limits_t *)h
508  * \brief Creates a new table type.
509  *
510  * This function takes ownership of the #wasm_valtype_t argument, but does not
511  * take ownership of the #wasm_limits_t.
512  *
513  * The caller is responsible for deallocating the returned type.
514  *
515  * \fn const wasm_valtype_t* wasm_tabletype_element(const wasm_tabletype_t *);
516  * \brief Returns the element type of this table.
517  *
518  * The returned #wasm_valtype_t is owned by the #wasm_tabletype_t parameter, the
519  * caller should not deallocate it.
520  *
521  * \fn const wasm_limits_t* wasm_tabletype_limits(const wasm_tabletype_t *);
522  * \brief Returns the limits of this table.
523  *
524  * The returned #wasm_limits_t is owned by the #wasm_tabletype_t parameter, the
525  * caller should not deallocate it.
526  */
527 
528 /**
529  * \struct wasm_limits_t
530  * \brief Limits for tables/memories in wasm modules
531  * \var wasm_limits_t::min
532  * The minimum value required.
533  * \var wasm_limits_t::max
534  * The maximum value required, or `wasm_limits_max_default` if no maximum is
535  * specified.
536  *
537  * \typedef wasm_limits_t
538  * \brief A convenience typedef to #wasm_limits_t
539  */
540 
541 /**
542  * \struct wasm_memorytype_t
543  * \brief An opaque object representing the type of a memory.
544  *
545  * \typedef wasm_memorytype_t
546  * \brief Convenience alias for #wasm_memorytype_t
547  *
548  * \struct wasm_memorytype_vec_t
549  * \brief A list of #wasm_memorytype_t values.
550  *
551  * \var wasm_memorytype_vec_t::size
552  * \brief Length of this vector.
553  *
554  * \var wasm_memorytype_vec_t::data
555  * \brief Pointer to the base of this vector
556  *
557  * \typedef wasm_memorytype_vec_t
558  * \brief Convenience alias for #wasm_memorytype_vec_t
559  *
560  * \fn void wasm_memorytype_delete(wasm_memorytype_t *);
561  * \brief Deletes a type.
562  *
563  * \fn void wasm_memorytype_vec_new_empty(wasm_memorytype_vec_t *out);
564  * \brief Creates an empty vector.
565  *
566  * See #wasm_byte_vec_new_empty for more information.
567  *
568  * \fn void wasm_memorytype_vec_new_uninitialized(wasm_memorytype_vec_t *out, size_t);
569  * \brief Creates a vector with the given capacity.
570  *
571  * See #wasm_byte_vec_new_uninitialized for more information.
572  *
573  * \fn void wasm_memorytype_vec_new(wasm_memorytype_vec_t *out, size_t, wasm_memorytype_t *const[]);
574  * \brief Creates a vector with the provided contents.
575  *
576  * See #wasm_byte_vec_new for more information.
577  *
578  * \fn void wasm_memorytype_vec_copy(wasm_memorytype_vec_t *out, const wasm_memorytype_vec_t *)
579  * \brief Copies one vector to another
580  *
581  * See #wasm_byte_vec_copy for more information.
582  *
583  * \fn void wasm_memorytype_vec_delete(wasm_memorytype_vec_t *out)
584  * \brief Deallocates memory for a vector.
585  *
586  * See #wasm_byte_vec_delete for more information.
587  *
588  * \fn wasm_memorytype_t* wasm_memorytype_copy(const wasm_memorytype_t *)
589  * \brief Creates a new value which matches the provided one.
590  *
591  * The caller is responsible for deleting the returned value.
592  *
593  * \fn wasm_memorytype_t* wasm_memorytype_new(const wasm_limits_t *)h
594  * \brief Creates a new memory type.
595  *
596  * This function takes ownership of the #wasm_valtype_t argument, but does not
597  * take ownership of the #wasm_limits_t.
598  *
599  * The caller is responsible for deallocating the returned type.
600  *
601  * For compatibility with memory64 it's recommended to use
602  * #wasmtime_memorytype_new instead.
603  *
604  * \fn const wasm_limits_t* wasm_memorytype_limits(const wasm_memorytype_t *);
605  * \brief Returns the limits of this memory.
606  *
607  * The returned #wasm_limits_t is owned by the #wasm_memorytype_t parameter, the
608  * caller should not deallocate it.
609  *
610  * For compatibility with memory64 it's recommended to use
611  * #wasmtime_memorytype_maximum or #wasmtime_memorytype_minimum instead.
612  */
613 
614 /**
615  * \struct wasm_externtype_t
616  * \brief An opaque object representing the type of a external value. Can be
617  * seen as a superclass of #wasm_functype_t, #wasm_tabletype_t,
618  * #wasm_globaltype_t, and #wasm_memorytype_t.
619  *
620  * \typedef wasm_externtype_t
621  * \brief Convenience alias for #wasm_externtype_t
622  *
623  * \struct wasm_externtype_vec_t
624  * \brief A list of #wasm_externtype_t values.
625  *
626  * \var wasm_externtype_vec_t::size
627  * \brief Length of this vector.
628  *
629  * \var wasm_externtype_vec_t::data
630  * \brief Pointer to the base of this vector
631  *
632  * \typedef wasm_externtype_vec_t
633  * \brief Convenience alias for #wasm_externtype_vec_t
634  *
635  * \fn void wasm_externtype_delete(wasm_externtype_t *);
636  * \brief Deletes a type.
637  *
638  * \fn void wasm_externtype_vec_new_empty(wasm_externtype_vec_t *out);
639  * \brief Creates an empty vector.
640  *
641  * See #wasm_byte_vec_new_empty for more information.
642  *
643  * \fn void wasm_externtype_vec_new_uninitialized(wasm_externtype_vec_t *out, size_t);
644  * \brief Creates a vector with the given capacity.
645  *
646  * See #wasm_byte_vec_new_uninitialized for more information.
647  *
648  * \fn void wasm_externtype_vec_new(wasm_externtype_vec_t *out, size_t, wasm_externtype_t *const[]);
649  * \brief Creates a vector with the provided contents.
650  *
651  * See #wasm_byte_vec_new for more information.
652  *
653  * \fn void wasm_externtype_vec_copy(wasm_externtype_vec_t *out, const wasm_externtype_vec_t *)
654  * \brief Copies one vector to another
655  *
656  * See #wasm_byte_vec_copy for more information.
657  *
658  * \fn void wasm_externtype_vec_delete(wasm_externtype_vec_t *out)
659  * \brief Deallocates extern for a vector.
660  *
661  * See #wasm_byte_vec_delete for more information.
662  *
663  * \fn wasm_externtype_t* wasm_externtype_copy(const wasm_externtype_t *)
664  * \brief Creates a new value which matches the provided one.
665  *
666  * The caller is responsible for deleting the returned value.
667  *
668  * \fn wasm_externkind_t wasm_externtype_kind(const wasm_externtype_t *)
669  * \brief Returns the kind of external item this type represents.
670  */
671 
672 /**
673  * \typedef wasm_externkind_t
674  * \brief Classifier for #wasm_externtype_t
675  *
676  * This is returned from #wasm_extern_kind and #wasm_externtype_kind to
677  * determine what kind of type is wrapped.
678  */
679 
680 /**
681  * \fn wasm_externtype_t* wasm_functype_as_externtype(wasm_functype_t *)
682  * \brief Converts a #wasm_functype_t to a #wasm_externtype_t
683  *
684  * The returned value is owned by the #wasm_functype_t argument and should not
685  * be deleted.
686  *
687  * \fn wasm_externtype_t* wasm_tabletype_as_externtype(wasm_tabletype_t *)
688  * \brief Converts a #wasm_tabletype_t to a #wasm_externtype_t
689  *
690  * The returned value is owned by the #wasm_tabletype_t argument and should not
691  * be deleted.
692  *
693  * \fn wasm_externtype_t* wasm_globaltype_as_externtype(wasm_globaltype_t *)
694  * \brief Converts a #wasm_globaltype_t to a #wasm_externtype_t
695  *
696  * The returned value is owned by the #wasm_globaltype_t argument and should not
697  * be deleted.
698  *
699  * \fn wasm_externtype_t* wasm_memorytype_as_externtype(wasm_memorytype_t *)
700  * \brief Converts a #wasm_memorytype_t to a #wasm_externtype_t
701  *
702  * The returned value is owned by the #wasm_memorytype_t argument and should not
703  * be deleted.
704  *
705  * \fn const wasm_externtype_t* wasm_functype_as_externtype_const(const wasm_functype_t *)
706  * \brief Converts a #wasm_functype_t to a #wasm_externtype_t
707  *
708  * The returned value is owned by the #wasm_functype_t argument and should not
709  * be deleted.
710  *
711  * \fn const wasm_externtype_t* wasm_tabletype_as_externtype_const(const wasm_tabletype_t *)
712  * \brief Converts a #wasm_tabletype_t to a #wasm_externtype_t
713  *
714  * The returned value is owned by the #wasm_tabletype_t argument and should not
715  * be deleted.
716  *
717  * \fn const wasm_externtype_t* wasm_globaltype_as_externtype_const(const wasm_globaltype_t *)
718  * \brief Converts a #wasm_globaltype_t to a #wasm_externtype_t
719  *
720  * The returned value is owned by the #wasm_globaltype_t argument and should not
721  * be deleted.
722  *
723  * \fn const wasm_externtype_t* wasm_memorytype_as_externtype_const(const wasm_memorytype_t *)
724  * \brief Converts a #wasm_memorytype_t to a #wasm_externtype_t
725  *
726  * The returned value is owned by the #wasm_memorytype_t argument and should not
727  * be deleted.
728  *
729  * \fn wasm_functype_t* wasm_externtype_as_functype(wasm_externtype_t *)
730  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_functype_t
731  *
732  * The returned value is owned by the #wasm_functype_t argument and should not
733  * be deleted. Returns `NULL` if the provided argument is not a
734  * #wasm_functype_t.
735  *
736  * \fn wasm_tabletype_t* wasm_externtype_as_tabletype(wasm_externtype_t *)
737  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_tabletype_t
738  *
739  * The returned value is owned by the #wasm_tabletype_t argument and should not
740  * be deleted. Returns `NULL` if the provided argument is not a
741  * #wasm_tabletype_t.
742  *
743  * \fn wasm_memorytype_t* wasm_externtype_as_memorytype(wasm_externtype_t *)
744  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_memorytype_t
745  *
746  * The returned value is owned by the #wasm_memorytype_t argument and should not
747  * be deleted. Returns `NULL` if the provided argument is not a
748  * #wasm_memorytype_t.
749  *
750  * \fn wasm_globaltype_t* wasm_externtype_as_globaltype(wasm_externtype_t *)
751  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_globaltype_t
752  *
753  * The returned value is owned by the #wasm_globaltype_t argument and should not
754  * be deleted. Returns `NULL` if the provided argument is not a
755  * #wasm_globaltype_t.
756  *
757  * \fn const wasm_functype_t* wasm_externtype_as_functype_const(const wasm_externtype_t *)
758  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_functype_t
759  *
760  * The returned value is owned by the #wasm_functype_t argument and should not
761  * be deleted. Returns `NULL` if the provided argument is not a
762  * #wasm_functype_t.
763  *
764  * \fn const wasm_tabletype_t* wasm_externtype_as_tabletype_const(const wasm_externtype_t *)
765  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_tabletype_t
766  *
767  * The returned value is owned by the #wasm_tabletype_t argument and should not
768  * be deleted. Returns `NULL` if the provided argument is not a
769  * #wasm_tabletype_t.
770  *
771  * \fn const wasm_memorytype_t* wasm_externtype_as_memorytype_const(const wasm_externtype_t *)
772  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_memorytype_t
773  *
774  * The returned value is owned by the #wasm_memorytype_t argument and should not
775  * be deleted. Returns `NULL` if the provided argument is not a
776  * #wasm_memorytype_t.
777  *
778  * \fn const wasm_globaltype_t* wasm_externtype_as_globaltype_const(const wasm_externtype_t *)
779  * \brief Attempts to convert a #wasm_externtype_t to a #wasm_globaltype_t
780  *
781  * The returned value is owned by the #wasm_globaltype_t argument and should not
782  * be deleted. Returns `NULL` if the provided argument is not a
783  * #wasm_globaltype_t.
784  */
785 
786 /**
787  * \struct wasm_importtype_t
788  * \brief An opaque object representing the type of an import.
789  *
790  * \typedef wasm_importtype_t
791  * \brief Convenience alias for #wasm_importtype_t
792  *
793  * \struct wasm_importtype_vec_t
794  * \brief A list of #wasm_importtype_t values.
795  *
796  * \var wasm_importtype_vec_t::size
797  * \brief Length of this vector.
798  *
799  * \var wasm_importtype_vec_t::data
800  * \brief Pointer to the base of this vector
801  *
802  * \typedef wasm_importtype_vec_t
803  * \brief Convenience alias for #wasm_importtype_vec_t
804  *
805  * \fn void wasm_importtype_delete(wasm_importtype_t *);
806  * \brief Deletes a type.
807  *
808  * \fn void wasm_importtype_vec_new_empty(wasm_importtype_vec_t *out);
809  * \brief Creates an empty vector.
810  *
811  * See #wasm_byte_vec_new_empty for more information.
812  *
813  * \fn void wasm_importtype_vec_new_uninitialized(wasm_importtype_vec_t *out, size_t);
814  * \brief Creates a vector with the given capacity.
815  *
816  * See #wasm_byte_vec_new_uninitialized for more information.
817  *
818  * \fn void wasm_importtype_vec_new(wasm_importtype_vec_t *out, size_t, wasm_importtype_t *const[]);
819  * \brief Creates a vector with the provided contents.
820  *
821  * See #wasm_byte_vec_new for more information.
822  *
823  * \fn void wasm_importtype_vec_copy(wasm_importtype_vec_t *out, const wasm_importtype_vec_t *)
824  * \brief Copies one vector to another
825  *
826  * See #wasm_byte_vec_copy for more information.
827  *
828  * \fn void wasm_importtype_vec_delete(wasm_importtype_vec_t *out)
829  * \brief Deallocates import for a vector.
830  *
831  * See #wasm_byte_vec_delete for more information.
832  *
833  * \fn wasm_importtype_t* wasm_importtype_copy(const wasm_importtype_t *)
834  * \brief Creates a new value which matches the provided one.
835  *
836  * The caller is responsible for deleting the returned value.
837  *
838  * \fn wasm_importtype_t* wasm_importtype_new(wasm_name_t *module, wasm_name_t *name, wasm_externtype_t *)
839  * \brief Creates a new import type.
840  *
841  * This function takes ownership of the `module`, `name`, and
842  * #wasm_externtype_t arguments. The caller is responsible for deleting the
843  * returned value. Note that `name` can be `NULL` where in the module linking
844  * proposal the import name can be omitted.
845  *
846  * \fn const wasm_name_t* wasm_importtype_module(const wasm_importtype_t *);
847  * \brief Returns the module this import is importing from.
848  *
849  * The returned memory is owned by the #wasm_importtype_t argument, the caller
850  * should not deallocate it.
851  *
852  * \fn const wasm_name_t* wasm_importtype_name(const wasm_importtype_t *);
853  * \brief Returns the name this import is importing from.
854  *
855  * The returned memory is owned by the #wasm_importtype_t argument, the caller
856  * should not deallocate it. Note that `NULL` can be returned which means
857  * that the import name is not provided. This is for imports with the module
858  * linking proposal that only have the module specified.
859  *
860  * \fn const wasm_externtype_t* wasm_importtype_type(const wasm_importtype_t *);
861  * \brief Returns the type of item this import is importing.
862  *
863  * The returned memory is owned by the #wasm_importtype_t argument, the caller
864  * should not deallocate it.
865  */
866 
867 /**
868  * \struct wasm_exporttype_t
869  * \brief An opaque object representing the type of an export.
870  *
871  * \typedef wasm_exporttype_t
872  * \brief Convenience alias for #wasm_exporttype_t
873  *
874  * \struct wasm_exporttype_vec_t
875  * \brief A list of #wasm_exporttype_t values.
876  *
877  * \var wasm_exporttype_vec_t::size
878  * \brief Length of this vector.
879  *
880  * \var wasm_exporttype_vec_t::data
881  * \brief Pointer to the base of this vector
882  *
883  * \typedef wasm_exporttype_vec_t
884  * \brief Convenience alias for #wasm_exporttype_vec_t
885  *
886  * \fn void wasm_exporttype_delete(wasm_exporttype_t *);
887  * \brief Deletes a type.
888  *
889  * \fn void wasm_exporttype_vec_new_empty(wasm_exporttype_vec_t *out);
890  * \brief Creates an empty vector.
891  *
892  * See #wasm_byte_vec_new_empty for more information.
893  *
894  * \fn void wasm_exporttype_vec_new_uninitialized(wasm_exporttype_vec_t *out, size_t);
895  * \brief Creates a vector with the given capacity.
896  *
897  * See #wasm_byte_vec_new_uninitialized for more information.
898  *
899  * \fn void wasm_exporttype_vec_new(wasm_exporttype_vec_t *out, size_t, wasm_exporttype_t *const[]);
900  * \brief Creates a vector with the provided contents.
901  *
902  * See #wasm_byte_vec_new for more information.
903  *
904  * \fn void wasm_exporttype_vec_copy(wasm_exporttype_vec_t *out, const wasm_exporttype_vec_t *)
905  * \brief Copies one vector to another
906  *
907  * See #wasm_byte_vec_copy for more information.
908  *
909  * \fn void wasm_exporttype_vec_delete(wasm_exporttype_vec_t *out)
910  * \brief Deallocates export for a vector.
911  *
912  * See #wasm_byte_vec_delete for more information.
913  *
914  * \fn wasm_exporttype_t* wasm_exporttype_copy(const wasm_exporttype_t *)
915  * \brief Creates a new value which matches the provided one.
916  *
917  * The caller is responsible for deleting the returned value.
918  *
919  * \fn wasm_exporttype_t* wasm_exporttype_new(wasm_name_t *name, wasm_externtype_t *)
920  * \brief Creates a new export type.
921  *
922  * This function takes ownership of the `name` and
923  * #wasm_externtype_t arguments. The caller is responsible for deleting the
924  * returned value.
925  *
926  * \fn const wasm_name_t* wasm_exporttype_name(const wasm_exporttype_t *);
927  * \brief Returns the name of this export.
928  *
929  * The returned memory is owned by the #wasm_exporttype_t argument, the caller
930  * should not deallocate it.
931  *
932  * \fn const wasm_externtype_t* wasm_exporttype_type(const wasm_exporttype_t *);
933  * \brief Returns the type of this export.
934  *
935  * The returned memory is owned by the #wasm_exporttype_t argument, the caller
936  * should not deallocate it.
937  */
938 
939 /**
940  * \struct wasm_val_t
941  * \brief Representation of a WebAssembly value.
942  *
943  * Note that this structure is intended to represent the way to communicate
944  * values from the embedder to the engine. This type is not actually the
945  * internal representation in JIT code, for example.
946  *
947  * Also note that this is an owned value, notably the `ref` field. The
948  * #wasm_val_delete function does not delete the memory holding the #wasm_val_t
949  * itself, but only the memory pointed to by #wasm_val_t.
950  *
951  * \var wasm_val_t::kind
952  * \brief The kind of this value, or which of the fields in the `of` payload
953  * contains the actual value.
954  *
955  * \var wasm_val_t::of
956  * \brief The actual value of this #wasm_val_t. Only one field of this
957  * anonymous union is valid, and which field is valid is defined by the `kind`
958  * field.
959  *
960  * \var wasm_val_t::@0::i32
961  * \brief value for the `WASM_I32` type
962  *
963  * \var wasm_val_t::@0::i64
964  * \brief value for the `WASM_I64` type
965  *
966  * \var wasm_val_t::@0::f32
967  * \brief value for the `WASM_F32` type
968  *
969  * \var wasm_val_t::@0::f64
970  * \brief value for the `WASM_F64` type
971  *
972  * \var wasm_val_t::@0::ref
973  * \brief Unused by Wasmtime.
974  *
975  * \typedef wasm_val_t
976  * \brief Convenience alias for #wasm_val_t
977  *
978  * \struct wasm_val_vec_t
979  * \brief A list of #wasm_val_t values.
980  *
981  * \var wasm_val_vec_t::size
982  * \brief Length of this vector.
983  *
984  * \var wasm_val_vec_t::data
985  * \brief Pointer to the base of this vector
986  *
987  * \typedef wasm_val_vec_t
988  * \brief Convenience alias for #wasm_val_vec_t
989  *
990  * \fn void wasm_val_delete(wasm_val_t *v);
991  * \brief Deletes a type.
992  *
993  * This does not delete the memory pointed to by `v`, so it's safe for `v` to
994  * reside on the stack. Instead this only deletes the memory referenced by `v`,
995  * such as the `ref` variant of #wasm_val_t.
996  *
997  * \fn void wasm_val_vec_new_empty(wasm_val_vec_t *out);
998  * \brief Creates an empty vector.
999  *
1000  * See #wasm_byte_vec_new_empty for more information.
1001  *
1002  * \fn void wasm_val_vec_new_uninitialized(wasm_val_vec_t *out, size_t);
1003  * \brief Creates a vector with the given capacity.
1004  *
1005  * See #wasm_byte_vec_new_uninitialized for more information.
1006  *
1007  * \fn void wasm_val_vec_new(wasm_val_vec_t *out, size_t, wasm_val_t const[]);
1008  * \brief Creates a vector with the provided contents.
1009  *
1010  * See #wasm_byte_vec_new for more information.
1011  *
1012  * \fn void wasm_val_vec_copy(wasm_val_vec_t *out, const wasm_val_vec_t *)
1013  * \brief Copies one vector to another
1014  *
1015  * See #wasm_byte_vec_copy for more information.
1016  *
1017  * \fn void wasm_val_vec_delete(wasm_val_vec_t *out)
1018  * \brief Deallocates export for a vector.
1019  *
1020  * See #wasm_byte_vec_delete for more information.
1021  *
1022  * \fn void wasm_val_copy(wasm_val_t *out, const wasm_val_t *)
1023  * \brief Copies a #wasm_val_t to a new one.
1024  *
1025  * The second argument to this function is copied to the first. The caller is
1026  * responsible for calling #wasm_val_delete on the first argument after this
1027  * function. The `out` parameter is assumed uninitialized by this function and
1028  * the previous contents will not be deallocated.
1029  */
1030 
1031 /**
1032  * \struct wasm_ref_t
1033  * \brief A reference type: either a funcref or an externref.
1034  *
1035  * \typedef wasm_ref_t
1036  * \brief Convenience alias for #wasm_ref_t
1037  *
1038  * \fn void wasm_ref_delete(wasm_ref_t *v);
1039  * \brief Delete a reference.
1040  *
1041  * \fn wasm_ref_t *wasm_ref_copy(const wasm_ref_t *)
1042  * \brief Copy a reference.
1043  *
1044  * \fn bool wasm_ref_same(const wasm_ref_t *, const wasm_ref_t *)
1045  * \brief Are the given references pointing to the same externref?
1046  *
1047  * > Note: Wasmtime does not support checking funcrefs for equality, and this
1048  * > function will always return false for funcrefs.
1049  *
1050  * \fn void* wasm_ref_get_host_info(const wasm_ref_t *);
1051  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1052  *
1053  * \fn void wasm_ref_set_host_info(wasm_ref_t *, void *);
1054  * \brief Unimplemented in Wasmtime, aborts the process if called.
1055  *
1056  * \fn void wasm_ref_set_host_info_with_finalizer(wasm_ref_t *, void *, void(*)(void*));
1057  * \brief Unimplemented in Wasmtime, aborts the process if called.
1058  */
1059 
1060 /**
1061  * \struct wasm_frame_t
1062  * \brief Opaque struct representing a frame of a wasm stack trace.
1063  *
1064  * \typedef wasm_frame_t
1065  * \brief Convenience alias for #wasm_frame_t
1066  *
1067  * \struct wasm_frame_vec_t
1068  * \brief A list of #wasm_frame_t frameues.
1069  *
1070  * \var wasm_frame_vec_t::size
1071  * \brief Length of this vector.
1072  *
1073  * \var wasm_frame_vec_t::data
1074  * \brief Pointer to the base of this vector
1075  *
1076  * \typedef wasm_frame_vec_t
1077  * \brief Convenience alias for #wasm_frame_vec_t
1078  *
1079  * \fn void wasm_frame_delete(wasm_frame_t *v);
1080  * \brief Deletes a frame.
1081  *
1082  * \fn void wasm_frame_vec_new_empty(wasm_frame_vec_t *out);
1083  * \brief Creates an empty vector.
1084  *
1085  * See #wasm_byte_vec_new_empty for more information.
1086  *
1087  * \fn void wasm_frame_vec_new_uninitialized(wasm_frame_vec_t *out, size_t);
1088  * \brief Creates a vector with the given capacity.
1089  *
1090  * See #wasm_byte_vec_new_uninitialized for more information.
1091  *
1092  * \fn void wasm_frame_vec_new(wasm_frame_vec_t *out, size_t, wasm_frame_t *const[]);
1093  * \brief Creates a vector with the provided contents.
1094  *
1095  * See #wasm_byte_vec_new for more information.
1096  *
1097  * \fn void wasm_frame_vec_copy(wasm_frame_vec_t *out, const wasm_frame_vec_t *)
1098  * \brief Copies one vector to another
1099  *
1100  * See #wasm_byte_vec_copy for more information.
1101  *
1102  * \fn void wasm_frame_vec_delete(wasm_frame_vec_t *out)
1103  * \brief Deallocates export for a vector.
1104  *
1105  * See #wasm_byte_vec_delete for more information.
1106  *
1107  * \fn wasm_frame_t *wasm_frame_copy(const wasm_frame_t *)
1108  * \brief Returns a copy of the provided frame.
1109  *
1110  * The caller is expected to call #wasm_frame_delete on the returned frame.
1111  *
1112  * \fn wasm_instance_t *wasm_frame_instance(const wasm_frame_t *);
1113  * \brief Unimplemented in Wasmtime, aborts the process if called.
1114  *
1115  * \fn uint32_t wasm_frame_func_index(const wasm_frame_t *);
1116  * \brief Returns the function index in the original wasm module that this frame
1117  * corresponds to.
1118  *
1119  * \fn uint32_t wasm_frame_func_offset(const wasm_frame_t *);
1120  * \brief Returns the byte offset from the beginning of the function in the
1121  * original wasm file to the instruction this frame points to.
1122  *
1123  * \fn uint32_t wasm_frame_module_offset(const wasm_frame_t *);
1124  * \brief Returns the byte offset from the beginning of the original wasm file
1125  * to the instruction this frame points to.
1126  */
1127 
1128 /**
1129  * \struct wasm_trap_t
1130  * \brief Opaque struct representing a wasm trap.
1131  *
1132  * \typedef wasm_trap_t
1133  * \brief Convenience alias for #wasm_trap_t
1134  *
1135  * \fn void wasm_trap_delete(wasm_trap_t *v);
1136  * \brief Deletes a trap.
1137  *
1138  * \fn wasm_trap_t *wasm_trap_copy(const wasm_trap_t *)
1139  * \brief Copies a #wasm_trap_t to a new one.
1140  *
1141  * The caller is responsible for deleting the returned #wasm_trap_t.
1142  *
1143  * \fn void wasm_trap_same(const wasm_trap_t *, const wasm_trap_t *)
1144  * \brief Unimplemented in Wasmtime, aborts the process if called.
1145  *
1146  * \fn void* wasm_trap_get_host_info(const wasm_trap_t *);
1147  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1148  *
1149  * \fn void wasm_trap_set_host_info(wasm_trap_t *, void *);
1150  * \brief Unimplemented in Wasmtime, aborts the process if called.
1151  *
1152  * \fn void wasm_trap_set_host_info_with_finalizer(wasm_trap_t *, void *, void(*)(void*));
1153  * \brief Unimplemented in Wasmtime, aborts the process if called.
1154  *
1155  * \fn wasm_ref_t *wasm_trap_as_ref(wasm_trap_t *);
1156  * \brief Unimplemented in Wasmtime, aborts the process if called.
1157  *
1158  * \fn wasm_trap_t *wasm_ref_as_trap(wasm_ref_t *);
1159  * \brief Unimplemented in Wasmtime, aborts the process if called.
1160  *
1161  * \fn const wasm_ref_t *wasm_trap_as_ref_const(const wasm_trap_t *);
1162  * \brief Unimplemented in Wasmtime, aborts the process if called.
1163  *
1164  * \fn const wasm_trap_t *wasm_ref_as_trap_const(const wasm_ref_t *);
1165  * \brief Unimplemented in Wasmtime, aborts the process if called.
1166  *
1167  * \fn wasm_trap_t *wasm_trap_new(wasm_store_t *store, const wasm_message_t *);
1168  * \brief Creates a new #wasm_trap_t with the provided message.
1169  *
1170  * This function will create a new trap within the given #wasm_store_t with the
1171  * provided message. This will also capture the backtrace, if any, of wasm
1172  * frames on the stack.
1173  *
1174  * Note that the #wasm_message_t argument is expected to have a 0-byte at the
1175  * end of the message, and the length should include the trailing 0-byte.
1176  *
1177  * This function does not take ownership of either argument.
1178  *
1179  * The caller is responsible for deallocating the trap returned.
1180  *
1181  * \fn void wasm_trap_message(const wasm_trap_t *, wasm_message_t *out);
1182  * \brief Retrieves the message associated with this trap.
1183  *
1184  * The caller takes ownership of the returned `out` value and is responsible for
1185  * calling #wasm_byte_vec_delete on it.
1186  *
1187  * \fn wasm_frame_t* wasm_trap_origin(const wasm_trap_t *);
1188  * \brief Returns the top frame of the wasm stack responsible for this trap.
1189  *
1190  * The caller is responsible for deallocating the returned frame. This function
1191  * may return `NULL`, for example, for traps created when there wasn't anything
1192  * on the wasm stack.
1193  *
1194  * \fn void wasm_trap_trace(const wasm_trap_t *, wasm_frame_vec_t *out);
1195  * \brief Returns the trace of wasm frames for this trap.
1196  *
1197  * The caller is responsible for deallocating the returned list of frames.
1198  * Frames are listed in order of increasing depth, with the most recently called
1199  * function at the front of the list and the base function on the stack at the
1200  * end.
1201  */
1202 
1203 /**
1204  * \struct wasm_foreign_t
1205  * \brief Unimplemented in Wasmtime
1206  *
1207  * \typedef wasm_foreign_t
1208  * \brief Convenience alias for #wasm_foreign_t
1209  *
1210  * \fn void wasm_foreign_delete(wasm_foreign_t *v);
1211  * \brief Unimplemented in Wasmtime, aborts the process if called
1212  *
1213  * \fn wasm_foreign_t *wasm_foreign_copy(const wasm_foreign_t *)
1214  * \brief Unimplemented in Wasmtime, aborts the process if called
1215  *
1216  * \fn void wasm_foreign_same(const wasm_foreign_t *, const wasm_foreign_t *)
1217  * \brief Unimplemented in Wasmtime, aborts the process if called.
1218  *
1219  * \fn void* wasm_foreign_get_host_info(const wasm_foreign_t *);
1220  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1221  *
1222  * \fn void wasm_foreign_set_host_info(wasm_foreign_t *, void *);
1223  * \brief Unimplemented in Wasmtime, aborts the process if called.
1224  *
1225  * \fn void wasm_foreign_set_host_info_with_finalizer(wasm_foreign_t *, void *, void(*)(void*));
1226  * \brief Unimplemented in Wasmtime, aborts the process if called.
1227  *
1228  * \fn wasm_ref_t *wasm_foreign_as_ref(wasm_foreign_t *);
1229  * \brief Unimplemented in Wasmtime, aborts the process if called.
1230  *
1231  * \fn wasm_foreign_t *wasm_ref_as_foreign(wasm_ref_t *);
1232  * \brief Unimplemented in Wasmtime, aborts the process if called.
1233  *
1234  * \fn const wasm_ref_t *wasm_foreign_as_ref_const(const wasm_foreign_t *);
1235  * \brief Unimplemented in Wasmtime, aborts the process if called.
1236  *
1237  * \fn const wasm_foreign_t *wasm_ref_as_foreign_const(const wasm_ref_t *);
1238  * \brief Unimplemented in Wasmtime, aborts the process if called.
1239  *
1240  * \fn wasm_foreign_t *wasm_foreign_new(wasm_store_t *store);
1241  * \brief Unimplemented in Wasmtime, aborts the process if called.
1242  */
1243 
1244 /**
1245  * \struct wasm_module_t
1246  * \brief Opaque struct representing a compiled wasm module.
1247  *
1248  * This structure is safe to send across threads in Wasmtime.
1249  *
1250  * \typedef wasm_module_t
1251  * \brief Convenience alias for #wasm_module_t
1252  *
1253  * \struct wasm_shared_module_t
1254  * \brief Opaque struct representing module that can be sent between threads.
1255  *
1256  * This structure is safe to send across threads in Wasmtime. Note that in
1257  * Wasmtime #wasm_module_t is also safe to share across threads.
1258  *
1259  * \typedef wasm_shared_module_t
1260  * \brief Convenience alias for #wasm_shared_module_t
1261  *
1262  * \fn void wasm_module_delete(wasm_module_t *v);
1263  * \brief Deletes a module.
1264  *
1265  * \fn wasm_module_t *wasm_module_copy(const wasm_module_t *)
1266  * \brief Copies a #wasm_module_t to a new one.
1267  *
1268  * The caller is responsible for deleting the returned #wasm_module_t.
1269  *
1270  * \fn void wasm_module_same(const wasm_module_t *, const wasm_module_t *)
1271  * \brief Unimplemented in Wasmtime, aborts the process if called.
1272  *
1273  * \fn void* wasm_module_get_host_info(const wasm_module_t *);
1274  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1275  *
1276  * \fn void wasm_module_set_host_info(wasm_module_t *, void *);
1277  * \brief Unimplemented in Wasmtime, aborts the process if called.
1278  *
1279  * \fn void wasm_module_set_host_info_with_finalizer(wasm_module_t *, void *, void(*)(void*));
1280  * \brief Unimplemented in Wasmtime, aborts the process if called.
1281  *
1282  * \fn wasm_ref_t *wasm_module_as_ref(wasm_module_t *);
1283  * \brief Unimplemented in Wasmtime, aborts the process if called.
1284  *
1285  * \fn wasm_module_t *wasm_ref_as_module(wasm_ref_t *);
1286  * \brief Unimplemented in Wasmtime, aborts the process if called.
1287  *
1288  * \fn const wasm_ref_t *wasm_module_as_ref_const(const wasm_module_t *);
1289  * \brief Unimplemented in Wasmtime, aborts the process if called.
1290  *
1291  * \fn const wasm_module_t *wasm_ref_as_module_const(const wasm_ref_t *);
1292  * \brief Unimplemented in Wasmtime, aborts the process if called.
1293  *
1294  * \fn wasm_ref_as_module_const(const wasm_ref_t *);
1295  * \brief Unimplemented in Wasmtime, aborts the process if called.
1296  *
1297  * \fn void wasm_shared_module_delete(wasm_shared_module_t *);
1298  * \brief Deletes the provided module.
1299  *
1300  * \fn wasm_shared_module_t *wasm_module_share(const wasm_module_t *);
1301  * \brief Creates a shareable module from the provided module.
1302  *
1303  * > Note that this API is not necessary in Wasmtime because #wasm_module_t can
1304  * > be shared across threads. This is implemented for compatibility, however.
1305  *
1306  * This function does not take ownership of the argument, but the caller is
1307  * expected to deallocate the returned #wasm_shared_module_t.
1308  *
1309  * \fn wasm_module_t *wasm_module_obtain(wasm_store_t *, const wasm_shared_module_t *);
1310  * \brief Attempts to create a #wasm_module_t from the shareable module.
1311  *
1312  * > Note that this API is not necessary in Wasmtime because #wasm_module_t can
1313  * > be shared across threads. This is implemented for compatibility, however.
1314  *
1315  * This function does not take ownership of its arguments, but the caller is
1316  * expected to deallocate the returned #wasm_module_t.
1317  *
1318  * This function may fail if the engines associated with the #wasm_store_t or
1319  * #wasm_shared_module_t are different.
1320  *
1321  * \fn wasm_module_t *wasm_module_new(wasm_store_t *, const wasm_byte_vec_t *binary)
1322  * \brief Compiles a raw WebAssembly binary to a #wasm_module_t.
1323  *
1324  * This function will validate and compile the provided binary. The returned
1325  * #wasm_module_t is ready for instantiation after this call returns.
1326  *
1327  * This function does not take ownership of its arguments, but the caller is
1328  * expected to deallocate the returned #wasm_module_t.
1329  *
1330  * This function may fail if the provided binary is not a WebAssembly binary or
1331  * if it does not pass validation. In these cases this function returns `NULL`.
1332  *
1333  * \fn bool wasm_module_validate(wasm_store_t *, const wasm_byte_vec_t *binary);
1334  * \brief Validates whether a provided byte sequence is a valid wasm binary.
1335  *
1336  * This function will perform any internal validation necessary to determine if
1337  * `binary` is a valid WebAssembly binary according to the configuration of the
1338  * #wasm_store_t provided.
1339  *
1340  * \fn void wasm_module_imports(const wasm_module_t *, wasm_importtype_vec_t *out);
1341  * \brief Returns the list of imports that this module expects.
1342  *
1343  * The list of imports returned are the types of items expected to be passed to
1344  * #wasm_instance_new. You can use #wasm_importtype_type to learn about the
1345  * expected type of each import.
1346  *
1347  * This function does not take ownership of the provided module but ownership of
1348  * `out` is passed to the caller. Note that `out` is treated as uninitialized
1349  * when passed to this function.
1350  *
1351  * \fn void wasm_module_exports(const wasm_module_t *, wasm_exporttype_vec_t *out);
1352  * \brief Returns the list of exports that this module provides.
1353  *
1354  * The list of exports returned are in the same order as the items returned by
1355  * #wasm_instance_exports.
1356  *
1357  * This function does not take ownership of the provided module but ownership
1358  * of `out` is passed to the caller. Note that `out` is treated as
1359  * uninitialized when passed to this function.
1360  *
1361  * \fn void wasm_module_serialize(const wasm_module_t *, wasm_byte_vec_t *out);
1362  * \brief Serializes the provided module to a byte vector.
1363  *
1364  * Does not take ownership of the input module but expects the caller will
1365  * deallocate the `out` vector. The byte vector can later be deserialized
1366  * through #wasm_module_deserialize.
1367  *
1368  * \fn wasm_module_t *wasm_module_deserialize(wasm_store_t *, const wasm_byte_vec_t *);
1369  * \brief Deserializes a previously-serialized module.
1370  *
1371  * The input bytes must have been created from a previous call to
1372  * #wasm_module_serialize.
1373  */
1374 
1375 /**
1376  * \struct wasm_func_t
1377  * \brief Opaque struct representing a compiled wasm function.
1378  *
1379  * \typedef wasm_func_t
1380  * \brief Convenience alias for #wasm_func_t
1381  *
1382  * \typedef wasm_func_callback_t
1383  * \brief Type definition for functions passed to #wasm_func_new.
1384  *
1385  * This is the type signature of a host function created with #wasm_func_new.
1386  * This function takes two parameters, the first of which is the list of
1387  * parameters to the function and the second of which is where to write the
1388  * results. This function can optionally return a #wasm_trap_t and does not have
1389  * to fill in the results in that case.
1390  *
1391  * It is guaranteed that this function will be called with the appropriate
1392  * number and types of arguments according to the function type passed to
1393  * #wasm_func_new. It is required that this function produces the correct number
1394  * and types of results as the original type signature. It is undefined behavior
1395  * to return other types or different numbers of values.
1396  *
1397  * Ownership of the results and the trap returned, if any, is passed to the
1398  * caller of this function.
1399  *
1400  * \typedef wasm_func_callback_with_env_t
1401  * \brief Type definition for functions passed to #wasm_func_new_with_env
1402  *
1403  * The semantics of this function are the same as those of
1404  * #wasm_func_callback_t, except the first argument is the same `void*` argument
1405  * passed to #wasm_func_new_with_env.
1406  *
1407  * \fn void wasm_func_delete(wasm_func_t *v);
1408  * \brief Deletes a func.
1409  *
1410  * \fn wasm_func_t *wasm_func_copy(const wasm_func_t *)
1411  * \brief Copies a #wasm_func_t to a new one.
1412  *
1413  * The caller is responsible for deleting the returned #wasm_func_t.
1414  *
1415  * \fn void wasm_func_same(const wasm_func_t *, const wasm_func_t *)
1416  * \brief Unimplemented in Wasmtime, aborts the process if called.
1417  *
1418  * \fn void* wasm_func_get_host_info(const wasm_func_t *);
1419  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1420  *
1421  * \fn void wasm_func_set_host_info(wasm_func_t *, void *);
1422  * \brief Unimplemented in Wasmtime, aborts the process if called.
1423  *
1424  * \fn void wasm_func_set_host_info_with_finalizer(wasm_func_t *, void *, void(*)(void*));
1425  * \brief Unimplemented in Wasmtime, aborts the process if called.
1426  *
1427  * \fn wasm_ref_t *wasm_func_as_ref(wasm_func_t *);
1428  * \brief Unimplemented in Wasmtime, aborts the process if called.
1429  *
1430  * \fn wasm_func_t *wasm_ref_as_func(wasm_ref_t *);
1431  * \brief Unimplemented in Wasmtime, aborts the process if called.
1432  *
1433  * \fn const wasm_ref_t *wasm_func_as_ref_const(const wasm_func_t *);
1434  * \brief Unimplemented in Wasmtime, aborts the process if called.
1435  *
1436  * \fn const wasm_func_t *wasm_ref_as_func_const(const wasm_ref_t *);
1437  * \brief Unimplemented in Wasmtime, aborts the process if called.
1438  *
1439  * \fn wasm_ref_as_func_const(const wasm_ref_t *);
1440  * \brief Unimplemented in Wasmtime, aborts the process if called.
1441  *
1442  * \fn wasm_func_t *wasm_func_new(wasm_store_t *, const wasm_functype_t *, wasm_func_callback_t);
1443  * \brief Creates a new WebAssembly function with host functionality.
1444  *
1445  * This function creates a new #wasm_func_t from a host-provided function. The
1446  * host provided function must implement the type signature matching the
1447  * #wasm_functype_t provided here.
1448  *
1449  * The returned #wasm_func_t is expected to be deleted by the caller. This
1450  * function does not take ownership of its arguments.
1451  *
1452  * \fn wasm_func_t *wasm_func_new_with_env(
1453  *    wasm_store_t *,
1454  *    const wasm_functype_t *type,
1455  *    wasm_func_callback_with_env_t,
1456  *    void *env,
1457  *    void (*finalizer)(void *));
1458  * \brief Creates a new WebAssembly function with host functionality.
1459  *
1460  * This function is the same as #wasm_func_new except that it the host-provided
1461  * `env` argument is passed to each invocation of the callback provided. This
1462  * provides a means of attaching host information to this #wasm_func_t.
1463  *
1464  * The `finalizer` argument will be invoked to deallocate `env` when the
1465  * #wasm_func_t is deallocated. If this argument is `NULL` then the data
1466  * provided will not be finalized.
1467  *
1468  * This function only takes ownership of the `env` argument (which is later
1469  * deallocated automatically by calling `finalizer`). This function yields
1470  * ownership of the returned #wasm_func_t to the caller.
1471  *
1472  * \fn wasm_functype_t *wasm_func_type(const wasm_func_t *);
1473  * \brief Returns the type of this function.
1474  *
1475  * The returned #wasm_functype_t is expected to be deallocated by the caller.
1476  *
1477  * \fn size_t wasm_func_param_arity(const wasm_func_t *);
1478  * \brief Returns the number of arguments expected by this function.
1479  *
1480  * \fn size_t wasm_func_result_arity(const wasm_func_t *);
1481  * \brief Returns the number of results returned by this function.
1482  *
1483 * \fn wasm_trap_t *wasm_func_call(const wasm_func_t *, const wasm_val_vec_t *args, wasm_val_vec_t *results);
1484  * \brief Calls the provided function with the arguments given.
1485  *
1486  * This function is used to call WebAssembly from the host. The parameter array
1487  * provided must be valid for #wasm_func_param_arity number of arguments, and
1488  * the result array must be valid for #wasm_func_result_arity number of results.
1489  * Providing not enough space is undefined behavior.
1490  *
1491  * If any of the arguments do not have the correct type then a trap is returned.
1492  * Additionally if any of the arguments come from a different store than
1493  * the #wasm_func_t provided a trap is returned.
1494  *
1495  * When no trap happens and no errors are detected then `NULL` is returned. The
1496  * `results` array is guaranteed to be filled in with values appropriate for
1497  * this function's type signature.
1498  *
1499  * If a trap happens during execution or some other error then a non-`NULL` trap
1500  * is returned. In this situation the `results` are is unmodified.
1501  *
1502  * Does not take ownership of `wasm_val_t` arguments. Gives ownership of
1503  * `wasm_val_t` results.
1504  */
1505 
1506 /**
1507  * \struct wasm_global_t
1508  * \brief Opaque struct representing a wasm global.
1509  *
1510  * \typedef wasm_global_t
1511  * \brief Convenience alias for #wasm_global_t
1512  *
1513  * \fn void wasm_global_delete(wasm_global_t *v);
1514  * \brief Deletes a global.
1515  *
1516  * \fn wasm_global_t *wasm_global_copy(const wasm_global_t *)
1517  * \brief Copies a #wasm_global_t to a new one.
1518  *
1519  * The caller is responsible for deleting the returned #wasm_global_t.
1520  *
1521  * \fn void wasm_global_same(const wasm_global_t *, const wasm_global_t *)
1522  * \brief Unimplemented in Wasmtime, aborts the process if called.
1523  *
1524  * \fn void* wasm_global_get_host_info(const wasm_global_t *);
1525  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1526  *
1527  * \fn void wasm_global_set_host_info(wasm_global_t *, void *);
1528  * \brief Unimplemented in Wasmtime, aborts the process if called.
1529  *
1530  * \fn void wasm_global_set_host_info_with_finalizer(wasm_global_t *, void *, void(*)(void*));
1531  * \brief Unimplemented in Wasmtime, aborts the process if called.
1532  *
1533  * \fn wasm_ref_t *wasm_global_as_ref(wasm_global_t *);
1534  * \brief Unimplemented in Wasmtime, aborts the process if called.
1535  *
1536  * \fn wasm_global_t *wasm_ref_as_global(wasm_ref_t *);
1537  * \brief Unimplemented in Wasmtime, aborts the process if called.
1538  *
1539  * \fn const wasm_ref_t *wasm_global_as_ref_const(const wasm_global_t *);
1540  * \brief Unimplemented in Wasmtime, aborts the process if called.
1541  *
1542  * \fn const wasm_global_t *wasm_ref_as_global_const(const wasm_ref_t *);
1543  * \brief Unimplemented in Wasmtime, aborts the process if called.
1544  *
1545  * \fn wasm_ref_as_global_const(const wasm_ref_t *);
1546  * \brief Unimplemented in Wasmtime, aborts the process if called.
1547  *
1548  * \fn wasm_global_t *wasm_global_new(wasm_store_t *, const wasm_globaltype_t *, const wasm_val_t *);
1549  * \brief Creates a new WebAssembly global.
1550  *
1551  * This function is used to create a wasm global from the host, typically to
1552  * provide as the import of a module. The type of the global is specified along
1553  * with the initial value.
1554  *
1555  * This function will return `NULL` on errors. Errors include:
1556  *
1557  * * The type of the global doesn't match the type of the value specified.
1558  * * The initialization value does not come from the provided #wasm_store_t.
1559  *
1560  * This function does not take ownership of any of its arguments. The caller is
1561  * expected to deallocate the returned value.
1562  *
1563  * \fn wasm_globaltype_t *wasm_global_type(const wasm_global_t *);
1564  * \brief Returns the type of this global.
1565  *
1566  * The caller is expected to deallocate the returned #wasm_globaltype_t.
1567  *
1568  * \fn void wasm_global_get(const wasm_global_t *, wasm_val_t *out);
1569  * \brief Gets the value of this global.
1570  *
1571  * The caller is expected to deallocate the returned #wasm_val_t. The provided
1572  * `out` argument is treated as uninitialized on input.
1573  *
1574  * \fn void wasm_global_set(wasm_global_t *, const wasm_val_t *);
1575  * \brief Sets the value of this global.
1576  *
1577  * This function will set the value of a global to a new value. This function
1578  * does nothing if the global is not mutable, if the #wasm_val_t argument has
1579  * the wrong type, or if the provided value comes from a different store as the
1580  * #wasm_global_t.
1581  *
1582  * This function does not take ownership of its arguments.
1583  */
1584 
1585 /**
1586  * \struct wasm_table_t
1587  * \brief Opaque struct representing a wasm table.
1588  *
1589  * \typedef wasm_table_t
1590  * \brief Convenience alias for #wasm_table_t
1591  *
1592  * \typedef wasm_table_size_t
1593  * \brief Typedef for indices and sizes of wasm tables.
1594  *
1595  * \fn void wasm_table_delete(wasm_table_t *v);
1596  * \brief Deletes a table.
1597  *
1598  * \fn wasm_table_t *wasm_table_copy(const wasm_table_t *)
1599  * \brief Copies a #wasm_table_t to a new one.
1600  *
1601  * The caller is responsible for deleting the returned #wasm_table_t.
1602  *
1603  * \fn void wasm_table_same(const wasm_table_t *, const wasm_table_t *)
1604  * \brief Unimplemented in Wasmtime, aborts the process if called.
1605  *
1606  * \fn void* wasm_table_get_host_info(const wasm_table_t *);
1607  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1608  *
1609  * \fn void wasm_table_set_host_info(wasm_table_t *, void *);
1610  * \brief Unimplemented in Wasmtime, aborts the process if called.
1611  *
1612  * \fn void wasm_table_set_host_info_with_finalizer(wasm_table_t *, void *, void(*)(void*));
1613  * \brief Unimplemented in Wasmtime, aborts the process if called.
1614  *
1615  * \fn wasm_ref_t *wasm_table_as_ref(wasm_table_t *);
1616  * \brief Unimplemented in Wasmtime, aborts the process if called.
1617  *
1618  * \fn wasm_table_t *wasm_ref_as_table(wasm_ref_t *);
1619  * \brief Unimplemented in Wasmtime, aborts the process if called.
1620  *
1621  * \fn const wasm_ref_t *wasm_table_as_ref_const(const wasm_table_t *);
1622  * \brief Unimplemented in Wasmtime, aborts the process if called.
1623  *
1624  * \fn const wasm_table_t *wasm_ref_as_table_const(const wasm_ref_t *);
1625  * \brief Unimplemented in Wasmtime, aborts the process if called.
1626  *
1627  * \fn wasm_ref_as_table_const(const wasm_ref_t *);
1628  * \brief Unimplemented in Wasmtime, aborts the process if called.
1629  *
1630  * \fn wasm_table_t *wasm_table_new(wasm_store_t *, const wasm_tabletype_t *, wasm_ref_t *init);
1631  * \brief Creates a new WebAssembly table.
1632  *
1633  * Creates a new host-defined table of values. This table has the type provided
1634  * and is filled with the provided initial value (which can be `NULL`).
1635  *
1636  * Returns an error if the #wasm_ref_t does not match the element type of the
1637  * table provided or if it comes from a different store than the one provided.
1638  *
1639  * Does not take ownship of the `init` value.
1640  *
1641  * \fn wasm_tabletype_t *wasm_table_type(const wasm_table_t *);
1642  * \brief Returns the type of this table.
1643  *
1644  * The caller is expected to deallocate the returned #wasm_tabletype_t.
1645  *
1646  * \fn wasm_ref_t *wasm_table_get(const wasm_table_t *, wasm_table_size_t index);
1647  * \brief Gets an element from this table.
1648  *
1649  * Attempts to get a value at an index in this table. This function returns
1650  * `NULL` if the index is out of bounds.
1651  *
1652  * Gives ownership of the resulting `wasm_ref_t*`.
1653  *
1654  * \fn void wasm_table_set(wasm_table_t *, wasm_table_size_t index, wasm_ref_t *);
1655  * \brief Sets an element in this table.
1656  *
1657  * Attempts to set a value at an index in this table. This function does nothing
1658  * in erroneous situations such as:
1659  *
1660  * * The index is out of bounds.
1661  * * The #wasm_ref_t comes from a different store than the table provided.
1662  * * The #wasm_ref_t does not have an appropriate type to store in this table.
1663  *
1664  * Does not take ownership of the given `wasm_ref_t*`.
1665  *
1666  * \fn wasm_table_size_t wasm_table_size(const wasm_table_t *);
1667  * \brief Gets the current size, in elements, of this table.
1668  *
1669  * \fn bool wasm_table_grow(wasm_table_t *, wasm_table_size_t delta, wasm_ref_t *init);
1670  * \brief Attempts to grow this table by `delta` elements.
1671  *
1672  * This function will grow the table by `delta` elements, initializing all new
1673  * elements to the `init` value provided.
1674  *
1675  * If growth happens successfully, then `true` is returned. Otherwise `false` is
1676  * returned and indicates one possible form of failure:
1677  *
1678  * * The table's limits do not allow growth by `delta`.
1679  * * The #wasm_ref_t comes from a different store than the table provided.
1680  * * The #wasm_ref_t does not have an appropriate type to store in this table.
1681  *
1682  * Does not take ownership of the given `init` value.
1683  */
1684 
1685 /**
1686  * \struct wasm_memory_t
1687  * \brief Opaque struct representing a wasm memory.
1688  *
1689  * \typedef wasm_memory_t
1690  * \brief Convenience alias for #wasm_memory_t
1691  *
1692  * \typedef wasm_memory_pages_t
1693  * \brief Unsigned integer to hold the number of pages a memory has.
1694  *
1695  * \fn void wasm_memory_delete(wasm_memory_t *v);
1696  * \brief Deletes a memory.
1697  *
1698  * \fn wasm_memory_t *wasm_memory_copy(const wasm_memory_t *)
1699  * \brief Copies a #wasm_memory_t to a new one.
1700  *
1701  * The caller is responsible for deleting the returned #wasm_memory_t.
1702  *
1703  * \fn void wasm_memory_same(const wasm_memory_t *, const wasm_memory_t *)
1704  * \brief Unimplemented in Wasmtime, aborts the process if called.
1705  *
1706  * \fn void* wasm_memory_get_host_info(const wasm_memory_t *);
1707  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1708  *
1709  * \fn void wasm_memory_set_host_info(wasm_memory_t *, void *);
1710  * \brief Unimplemented in Wasmtime, aborts the process if called.
1711  *
1712  * \fn void wasm_memory_set_host_info_with_finalizer(wasm_memory_t *, void *, void(*)(void*));
1713  * \brief Unimplemented in Wasmtime, aborts the process if called.
1714  *
1715  * \fn wasm_ref_t *wasm_memory_as_ref(wasm_memory_t *);
1716  * \brief Unimplemented in Wasmtime, aborts the process if called.
1717  *
1718  * \fn wasm_memory_t *wasm_ref_as_memory(wasm_ref_t *);
1719  * \brief Unimplemented in Wasmtime, aborts the process if called.
1720  *
1721  * \fn const wasm_ref_t *wasm_memory_as_ref_const(const wasm_memory_t *);
1722  * \brief Unimplemented in Wasmtime, aborts the process if called.
1723  *
1724  * \fn const wasm_memory_t *wasm_ref_as_memory_const(const wasm_ref_t *);
1725  * \brief Unimplemented in Wasmtime, aborts the process if called.
1726  *
1727  * \fn wasm_ref_as_memory_const(const wasm_ref_t *);
1728  * \brief Unimplemented in Wasmtime, aborts the process if called.
1729  *
1730  * \fn wasm_memory_t *wasm_memory_new(wasm_store_t *, const wasm_memorytype_t *);
1731  * \brief Creates a new WebAssembly memory.
1732  *
1733  * \fn wasm_memorytype_t *wasm_memory_type(const wasm_memory_t *);
1734  * \brief Returns the type of this memory.
1735  *
1736  * The caller is expected to deallocate the returned #wasm_memorytype_t.
1737  *
1738  * \fn byte_t *wasm_memory_data(wasm_memory_t *);
1739  * \brief Returns the base address, in memory, where this memory is located.
1740  *
1741  * Note that the returned address may change over time when growth happens. The
1742  * returned pointer is only valid until the memory is next grown (which could
1743  * happen in wasm itself).
1744  *
1745  * \fn size_t wasm_memory_data_size(const wasm_memory_t *);
1746  * \brief Returns the size, in bytes, of this memory.
1747  *
1748  * \fn wasm_memory_pages_t wasm_memory_size(const wasm_memory_t *);
1749  * \brief Returns the size, in wasm pages, of this memory.
1750  *
1751  * \fn bool wasm_memory_grow(wasm_memory_t *, wasm_memory_pages_t delta);
1752  * \brief Attempts to grow this memory by `delta` wasm pages.
1753  *
1754  * This function is similar to the `memory.grow` instruction in wasm itself. It
1755  * will attempt to grow the memory by `delta` wasm pages. If growth fails then
1756  * `false` is returned, otherwise `true` is returned.
1757  */
1758 
1759 /**
1760  * \struct wasm_extern_t
1761  * \brief Opaque struct representing a wasm external value.
1762  *
1763  * \typedef wasm_extern_t
1764  * \brief Convenience alias for #wasm_extern_t
1765  *
1766  * \struct wasm_extern_vec_t
1767  * \brief A list of #wasm_extern_t values.
1768  *
1769  * \var wasm_extern_vec_t::size
1770  * \brief Length of this vector.
1771  *
1772  * \var wasm_extern_vec_t::data
1773  * \brief Pointer to the base of this vector
1774  *
1775  * \typedef wasm_extern_vec_t
1776  * \brief Convenience alias for #wasm_extern_vec_t
1777  *
1778  * \fn void wasm_extern_delete(wasm_extern_t *v);
1779  * \brief Deletes a extern.
1780  *
1781  * \fn void wasm_extern_vec_new_empty(wasm_extern_vec_t *out);
1782  * \brief Creates an empty vector.
1783  *
1784  * See #wasm_byte_vec_new_empty for more information.
1785  *
1786  * \fn void wasm_extern_vec_new_uninitialized(wasm_extern_vec_t *out, size_t);
1787  * \brief Creates a vector with the given capacity.
1788  *
1789  * See #wasm_byte_vec_new_uninitialized for more information.
1790  *
1791  * \fn void wasm_extern_vec_new(wasm_extern_vec_t *out, size_t, wasm_extern_t *const[]);
1792  * \brief Creates a vector with the provided contents.
1793  *
1794  * See #wasm_byte_vec_new for more information.
1795  *
1796  * \fn void wasm_extern_vec_copy(wasm_extern_vec_t *out, const wasm_extern_vec_t *)
1797  * \brief Copies one vector to another
1798  *
1799  * See #wasm_byte_vec_copy for more information.
1800  *
1801  * \fn void wasm_extern_vec_delete(wasm_extern_vec_t *out)
1802  * \brief Deallocates import for a vector.
1803  *
1804  * See #wasm_byte_vec_delete for more information.
1805  *
1806  * \fn wasm_extern_t *wasm_extern_copy(const wasm_extern_t *)
1807  * \brief Copies a #wasm_extern_t to a new one.
1808  *
1809  * The caller is responsible for deleting the returned #wasm_extern_t.
1810  *
1811  * \fn void wasm_extern_same(const wasm_extern_t *, const wasm_extern_t *)
1812  * \brief Unimplemented in Wasmtime, aborts the process if called.
1813  *
1814  * \fn void* wasm_extern_get_host_info(const wasm_extern_t *);
1815  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1816  *
1817  * \fn void wasm_extern_set_host_info(wasm_extern_t *, void *);
1818  * \brief Unimplemented in Wasmtime, aborts the process if called.
1819  *
1820  * \fn void wasm_extern_set_host_info_with_finalizer(wasm_extern_t *, void *, void(*)(void*));
1821  * \brief Unimplemented in Wasmtime, aborts the process if called.
1822  *
1823  * \fn wasm_ref_t *wasm_extern_as_ref(wasm_extern_t *);
1824  * \brief Unimplemented in Wasmtime, aborts the process if called.
1825  *
1826  * \fn wasm_extern_t *wasm_ref_as_extern(wasm_ref_t *);
1827  * \brief Unimplemented in Wasmtime, aborts the process if called.
1828  *
1829  * \fn const wasm_ref_t *wasm_extern_as_ref_const(const wasm_extern_t *);
1830  * \brief Unimplemented in Wasmtime, aborts the process if called.
1831  *
1832  * \fn const wasm_extern_t *wasm_ref_as_extern_const(const wasm_ref_t *);
1833  * \brief Unimplemented in Wasmtime, aborts the process if called.
1834  *
1835  * \fn wasm_ref_as_extern_const(const wasm_ref_t *);
1836  * \brief Unimplemented in Wasmtime, aborts the process if called.
1837  *
1838  * \fn wasm_externkind_t *wasm_extern_kind(const wasm_extern_t *);
1839  * \brief Returns the kind of this extern, indicating what it will downcast as.
1840  *
1841  * \fn wasm_externtype_t *wasm_extern_type(const wasm_extern_t *);
1842  * \brief Returns the type of this extern.
1843  *
1844  * The caller is expected to deallocate the returned #wasm_externtype_t.
1845  */
1846 
1847 /**
1848  * \fn wasm_extern_t *wasm_func_as_extern(wasm_func_t *f);
1849  * \brief Converts a #wasm_func_t to #wasm_extern_t.
1850  *
1851  * The returned #wasm_extern_t is owned by the #wasm_func_t argument. Callers
1852  * should not delete the returned value, and it only lives as long as the
1853  * #wasm_func_t argument.
1854  *
1855  * \fn wasm_extern_t *wasm_global_as_extern(wasm_global_t *f);
1856  * \brief Converts a #wasm_global_t to #wasm_extern_t.
1857  *
1858  * The returned #wasm_extern_t is owned by the #wasm_global_t argument. Callers
1859  * should not delete the returned value, and it only lives as long as the
1860  * #wasm_global_t argument.
1861  *
1862  * \fn wasm_extern_t *wasm_memory_as_extern(wasm_memory_t *f);
1863  * \brief Converts a #wasm_memory_t to #wasm_extern_t.
1864  *
1865  * The returned #wasm_extern_t is owned by the #wasm_memory_t argument. Callers
1866  * should not delete the returned value, and it only lives as long as the
1867  * #wasm_memory_t argument.
1868  *
1869  * \fn wasm_extern_t *wasm_table_as_extern(wasm_table_t *f);
1870  * \brief Converts a #wasm_table_t to #wasm_extern_t.
1871  *
1872  * The returned #wasm_extern_t is owned by the #wasm_table_t argument. Callers
1873  * should not delete the returned value, and it only lives as long as the
1874  * #wasm_table_t argument.
1875  *
1876  * \fn const wasm_extern_t *wasm_func_as_extern_const(const wasm_func_t *f);
1877  * \brief Converts a #wasm_func_t to #wasm_extern_t.
1878  *
1879  * The returned #wasm_extern_t is owned by the #wasm_func_t argument. Callers
1880  * should not delete the returned value, and it only lives as long as the
1881  * #wasm_func_t argument.
1882  *
1883  * \fn const wasm_extern_t *wasm_global_as_extern_const(const wasm_global_t *f);
1884  * \brief Converts a #wasm_global_t to #wasm_extern_t.
1885  *
1886  * The returned #wasm_extern_t is owned by the #wasm_global_t argument. Callers
1887  * should not delete the returned value, and it only lives as long as the
1888  * #wasm_global_t argument.
1889  *
1890  * \fn const wasm_extern_t *wasm_memory_as_extern_const(const wasm_memory_t *f);
1891  * \brief Converts a #wasm_memory_t to #wasm_extern_t.
1892  *
1893  * The returned #wasm_extern_t is owned by the #wasm_memory_t argument. Callers
1894  * should not delete the returned value, and it only lives as long as the
1895  * #wasm_memory_t argument.
1896  *
1897  * \fn const wasm_extern_t *wasm_table_as_extern_const(const wasm_table_t *f);
1898  * \brief Converts a #wasm_table_t to #wasm_extern_t.
1899  *
1900  * The returned #wasm_extern_t is owned by the #wasm_table_t argument. Callers
1901  * should not delete the returned value, and it only lives as long as the
1902  * #wasm_table_t argument.
1903  *
1904  * \fn wasm_func_t *wasm_extern_as_func(wasm_extern_t *);
1905  * \brief Converts a #wasm_extern_t to #wasm_func_t.
1906  *
1907  * The returned #wasm_func_t is owned by the #wasm_extern_t argument. Callers
1908  * should not delete the returned value, and it only lives as long as the
1909  * #wasm_extern_t argument.
1910  *
1911  * If the #wasm_extern_t argument isn't a #wasm_func_t then `NULL` is returned.
1912  *
1913  * \fn wasm_table_t *wasm_extern_as_table(wasm_extern_t *);
1914  * \brief Converts a #wasm_extern_t to #wasm_table_t.
1915  *
1916  * The returned #wasm_table_t is owned by the #wasm_extern_t argument. Callers
1917  * should not delete the returned value, and it only lives as long as the
1918  * #wasm_extern_t argument.
1919  *
1920  * If the #wasm_extern_t argument isn't a #wasm_table_t then `NULL` is returned.
1921  *
1922  * \fn wasm_memory_t *wasm_extern_as_memory(wasm_extern_t *);
1923  * \brief Converts a #wasm_extern_t to #wasm_memory_t.
1924  *
1925  * The returned #wasm_memory_t is owned by the #wasm_extern_t argument. Callers
1926  * should not delete the returned value, and it only lives as long as the
1927  * #wasm_extern_t argument.
1928  *
1929  * If the #wasm_extern_t argument isn't a #wasm_memory_t then `NULL` is returned.
1930  *
1931  * \fn wasm_global_t *wasm_extern_as_global(wasm_extern_t *);
1932  * \brief Converts a #wasm_extern_t to #wasm_global_t.
1933  *
1934  * The returned #wasm_global_t is owned by the #wasm_extern_t argument. Callers
1935  * should not delete the returned value, and it only lives as long as the
1936  * #wasm_extern_t argument.
1937  *
1938  * If the #wasm_extern_t argument isn't a #wasm_global_t then `NULL` is returned.
1939  *
1940  * \fn const wasm_func_t *wasm_extern_as_func_const(const wasm_extern_t *);
1941  * \brief Converts a #wasm_extern_t to #wasm_func_t.
1942  *
1943  * The returned #wasm_func_t is owned by the #wasm_extern_t argument. Callers
1944  * should not delete the returned value, and it only lives as long as the
1945  * #wasm_extern_t argument.
1946  *
1947  * If the #wasm_extern_t argument isn't a #wasm_func_t then `NULL` is returned.
1948  *
1949  * \fn const wasm_table_t *wasm_extern_as_table_const(const wasm_extern_t *);
1950  * \brief Converts a #wasm_extern_t to #wasm_table_t.
1951  *
1952  * The returned #wasm_table_t is owned by the #wasm_extern_t argument. Callers
1953  * should not delete the returned value, and it only lives as long as the
1954  * #wasm_extern_t argument.
1955  *
1956  * If the #wasm_extern_t argument isn't a #wasm_table_t then `NULL` is returned.
1957  *
1958  * \fn const wasm_memory_t *wasm_extern_as_memory_const(const wasm_extern_t *);
1959  * \brief Converts a #wasm_extern_t to #wasm_memory_t.
1960  *
1961  * The returned #wasm_memory_t is owned by the #wasm_extern_t argument. Callers
1962  * should not delete the returned value, and it only lives as long as the
1963  * #wasm_extern_t argument.
1964  *
1965  * If the #wasm_extern_t argument isn't a #wasm_memory_t then `NULL` is returned.
1966  *
1967  * \fn const wasm_global_t *wasm_extern_as_global_const(const wasm_extern_t *);
1968  * \brief Converts a #wasm_extern_t to #wasm_global_t.
1969  *
1970  * The returned #wasm_global_t is owned by the #wasm_extern_t argument. Callers
1971  * should not delete the returned value, and it only lives as long as the
1972  * #wasm_extern_t argument.
1973  *
1974  * If the #wasm_extern_t argument isn't a #wasm_global_t then `NULL` is returned.
1975  */
1976 
1977 /**
1978  * \struct wasm_instance_t
1979  * \brief Opaque struct representing a wasm instance.
1980  *
1981  * \typedef wasm_instance_t
1982  * \brief Convenience alias for #wasm_instance_t
1983  *
1984  * \fn void wasm_instance_delete(wasm_instance_t *v);
1985  * \brief Deletes a instance.
1986  *
1987  * \fn wasm_instance_t *wasm_instance_copy(const wasm_instance_t *)
1988  * \brief Copies a #wasm_instance_t to a new one.
1989  *
1990  * The caller is responsible for deleting the returned #wasm_instance_t.
1991  *
1992  * \fn void wasm_instance_same(const wasm_instance_t *, const wasm_instance_t *)
1993  * \brief Unimplemented in Wasmtime, aborts the process if called.
1994  *
1995  * \fn void* wasm_instance_get_host_info(const wasm_instance_t *);
1996  * \brief Unimplemented in Wasmtime, always returns `NULL`.
1997  *
1998  * \fn void wasm_instance_set_host_info(wasm_instance_t *, void *);
1999  * \brief Unimplemented in Wasmtime, aborts the process if called.
2000  *
2001  * \fn void wasm_instance_set_host_info_with_finalizer(wasm_instance_t *, void *, void(*)(void*));
2002  * \brief Unimplemented in Wasmtime, aborts the process if called.
2003  *
2004  * \fn wasm_ref_t *wasm_instance_as_ref(wasm_instance_t *);
2005  * \brief Unimplemented in Wasmtime, aborts the process if called.
2006  *
2007  * \fn wasm_instance_t *wasm_ref_as_instance(wasm_ref_t *);
2008  * \brief Unimplemented in Wasmtime, aborts the process if called.
2009  *
2010  * \fn const wasm_ref_t *wasm_instance_as_ref_const(const wasm_instance_t *);
2011  * \brief Unimplemented in Wasmtime, aborts the process if called.
2012  *
2013  * \fn const wasm_instance_t *wasm_ref_as_instance_const(const wasm_ref_t *);
2014  * \brief Unimplemented in Wasmtime, aborts the process if called.
2015  *
2016  * \fn wasm_ref_as_instance_const(const wasm_ref_t *);
2017  * \brief Unimplemented in Wasmtime, aborts the process if called.
2018  *
2019  * \fn wasm_instance_t *wasm_instance_new(wasm_store_t *, const wasm_module_t *, const wasm_extern_vec_t *, wasm_trap_t **);
2020  * \brief Instantiates a module with the provided imports.
2021  *
2022  * This function will instantiate the provided #wasm_module_t into the provided
2023  * #wasm_store_t. The `imports` specified are used to satisfy the imports of the
2024  * #wasm_module_t.
2025  *
2026  * This function must provide exactly the same number of imports as returned by
2027  * #wasm_module_imports or this results in undefined behavior.
2028  *
2029  * Imports provided are expected to be 1:1 matches against the list returned by
2030  * #wasm_module_imports.
2031  *
2032  * Instantiation includes invoking the `start` function of a wasm module. If
2033  * that function traps then a trap is returned through the #wasm_trap_t type.
2034  *
2035  * This function does not take ownership of any of its arguments, and the
2036  * returned #wasm_instance_t and #wasm_trap_t are owned by the caller.
2037  *
2038  * \fn void wasm_instance_exports(const wasm_instance_t *, wasm_extern_vec_t *out);
2039  * \brief Returns the exports of an instance.
2040  *
2041  * This function returns a list of #wasm_extern_t values, which will be owned by
2042  * the caller, which are exported from the instance. The `out` list will have
2043  * the same length as #wasm_module_exports called on the original module. Each
2044  * element is 1:1 matched with the elements in the list of #wasm_module_exports.
2045  */
2046 
2047 /**
2048  * \def WASM_EMPTY_VEC
2049  * \brief Used to initialize an empty vector type.
2050  *
2051  * \def WASM_ARRAY_VEC
2052  * \brief Used to initialize a vector type from a C array.
2053  *
2054  * \def WASM_I32_VAL
2055  * \brief Used to initialize a 32-bit integer wasm_val_t value.
2056  *
2057  * \def WASM_I64_VAL
2058  * \brief Used to initialize a 64-bit integer wasm_val_t value.
2059  *
2060  * \def WASM_F32_VAL
2061  * \brief Used to initialize a 32-bit floating point wasm_val_t value.
2062  *
2063  * \def WASM_F64_VAL
2064  * \brief Used to initialize a 64-bit floating point wasm_val_t value.
2065  *
2066  * \def WASM_REF_VAL
2067  * \brief Used to initialize an externref wasm_val_t value.
2068  *
2069  * \def WASM_INIT_VAL
2070  * \brief Used to initialize a null externref wasm_val_t value.
2071  */
2072