Wasmtime
val.h
Go to the documentation of this file.
1
7#ifndef WASMTIME_VAL_H
8#define WASMTIME_VAL_H
9
10#include <stdalign.h>
11#include <wasm.h>
12#include <wasmtime/extern.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#ifdef WASMTIME_FEATURE_GC
20typedef struct wasmtime_eqref wasmtime_eqref_t;
21
47typedef struct wasmtime_anyref {
50 uint64_t store_id;
52 uint32_t __private1;
54 uint32_t __private2;
56 void *__private3;
57} wasmtime_anyref_t;
58
61static inline void wasmtime_anyref_set_null(wasmtime_anyref_t *ref) {
62 ref->store_id = 0;
63}
64
70static inline bool wasmtime_anyref_is_null(const wasmtime_anyref_t *ref) {
71 return ref->store_id == 0;
72}
73
81WASM_API_EXTERN void wasmtime_anyref_clone(const wasmtime_anyref_t *anyref,
82 wasmtime_anyref_t *out);
83
97WASM_API_EXTERN void wasmtime_anyref_unroot(wasmtime_anyref_t *ref);
98
106WASM_API_EXTERN void wasmtime_anyref_from_raw(wasmtime_context_t *context,
107 uint32_t raw,
108 wasmtime_anyref_t *out);
109
120WASM_API_EXTERN uint32_t wasmtime_anyref_to_raw(wasmtime_context_t *context,
121 const wasmtime_anyref_t *ref);
122
131WASM_API_EXTERN void wasmtime_anyref_from_i31(wasmtime_context_t *context,
132 uint32_t i31val,
133 wasmtime_anyref_t *out);
134
141WASM_API_EXTERN bool wasmtime_anyref_is_i31(wasmtime_context_t *context,
142 const wasmtime_anyref_t *anyref);
143
153WASM_API_EXTERN bool wasmtime_anyref_i31_get_u(wasmtime_context_t *context,
154 const wasmtime_anyref_t *anyref,
155 uint32_t *dst);
156
166WASM_API_EXTERN bool wasmtime_anyref_i31_get_s(wasmtime_context_t *context,
167 const wasmtime_anyref_t *anyref,
168 int32_t *dst);
169
192typedef struct wasmtime_externref {
195 uint64_t store_id;
197 uint32_t __private1;
199 uint32_t __private2;
201 void *__private3;
202} wasmtime_externref_t;
203
206static inline void wasmtime_externref_set_null(wasmtime_externref_t *ref) {
207 ref->store_id = 0;
208}
209
215static inline bool wasmtime_externref_is_null(const wasmtime_externref_t *ref) {
216 return ref->store_id == 0;
217}
218
242WASM_API_EXTERN bool wasmtime_externref_new(wasmtime_context_t *context,
243 void *data,
244 void (*finalizer)(void *),
245 wasmtime_externref_t *out);
246
253WASM_API_EXTERN void *wasmtime_externref_data(wasmtime_context_t *context,
254 const wasmtime_externref_t *data);
255
265WASM_API_EXTERN void wasmtime_externref_clone(const wasmtime_externref_t *ref,
266 wasmtime_externref_t *out);
267
279WASM_API_EXTERN void wasmtime_externref_unroot(wasmtime_externref_t *ref);
280
288WASM_API_EXTERN void wasmtime_externref_from_raw(wasmtime_context_t *context,
289 uint32_t raw,
290 wasmtime_externref_t *out);
291
302WASM_API_EXTERN uint32_t wasmtime_externref_to_raw(
303 wasmtime_context_t *context, const wasmtime_externref_t *ref);
304
319typedef struct wasmtime_exnref {
322 uint64_t store_id;
324 uint32_t __private1;
326 uint32_t __private2;
328 void *__private3;
329} wasmtime_exnref_t;
330
333static inline void wasmtime_exnref_set_null(wasmtime_exnref_t *ref) {
334 ref->store_id = 0;
335}
336
339static inline bool wasmtime_exnref_is_null(const wasmtime_exnref_t *ref) {
340 return ref->store_id == 0;
341}
342
349WASM_API_EXTERN void wasmtime_exnref_clone(const wasmtime_exnref_t *ref,
350 wasmtime_exnref_t *out);
351
357WASM_API_EXTERN void wasmtime_exnref_unroot(wasmtime_exnref_t *ref);
358#endif // WASMTIME_FEATURE_GC
359
361typedef uint8_t wasmtime_valkind_t;
363#define WASMTIME_I32 0
365#define WASMTIME_I64 1
367#define WASMTIME_F32 2
369#define WASMTIME_F64 3
371#define WASMTIME_V128 4
374#define WASMTIME_FUNCREF 5
377#define WASMTIME_EXTERNREF 6
380#define WASMTIME_ANYREF 7
383#define WASMTIME_EXNREF 8
384
387typedef uint8_t wasmtime_v128[16];
388
399typedef union wasmtime_valunion {
401 int32_t i32;
403 int64_t i64;
408#ifdef WASMTIME_FEATURE_GC
410 wasmtime_anyref_t anyref;
412 wasmtime_externref_t externref;
414 wasmtime_exnref_t exnref;
419 wasmtime_func_t funcref;
420#endif // WASMTIME_FEATURE_GC
422 wasmtime_v128 v128;
424
430static inline void wasmtime_funcref_set_null(wasmtime_func_t *func) {
431 func->store_id = 0;
432}
433
439static inline bool wasmtime_funcref_is_null(const wasmtime_func_t *func) {
440 return func->store_id == 0;
441}
442
456typedef union wasmtime_val_raw {
460 int32_t i32;
464 int64_t i64;
484 uint32_t anyref;
492 uint32_t externref;
499 void *funcref;
501
502// Assert that the shape of this type is as expected since it needs to match
503// Rust.
504static inline void __wasmtime_val_assertions() {
505 static_assert(sizeof(wasmtime_valunion_t) >= 16 &&
506 sizeof(wasmtime_valunion_t) <= 24,
507 "should be 16 bytes plus a pointer large (plus alignment on "
508 "some platforms)");
509 static_assert(__alignof(wasmtime_valunion_t) == 8,
510 "should be 8-byte aligned");
511 static_assert(sizeof(wasmtime_val_raw_t) == 16, "should be 16 bytes large");
512 static_assert(__alignof(wasmtime_val_raw_t) == 8, "should be 8-byte aligned");
513}
514
532typedef struct wasmtime_val {
538
551WASM_API_EXTERN void wasmtime_val_unroot(wasmtime_val_t *val);
552
560WASM_API_EXTERN void wasmtime_val_clone(const wasmtime_val_t *src,
561 wasmtime_val_t *dst);
562
563#ifdef __cplusplus
564} // extern "C"
565#endif
566
567#endif // WASMTIME_VAL_H
Definition of wasmtime_extern_t and external items.
An interior pointer into a wasmtime_store_t which is used as "context" for many functions.
Representation of a function in Wasmtime.
Definition: extern.h:26
uint64_t store_id
Definition: extern.h:32
Container for different kinds of wasm values.
Definition: val.h:532
wasmtime_valkind_t kind
Discriminant of which field of of is valid.
Definition: val.h:534
wasmtime_valunion_t of
Container for the extern item's value.
Definition: val.h:536
Container for possible wasm values.
Definition: val.h:456
uint32_t anyref
Definition: val.h:484
uint32_t externref
Definition: val.h:492
float32_t f32
Definition: val.h:468
float64_t f64
Definition: val.h:472
int32_t i32
Definition: val.h:460
wasmtime_v128 v128
Definition: val.h:476
int64_t i64
Definition: val.h:464
void * funcref
Definition: val.h:499
Container for different kinds of wasm values.
Definition: val.h:399
int32_t i32
Field used if wasmtime_val_t::kind is WASMTIME_I32.
Definition: val.h:401
float32_t f32
Field used if wasmtime_val_t::kind is WASMTIME_F32.
Definition: val.h:405
int64_t i64
Field used if wasmtime_val_t::kind is WASMTIME_I64.
Definition: val.h:403
float64_t f64
Field used if wasmtime_val_t::kind is WASMTIME_F64.
Definition: val.h:407
uint8_t wasmtime_valkind_t
Discriminant stored in wasmtime_val::kind.
Definition: val.h:361
union wasmtime_valunion wasmtime_valunion_t
Convenience alias for wasmtime_valunion.
union wasmtime_val_raw wasmtime_val_raw_t
Convenience alias for wasmtime_val_raw.
uint8_t wasmtime_v128[16]
A 128-bit value representing the WebAssembly v128 type. Bytes are stored in little-endian order.
Definition: val.h:387
WASM_API_EXTERN void wasmtime_val_unroot(wasmtime_val_t *val)
Unroot the value contained by val.
WASM_API_EXTERN void wasmtime_val_clone(const wasmtime_val_t *src, wasmtime_val_t *dst)
Clones the value pointed to by src into the dst provided.
struct wasmtime_val wasmtime_val_t
Convenience alias for wasmtime_val_t.
float float32_t
A type definition for a 32-bit float.
Definition: wasm.h:44
double float64_t
A type definition for a 64-bit float.
Definition: wasm.h:45