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