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