Coverage Report

Created: 2026-09-28 06:22

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