gc_export.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. /**
  6. * @file gc_export.h
  7. *
  8. * @brief This file defines the exported GC APIs
  9. */
  10. #ifndef _GC_EXPORT_H
  11. #define _GC_EXPORT_H
  12. #include "wasm_export.h"
  13. #ifdef __cplusplus
  14. extern "C" {
  15. #endif
  16. typedef uint8_t wasm_value_type_t;
  17. typedef enum wasm_value_type_enum {
  18. VALUE_TYPE_I32 = 0x7F,
  19. VALUE_TYPE_I64 = 0x7E,
  20. VALUE_TYPE_F32 = 0x7D,
  21. VALUE_TYPE_F64 = 0x7C,
  22. VALUE_TYPE_V128 = 0x7B,
  23. /* GC Types */
  24. VALUE_TYPE_I8 = 0x78,
  25. VALUE_TYPE_I16 = 0x77,
  26. VALUE_TYPE_NULLFUNCREF = 0x73,
  27. VALUE_TYPE_NULLEXTERNREF = 0x72,
  28. VALUE_TYPE_NULLREF = 0x71,
  29. VALUE_TYPE_FUNCREF = 0x70,
  30. VALUE_TYPE_EXTERNREF = 0x6F,
  31. VALUE_TYPE_ANYREF = 0x6E,
  32. VALUE_TYPE_EQREF = 0x6D,
  33. VALUE_TYPE_I31REF = 0x6C,
  34. VALUE_TYPE_STRUCTREF = 0x6B,
  35. VALUE_TYPE_ARRAYREF = 0x6A,
  36. VALUE_TYPE_HT_NON_NULLABLE_REF = 0x64,
  37. VALUE_TYPE_HT_NULLABLE_REF = 0x63,
  38. /* Stringref Types */
  39. VALUE_TYPE_STRINGREF = 0X67,
  40. VALUE_TYPE_STRINGVIEWWTF8 = 0x66,
  41. VALUE_TYPE_STRINGVIEWWTF16 = 0x62,
  42. VALUE_TYPE_STRINGVIEWITER = 0x61
  43. } wasm_value_type_enum;
  44. typedef int32_t wasm_heap_type_t;
  45. typedef enum wasm_heap_type_enum {
  46. HEAP_TYPE_NOFUNC = -0x0D,
  47. HEAP_TYPE_NOEXTERN = -0x0E,
  48. HEAP_TYPE_NONE = -0x0F,
  49. HEAP_TYPE_FUNC = -0x10,
  50. HEAP_TYPE_EXTERN = -0x11,
  51. HEAP_TYPE_ANY = -0x12,
  52. HEAP_TYPE_EQ = -0x13,
  53. HEAP_TYPE_I31 = -0x14,
  54. HEAP_TYPE_STRUCT = -0x15,
  55. HEAP_TYPE_ARRAY = -0x16,
  56. /* Stringref Types */
  57. HEAP_TYPE_STRINGREF = -0x19,
  58. HEAP_TYPE_STRINGVIEWWTF8 = -0x1A,
  59. HEAP_TYPE_STRINGVIEWWTF16 = -0x1E,
  60. HEAP_TYPE_STRINGVIEWITER = -0x1F
  61. } wasm_heap_type_enum;
  62. struct WASMObject;
  63. typedef struct WASMObject *wasm_obj_t;
  64. #ifndef WASM_VALUE_DEFINED
  65. #define WASM_VALUE_DEFINED
  66. typedef union V128 {
  67. int8_t i8x16[16];
  68. int16_t i16x8[8];
  69. int32_t i32x4[4];
  70. int64_t i64x2[2];
  71. float f32x4[4];
  72. double f64x2[2];
  73. } V128;
  74. typedef union WASMValue {
  75. int32_t i32;
  76. uint32_t u32;
  77. uint32_t global_index;
  78. uint32_t ref_index;
  79. int64_t i64;
  80. uint64_t u64;
  81. float f32;
  82. double f64;
  83. V128 v128;
  84. wasm_obj_t gc_obj;
  85. uint32_t type_index;
  86. struct {
  87. uint32_t type_index;
  88. uint32_t length;
  89. } array_new_default;
  90. /* pointer to a memory space holding more data, current usage:
  91. * struct.new init value: WASMStructNewInitValues *
  92. * array.new init value: WASMArrayNewInitValues *
  93. */
  94. void *data;
  95. } WASMValue;
  96. #endif /* end of WASM_VALUE_DEFINED */
  97. typedef union WASMValue wasm_value_t;
  98. /* Reference type, the layout is same as WasmRefType in wasm.h
  99. * use wasm_ref_type_set_type_idx to initialize as concrete ref type
  100. * use wasm_ref_type_set_heap_type to initialize as abstract ref type
  101. */
  102. typedef struct wasm_ref_type_t {
  103. wasm_value_type_t value_type;
  104. bool nullable;
  105. int32_t heap_type;
  106. } wasm_ref_type_t;
  107. /**
  108. * Local object reference that can be traced when GC occurs. All
  109. * native functions that need to hold WASM objects which may not be
  110. * referenced from other elements of GC root set may be hold with
  111. * this type of variable so that they can be traced when GC occurs.
  112. * Before using such a variable, it must be pushed onto the stack
  113. * (implemented as a chain) of such variables, and before leaving the
  114. * frame of the variables, they must be popped from the stack.
  115. */
  116. typedef struct WASMLocalObjectRef {
  117. /* Previous local object reference variable on the stack */
  118. struct WASMLocalObjectRef *prev;
  119. /* The reference of WASM object hold by this variable */
  120. wasm_obj_t val;
  121. } WASMLocalObjectRef, wasm_local_obj_ref_t;
  122. struct WASMType;
  123. struct WASMFuncType;
  124. struct WASMStructType;
  125. struct WASMArrayType;
  126. typedef struct WASMType *wasm_defined_type_t;
  127. typedef struct WASMFuncType *wasm_func_type_t;
  128. typedef struct WASMStructType *wasm_struct_type_t;
  129. typedef struct WASMArrayType *wasm_array_type_t;
  130. struct WASMExternrefObject;
  131. struct WASMAnyrefObject;
  132. struct WASMStructObject;
  133. struct WASMArrayObject;
  134. struct WASMFuncObject;
  135. typedef struct WASMExternrefObject *wasm_externref_obj_t;
  136. typedef struct WASMAnyrefObject *wasm_anyref_obj_t;
  137. typedef struct WASMStructObject *wasm_struct_obj_t;
  138. typedef struct WASMArrayObject *wasm_array_obj_t;
  139. typedef struct WASMFuncObject *wasm_func_obj_t;
  140. typedef struct WASMStringrefObject *wasm_stringref_obj_t;
  141. typedef uintptr_t wasm_i31_obj_t;
  142. typedef void (*wasm_obj_finalizer_t)(const wasm_obj_t obj, void *data);
  143. /* Defined type related operations */
  144. /**
  145. * Get number of defined types in the given wasm module
  146. *
  147. * @param module the wasm module
  148. *
  149. * @return defined type count
  150. */
  151. WASM_RUNTIME_API_EXTERN uint32_t
  152. wasm_get_defined_type_count(const wasm_module_t module);
  153. /**
  154. * Get defined type by type index
  155. *
  156. * @param module the wasm module
  157. * @param index the type index
  158. *
  159. * @return defined type
  160. */
  161. WASM_RUNTIME_API_EXTERN wasm_defined_type_t
  162. wasm_get_defined_type(const wasm_module_t module, uint32_t index);
  163. /**
  164. * Get defined type of the GC managed object, the object must be struct,
  165. * array or func.
  166. *
  167. * @param obj the object
  168. *
  169. * @return defined type of the object.
  170. */
  171. WASM_RUNTIME_API_EXTERN wasm_defined_type_t
  172. wasm_obj_get_defined_type(const wasm_obj_t obj);
  173. /**
  174. * Get defined type index of the GC managed object, the object must be struct,
  175. * array or func.
  176. *
  177. * @param obj the object
  178. *
  179. * @return defined type index of the object.
  180. */
  181. WASM_RUNTIME_API_EXTERN int32_t
  182. wasm_obj_get_defined_type_idx(const wasm_module_t module, const wasm_obj_t obj);
  183. /**
  184. * Check whether a defined type is a function type
  185. *
  186. * @param def_type the defined type to be checked
  187. *
  188. * @return true if the defined type is function type, false otherwise
  189. */
  190. WASM_RUNTIME_API_EXTERN bool
  191. wasm_defined_type_is_func_type(const wasm_defined_type_t def_type);
  192. /**
  193. * Check whether a defined type is a struct type
  194. *
  195. * @param def_type the defined type to be checked
  196. *
  197. * @return true if the defined type is struct type, false otherwise
  198. */
  199. WASM_RUNTIME_API_EXTERN bool
  200. wasm_defined_type_is_struct_type(const wasm_defined_type_t def_type);
  201. /**
  202. * Check whether a defined type is an array type
  203. *
  204. * @param def_type the defined type to be checked
  205. *
  206. * @return true if the defined type is array type, false otherwise
  207. */
  208. WASM_RUNTIME_API_EXTERN bool
  209. wasm_defined_type_is_array_type(const wasm_defined_type_t def_type);
  210. /**
  211. * Get type of a specified parameter of a function type
  212. *
  213. * @param func_type the specified function type
  214. * @param param_idx the specified param index
  215. *
  216. * @return the param type at the specified param index of the specified func
  217. * type
  218. */
  219. WASM_RUNTIME_API_EXTERN wasm_ref_type_t
  220. wasm_func_type_get_param_type(const wasm_func_type_t func_type,
  221. uint32_t param_idx);
  222. /**
  223. * Get type of a specified result of a function type
  224. *
  225. * @param func_type the specified function type
  226. * @param param_idx the specified result index
  227. *
  228. * @return the result type at the specified result index of the specified func
  229. * type
  230. */
  231. WASM_RUNTIME_API_EXTERN wasm_ref_type_t
  232. wasm_func_type_get_result_type(const wasm_func_type_t func_type,
  233. uint32_t result_idx);
  234. /**
  235. * Get field count of a struct type
  236. *
  237. * @param struct_type the specified struct type
  238. *
  239. * @return the field count of the specified struct type
  240. */
  241. WASM_RUNTIME_API_EXTERN uint32_t
  242. wasm_struct_type_get_field_count(const wasm_struct_type_t struct_type);
  243. /**
  244. * Get type of a specified field of a struct type
  245. *
  246. * @param struct_type the specified struct type
  247. * @param field_idx index of the specified field
  248. * @param p_is_mutable if not NULL, output the mutability of the field
  249. *
  250. * @return the result type at the specified field index of the specified struct
  251. */
  252. WASM_RUNTIME_API_EXTERN wasm_ref_type_t
  253. wasm_struct_type_get_field_type(const wasm_struct_type_t struct_type,
  254. uint32_t field_idx, bool *p_is_mutable);
  255. /**
  256. * Get element type of an array type
  257. *
  258. * @param array_type the specified array type
  259. * @param p_is_mutable if not NULL, output the mutability of the element type
  260. *
  261. * @return the ref type of array's elem type
  262. */
  263. WASM_RUNTIME_API_EXTERN wasm_ref_type_t
  264. wasm_array_type_get_elem_type(const wasm_array_type_t array_type,
  265. bool *p_is_mutable);
  266. /**
  267. * Check whether two defined types are equal
  268. *
  269. * @param def_type1 the specified defined type1
  270. * @param def_type2 the specified defined type2
  271. * @param module current wasm module
  272. *
  273. * @return true if the defined type1 is equal to the defined type2,
  274. * false otherwise
  275. */
  276. WASM_RUNTIME_API_EXTERN bool
  277. wasm_defined_type_equal(const wasm_defined_type_t def_type1,
  278. const wasm_defined_type_t def_type2,
  279. const wasm_module_t module);
  280. /**
  281. * Check whether def_type1 is subtype of def_type2
  282. *
  283. * @param def_type1 the specified defined type1
  284. * @param def_type2 the specified defined type2
  285. * @param module current wasm module
  286. *
  287. * @return true if the defined type1 is subtype of the defined type2,
  288. * false otherwise
  289. */
  290. WASM_RUNTIME_API_EXTERN bool
  291. wasm_defined_type_is_subtype_of(const wasm_defined_type_t def_type1,
  292. const wasm_defined_type_t def_type2,
  293. const wasm_module_t module);
  294. /* ref type related operations */
  295. /**
  296. * Set the ref_type to be (ref null? type_idx)
  297. *
  298. * @param ref_type the ref_type to be set
  299. * @param nullable whether the ref_type is nullable
  300. * @param type_idx the type index
  301. */
  302. WASM_RUNTIME_API_EXTERN void
  303. wasm_ref_type_set_type_idx(wasm_ref_type_t *ref_type, bool nullable,
  304. int32_t type_idx);
  305. /**
  306. * Set the ref_type to be (ref null? func/extern/any/eq/i31/struct/array/..)
  307. *
  308. * @param ref_type the ref_type to be set
  309. * @param nullable whether the ref_type is nullable
  310. * @param heap_type the heap type
  311. */
  312. WASM_RUNTIME_API_EXTERN void
  313. wasm_ref_type_set_heap_type(wasm_ref_type_t *ref_type, bool nullable,
  314. int32_t heap_type);
  315. /**
  316. * Check whether two ref types are equal
  317. *
  318. * @param ref_type1 the specified ref type1
  319. * @param ref_type2 the specified ref type2
  320. * @param module current wasm module
  321. *
  322. * @return true if the ref type1 is equal to the ref type2,
  323. * false otherwise
  324. */
  325. WASM_RUNTIME_API_EXTERN bool
  326. wasm_ref_type_equal(const wasm_ref_type_t *ref_type1,
  327. const wasm_ref_type_t *ref_type2,
  328. const wasm_module_t module);
  329. /**
  330. * Check whether ref_type1 is subtype of ref_type2
  331. *
  332. * @param ref_type1 the specified ref type1
  333. * @param ref_type2 the specified ref type2
  334. * @param module current wasm module
  335. *
  336. * @return true if the ref type1 is subtype of the ref type2,
  337. * false otherwise
  338. */
  339. WASM_RUNTIME_API_EXTERN bool
  340. wasm_ref_type_is_subtype_of(const wasm_ref_type_t *ref_type1,
  341. const wasm_ref_type_t *ref_type2,
  342. const wasm_module_t module);
  343. /* wasm object related operations */
  344. /**
  345. * Create a struct object with the index of defined type
  346. *
  347. * @param exec_env the execution environment
  348. * @param type_idx index of the struct type
  349. *
  350. * @return wasm_struct_obj_t if create success, NULL otherwise
  351. */
  352. WASM_RUNTIME_API_EXTERN wasm_struct_obj_t
  353. wasm_struct_obj_new_with_typeidx(wasm_exec_env_t exec_env, uint32_t type_idx);
  354. /**
  355. * Create a struct object with the struct type
  356. *
  357. * @param exec_env the execution environment
  358. * @param type defined struct type
  359. *
  360. * @return wasm_struct_obj_t if create success, NULL otherwise
  361. */
  362. WASM_RUNTIME_API_EXTERN wasm_struct_obj_t
  363. wasm_struct_obj_new_with_type(wasm_exec_env_t exec_env,
  364. const wasm_struct_type_t type);
  365. /**
  366. * Set the field value of a struct object
  367. *
  368. * @param obj the struct object to set field
  369. * @param field_idx the specified field index
  370. * @param value wasm value to be set
  371. */
  372. WASM_RUNTIME_API_EXTERN void
  373. wasm_struct_obj_set_field(wasm_struct_obj_t obj, uint32_t field_idx,
  374. const wasm_value_t *value);
  375. /**
  376. * Get the field value of a struct object
  377. *
  378. * @param obj the struct object to get field
  379. * @param field_idx the specified field index
  380. * @param sign_extend whether to sign extend for i8 and i16 element types
  381. * @param value output the wasm value
  382. */
  383. WASM_RUNTIME_API_EXTERN void
  384. wasm_struct_obj_get_field(const wasm_struct_obj_t obj, uint32_t field_idx,
  385. bool sign_extend, wasm_value_t *value);
  386. /**
  387. * Get the field count of the a struct object.
  388. *
  389. * @param obj the WASM struct object
  390. *
  391. * @return the field count of the a struct object
  392. */
  393. WASM_RUNTIME_API_EXTERN uint32_t
  394. wasm_struct_obj_get_field_count(const wasm_struct_obj_t obj);
  395. /**
  396. * Create an array object with the index of defined type, the obj's length is
  397. * length, init value is init_value
  398. *
  399. * @param exec_env the execution environment
  400. * @param type_idx the index of the specified type
  401. * @param length the array's length
  402. * @param init_value the array's init value
  403. *
  404. * @return the created array object
  405. */
  406. WASM_RUNTIME_API_EXTERN wasm_array_obj_t
  407. wasm_array_obj_new_with_typeidx(wasm_exec_env_t exec_env, uint32_t type_idx,
  408. uint32_t length, wasm_value_t *init_value);
  409. /**
  410. * Create an array object with the array type, the obj's length is length, init
  411. * value is init_value
  412. *
  413. * @param exec_env the execution environment
  414. * @param type the array's specified type
  415. * @param length the array's length
  416. * @param init_value the array's init value
  417. *
  418. * @return the created array object
  419. */
  420. WASM_RUNTIME_API_EXTERN wasm_array_obj_t
  421. wasm_array_obj_new_with_type(wasm_exec_env_t exec_env,
  422. const wasm_array_type_t type, uint32_t length,
  423. wasm_value_t *init_value);
  424. /**
  425. * Set the specified element's value of an array object
  426. *
  427. * @param array_obj the array object to set element value
  428. * @param elem_idx the specified element index
  429. * @param value wasm value to be set
  430. */
  431. WASM_RUNTIME_API_EXTERN void
  432. wasm_array_obj_set_elem(wasm_array_obj_t array_obj, uint32_t elem_idx,
  433. const wasm_value_t *value);
  434. /**
  435. * Get the specified element's value of an array object
  436. *
  437. * @param array_obj the array object to get element value
  438. * @param elem_idx the specified element index
  439. * @param sign_extend whether to sign extend for i8 and i16 element types
  440. * @param value output the wasm value
  441. */
  442. WASM_RUNTIME_API_EXTERN void
  443. wasm_array_obj_get_elem(const wasm_array_obj_t array_obj, uint32_t elem_idx,
  444. bool sign_extend, wasm_value_t *value);
  445. /**
  446. * Copy elements from one array to another
  447. *
  448. * @param dst_obj destination array object
  449. * @param dst_idx target index in destination
  450. * @param src_obj source array object
  451. * @param src_idx start index in source
  452. * @param len length of elements to copy
  453. */
  454. WASM_RUNTIME_API_EXTERN void
  455. wasm_array_obj_copy(wasm_array_obj_t dst_obj, uint32_t dst_idx,
  456. const wasm_array_obj_t src_obj, uint32_t src_idx,
  457. uint32_t len);
  458. /**
  459. * Return the length of an array object
  460. *
  461. * @param array_obj the array object to get length
  462. *
  463. * @return length of the array object
  464. */
  465. WASM_RUNTIME_API_EXTERN uint32_t
  466. wasm_array_obj_length(const wasm_array_obj_t array_obj);
  467. /**
  468. * Get the address of the first element of an array object
  469. *
  470. * @param array_obj the array object to get element address
  471. *
  472. * @return address of the first element
  473. */
  474. WASM_RUNTIME_API_EXTERN void *
  475. wasm_array_obj_first_elem_addr(const wasm_array_obj_t array_obj);
  476. /**
  477. * Get the address of the i-th element of an array object
  478. *
  479. * @param array_obj the array object to get element address
  480. * @param elem_idx the specified element index
  481. *
  482. * @return address of the specified element
  483. */
  484. WASM_RUNTIME_API_EXTERN void *
  485. wasm_array_obj_elem_addr(const wasm_array_obj_t array_obj, uint32_t elem_idx);
  486. /**
  487. * Create a function object with the index of defined type and the index of the
  488. * function
  489. *
  490. * @param exec_env the execution environment
  491. * @param type_idx the index of the specified type
  492. * @param func_idx_bound the index of the function
  493. *
  494. * @return the created function object
  495. */
  496. WASM_RUNTIME_API_EXTERN wasm_func_obj_t
  497. wasm_func_obj_new_with_typeidx(wasm_exec_env_t exec_env, uint32_t type_idx,
  498. uint32_t func_idx_bound);
  499. /**
  500. * Create a function object with the function type and the index of the function
  501. *
  502. * @param exec_env the execution environment
  503. * @param type the specified type
  504. * @param func_idx_bound the index of the function
  505. *
  506. * @return the created function object
  507. */
  508. WASM_RUNTIME_API_EXTERN wasm_func_obj_t
  509. wasm_func_obj_new_with_type(wasm_exec_env_t exec_env, wasm_func_type_t type,
  510. uint32_t func_idx_bound);
  511. /**
  512. * Get the function index bound of a function object
  513. *
  514. * @param func_obj the function object
  515. *
  516. * @return the bound function index
  517. */
  518. WASM_RUNTIME_API_EXTERN uint32_t
  519. wasm_func_obj_get_func_idx_bound(const wasm_func_obj_t func_obj);
  520. /**
  521. * Get the function type of a function object
  522. *
  523. * @param func_obj the function object
  524. *
  525. * @return defined function type
  526. */
  527. WASM_RUNTIME_API_EXTERN wasm_func_type_t
  528. wasm_func_obj_get_func_type(const wasm_func_obj_t func_obj);
  529. /**
  530. * Call the given WASM function object with arguments (bytecode and AoT).
  531. *
  532. * @param exec_env the execution environment to call the function,
  533. * which must be created from wasm_create_exec_env()
  534. * @param func_obj the function object to call
  535. * @param argc total cell number that the function parameters occupy,
  536. * a cell is a slot of the uint32 array argv[], e.g. i32/f32 argument
  537. * occupies one cell, i64/f64 argument occupies two cells, note that
  538. * it might be different from the parameter number of the function
  539. * @param argv the arguments. If the function has return value,
  540. * the first (or first two in case 64-bit return value) element of
  541. * argv stores the return value of the called WASM function after this
  542. * function returns.
  543. *
  544. * @return true if success, false otherwise and exception will be thrown,
  545. * the caller can call wasm_runtime_get_exception to get the exception
  546. * info.
  547. */
  548. WASM_RUNTIME_API_EXTERN bool
  549. wasm_runtime_call_func_ref(wasm_exec_env_t exec_env,
  550. const wasm_func_obj_t func_obj, uint32_t argc,
  551. uint32_t argv[]);
  552. /**
  553. * Call the given WASM function object with provided results space
  554. * and arguments (bytecode and AoT).
  555. *
  556. * @param exec_env the execution environment to call the function,
  557. * which must be created from wasm_create_exec_env()
  558. * @param func_obj the function object to call
  559. * @param num_results the number of results
  560. * @param results the pre-alloced pointer to get the results
  561. * @param num_args the number of arguments
  562. * @param args the arguments
  563. *
  564. * @return true if success, false otherwise and exception will be thrown,
  565. * the caller can call wasm_runtime_get_exception to get the exception
  566. * info.
  567. */
  568. WASM_RUNTIME_API_EXTERN bool
  569. wasm_runtime_call_func_ref_a(wasm_exec_env_t exec_env,
  570. const wasm_func_obj_t func_obj,
  571. uint32_t num_results, wasm_val_t results[],
  572. uint32_t num_args, wasm_val_t *args);
  573. /**
  574. * Call the given WASM function object with provided results space and
  575. * variant arguments (bytecode and AoT).
  576. *
  577. * @param exec_env the execution environment to call the function,
  578. * which must be created from wasm_create_exec_env()
  579. * @param func_obj the function object to call
  580. * @param num_results the number of results
  581. * @param results the pre-alloced pointer to get the results
  582. * @param num_args the number of arguments
  583. * @param ... the variant arguments
  584. *
  585. * @return true if success, false otherwise and exception will be thrown,
  586. * the caller can call wasm_runtime_get_exception to get the exception
  587. * info.
  588. */
  589. WASM_RUNTIME_API_EXTERN bool
  590. wasm_runtime_call_func_ref_v(wasm_exec_env_t exec_env,
  591. const wasm_func_obj_t func_obj,
  592. uint32_t num_results, wasm_val_t results[],
  593. uint32_t num_args, ...);
  594. /**
  595. * Create an externref object with host object
  596. *
  597. * @param exec_env the execution environment
  598. * @param host_obj host object pointer
  599. *
  600. * @return wasm_externref_obj_t if success, NULL otherwise
  601. */
  602. WASM_RUNTIME_API_EXTERN wasm_externref_obj_t
  603. wasm_externref_obj_new(wasm_exec_env_t exec_env, const void *host_obj);
  604. /**
  605. * Get the host value of an externref object
  606. *
  607. * @param externref_obj the externref object
  608. *
  609. * @return the stored host object pointer
  610. */
  611. WASM_RUNTIME_API_EXTERN const void *
  612. wasm_externref_obj_get_value(const wasm_externref_obj_t externref_obj);
  613. /**
  614. * Create an anyref object with host object
  615. *
  616. * @param exec_env the execution environment
  617. * @param host_obj host object pointer
  618. *
  619. * @return wasm_anyref_obj_t if success, NULL otherwise
  620. */
  621. WASM_RUNTIME_API_EXTERN wasm_anyref_obj_t
  622. wasm_anyref_obj_new(wasm_exec_env_t exec_env, const void *host_obj);
  623. /**
  624. * Get the host object value of an anyref object
  625. *
  626. * @param anyref_obj the anyref object
  627. *
  628. * @return the stored host object pointer
  629. */
  630. WASM_RUNTIME_API_EXTERN const void *
  631. wasm_anyref_obj_get_value(const wasm_anyref_obj_t anyref_obj);
  632. /**
  633. * Get the internal object inside the externref object, same as
  634. * the operation of opcode extern.internalize
  635. *
  636. * @param externref_obj the externref object
  637. *
  638. * @return internalized wasm_obj_t
  639. */
  640. WASM_RUNTIME_API_EXTERN wasm_obj_t
  641. wasm_externref_obj_to_internal_obj(const wasm_externref_obj_t externref_obj);
  642. /**
  643. * Create an externref object from an internal object, same as
  644. * the operation of opcode extern.externalize
  645. *
  646. * @param exec_env the execution environment
  647. * @param internal_obj the internal object
  648. *
  649. * @return wasm_externref_obj_t if create success, NULL otherwise
  650. */
  651. WASM_RUNTIME_API_EXTERN wasm_externref_obj_t
  652. wasm_internal_obj_to_externref_obj(wasm_exec_env_t exec_env,
  653. const wasm_obj_t internal_obj);
  654. /**
  655. * Create an i31 object
  656. *
  657. * @param i31_value the scalar value
  658. *
  659. * @return wasm_i31_obj_t
  660. */
  661. WASM_RUNTIME_API_EXTERN wasm_i31_obj_t
  662. wasm_i31_obj_new(uint32_t i31_value);
  663. /**
  664. * Get value from an i31 object
  665. *
  666. * @param i31_obj the i31 object
  667. * @param sign_extend whether to sign extend the value
  668. *
  669. * @return wasm_i31_obj_t
  670. */
  671. WASM_RUNTIME_API_EXTERN uint32_t
  672. wasm_i31_obj_get_value(wasm_i31_obj_t i31_obj, bool sign_extend);
  673. /**
  674. * Pin an object to make it traced during GC
  675. *
  676. * @param exec_env the execution environment
  677. * @param obj the object to pin
  678. *
  679. * @return true if success, false otherwise
  680. */
  681. WASM_RUNTIME_API_EXTERN bool
  682. wasm_runtime_pin_object(wasm_exec_env_t exec_env, wasm_obj_t obj);
  683. /**
  684. * Unpin an object
  685. *
  686. * @param exec_env the execution environment
  687. * @param obj the object to unpin
  688. *
  689. * @return true if success, false otherwise
  690. */
  691. WASM_RUNTIME_API_EXTERN bool
  692. wasm_runtime_unpin_object(wasm_exec_env_t exec_env, wasm_obj_t obj);
  693. /**
  694. * Check whether an object is a struct object
  695. *
  696. * @param obj the object to check
  697. *
  698. * @return true if the object is a struct, false otherwise
  699. */
  700. WASM_RUNTIME_API_EXTERN bool
  701. wasm_obj_is_struct_obj(const wasm_obj_t obj);
  702. /**
  703. * Check whether an object is an array object
  704. *
  705. * @param obj the object to check
  706. *
  707. * @return true if the object is a array, false otherwise
  708. */
  709. WASM_RUNTIME_API_EXTERN bool
  710. wasm_obj_is_array_obj(const wasm_obj_t obj);
  711. /**
  712. * Check whether an object is a function object
  713. *
  714. * @param obj the object to check
  715. *
  716. * @return true if the object is a function, false otherwise
  717. */
  718. WASM_RUNTIME_API_EXTERN bool
  719. wasm_obj_is_func_obj(const wasm_obj_t obj);
  720. /**
  721. * Check whether an object is an i31 object
  722. *
  723. * @param obj the object to check
  724. *
  725. * @return true if the object is an i32, false otherwise
  726. */
  727. WASM_RUNTIME_API_EXTERN bool
  728. wasm_obj_is_i31_obj(const wasm_obj_t obj);
  729. /**
  730. * Check whether an object is an externref object
  731. *
  732. * @param obj the object to check
  733. *
  734. * @return true if the object is an externref, false otherwise
  735. */
  736. WASM_RUNTIME_API_EXTERN bool
  737. wasm_obj_is_externref_obj(const wasm_obj_t obj);
  738. /**
  739. * Check whether an object is an anyref object
  740. *
  741. * @param obj the object to check
  742. *
  743. * @return true if the object is an anyref, false otherwise
  744. */
  745. WASM_RUNTIME_API_EXTERN bool
  746. wasm_obj_is_anyref_obj(const wasm_obj_t obj);
  747. /**
  748. * Check whether an object is a struct object, or, an i31/struct/array object
  749. *
  750. * @param obj the object to check
  751. *
  752. * @return true if the object is an internal object, false otherwise
  753. */
  754. WASM_RUNTIME_API_EXTERN bool
  755. wasm_obj_is_internal_obj(const wasm_obj_t obj);
  756. /**
  757. * Check whether an object is an eq object
  758. *
  759. * @param obj the object to check
  760. *
  761. * @return true if the object is an eq object, false otherwise
  762. */
  763. WASM_RUNTIME_API_EXTERN bool
  764. wasm_obj_is_eq_obj(const wasm_obj_t obj);
  765. /**
  766. * Check whether an object is an instance of a defined type
  767. *
  768. * @param obj the object to check
  769. * @param defined_type the defined type
  770. * @param module current wasm module
  771. *
  772. * @return true if the object is instance of the defined type, false otherwise
  773. */
  774. WASM_RUNTIME_API_EXTERN bool
  775. wasm_obj_is_instance_of_defined_type(const wasm_obj_t obj,
  776. const wasm_defined_type_t defined_type,
  777. const wasm_module_t module);
  778. /**
  779. * Check whether an object is an instance of a defined type with
  780. * index type_idx
  781. *
  782. * @param obj the object to check
  783. * @param type_idx the type index
  784. * @param module current wasm module
  785. *
  786. * @return true if the object is instance of the defined type specified by
  787. * type_idx, false otherwise
  788. */
  789. WASM_RUNTIME_API_EXTERN bool
  790. wasm_obj_is_instance_of_type_idx(const wasm_obj_t obj, uint32_t type_idx,
  791. const wasm_module_t module);
  792. /**
  793. * Check whether an object is an instance of a ref type
  794. *
  795. * @param obj the object to check
  796. * @param ref_type the ref type
  797. *
  798. * @return true if the object is instance of the ref type, false otherwise
  799. */
  800. WASM_RUNTIME_API_EXTERN bool
  801. wasm_obj_is_instance_of_ref_type(const wasm_obj_t obj,
  802. const wasm_ref_type_t *ref_type);
  803. /**
  804. * Push a local object ref into stack, note that we should set its value
  805. * after pushing to retain it during GC, and should pop it from stack
  806. * before returning from the current function
  807. *
  808. * @param exec_env the execution environment
  809. * @param local_obj_ref the local object ref to push
  810. */
  811. WASM_RUNTIME_API_EXTERN void
  812. wasm_runtime_push_local_obj_ref(wasm_exec_env_t exec_env,
  813. wasm_local_obj_ref_t *local_obj_ref);
  814. /**
  815. * Pop a local object ref from stack
  816. *
  817. * @param exec_env the execution environment
  818. *
  819. * @return the popped wasm_local_obj_ref_t
  820. */
  821. WASM_RUNTIME_API_EXTERN wasm_local_obj_ref_t *
  822. wasm_runtime_pop_local_obj_ref(wasm_exec_env_t exec_env);
  823. /**
  824. * Pop n local object refs from stack
  825. *
  826. * @param exec_env the execution environment
  827. * @param n number to pop
  828. */
  829. WASM_RUNTIME_API_EXTERN void
  830. wasm_runtime_pop_local_obj_refs(wasm_exec_env_t exec_env, uint32_t n);
  831. /**
  832. * Get current local object ref from stack
  833. *
  834. * @param exec_env the execution environment
  835. *
  836. * @return the wasm_local_obj_ref_t obj from the top of the stack, not change
  837. * the state of the stack
  838. */
  839. WASM_RUNTIME_API_EXTERN wasm_local_obj_ref_t *
  840. wasm_runtime_get_cur_local_obj_ref(wasm_exec_env_t exec_env);
  841. /**
  842. * Set finalizer to the given object, if another finalizer is set to the same
  843. * object, the previous one will be cancelled
  844. *
  845. * @param exec_env the execution environment
  846. * @param obj object to set finalizer
  847. * @param cb finalizer function to be called before this object is freed
  848. * @param data custom data to be passed to finalizer function
  849. *
  850. * @return true if success, false otherwise
  851. */
  852. bool
  853. wasm_obj_set_gc_finalizer(wasm_exec_env_t exec_env, const wasm_obj_t obj,
  854. wasm_obj_finalizer_t cb, void *data);
  855. /**
  856. * Unset finalizer to the given object
  857. *
  858. * @param exec_env the execution environment
  859. * @param obj object to unset finalizer
  860. */
  861. void
  862. wasm_obj_unset_gc_finalizer(wasm_exec_env_t exec_env, void *obj);
  863. #ifdef __cplusplus
  864. }
  865. #endif
  866. #endif /* end of _GC_EXPORT_H */