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(¶ms); 569 wasm_valtype_vec_new_empty(&results); 570 return wasm_functype_new(¶ms, &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(¶ms, 1, ps); 579 wasm_valtype_vec_new_empty(&results); 580 return wasm_functype_new(¶ms, &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(¶ms, 2, ps); 589 wasm_valtype_vec_new_empty(&results); 590 return wasm_functype_new(¶ms, &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(¶ms, 3, ps); 599 wasm_valtype_vec_new_empty(&results); 600 return wasm_functype_new(¶ms, &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(¶ms); 609 wasm_valtype_vec_new(&results, 1, rs); 610 return wasm_functype_new(¶ms, &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(¶ms, 1, ps); 620 wasm_valtype_vec_new(&results, 1, rs); 621 return wasm_functype_new(¶ms, &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(¶ms, 2, ps); 631 wasm_valtype_vec_new(&results, 1, rs); 632 return wasm_functype_new(¶ms, &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(¶ms, 3, ps); 643 wasm_valtype_vec_new(&results, 1, rs); 644 return wasm_functype_new(¶ms, &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(¶ms); 653 wasm_valtype_vec_new(&results, 2, rs); 654 return wasm_functype_new(¶ms, &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(¶ms, 1, ps); 664 wasm_valtype_vec_new(&results, 2, rs); 665 return wasm_functype_new(¶ms, &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(¶ms, 2, ps); 676 wasm_valtype_vec_new(&results, 2, rs); 677 return wasm_functype_new(¶ms, &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(¶ms, 3, ps); 688 wasm_valtype_vec_new(&results, 2, rs); 689 return wasm_functype_new(¶ms, &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