| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 |
- /*
- * Copyright (C) 2019 Intel Corporation. All rights reserved.
- * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- */
- #ifndef _GC_OBJECT_H_
- #define _GC_OBJECT_H_
- #include "gc_type.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * Object header of a WASM object, as the address of allocated memory
- * must be 8-byte aligned, the lowest 3 bits are zero, we use them to
- * mark the object:
- * bits[0] is 1: the object is an externref object
- * bits[1] is 1: the object is an anyref object
- * bits[2] is 1: the object has extra information
- * if both bits[0] and bits[1] are 0, then this object header must
- * be a pointer of a WASMRttType, denotes that the object is a
- * struct object, or an array object, or a function object
- */
- typedef uintptr_t WASMObjectHeader;
- #define WASM_OBJ_HEADER_MASK (~((uintptr_t)7))
- #define WASM_OBJ_EXTERNREF_OBJ_FLAG (((uintptr_t)1) << 0)
- #define WASM_OBJ_ANYREF_OBJ_FLAG (((uintptr_t)1) << 1)
- #define WASM_OBJ_EXTRA_INFO_FLAG (((uintptr_t)1) << 2)
- /* Representation of WASM objects */
- typedef struct WASMObject {
- WASMObjectHeader header;
- } WASMObject, *WASMObjectRef;
- /* Representation of WASM rtt types */
- typedef struct WASMRttType {
- /* type_flag must be WASM_TYPE_FUNC/STRUCT/ARRAY to
- denote an object of func, struct or array */
- uint32 type_flag;
- uint32 inherit_depth;
- WASMType *defined_type;
- WASMType *root_type;
- } WASMRttType, *WASMRttTypeRef;
- /* Representation of WASM externref objects */
- typedef struct WASMExternrefObject {
- /* bits[0] must be 1, denotes an externref object */
- WASMObjectHeader header;
- /* an object of WASMAnyrefObjectRef which encapsulates the external
- object passed from host, or other internal objects passed to
- opcode extern.externalize */
- WASMObjectRef internal_obj;
- } WASMExternrefObject, *WASMExternrefObjectRef;
- /* Representation of WASM anyref objects which encapsulate the
- external object passed from host */
- typedef struct WASMAnyrefObject {
- /* bits[1] must be 1, denotes an anyref object */
- WASMObjectHeader header;
- const void *host_obj;
- } WASMAnyrefObject, *WASMAnyrefObjectRef;
- /**
- * Representation of WASM i31 objects, the lowest bit is 1:
- * for a pointer of WASMObjectRef, if the lowest bit is 1, then it is an
- * i31 object and bits[1..31] stores the actual i31 value, otherwise
- * it is a normal object of rtt/externref/struct/array/func */
- typedef uintptr_t WASMI31ObjectRef;
- /* Representation of WASM struct objects */
- typedef struct WASMStructObject {
- /* Must be pointer of WASMRttObject of struct type */
- WASMObjectHeader header;
- uint8 field_data[1];
- } WASMStructObject, *WASMStructObjectRef;
- /* Representation of WASM array objects */
- typedef struct WASMArrayObject {
- /* Must be pointer of WASMRttObject of array type */
- WASMObjectHeader header;
- /* (<array length> << 2) | <array element size>,
- * elem_count = length >> 2
- * elem_size = 2 ^ (length & 0x3)
- */
- uint32 length;
- uint8 elem_data[1];
- } WASMArrayObject, *WASMArrayObjectRef;
- #define WASM_ARRAY_LENGTH_SHIFT 2
- #define WASM_ARRAY_ELEM_SIZE_MASK 3
- /* Representation of WASM function objects */
- typedef struct WASMFuncObject {
- /* must be pointer of WASMRttObject of func type */
- WASMObjectHeader header;
- uint32 func_idx_bound;
- } WASMFuncObject, *WASMFuncObjectRef;
- /* Representation of WASM stringref objects */
- typedef struct WASMStringrefObject {
- WASMObjectHeader header;
- const void *str_obj;
- } WASMStringrefObject, *WASMStringrefObjectRef;
- typedef struct WASMStringviewWTF8Object {
- WASMObjectHeader header;
- const void *str_obj;
- } WASMStringviewWTF8Object, *WASMStringviewWTF8ObjectRef;
- typedef struct WASMStringviewWTF16Object {
- WASMObjectHeader header;
- const void *str_obj;
- } WASMStringviewWTF16Object, *WASMStringviewWTF16ObjectRef;
- typedef struct WASMStringviewIterObject {
- WASMObjectHeader header;
- const void *str_obj;
- int32 pos;
- } WASMStringviewIterObject, *WASMStringviewIterObjectRef;
- struct WASMExecEnv;
- inline static WASMObjectHeader
- wasm_object_header(const WASMObjectRef obj)
- {
- return (obj->header & WASM_OBJ_HEADER_MASK);
- }
- WASMRttTypeRef
- wasm_rtt_type_new(WASMType *defined_type, uint32 defined_type_idx,
- WASMRttType **rtt_types, uint32 rtt_type_count,
- korp_mutex *rtt_type_lock);
- inline static WASMType *
- wasm_rtt_type_get_defined_type(const WASMRttTypeRef rtt_type)
- {
- return rtt_type->defined_type;
- }
- WASMStructObjectRef
- wasm_struct_obj_new_internal(void *heap_handle, WASMRttTypeRef rtt_type);
- WASMStructObjectRef
- wasm_struct_obj_new(struct WASMExecEnv *exec_env, WASMRttTypeRef rtt_type);
- void
- wasm_struct_obj_set_field(WASMStructObjectRef struct_obj, uint32 field_idx,
- const WASMValue *value);
- void
- wasm_struct_obj_get_field(const WASMStructObjectRef struct_obj,
- uint32 field_idx, bool sign_extend, WASMValue *value);
- /**
- * Return the field count of the WASM struct object.
- *
- * @param struct_obj the WASM struct object
- *
- * @return the field count of the WASM struct object
- */
- uint32
- wasm_struct_obj_get_field_count(const WASMStructObjectRef struct_obj);
- WASMArrayObjectRef
- wasm_array_obj_new_internal(void *heap_handle, WASMRttTypeRef rtt_type,
- uint32 length, WASMValue *init_value);
- WASMArrayObjectRef
- wasm_array_obj_new(struct WASMExecEnv *exec_env, WASMRttTypeRef rtt_type,
- uint32 length, WASMValue *init_value);
- void
- wasm_array_obj_set_elem(WASMArrayObjectRef array_obj, uint32 elem_idx,
- const WASMValue *value);
- void
- wasm_array_obj_get_elem(const WASMArrayObjectRef array_obj, uint32 elem_idx,
- bool sign_extend, WASMValue *value);
- void
- wasm_array_obj_fill(const WASMArrayObjectRef array_obj, uint32 elem_idx,
- uint32 len, WASMValue *value);
- void
- wasm_array_obj_copy(WASMArrayObjectRef dst_obj, uint32 dst_idx,
- WASMArrayObjectRef src_obj, uint32 src_idx, uint32 len);
- /**
- * Return the logarithm of the size of array element.
- *
- * @param array the WASM array object
- *
- * @return log(size of the array element)
- */
- inline static uint32
- wasm_array_obj_elem_size_log(const WASMArrayObjectRef array_obj)
- {
- return (array_obj->length & WASM_ARRAY_ELEM_SIZE_MASK);
- }
- /**
- * Return the length of the array.
- *
- * @param array_obj the WASM array object
- *
- * @return the length of the array
- */
- uint32
- wasm_array_obj_length(const WASMArrayObjectRef array_obj);
- /**
- * Return the address of the first element of an array object.
- *
- * @param array_obj the WASM array object
- *
- * @return the address of the first element of the array object
- */
- void *
- wasm_array_obj_first_elem_addr(const WASMArrayObjectRef array_obj);
- /**
- * Return the address of the i-th element of an array object.
- *
- * @param array_obj the WASM array object
- * @param index the index of the element
- *
- * @return the address of the i-th element of the array object
- */
- void *
- wasm_array_obj_elem_addr(const WASMArrayObjectRef array_obj, uint32 elem_idx);
- WASMFuncObjectRef
- wasm_func_obj_new_internal(void *heap_handle, WASMRttTypeRef rtt_type,
- uint32 func_idx_bound);
- WASMFuncObjectRef
- wasm_func_obj_new(struct WASMExecEnv *exec_env, WASMRttTypeRef rtt_type,
- uint32 func_idx_bound);
- uint32
- wasm_func_obj_get_func_idx_bound(const WASMFuncObjectRef func_obj);
- WASMFuncType *
- wasm_func_obj_get_func_type(const WASMFuncObjectRef func_obj);
- WASMExternrefObjectRef
- wasm_externref_obj_new(struct WASMExecEnv *exec_env, const void *host_obj);
- WASMAnyrefObjectRef
- wasm_anyref_obj_new(struct WASMExecEnv *exec_env, const void *host_obj);
- /* Implementation of opcode extern.internalize */
- WASMObjectRef
- wasm_externref_obj_to_internal_obj(const WASMExternrefObjectRef externref_obj);
- /* Implementation of opcode extern.externalize */
- WASMExternrefObjectRef
- wasm_internal_obj_to_externref_obj(struct WASMExecEnv *exec_env,
- const WASMObjectRef internal_obj);
- const void *
- wasm_anyref_obj_get_value(const WASMAnyrefObjectRef anyref_obj);
- const void *
- wasm_externref_obj_get_value(const WASMExternrefObjectRef externref_obj);
- WASMI31ObjectRef
- wasm_i31_obj_new(uint32 i31_value);
- uint32
- wasm_i31_obj_get_value(WASMI31ObjectRef i31_obj, bool sign_extend);
- bool
- wasm_obj_is_i31_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_externref_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_anyref_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_i31_externref_or_anyref_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_struct_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_array_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_func_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_internal_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_eq_obj(WASMObjectRef obj);
- inline static bool
- wasm_obj_is_null_obj(WASMObjectRef obj)
- {
- return obj == NULL_REF ? true : false;
- }
- inline static bool
- wasm_obj_is_created_from_heap(WASMObjectRef obj)
- {
- if (obj == NULL || (((uintptr_t)obj) & 1))
- /* null object or i31 object */
- return false;
- return true;
- }
- bool
- wasm_obj_is_instance_of(WASMObjectRef obj, uint32 type_idx, WASMType **types,
- uint32 type_count);
- bool
- wasm_obj_is_type_of(WASMObjectRef obj, int32 heap_type);
- bool
- wasm_obj_equal(WASMObjectRef obj1, WASMObjectRef obj2);
- bool
- wasm_object_get_ref_list(WASMObjectRef obj, bool *p_is_compact_mode,
- uint32 *p_ref_num, uint16 **p_ref_list,
- uint32 *p_ref_start_offset);
- #if WASM_ENABLE_STRINGREF != 0
- WASMStringrefObjectRef
- wasm_stringref_obj_new(struct WASMExecEnv *exec_env, const void *str_obj);
- WASMStringviewWTF8ObjectRef
- wasm_stringview_wtf8_obj_new(struct WASMExecEnv *exec_env, const void *str_obj);
- WASMStringviewWTF16ObjectRef
- wasm_stringview_wtf16_obj_new(struct WASMExecEnv *exec_env,
- const void *str_obj);
- WASMStringviewIterObjectRef
- wasm_stringview_iter_obj_new(struct WASMExecEnv *exec_env, const void *str_obj,
- int32 pos);
- const void *
- wasm_stringref_obj_get_value(WASMStringrefObjectRef stringref_obj);
- const void *
- wasm_stringview_wtf8_obj_get_value(
- WASMStringviewWTF8ObjectRef stringview_wtf8_obj);
- const void *
- wasm_stringview_wtf16_obj_get_value(
- WASMStringviewWTF16ObjectRef stringview_wtf16_obj);
- const void *
- wasm_stringview_iter_obj_get_value(
- WASMStringviewIterObjectRef stringview_iter_obj);
- int32
- wasm_stringview_iter_obj_get_pos(
- WASMStringviewIterObjectRef stringview_iter_obj);
- void
- wasm_stringview_iter_obj_update_pos(
- WASMStringviewIterObjectRef stringview_iter_obj, int32 pos);
- bool
- wasm_obj_is_stringref_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_stringview_wtf8_obj(WASMObjectRef obj);
- bool
- wasm_obj_is_stringview_wtf16_obj(WASMObjectRef obj);
- #endif /* end of WASM_ENABLE_STRINGREF != 0 */
- #ifdef __cplusplus
- } /* end of extern "C" */
- #endif
- #endif /* end of _GC_OBJECT_H_ */
|