14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ci#ifndef ECMASCRIPT_JS_HCLASS_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_JS_HCLASS_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include "ecmascript/ecma_macros.h"
204514f5e3Sopenharmony_ci#include "ecmascript/elements.h"
214514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
224514f5e3Sopenharmony_ci#include "ecmascript/mem/tagged_object.h"
234514f5e3Sopenharmony_ci#include "ecmascript/mem/barriers.h"
244514f5e3Sopenharmony_ci#include "ecmascript/mem/slots.h"
254514f5e3Sopenharmony_ci#include "ecmascript/mem/visitor.h"
264514f5e3Sopenharmony_ci#include "ecmascript/property_attributes.h"
274514f5e3Sopenharmony_ci
284514f5e3Sopenharmony_ci#include "libpandabase/utils/bit_field.h"
294514f5e3Sopenharmony_ci
304514f5e3Sopenharmony_ci/*
314514f5e3Sopenharmony_ci *                         JS Object and JS HClass Layout
324514f5e3Sopenharmony_ci *
334514f5e3Sopenharmony_ci *      Properties                         JS Object                    JS HClass
344514f5e3Sopenharmony_ci *      +------------+                     +------------+               +------------------+
354514f5e3Sopenharmony_ci *      |arrayHClass + <---------|         |JS HClass   +-------------->|   meta hclass    |
364514f5e3Sopenharmony_ci *      +------------+           |         +------------+               +------------------+
374514f5e3Sopenharmony_ci *      | property 0 |           |         |Hash        |               |   hclass level   |
384514f5e3Sopenharmony_ci *      +------------+           |         +------------+               +------------------+
394514f5e3Sopenharmony_ci *      | property 1 |           |-------  |Properties  |               |   supers[]       |
404514f5e3Sopenharmony_ci *      +------------+                     +------------+               +------------------+
414514f5e3Sopenharmony_ci *      |...         |           |-------  |Elements    |               |   vtable[]       |
424514f5e3Sopenharmony_ci *      +------------+           |         +------------+               +------------------+
434514f5e3Sopenharmony_ci *                               |         |inl-prop-0  |               |   prototype      |
444514f5e3Sopenharmony_ci *      Elements                 |         +------------+               +------------------+
454514f5e3Sopenharmony_ci *      +------------+           |         |inl-prop-1  |               |   layout         |
464514f5e3Sopenharmony_ci *      |arrayHClass + <---------|         +------------+               +------------------+
474514f5e3Sopenharmony_ci *      +------------+                     |...         |               |   transitions    |
484514f5e3Sopenharmony_ci *      | value 0    |                     +------------+               +------------------+
494514f5e3Sopenharmony_ci *      +------------+                                                  |    parent        |
504514f5e3Sopenharmony_ci *      | value 1    |                                                  +------------------+
514514f5e3Sopenharmony_ci *      +------------+                                                  |ProtoChangeMarker |
524514f5e3Sopenharmony_ci *      |...         |                                                  +------------------+
534514f5e3Sopenharmony_ci *      +------------+                                                  |    EnumCache     |
544514f5e3Sopenharmony_ci *                                                                      +------------------+
554514f5e3Sopenharmony_ci *
564514f5e3Sopenharmony_ci *                          Proto: [[Prototype]] in Ecma spec
574514f5e3Sopenharmony_ci *                          Layout: record key and attr
584514f5e3Sopenharmony_ci *                          ProtoChangeMarker, ProtoChangeDetails: monitor [[prototype]] chain
594514f5e3Sopenharmony_ci *                          EnumCache: use for for-in syntax
604514f5e3Sopenharmony_ci *
614514f5e3Sopenharmony_ci */
624514f5e3Sopenharmony_cinamespace panda::ecmascript {
634514f5e3Sopenharmony_ciclass ProtoChangeDetails;
644514f5e3Sopenharmony_ciclass PropertyLookupResult;
654514f5e3Sopenharmony_ciclass SharedHeap;
664514f5e3Sopenharmony_ciclass JSSharedArray;
674514f5e3Sopenharmony_ciclass LayoutInfo;
684514f5e3Sopenharmony_ciclass NameDictionary;
694514f5e3Sopenharmony_cinamespace pgo {
704514f5e3Sopenharmony_ci    class HClassLayoutDesc;
714514f5e3Sopenharmony_ci    class PGOHClassTreeDesc;
724514f5e3Sopenharmony_ci    class PGOHandler;
734514f5e3Sopenharmony_ci} // namespace pgo
744514f5e3Sopenharmony_ciusing HClassLayoutDesc = pgo::HClassLayoutDesc;
754514f5e3Sopenharmony_ciusing PGOHClassTreeDesc = pgo::PGOHClassTreeDesc;
764514f5e3Sopenharmony_ciusing PGOHandler = pgo::PGOHandler;
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_cistruct Reference;
794514f5e3Sopenharmony_ci
804514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
814514f5e3Sopenharmony_ci#define JSTYPE_DECL       /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
824514f5e3Sopenharmony_ci    INVALID = 0,          /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
834514f5e3Sopenharmony_ci        JS_OBJECT,        /* JS_OBJECT_FIRST ////////////////////////////////////////////////////////////////////// */ \
844514f5e3Sopenharmony_ci        JS_SHARED_OBJECT, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
854514f5e3Sopenharmony_ci        JS_REALM,         /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
864514f5e3Sopenharmony_ci        JS_FUNCTION_BASE, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
874514f5e3Sopenharmony_ci        JS_FUNCTION,      /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
884514f5e3Sopenharmony_ci        JS_SHARED_FUNCTION,            /* /////////////////////////////////////////////////////////////////-PADDING */ \
894514f5e3Sopenharmony_ci        JS_PROXY_REVOC_FUNCTION,       /* /////////////////////////////////////////////////////////////////-PADDING */ \
904514f5e3Sopenharmony_ci        JS_PROMISE_REACTIONS_FUNCTION, /* /////////////////////////////////////////////////////////////////-PADDING */ \
914514f5e3Sopenharmony_ci        JS_PROMISE_EXECUTOR_FUNCTION,  /* /////////////////////////////////////////////////////////////////-PADDING */ \
924514f5e3Sopenharmony_ci        JS_ASYNC_MODULE_FULFILLED_FUNCTION, /* ////////////////////////////////////////////////////////////-PADDING */ \
934514f5e3Sopenharmony_ci        JS_ASYNC_MODULE_REJECTED_FUNCTION, /* /////////////////////////////////////////////////////////////-PADDING */ \
944514f5e3Sopenharmony_ci        JS_ASYNC_FROM_SYNC_ITER_UNWARP_FUNCTION,  /* //////////////////////////////////////////////////////-PADDING */ \
954514f5e3Sopenharmony_ci        JS_PROMISE_ALL_RESOLVE_ELEMENT_FUNCTION,  /* //////////////////////////////////////////////////////-PADDING */ \
964514f5e3Sopenharmony_ci        JS_ASYNC_GENERATOR_RESUME_NEXT_RETURN_PROCESSOR_RST_FTN, /* ///////////////////////////////////////-PADDING */ \
974514f5e3Sopenharmony_ci        JS_PROMISE_ANY_REJECT_ELEMENT_FUNCTION,  /* ///////////////////////////////////////////////////////-PADDING */ \
984514f5e3Sopenharmony_ci        JS_PROMISE_ALL_SETTLED_ELEMENT_FUNCTION,  /* //////////////////////////////////////////////////////-PADDING */ \
994514f5e3Sopenharmony_ci        JS_PROMISE_FINALLY_FUNCTION,  /* //////////////////////////////////////////////////////////////////-PADDING */ \
1004514f5e3Sopenharmony_ci        JS_PROMISE_VALUE_THUNK_OR_THROWER_FUNCTION,  /* ///////////////////////////////////////////////////-PADDING */ \
1014514f5e3Sopenharmony_ci        JS_GENERATOR_FUNCTION, /* /////////////////////////////////////////////////////////////////////////-PADDING */ \
1024514f5e3Sopenharmony_ci        JS_ASYNC_GENERATOR_FUNCTION,  /* //////////////////////////////////////////////////////////////////-PADDING */ \
1034514f5e3Sopenharmony_ci        JS_ASYNC_FUNCTION, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1044514f5e3Sopenharmony_ci        JS_SHARED_ASYNC_FUNCTION, /* //////////////////////////////////////////////////////////////////////-PADDING */ \
1054514f5e3Sopenharmony_ci        JS_INTL_BOUND_FUNCTION, /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
1064514f5e3Sopenharmony_ci        JS_ASYNC_AWAIT_STATUS_FUNCTION, /* ////////////////////////////////////////////////////////////////-PADDING */ \
1074514f5e3Sopenharmony_ci        JS_BOUND_FUNCTION, /*  //////////////////////////////////////////////////////////////////////////////////// */ \
1084514f5e3Sopenharmony_ci                                                                                                                       \
1094514f5e3Sopenharmony_ci        JS_ERROR,           /* JS_ERROR_FIRST /////////////////////////////////////////////////////////////-PADDING */ \
1104514f5e3Sopenharmony_ci        JS_EVAL_ERROR,      /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1114514f5e3Sopenharmony_ci        JS_RANGE_ERROR,     /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1124514f5e3Sopenharmony_ci        JS_REFERENCE_ERROR, /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1134514f5e3Sopenharmony_ci        JS_TYPE_ERROR,      /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1144514f5e3Sopenharmony_ci        JS_AGGREGATE_ERROR, /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1154514f5e3Sopenharmony_ci        JS_URI_ERROR,       /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1164514f5e3Sopenharmony_ci        JS_SYNTAX_ERROR,    /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1174514f5e3Sopenharmony_ci        JS_OOM_ERROR,       /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1184514f5e3Sopenharmony_ci        JS_TERMINATION_ERROR, /* JS_ERROR_LAST //////////////////////////////////////////////////////////////////// */ \
1194514f5e3Sopenharmony_ci                                                                                                                       \
1204514f5e3Sopenharmony_ci        JS_REG_EXP,  /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1214514f5e3Sopenharmony_ci        JS_SET,      /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1224514f5e3Sopenharmony_ci        JS_SHARED_SET, /*  ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1234514f5e3Sopenharmony_ci        JS_MAP,      /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1244514f5e3Sopenharmony_ci        JS_SHARED_MAP, /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1254514f5e3Sopenharmony_ci        JS_WEAK_MAP, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1264514f5e3Sopenharmony_ci        JS_WEAK_SET, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1274514f5e3Sopenharmony_ci        JS_WEAK_REF, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1284514f5e3Sopenharmony_ci        JS_FINALIZATION_REGISTRY, /* //////////////////////////////////////////////////////////////////////-PADDING */ \
1294514f5e3Sopenharmony_ci        JS_DATE,     /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1304514f5e3Sopenharmony_ci        JS_ITERATOR, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1314514f5e3Sopenharmony_ci        JS_ASYNCITERATOR, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
1324514f5e3Sopenharmony_ci        JS_ASYNC_FROM_SYNC_ITERATOR, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
1334514f5e3Sopenharmony_ci        JS_FORIN_ITERATOR,       /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1344514f5e3Sopenharmony_ci        JS_MAP_ITERATOR,         /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1354514f5e3Sopenharmony_ci        JS_SHARED_MAP_ITERATOR,  /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1364514f5e3Sopenharmony_ci        JS_SET_ITERATOR,         /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1374514f5e3Sopenharmony_ci        JS_SHARED_SET_ITERATOR,  /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1384514f5e3Sopenharmony_ci        JS_REG_EXP_ITERATOR,        /* ////////////////////////////////////////////////////////////////////-PADDING */ \
1394514f5e3Sopenharmony_ci        JS_API_ARRAYLIST_ITERATOR, /* /////////////////////////////////////////////////////////////////////-PADDING */ \
1404514f5e3Sopenharmony_ci        JS_API_DEQUE_ITERATOR,   /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1414514f5e3Sopenharmony_ci        JS_API_HASHMAP_ITERATOR, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1424514f5e3Sopenharmony_ci        JS_API_HASHSET_ITERATOR, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1434514f5e3Sopenharmony_ci        JS_API_LIGHT_WEIGHT_MAP_ITERATOR, /* //////////////////////////////////////////////////////////////-PADDING */ \
1444514f5e3Sopenharmony_ci        JS_API_LIGHT_WEIGHT_SET_ITERATOR,  /* /////////////////////////////////////////////////////////////-PADDING */ \
1454514f5e3Sopenharmony_ci        JS_API_PLAIN_ARRAY_ITERATOR,  /* //////////////////////////////////////////////////////////////////-PADDING */ \
1464514f5e3Sopenharmony_ci        JS_API_QUEUE_ITERATOR,   /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1474514f5e3Sopenharmony_ci        JS_API_STACK_ITERATOR,   /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1484514f5e3Sopenharmony_ci        JS_API_TREEMAP_ITERATOR, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1494514f5e3Sopenharmony_ci        JS_API_TREESET_ITERATOR, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1504514f5e3Sopenharmony_ci        JS_API_VECTOR_ITERATOR,  /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1514514f5e3Sopenharmony_ci        JS_API_BITVECTOR_ITERATOR,  /* ////////////////////////////////////////////////////////////////////-PADDING */ \
1524514f5e3Sopenharmony_ci        JS_API_LINKED_LIST_ITERATOR, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
1534514f5e3Sopenharmony_ci        JS_API_LIST_ITERATOR,    /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1544514f5e3Sopenharmony_ci        JS_ARRAY_ITERATOR,       /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1554514f5e3Sopenharmony_ci        JS_SHARED_ARRAY_ITERATOR, /* //////////////////////////////////////////////////////////////////////-PADDING */ \
1564514f5e3Sopenharmony_ci        JS_SEGMENT_ITERATOR,       /* /////////////////////////////////////////////////////////////////////-PADDING */ \
1574514f5e3Sopenharmony_ci        JS_STRING_ITERATOR,      /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1584514f5e3Sopenharmony_ci        JS_INTL, /* ///////////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1594514f5e3Sopenharmony_ci        JS_LOCALE, /* /////////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1604514f5e3Sopenharmony_ci        JS_DATE_TIME_FORMAT, /* ///////////////////////////////////////////////////////////////////////////-PADDING */ \
1614514f5e3Sopenharmony_ci        JS_RELATIVE_TIME_FORMAT, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1624514f5e3Sopenharmony_ci        JS_NUMBER_FORMAT, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
1634514f5e3Sopenharmony_ci        JS_COLLATOR, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1644514f5e3Sopenharmony_ci        JS_PLURAL_RULES, /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1654514f5e3Sopenharmony_ci        JS_DISPLAYNAMES, /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1664514f5e3Sopenharmony_ci        JS_LIST_FORMAT,  /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1674514f5e3Sopenharmony_ci        JS_SEGMENTER, /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1684514f5e3Sopenharmony_ci        JS_SEGMENTS, /* /////////////////////////////////////////////////////////////////////////// ///////-PADDING */ \
1694514f5e3Sopenharmony_ci                                                                                                                       \
1704514f5e3Sopenharmony_ci        JS_ARRAY_BUFFER, /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1714514f5e3Sopenharmony_ci        JS_SHARED_ARRAY_BUFFER, /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
1724514f5e3Sopenharmony_ci        JS_SENDABLE_ARRAY_BUFFER, /* //////////////////////////////////////////////////////////////////////-PADDING */ \
1734514f5e3Sopenharmony_ci        JS_PROMISE,      /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1744514f5e3Sopenharmony_ci        JS_DATA_VIEW,    /* /////////////////////////////////////////////////////////////////////////////////////// */ \
1754514f5e3Sopenharmony_ci        JS_ARGUMENTS, /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1764514f5e3Sopenharmony_ci        JS_GENERATOR_OBJECT,  /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
1774514f5e3Sopenharmony_ci        JS_ASYNC_GENERATOR_OBJECT,  /* ////////////////////////////////////////////////////////////////////-PADDING */ \
1784514f5e3Sopenharmony_ci        JS_ASYNC_FUNC_OBJECT, /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
1794514f5e3Sopenharmony_ci                                                                                                                       \
1804514f5e3Sopenharmony_ci        /* SPECIAL indexed objects begin, DON'T CHANGE HERE ///////////////////////////////////////////////-PADDING */ \
1814514f5e3Sopenharmony_ci        JS_ARRAY,       /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
1824514f5e3Sopenharmony_ci        JS_SHARED_ARRAY, /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
1834514f5e3Sopenharmony_ci        JS_API_ARRAY_LIST, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1844514f5e3Sopenharmony_ci        JS_API_LIGHT_WEIGHT_MAP,      /* //////////////////////////////////////////////////////////////////-PADDING */ \
1854514f5e3Sopenharmony_ci        JS_API_LIGHT_WEIGHT_SET, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
1864514f5e3Sopenharmony_ci        JS_API_VECTOR,     /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1874514f5e3Sopenharmony_ci        JS_API_BITVECTOR,     /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
1884514f5e3Sopenharmony_ci        JS_API_LINKED_LIST, /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1894514f5e3Sopenharmony_ci        JS_API_LIST,       /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1904514f5e3Sopenharmony_ci        JS_API_HASH_MAP,   /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1914514f5e3Sopenharmony_ci        JS_API_HASH_SET,   /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1924514f5e3Sopenharmony_ci        JS_API_TREE_MAP,   /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1934514f5e3Sopenharmony_ci        JS_API_TREE_SET,   /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1944514f5e3Sopenharmony_ci        JS_API_DEQUE,      /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1954514f5e3Sopenharmony_ci        JS_API_STACK,      /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1964514f5e3Sopenharmony_ci        JS_API_PLAIN_ARRAY, /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
1974514f5e3Sopenharmony_ci        JS_API_QUEUE,      /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
1984514f5e3Sopenharmony_ci        JS_TYPED_ARRAY, /* JS_TYPED_ARRAY_FIRST /////////////////////////////////////////////////////////////////// */ \
1994514f5e3Sopenharmony_ci        JS_INT8_ARRAY,  /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2004514f5e3Sopenharmony_ci        JS_UINT8_ARRAY, /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2014514f5e3Sopenharmony_ci        JS_UINT8_CLAMPED_ARRAY, /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2024514f5e3Sopenharmony_ci        JS_INT16_ARRAY,         /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2034514f5e3Sopenharmony_ci        JS_UINT16_ARRAY,        /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2044514f5e3Sopenharmony_ci        JS_INT32_ARRAY,         /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2054514f5e3Sopenharmony_ci        JS_UINT32_ARRAY,        /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2064514f5e3Sopenharmony_ci        JS_FLOAT32_ARRAY,       /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2074514f5e3Sopenharmony_ci        JS_FLOAT64_ARRAY,       /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2084514f5e3Sopenharmony_ci        JS_BIGINT64_ARRAY,      /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2094514f5e3Sopenharmony_ci        JS_BIGUINT64_ARRAY,     /* JS_TYPED_ARRAY_LAST //////////////////////////////////////////////////////////// */ \
2104514f5e3Sopenharmony_ci        JS_SHARED_TYPED_ARRAY,  /* JS_SHARED_TYPED_ARRAY_FIRST //////////////////////////////////////////////////// */ \
2114514f5e3Sopenharmony_ci        JS_SHARED_INT8_ARRAY,  /* /////////////////////////////////////////////////////////////////////////-PADDING */ \
2124514f5e3Sopenharmony_ci        JS_SHARED_UINT8_ARRAY, /* /////////////////////////////////////////////////////////////////////////-PADDING */ \
2134514f5e3Sopenharmony_ci        JS_SHARED_UINT8_CLAMPED_ARRAY, /* /////////////////////////////////////////////////////////////////-PADDING */ \
2144514f5e3Sopenharmony_ci        JS_SHARED_INT16_ARRAY,         /* /////////////////////////////////////////////////////////////////-PADDING */ \
2154514f5e3Sopenharmony_ci        JS_SHARED_UINT16_ARRAY,        /* /////////////////////////////////////////////////////////////////-PADDING */ \
2164514f5e3Sopenharmony_ci        JS_SHARED_INT32_ARRAY,         /* /////////////////////////////////////////////////////////////////-PADDING */ \
2174514f5e3Sopenharmony_ci        JS_SHARED_UINT32_ARRAY,        /* /////////////////////////////////////////////////////////////////-PADDING */ \
2184514f5e3Sopenharmony_ci        JS_SHARED_FLOAT32_ARRAY,       /* /////////////////////////////////////////////////////////////////-PADDING */ \
2194514f5e3Sopenharmony_ci        JS_SHARED_FLOAT64_ARRAY,       /* /////////////////////////////////////////////////////////////////-PADDING */ \
2204514f5e3Sopenharmony_ci        JS_SHARED_BIGINT64_ARRAY,      /* /////////////////////////////////////////////////////////////////-PADDING */ \
2214514f5e3Sopenharmony_ci        JS_SHARED_BIGUINT64_ARRAY,     /* JS_SHARED_TYPED_ARRAY_LAST ////////////////////////////////////////////// */ \
2224514f5e3Sopenharmony_ci        JS_PRIMITIVE_REF, /* number\boolean\string. SPECIAL indexed objects end, DON'T CHANGE HERE ////////-PADDING */ \
2234514f5e3Sopenharmony_ci        JS_MODULE_NAMESPACE, /* ///////////////////////////////////////////////////////////////////////////-PADDING */ \
2244514f5e3Sopenharmony_ci        JS_CJS_MODULE, /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2254514f5e3Sopenharmony_ci        JS_CJS_EXPORTS, /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2264514f5e3Sopenharmony_ci        JS_CJS_REQUIRE, /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2274514f5e3Sopenharmony_ci        NATIVE_MODULE_FAILURE_INFO, /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2284514f5e3Sopenharmony_ci        JS_GLOBAL_OBJECT, /* JS_OBJECT_LAST////////////////////////////////////////////////////////////////-PADDING */ \
2294514f5e3Sopenharmony_ci        JS_PROXY, /* ECMA_OBJECT_LAST ///////////////////////////////////////////////////////////////////////////// */ \
2304514f5e3Sopenharmony_ci                                                                                                                       \
2314514f5e3Sopenharmony_ci        HCLASS,       /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2324514f5e3Sopenharmony_ci        LINE_STRING,   /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2334514f5e3Sopenharmony_ci        CONSTANT_STRING,  /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
2344514f5e3Sopenharmony_ci        SLICED_STRING,  /* ////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2354514f5e3Sopenharmony_ci        TREE_STRING,  /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2364514f5e3Sopenharmony_ci        BIGINT,       /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2374514f5e3Sopenharmony_ci        TAGGED_ARRAY, /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2384514f5e3Sopenharmony_ci        MUTANT_TAGGED_ARRAY, /* ///////////////////////////////////////////////////////////////////////////-PADDING */ \
2394514f5e3Sopenharmony_ci        BYTE_ARRAY,   /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2404514f5e3Sopenharmony_ci        LEXICAL_ENV,  /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2414514f5e3Sopenharmony_ci        SENDABLE_ENV,  /* //////////////////////////////////////////////////////////////////////////////////-PADDING */\
2424514f5e3Sopenharmony_ci        TAGGED_DICTIONARY, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2434514f5e3Sopenharmony_ci        CONSTANT_POOL, /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2444514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2454514f5e3Sopenharmony_ci        COW_MUTANT_TAGGED_ARRAY, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
2464514f5e3Sopenharmony_ci        COW_TAGGED_ARRAY, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
2474514f5e3Sopenharmony_ci        LINKED_NODE,  /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2484514f5e3Sopenharmony_ci        RB_TREENODE,  /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2494514f5e3Sopenharmony_ci        FREE_OBJECT_WITH_ONE_FIELD, /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2504514f5e3Sopenharmony_ci        FREE_OBJECT_WITH_NONE_FIELD, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
2514514f5e3Sopenharmony_ci        FREE_OBJECT_WITH_TWO_FIELD, /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2524514f5e3Sopenharmony_ci        JS_NATIVE_POINTER, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2534514f5e3Sopenharmony_ci        GLOBAL_ENV,        /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2544514f5e3Sopenharmony_ci        ACCESSOR_DATA,     /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2554514f5e3Sopenharmony_ci        INTERNAL_ACCESSOR, /* /////////////////////////////////////////////////////////////////////////////-PADDING */ \
2564514f5e3Sopenharmony_ci        SYMBOL, /* ////////////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2574514f5e3Sopenharmony_ci        JS_GENERATOR_CONTEXT, /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
2584514f5e3Sopenharmony_ci        PROTOTYPE_HANDLER,    /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
2594514f5e3Sopenharmony_ci        TRANSITION_HANDLER,   /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
2604514f5e3Sopenharmony_ci        TRANS_WITH_PROTO_HANDLER,    /* ///////////////////////////////////////////////////////////////////-PADDING */ \
2614514f5e3Sopenharmony_ci        STORE_TS_HANDLER,       /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2624514f5e3Sopenharmony_ci        PROPERTY_BOX, /* //////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2634514f5e3Sopenharmony_ci        PROTO_CHANGE_MARKER, /* ///////////////////////////////////////////////////////////////////////////-PADDING */ \
2644514f5e3Sopenharmony_ci        MARKER_CELL, /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2654514f5e3Sopenharmony_ci        TRACK_INFO,  /* ///////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2664514f5e3Sopenharmony_ci        PROTOTYPE_INFO,     /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
2674514f5e3Sopenharmony_ci        TEMPLATE_MAP,       /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
2684514f5e3Sopenharmony_ci        PROGRAM,       /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2694514f5e3Sopenharmony_ci        METHOD,     /* ////////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2704514f5e3Sopenharmony_ci        CLASS_LITERAL,      /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
2714514f5e3Sopenharmony_ci                                                                                                                       \
2724514f5e3Sopenharmony_ci        PROMISE_CAPABILITY, /* JS_RECORD_FIRST //////////////////////////////////////////////////////////////////// */ \
2734514f5e3Sopenharmony_ci        PROMISE_RECORD,     /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
2744514f5e3Sopenharmony_ci        RESOLVING_FUNCTIONS_RECORD, /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2754514f5e3Sopenharmony_ci        PROMISE_REACTIONS,          /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2764514f5e3Sopenharmony_ci        ASYNC_GENERATOR_REQUEST, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
2774514f5e3Sopenharmony_ci        ASYNC_ITERATOR_RECORD,   /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
2784514f5e3Sopenharmony_ci        PROMISE_ITERATOR_RECORD,    /* ////////////////////////////////////////////////////////////////////-PADDING */ \
2794514f5e3Sopenharmony_ci        MICRO_JOB_QUEUE, /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
2804514f5e3Sopenharmony_ci        PENDING_JOB,     /* ///////////////////////////////////////////////////////////////////////////////-PADDING */ \
2814514f5e3Sopenharmony_ci        MODULE_RECORD, /* /////////////////////////////////////////////////////////////////////////////////-PADDING */ \
2824514f5e3Sopenharmony_ci        SOURCE_TEXT_MODULE_RECORD, /* /////////////////////////////////////////////////////////////////////-PADDING */ \
2834514f5e3Sopenharmony_ci        IMPORTENTRY_RECORD, /* ////////////////////////////////////////////////////////////////////////////-PADDING */ \
2844514f5e3Sopenharmony_ci        LOCAL_EXPORTENTRY_RECORD, /* //////////////////////////////////////////////////////////////////////-PADDING */ \
2854514f5e3Sopenharmony_ci        INDIRECT_EXPORTENTRY_RECORD, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
2864514f5e3Sopenharmony_ci        STAR_EXPORTENTRY_RECORD, /* ///////////////////////////////////////////////////////////////////////-PADDING */ \
2874514f5e3Sopenharmony_ci        RESOLVEDBINDING_RECORD, /* ////////////////////////////////////////////////////////////////////////-PADDING */ \
2884514f5e3Sopenharmony_ci        RESOLVEDINDEXBINDING_RECORD, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
2894514f5e3Sopenharmony_ci        RESOLVEDRECORDINDEXBINDING_RECORD, /* /////////////////////////////////////////////////////////////-PADDING */ \
2904514f5e3Sopenharmony_ci        RESOLVEDRECORDBINDING_RECORD, /* //////////////////////////////////////////////////////////////////-PADDING */ \
2914514f5e3Sopenharmony_ci        CELL_RECORD,          /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
2924514f5e3Sopenharmony_ci        COMPLETION_RECORD, /* JS_RECORD_LAST ////////////////////////////////////////////////////////////////////// */ \
2934514f5e3Sopenharmony_ci        MACHINE_CODE_OBJECT,                                                                                           \
2944514f5e3Sopenharmony_ci        CLASS_INFO_EXTRACTOR, /* //////////////////////////////////////////////////////////////////////////-PADDING */ \
2954514f5e3Sopenharmony_ci                                                                                                                       \
2964514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO_CELL_0,  /* PROFILE_TYPE_INFO_CELL_FIRST ////////////////////////////////////////-PADDING */ \
2974514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO_CELL_1,  /* /////////////////////////////////////////////////////////////////////-PADDING */ \
2984514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO_CELL_N,  /* PROFILE_TYPE_INFO_CELL_LAST /////////////////////////////////////////-PADDING */ \
2994514f5e3Sopenharmony_ci                                                                                                                       \
3004514f5e3Sopenharmony_ci        EXTRA_PROFILE_TYPE_INFO,      /* //////////////////////////////////////////////////////////////////-PADDING */ \
3014514f5e3Sopenharmony_ci        FUNCTION_TEMPLATE,            /* //////////////////////////////////////////////////////////////////-PADDING */ \
3024514f5e3Sopenharmony_ci                                                                                                                       \
3034514f5e3Sopenharmony_ci        VTABLE,                       /* //////////////////////////////////////////////////////////////////-PADDING */ \
3044514f5e3Sopenharmony_ci        AOT_LITERAL_INFO, /* //////////////////////////////////////////////////////////////////////////////-PADDING */ \
3054514f5e3Sopenharmony_ci        TYPE_LAST = AOT_LITERAL_INFO, /* //////////////////////////////////////////////////////////////////-PADDING */ \
3064514f5e3Sopenharmony_ci                                                                                                                       \
3074514f5e3Sopenharmony_ci        JS_FUNCTION_FIRST = JS_FUNCTION, /* ///////////////////////////////////////////////////////////////-PADDING */ \
3084514f5e3Sopenharmony_ci        JS_FUNCTION_LAST = JS_ASYNC_AWAIT_STATUS_FUNCTION, /* /////////////////////////////////////////////-PADDING */ \
3094514f5e3Sopenharmony_ci                                                                                                                       \
3104514f5e3Sopenharmony_ci        JS_OBJECT_FIRST = JS_OBJECT, /* ///////////////////////////////////////////////////////////////////-PADDING */ \
3114514f5e3Sopenharmony_ci        JS_OBJECT_LAST = JS_GLOBAL_OBJECT, /* /////////////////////////////////////////////////////////////-PADDING */ \
3124514f5e3Sopenharmony_ci                                                                                                                       \
3134514f5e3Sopenharmony_ci        ECMA_OBJECT_FIRST = JS_OBJECT, /* /////////////////////////////////////////////////////////////////-PADDING */ \
3144514f5e3Sopenharmony_ci        ECMA_OBJECT_LAST = JS_PROXY,    /* ////////////////////////////////////////////////////////////////-PADDING */ \
3154514f5e3Sopenharmony_ci                                                                                                                       \
3164514f5e3Sopenharmony_ci        JS_ERROR_FIRST = JS_ERROR,      /* ////////////////////////////////////////////////////////////////-PADDING */ \
3174514f5e3Sopenharmony_ci        JS_ERROR_LAST = JS_TERMINATION_ERROR,    /* ///////////////////////////////////////////////////////-PADDING */ \
3184514f5e3Sopenharmony_ci                                                                                                                       \
3194514f5e3Sopenharmony_ci        JS_ITERATOR_FIRST = JS_ITERATOR,      /* //////////////////////////////////////////////////////////-PADDING */ \
3204514f5e3Sopenharmony_ci        JS_ITERATOR_LAST = JS_STRING_ITERATOR, /* /////////////////////////////////////////////////////////-PADDING */ \
3214514f5e3Sopenharmony_ci                                                                                                                       \
3224514f5e3Sopenharmony_ci        JS_RECORD_FIRST = PROMISE_CAPABILITY, /* //////////////////////////////////////////////////////////-PADDING */ \
3234514f5e3Sopenharmony_ci        JS_RECORD_LAST = COMPLETION_RECORD,    /* /////////////////////////////////////////////////////////-PADDING */ \
3244514f5e3Sopenharmony_ci                                                                                                                       \
3254514f5e3Sopenharmony_ci        JS_TYPED_ARRAY_FIRST = JS_TYPED_ARRAY, /* /////////////////////////////////////////////////////////-PADDING */ \
3264514f5e3Sopenharmony_ci        JS_TYPED_ARRAY_LAST = JS_BIGUINT64_ARRAY, /* //////////////////////////////////////////////////////-PADDING */ \
3274514f5e3Sopenharmony_ci                                                                                                                       \
3284514f5e3Sopenharmony_ci        JS_SHARED_TYPED_ARRAY_FIRST = JS_SHARED_TYPED_ARRAY, /* ///////////////////////////////////////////-PADDING */ \
3294514f5e3Sopenharmony_ci        JS_SHARED_TYPED_ARRAY_LAST = JS_SHARED_BIGUINT64_ARRAY, /* ////////////////////////////////////////-PADDING */ \
3304514f5e3Sopenharmony_ci                                                                                                                       \
3314514f5e3Sopenharmony_ci        MODULE_RECORD_FIRST = MODULE_RECORD, /* ///////////////////////////////////////////////////////////-PADDING */ \
3324514f5e3Sopenharmony_ci        MODULE_RECORD_LAST = SOURCE_TEXT_MODULE_RECORD, /* ////////////////////////////////////////////////-PADDING */ \
3334514f5e3Sopenharmony_ci                                                                                                                       \
3344514f5e3Sopenharmony_ci        STRING_FIRST = LINE_STRING, /* ////////////////////////////////////////////////////////////////////-PADDING */ \
3354514f5e3Sopenharmony_ci        STRING_LAST = TREE_STRING,  /* ////////////////////////////////////////////////////////////////////-PADDING */ \
3364514f5e3Sopenharmony_ci                                                                                                                       \
3374514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO_CELL_FIRST = PROFILE_TYPE_INFO_CELL_0,  /* //////////////////////////////////////-PADDING */ \
3384514f5e3Sopenharmony_ci        PROFILE_TYPE_INFO_CELL_LAST = PROFILE_TYPE_INFO_CELL_N    /* //////////////////////////////////////-PADDING */
3394514f5e3Sopenharmony_ci
3404514f5e3Sopenharmony_cienum class JSType : uint8_t {
3414514f5e3Sopenharmony_ci    JSTYPE_DECL,
3424514f5e3Sopenharmony_ci};
3434514f5e3Sopenharmony_ci
3444514f5e3Sopenharmony_ci// EnumCache:
3454514f5e3Sopenharmony_ci// +-----------------+----------------------+
3464514f5e3Sopenharmony_ci// |      value      |     status           |
3474514f5e3Sopenharmony_ci// +-----------------+----------------------+
3484514f5e3Sopenharmony_ci// |      null       |    uninitialized     |
3494514f5e3Sopenharmony_ci// ------------------------------------------
3504514f5e3Sopenharmony_ci// |    undefined    | a fast path to check |
3514514f5e3Sopenharmony_ci// |                 | simple enum cache    |
3524514f5e3Sopenharmony_ci// ------------------------------------------
3534514f5e3Sopenharmony_ci// |   empty array   |  enum keys is empty  |
3544514f5e3Sopenharmony_ci// ------------------------------------------
3554514f5e3Sopenharmony_ci// | non-empty array |  non-empty enum keys |
3564514f5e3Sopenharmony_ci// +----------------------------------------+
3574514f5e3Sopenharmony_ci// structure of non-empty array of EnumCache:
3584514f5e3Sopenharmony_ci// 0: an int value indicating enum cache kind
3594514f5e3Sopenharmony_ci// 1-n: enum keys
3604514f5e3Sopenharmony_cinamespace EnumCache {
3614514f5e3Sopenharmony_cistatic constexpr uint32_t ENUM_CACHE_HEADER_SIZE = 1;
3624514f5e3Sopenharmony_cistatic constexpr uint32_t ENUM_CACHE_KIND_OFFSET = 0;
3634514f5e3Sopenharmony_cienum class EnumCacheKind : uint8_t {
3644514f5e3Sopenharmony_ci    NONE = 0,
3654514f5e3Sopenharmony_ci    SIMPLE,        // simple enum cache(used in for-in)
3664514f5e3Sopenharmony_ci                   // make sure EnumCache is empty array only for SIMPLE
3674514f5e3Sopenharmony_ci    PROTOCHAIN,    // enum cache with prototype chain info(used in for-in)
3684514f5e3Sopenharmony_ci    ONLY_OWN_KEYS  // enum cache with only own enum keys(used in Json.stringify and Object.keys)
3694514f5e3Sopenharmony_ci};
3704514f5e3Sopenharmony_ci
3714514f5e3Sopenharmony_ci}  // namespace EnumCache
3724514f5e3Sopenharmony_ci
3734514f5e3Sopenharmony_cistruct TransitionResult {
3744514f5e3Sopenharmony_ci    bool isTagged;
3754514f5e3Sopenharmony_ci    bool isTransition;
3764514f5e3Sopenharmony_ci    JSTaggedValue value;
3774514f5e3Sopenharmony_ci};
3784514f5e3Sopenharmony_ci
3794514f5e3Sopenharmony_ciclass JSHClass : public TaggedObject {
3804514f5e3Sopenharmony_cipublic:
3814514f5e3Sopenharmony_ci    static constexpr int TYPE_BITFIELD_NUM = 8;
3824514f5e3Sopenharmony_ci    static constexpr int LEVEL_BTTFIELD_NUM = 5;
3834514f5e3Sopenharmony_ci    static constexpr int ELEMENTS_KIND_BITFIELD_NUM = 5;
3844514f5e3Sopenharmony_ci    static constexpr unsigned BITS_PER_BYTE = 8;
3854514f5e3Sopenharmony_ci    using ObjectTypeBits = BitField<JSType, 0, TYPE_BITFIELD_NUM>;                                // 8
3864514f5e3Sopenharmony_ci    using CallableBit = ObjectTypeBits::NextFlag;                                                 // 9
3874514f5e3Sopenharmony_ci    using ConstructorBit = CallableBit::NextFlag;                                                 // 10
3884514f5e3Sopenharmony_ci    using ExtensibleBit = ConstructorBit::NextFlag;                                               // 11
3894514f5e3Sopenharmony_ci    using IsPrototypeBit = ExtensibleBit::NextFlag;                                               // 12
3904514f5e3Sopenharmony_ci    using ElementsKindBits = IsPrototypeBit::NextField<ElementsKind, ELEMENTS_KIND_BITFIELD_NUM>; // 13-17
3914514f5e3Sopenharmony_ci    using DictionaryElementBits = ElementsKindBits::NextFlag;                                     // 18
3924514f5e3Sopenharmony_ci    using IsDictionaryBit = DictionaryElementBits::NextFlag;                                      // 19
3934514f5e3Sopenharmony_ci    using IsStableElementsBit = IsDictionaryBit::NextFlag;                                        // 20
3944514f5e3Sopenharmony_ci    using HasConstructorBits = IsStableElementsBit::NextFlag;                                     // 21
3954514f5e3Sopenharmony_ci    using IsClassConstructorOrPrototypeBit = HasConstructorBits::NextFlag;                        // 22
3964514f5e3Sopenharmony_ci    using IsNativeBindingObjectBit = IsClassConstructorOrPrototypeBit::NextFlag;                  // 23
3974514f5e3Sopenharmony_ci    using IsTSBit = IsNativeBindingObjectBit::NextFlag;                                           // 24
3984514f5e3Sopenharmony_ci    using LevelBit = IsTSBit::NextField<uint32_t, LEVEL_BTTFIELD_NUM>;                            // 25-29
3994514f5e3Sopenharmony_ci    using IsJSFunctionBit = LevelBit::NextFlag;                                                   // 30
4004514f5e3Sopenharmony_ci    using IsOnHeap = IsJSFunctionBit::NextFlag;                                                   // 31
4014514f5e3Sopenharmony_ci    using IsJSSharedBit = IsOnHeap::NextFlag;                                                     // 32
4024514f5e3Sopenharmony_ci    using BitFieldLastBit = IsJSSharedBit;
4034514f5e3Sopenharmony_ci    static_assert(BitFieldLastBit::START_BIT + BitFieldLastBit::SIZE <= sizeof(uint32_t) * BITS_PER_BYTE, "Invalid");
4044514f5e3Sopenharmony_ci
4054514f5e3Sopenharmony_ci    static constexpr int DEFAULT_CAPACITY_OF_IN_OBJECTS = 4;
4064514f5e3Sopenharmony_ci    static constexpr int OFFSET_MAX_OBJECT_SIZE_IN_WORDS_WITHOUT_INLINED = 5;
4074514f5e3Sopenharmony_ci    static constexpr int OFFSET_MAX_OBJECT_SIZE_IN_WORDS =
4084514f5e3Sopenharmony_ci        PropertyAttributes::OFFSET_BITFIELD_NUM + OFFSET_MAX_OBJECT_SIZE_IN_WORDS_WITHOUT_INLINED;
4094514f5e3Sopenharmony_ci    static constexpr int MAX_OBJECT_SIZE_IN_WORDS = (1U << OFFSET_MAX_OBJECT_SIZE_IN_WORDS) - 1;
4104514f5e3Sopenharmony_ci
4114514f5e3Sopenharmony_ci    using NumberOfPropsBits = BitField<uint32_t, 0, PropertyAttributes::OFFSET_BITFIELD_NUM>;                  // 10
4124514f5e3Sopenharmony_ci    using InlinedPropsStartBits = NumberOfPropsBits::NextField<uint32_t,
4134514f5e3Sopenharmony_ci        OFFSET_MAX_OBJECT_SIZE_IN_WORDS_WITHOUT_INLINED>;                                                      // 15
4144514f5e3Sopenharmony_ci    using ObjectSizeInWordsBits = InlinedPropsStartBits::NextField<uint32_t, OFFSET_MAX_OBJECT_SIZE_IN_WORDS>; // 30
4154514f5e3Sopenharmony_ci    using HasDeletePropertyBit = ObjectSizeInWordsBits::NextFlag;                                              //
4164514f5e3Sopenharmony_ci    using IsAllTaggedPropBit = HasDeletePropertyBit::NextFlag;                                                 // 32
4174514f5e3Sopenharmony_ci    using BitField1LastBit = IsAllTaggedPropBit;
4184514f5e3Sopenharmony_ci    static_assert(BitField1LastBit::START_BIT + BitField1LastBit::SIZE <= sizeof(uint32_t) * BITS_PER_BYTE, "Invalid");
4194514f5e3Sopenharmony_ci
4204514f5e3Sopenharmony_ci    static JSHClass *Cast(const TaggedObject *object)
4214514f5e3Sopenharmony_ci    {
4224514f5e3Sopenharmony_ci        ASSERT(JSTaggedValue(object).IsJSHClass());
4234514f5e3Sopenharmony_ci        return static_cast<JSHClass *>(const_cast<TaggedObject *>(object));
4244514f5e3Sopenharmony_ci    }
4254514f5e3Sopenharmony_ci
4264514f5e3Sopenharmony_ci    inline size_t SizeFromJSHClass(TaggedObject *header);
4274514f5e3Sopenharmony_ci    inline bool HasReferenceField();
4284514f5e3Sopenharmony_ci
4294514f5e3Sopenharmony_ci    // size need to add inlined property numbers
4304514f5e3Sopenharmony_ci    void Initialize(const JSThread *thread, uint32_t size, JSType type, uint32_t inlinedProps);
4314514f5e3Sopenharmony_ci    // for sharedHeap
4324514f5e3Sopenharmony_ci    void Initialize(const JSThread *thread, uint32_t size, JSType type, uint32_t inlinedProps,
4334514f5e3Sopenharmony_ci        const JSHandle<JSTaggedValue> &layout);
4344514f5e3Sopenharmony_ci    static JSHandle<JSHClass> Clone(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4354514f5e3Sopenharmony_ci                                    bool withoutInlinedProperties = false, uint32_t incInlinedProperties = 0);
4364514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CloneWithoutInlinedProperties(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
4374514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CloneWithElementsKind(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4384514f5e3Sopenharmony_ci                                                    const ElementsKind kind, bool isPrototype);
4394514f5e3Sopenharmony_ci
4404514f5e3Sopenharmony_ci    static void TransitionElementsToDictionary(const JSThread *thread, const JSHandle<JSObject> &obj);
4414514f5e3Sopenharmony_ci    static void OptimizeAsFastElements(const JSThread *thread, JSHandle<JSObject> obj);
4424514f5e3Sopenharmony_ci    static void OptimizeAsFastProperties(const JSThread *thread, const JSHandle<JSObject> &obj,
4434514f5e3Sopenharmony_ci                                         const std::vector<int> &indexArray = {}, bool isDictionary = false);
4444514f5e3Sopenharmony_ci    template<bool checkDuplicateKeys = false>
4454514f5e3Sopenharmony_ci    static JSHandle<JSHClass> SetPropertyOfObjHClass(const JSThread *thread, JSHandle<JSHClass> &jshclass,
4464514f5e3Sopenharmony_ci                                                     const JSHandle<JSTaggedValue> &key,
4474514f5e3Sopenharmony_ci                                                     const PropertyAttributes &attr,
4484514f5e3Sopenharmony_ci                                                     const Representation &rep);
4494514f5e3Sopenharmony_ci    static void PUBLIC_API AddProperty(const JSThread *thread, const JSHandle<JSObject> &obj,
4504514f5e3Sopenharmony_ci                                       const JSHandle<JSTaggedValue> &key, const PropertyAttributes &attr,
4514514f5e3Sopenharmony_ci                                       const Representation &rep = Representation::NONE);
4524514f5e3Sopenharmony_ci
4534514f5e3Sopenharmony_ci    inline static void RestoreElementsKindToGeneric(JSHClass *newJsHClass);
4544514f5e3Sopenharmony_ci
4554514f5e3Sopenharmony_ci    static JSHandle<JSHClass> TransitionExtension(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
4564514f5e3Sopenharmony_ci    static void ReBuildFunctionInheritanceRelationship(const JSThread *thread,
4574514f5e3Sopenharmony_ci                                                       const JSHandle<JSTaggedValue> &proto,
4584514f5e3Sopenharmony_ci                                                       const JSHandle<JSTaggedValue> &baseIhc,
4594514f5e3Sopenharmony_ci                                                       const JSHandle<JSTaggedValue> &transIhc,
4604514f5e3Sopenharmony_ci                                                       const JSHandle<JSTaggedValue> &transPhc);
4614514f5e3Sopenharmony_ci    static JSHandle<JSHClass> TransitionProto(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4624514f5e3Sopenharmony_ci                                              const JSHandle<JSTaggedValue> &proto, bool isChangeProto = false);
4634514f5e3Sopenharmony_ci    static JSHClass *FindTransitionProtoForAOT(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4644514f5e3Sopenharmony_ci                                               const JSHandle<JSTaggedValue> &proto);
4654514f5e3Sopenharmony_ci    static JSHandle<JSHClass> TransProtoWithoutLayout(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4664514f5e3Sopenharmony_ci                                                      const JSHandle<JSTaggedValue> &proto);
4674514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CloneWithAddProto(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
4684514f5e3Sopenharmony_ci                                                const JSHandle<JSTaggedValue> &key,
4694514f5e3Sopenharmony_ci                                                const JSHandle<JSTaggedValue> &proto);
4704514f5e3Sopenharmony_ci    static void TransitionToDictionary(const JSThread *thread, const JSHandle<JSObject> &obj);
4714514f5e3Sopenharmony_ci    static void TransitionForRepChange(const JSThread *thread, const JSHandle<JSObject> &receiver,
4724514f5e3Sopenharmony_ci                                       const JSHandle<JSTaggedValue> &key, PropertyAttributes attr);
4734514f5e3Sopenharmony_ci    static void TransitionForElementsKindChange(const JSThread *thread, const JSHandle<JSObject> &receiver,
4744514f5e3Sopenharmony_ci                                         const ElementsKind newKind);
4754514f5e3Sopenharmony_ci    static bool IsInitialArrayHClassWithElementsKind(const JSThread *thread, const JSHClass *targetHClass,
4764514f5e3Sopenharmony_ci                                                     const ElementsKind targetKind);
4774514f5e3Sopenharmony_ci    static bool PUBLIC_API TransitToElementsKindUncheck(const JSThread *thread, const JSHandle<JSObject> &obj,
4784514f5e3Sopenharmony_ci                                                        ElementsKind newKind);
4794514f5e3Sopenharmony_ci    static void PUBLIC_API TransitToElementsKind(const JSThread *thread, const JSHandle<JSArray> &array,
4804514f5e3Sopenharmony_ci                                                 ElementsKind newKind = ElementsKind::NONE);
4814514f5e3Sopenharmony_ci    static bool PUBLIC_API TransitToElementsKind(const JSThread *thread, const JSHandle<JSObject> &object,
4824514f5e3Sopenharmony_ci                                                 const JSHandle<JSTaggedValue> &value,
4834514f5e3Sopenharmony_ci                                                 ElementsKind kind = ElementsKind::NONE);
4844514f5e3Sopenharmony_ci    static TransitionResult PUBLIC_API ConvertOrTransitionWithRep(const JSThread *thread,
4854514f5e3Sopenharmony_ci        const JSHandle<JSObject> &receiver, const JSHandle<JSTaggedValue> &key, const JSHandle<JSTaggedValue> &value,
4864514f5e3Sopenharmony_ci        PropertyAttributes &attr);
4874514f5e3Sopenharmony_ci
4884514f5e3Sopenharmony_ci    static void UpdateFieldType(JSHClass *hclass, const PropertyAttributes &attr);
4894514f5e3Sopenharmony_ci    static JSHClass *FindFieldOwnHClass(JSHClass *hclass, const PropertyAttributes &attr);
4904514f5e3Sopenharmony_ci    static void VisitAndUpdateLayout(JSHClass *ownHClass, const PropertyAttributes &attr);
4914514f5e3Sopenharmony_ci
4924514f5e3Sopenharmony_ci    static JSHandle<JSTaggedValue> EnableProtoChangeMarker(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
4934514f5e3Sopenharmony_ci    static JSHandle<JSTaggedValue> EnablePHCProtoChangeMarker(
4944514f5e3Sopenharmony_ci        const JSThread *thread, const JSHandle<JSHClass> &protoClass);
4954514f5e3Sopenharmony_ci
4964514f5e3Sopenharmony_ci    static void NotifyHclassChanged(const JSThread *thread, JSHandle<JSHClass> oldHclass, JSHandle<JSHClass> newHclass,
4974514f5e3Sopenharmony_ci                                    JSTaggedValue addedKey = JSTaggedValue::Undefined());
4984514f5e3Sopenharmony_ci
4994514f5e3Sopenharmony_ci    static void NotifyAccessorChanged(const JSThread *thread, JSHandle<JSHClass> hclass);
5004514f5e3Sopenharmony_ci
5014514f5e3Sopenharmony_ci    static void RegisterOnProtoChain(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
5024514f5e3Sopenharmony_ci
5034514f5e3Sopenharmony_ci    static bool UnregisterOnProtoChain(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
5044514f5e3Sopenharmony_ci
5054514f5e3Sopenharmony_ci    static JSHandle<ProtoChangeDetails> GetProtoChangeDetails(const JSThread *thread,
5064514f5e3Sopenharmony_ci                                                              const JSHandle<JSHClass> &jshclass);
5074514f5e3Sopenharmony_ci
5084514f5e3Sopenharmony_ci    static JSHandle<ProtoChangeDetails> GetProtoChangeDetails(const JSThread *thread, const JSHandle<JSObject> &obj);
5094514f5e3Sopenharmony_ci
5104514f5e3Sopenharmony_ci    inline void UpdatePropertyMetaData(const JSThread *thread, const JSTaggedValue &key,
5114514f5e3Sopenharmony_ci                                      const PropertyAttributes &metaData);
5124514f5e3Sopenharmony_ci
5134514f5e3Sopenharmony_ci    static void MarkProtoChanged(const JSThread *thread, const JSHandle<JSHClass> &jshclass);
5144514f5e3Sopenharmony_ci
5154514f5e3Sopenharmony_ci    static void NoticeThroughChain(const JSThread *thread, const JSHandle<JSHClass> &jshclass,
5164514f5e3Sopenharmony_ci                                   JSTaggedValue addedKey = JSTaggedValue::Undefined());
5174514f5e3Sopenharmony_ci
5184514f5e3Sopenharmony_ci    static void RefreshUsers(const JSThread *thread, const JSHandle<JSHClass> &oldHclass,
5194514f5e3Sopenharmony_ci                             const JSHandle<JSHClass> &newHclass);
5204514f5e3Sopenharmony_ci
5214514f5e3Sopenharmony_ci    static bool IsNeedNotifyHclassChangedForAotTransition(const JSThread *thread, const JSHandle<JSHClass> &hclass,
5224514f5e3Sopenharmony_ci                                                          JSTaggedValue key);
5234514f5e3Sopenharmony_ci
5244514f5e3Sopenharmony_ci    static JSHandle<JSTaggedValue> ParseKeyFromPGOCString(ObjectFactory* factory,
5254514f5e3Sopenharmony_ci                                                          const CString& key,
5264514f5e3Sopenharmony_ci                                                          const PGOHandler& handler);
5274514f5e3Sopenharmony_ci
5284514f5e3Sopenharmony_ci    inline void ClearBitField()
5294514f5e3Sopenharmony_ci    {
5304514f5e3Sopenharmony_ci        SetProfileType(0ULL);
5314514f5e3Sopenharmony_ci        SetBitField(0UL);
5324514f5e3Sopenharmony_ci        SetBitField1(0UL);
5334514f5e3Sopenharmony_ci    }
5344514f5e3Sopenharmony_ci
5354514f5e3Sopenharmony_ci    inline JSType GetObjectType() const
5364514f5e3Sopenharmony_ci    {
5374514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
5384514f5e3Sopenharmony_ci        return ObjectTypeBits::Decode(bits);
5394514f5e3Sopenharmony_ci    }
5404514f5e3Sopenharmony_ci
5414514f5e3Sopenharmony_ci    inline void SetObjectType(JSType type)
5424514f5e3Sopenharmony_ci    {
5434514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
5444514f5e3Sopenharmony_ci        uint32_t newVal = ObjectTypeBits::Update(bits, type);
5454514f5e3Sopenharmony_ci        SetBitField(newVal);
5464514f5e3Sopenharmony_ci    }
5474514f5e3Sopenharmony_ci
5484514f5e3Sopenharmony_ci    inline void SetCallable(bool flag)
5494514f5e3Sopenharmony_ci    {
5504514f5e3Sopenharmony_ci        CallableBit::Set<uint32_t>(flag, GetBitFieldAddr());
5514514f5e3Sopenharmony_ci    }
5524514f5e3Sopenharmony_ci
5534514f5e3Sopenharmony_ci    inline void SetConstructor(bool flag) const
5544514f5e3Sopenharmony_ci    {
5554514f5e3Sopenharmony_ci        ConstructorBit::Set<uint32_t>(flag, GetBitFieldAddr());
5564514f5e3Sopenharmony_ci    }
5574514f5e3Sopenharmony_ci
5584514f5e3Sopenharmony_ci    inline void SetExtensible(bool flag) const
5594514f5e3Sopenharmony_ci    {
5604514f5e3Sopenharmony_ci        ExtensibleBit::Set<uint32_t>(flag, GetBitFieldAddr());
5614514f5e3Sopenharmony_ci    }
5624514f5e3Sopenharmony_ci
5634514f5e3Sopenharmony_ci    inline void SetIsPrototype(bool flag) const
5644514f5e3Sopenharmony_ci    {
5654514f5e3Sopenharmony_ci        IsPrototypeBit::Set<uint32_t>(flag, GetBitFieldAddr());
5664514f5e3Sopenharmony_ci    }
5674514f5e3Sopenharmony_ci
5684514f5e3Sopenharmony_ci    inline void SetClassConstructor(bool flag) const
5694514f5e3Sopenharmony_ci    {
5704514f5e3Sopenharmony_ci        IsClassConstructorOrPrototypeBit::Set<uint32_t>(flag, GetBitFieldAddr());
5714514f5e3Sopenharmony_ci        SetConstructor(flag);
5724514f5e3Sopenharmony_ci    }
5734514f5e3Sopenharmony_ci
5744514f5e3Sopenharmony_ci    inline void SetClassPrototype(bool flag) const
5754514f5e3Sopenharmony_ci    {
5764514f5e3Sopenharmony_ci        IsClassConstructorOrPrototypeBit::Set<uint32_t>(flag, GetBitFieldAddr());
5774514f5e3Sopenharmony_ci        SetIsPrototype(flag);
5784514f5e3Sopenharmony_ci    }
5794514f5e3Sopenharmony_ci
5804514f5e3Sopenharmony_ci    inline void SetIsNativeBindingObject(bool flag) const
5814514f5e3Sopenharmony_ci    {
5824514f5e3Sopenharmony_ci        IsNativeBindingObjectBit::Set<uint32_t>(flag, GetBitFieldAddr());
5834514f5e3Sopenharmony_ci    }
5844514f5e3Sopenharmony_ci
5854514f5e3Sopenharmony_ci    inline void SetIsDictionaryMode(bool flag) const
5864514f5e3Sopenharmony_ci    {
5874514f5e3Sopenharmony_ci        IsDictionaryBit::Set<uint32_t>(flag, GetBitFieldAddr());
5884514f5e3Sopenharmony_ci    }
5894514f5e3Sopenharmony_ci
5904514f5e3Sopenharmony_ci    inline void SetTS(bool flag) const
5914514f5e3Sopenharmony_ci    {
5924514f5e3Sopenharmony_ci        IsTSBit::Set<uint32_t>(flag, GetBitFieldAddr());
5934514f5e3Sopenharmony_ci    }
5944514f5e3Sopenharmony_ci
5954514f5e3Sopenharmony_ci    inline void SetIsJSFunction(bool flag) const
5964514f5e3Sopenharmony_ci    {
5974514f5e3Sopenharmony_ci        IsJSFunctionBit::Set<uint32_t>(flag, GetBitFieldAddr());
5984514f5e3Sopenharmony_ci    }
5994514f5e3Sopenharmony_ci
6004514f5e3Sopenharmony_ci    inline void SetIsOnHeap(bool flag) const
6014514f5e3Sopenharmony_ci    {
6024514f5e3Sopenharmony_ci        IsOnHeap::Set<uint32_t>(flag, GetBitFieldAddr());
6034514f5e3Sopenharmony_ci    }
6044514f5e3Sopenharmony_ci
6054514f5e3Sopenharmony_ci    inline bool IsJSObject() const
6064514f5e3Sopenharmony_ci    {
6074514f5e3Sopenharmony_ci        return IsJSTypeObject(GetObjectType());
6084514f5e3Sopenharmony_ci    }
6094514f5e3Sopenharmony_ci
6104514f5e3Sopenharmony_ci    inline bool IsOnlyJSObject() const
6114514f5e3Sopenharmony_ci    {
6124514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_OBJECT;
6134514f5e3Sopenharmony_ci    }
6144514f5e3Sopenharmony_ci
6154514f5e3Sopenharmony_ci    inline bool IsECMAObject() const
6164514f5e3Sopenharmony_ci    {
6174514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
6184514f5e3Sopenharmony_ci        return (JSType::ECMA_OBJECT_FIRST <= jsType && jsType <= JSType::ECMA_OBJECT_LAST);
6194514f5e3Sopenharmony_ci    }
6204514f5e3Sopenharmony_ci
6214514f5e3Sopenharmony_ci    inline bool ShouldSetDefaultSupers() const
6224514f5e3Sopenharmony_ci    {
6234514f5e3Sopenharmony_ci        return IsECMAObject() || IsStringOrSymbol();
6244514f5e3Sopenharmony_ci    }
6254514f5e3Sopenharmony_ci
6264514f5e3Sopenharmony_ci    inline bool IsRealm() const
6274514f5e3Sopenharmony_ci    {
6284514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_REALM;
6294514f5e3Sopenharmony_ci    }
6304514f5e3Sopenharmony_ci
6314514f5e3Sopenharmony_ci    inline bool IsHClass() const
6324514f5e3Sopenharmony_ci    {
6334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::HCLASS;
6344514f5e3Sopenharmony_ci    }
6354514f5e3Sopenharmony_ci
6364514f5e3Sopenharmony_ci    inline bool IsString() const
6374514f5e3Sopenharmony_ci    {
6384514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
6394514f5e3Sopenharmony_ci        return (JSType::STRING_FIRST <= jsType && jsType <= JSType::STRING_LAST);
6404514f5e3Sopenharmony_ci    }
6414514f5e3Sopenharmony_ci
6424514f5e3Sopenharmony_ci    inline bool IsLineString() const
6434514f5e3Sopenharmony_ci    {
6444514f5e3Sopenharmony_ci        return GetObjectType() == JSType::LINE_STRING;
6454514f5e3Sopenharmony_ci    }
6464514f5e3Sopenharmony_ci
6474514f5e3Sopenharmony_ci    inline bool IsConstantString() const
6484514f5e3Sopenharmony_ci    {
6494514f5e3Sopenharmony_ci        return GetObjectType() == JSType::CONSTANT_STRING;
6504514f5e3Sopenharmony_ci    }
6514514f5e3Sopenharmony_ci
6524514f5e3Sopenharmony_ci    inline bool IsSlicedString() const
6534514f5e3Sopenharmony_ci    {
6544514f5e3Sopenharmony_ci        return GetObjectType() == JSType::SLICED_STRING;
6554514f5e3Sopenharmony_ci    }
6564514f5e3Sopenharmony_ci
6574514f5e3Sopenharmony_ci    inline bool IsTreeString() const
6584514f5e3Sopenharmony_ci    {
6594514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TREE_STRING;
6604514f5e3Sopenharmony_ci    }
6614514f5e3Sopenharmony_ci
6624514f5e3Sopenharmony_ci    inline bool IsBigInt() const
6634514f5e3Sopenharmony_ci    {
6644514f5e3Sopenharmony_ci        return GetObjectType() == JSType::BIGINT;
6654514f5e3Sopenharmony_ci    }
6664514f5e3Sopenharmony_ci
6674514f5e3Sopenharmony_ci    inline bool IsSymbol() const
6684514f5e3Sopenharmony_ci    {
6694514f5e3Sopenharmony_ci        return GetObjectType() == JSType::SYMBOL;
6704514f5e3Sopenharmony_ci    }
6714514f5e3Sopenharmony_ci
6724514f5e3Sopenharmony_ci    inline bool IsStringOrSymbol() const
6734514f5e3Sopenharmony_ci    {
6744514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
6754514f5e3Sopenharmony_ci        return (JSType::STRING_FIRST <= jsType && jsType <= JSType::STRING_LAST) || (jsType == JSType::SYMBOL);
6764514f5e3Sopenharmony_ci    }
6774514f5e3Sopenharmony_ci
6784514f5e3Sopenharmony_ci    inline bool IsTaggedArray() const
6794514f5e3Sopenharmony_ci    {
6804514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
6814514f5e3Sopenharmony_ci        switch (jsType) {
6824514f5e3Sopenharmony_ci            case JSType::TAGGED_ARRAY:
6834514f5e3Sopenharmony_ci            case JSType::TAGGED_DICTIONARY:
6844514f5e3Sopenharmony_ci            case JSType::LEXICAL_ENV:
6854514f5e3Sopenharmony_ci            case JSType::SENDABLE_ENV:
6864514f5e3Sopenharmony_ci            case JSType::CONSTANT_POOL:
6874514f5e3Sopenharmony_ci            case JSType::PROFILE_TYPE_INFO:
6884514f5e3Sopenharmony_ci            case JSType::AOT_LITERAL_INFO:
6894514f5e3Sopenharmony_ci            case JSType::VTABLE:
6904514f5e3Sopenharmony_ci            case JSType::COW_TAGGED_ARRAY:
6914514f5e3Sopenharmony_ci            case JSType::MUTANT_TAGGED_ARRAY:
6924514f5e3Sopenharmony_ci            case JSType::COW_MUTANT_TAGGED_ARRAY:
6934514f5e3Sopenharmony_ci                return true;
6944514f5e3Sopenharmony_ci            default:
6954514f5e3Sopenharmony_ci                return false;
6964514f5e3Sopenharmony_ci        }
6974514f5e3Sopenharmony_ci    }
6984514f5e3Sopenharmony_ci
6994514f5e3Sopenharmony_ci    inline bool IsLexicalEnv() const
7004514f5e3Sopenharmony_ci    {
7014514f5e3Sopenharmony_ci        return GetObjectType() == JSType::LEXICAL_ENV;
7024514f5e3Sopenharmony_ci    }
7034514f5e3Sopenharmony_ci    inline bool IsByteArray() const
7044514f5e3Sopenharmony_ci    {
7054514f5e3Sopenharmony_ci        return GetObjectType() == JSType::BYTE_ARRAY;
7064514f5e3Sopenharmony_ci    }
7074514f5e3Sopenharmony_ci
7084514f5e3Sopenharmony_ci    inline bool IsConstantPool() const
7094514f5e3Sopenharmony_ci    {
7104514f5e3Sopenharmony_ci        return GetObjectType() == JSType::CONSTANT_POOL;
7114514f5e3Sopenharmony_ci    }
7124514f5e3Sopenharmony_ci
7134514f5e3Sopenharmony_ci    inline bool IsDictionary() const
7144514f5e3Sopenharmony_ci    {
7154514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TAGGED_DICTIONARY;
7164514f5e3Sopenharmony_ci    }
7174514f5e3Sopenharmony_ci
7184514f5e3Sopenharmony_ci    inline bool IsCOWArray() const
7194514f5e3Sopenharmony_ci    {
7204514f5e3Sopenharmony_ci        // Copy On Write ARRAY.
7214514f5e3Sopenharmony_ci        return GetObjectType() == JSType::COW_TAGGED_ARRAY ||
7224514f5e3Sopenharmony_ci               GetObjectType() == JSType::COW_MUTANT_TAGGED_ARRAY;
7234514f5e3Sopenharmony_ci    }
7244514f5e3Sopenharmony_ci
7254514f5e3Sopenharmony_ci    inline bool IsMutantTaggedArray() const
7264514f5e3Sopenharmony_ci    {
7274514f5e3Sopenharmony_ci        return GetObjectType() == JSType::MUTANT_TAGGED_ARRAY ||
7284514f5e3Sopenharmony_ci               GetObjectType() == JSType::COW_MUTANT_TAGGED_ARRAY;
7294514f5e3Sopenharmony_ci    }
7304514f5e3Sopenharmony_ci
7314514f5e3Sopenharmony_ci    inline bool IsJSNativePointer() const
7324514f5e3Sopenharmony_ci    {
7334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_NATIVE_POINTER;
7344514f5e3Sopenharmony_ci    }
7354514f5e3Sopenharmony_ci
7364514f5e3Sopenharmony_ci    inline bool IsJSSymbol() const
7374514f5e3Sopenharmony_ci    {
7384514f5e3Sopenharmony_ci        return GetObjectType() == JSType::SYMBOL;
7394514f5e3Sopenharmony_ci    }
7404514f5e3Sopenharmony_ci
7414514f5e3Sopenharmony_ci    inline bool IsJSArray() const
7424514f5e3Sopenharmony_ci    {
7434514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ARRAY;
7444514f5e3Sopenharmony_ci    }
7454514f5e3Sopenharmony_ci
7464514f5e3Sopenharmony_ci    inline bool IsTypedArray() const
7474514f5e3Sopenharmony_ci    {
7484514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
7494514f5e3Sopenharmony_ci        return (JSType::JS_TYPED_ARRAY_FIRST < jsType && jsType <= JSType::JS_TYPED_ARRAY_LAST);
7504514f5e3Sopenharmony_ci    }
7514514f5e3Sopenharmony_ci
7524514f5e3Sopenharmony_ci    inline bool IsSharedTypedArray() const
7534514f5e3Sopenharmony_ci    {
7544514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
7554514f5e3Sopenharmony_ci        return (JSType::JS_SHARED_TYPED_ARRAY_FIRST < jsType && jsType <= JSType::JS_SHARED_TYPED_ARRAY_LAST);
7564514f5e3Sopenharmony_ci    }
7574514f5e3Sopenharmony_ci
7584514f5e3Sopenharmony_ci    inline bool HasOrdinaryGet() const
7594514f5e3Sopenharmony_ci    {
7604514f5e3Sopenharmony_ci        return (IsSpecialContainer() || IsModuleNamespace() || IsBigInt64Array());
7614514f5e3Sopenharmony_ci    }
7624514f5e3Sopenharmony_ci
7634514f5e3Sopenharmony_ci    inline bool IsJSTypedArray() const
7644514f5e3Sopenharmony_ci    {
7654514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_TYPED_ARRAY;
7664514f5e3Sopenharmony_ci    }
7674514f5e3Sopenharmony_ci
7684514f5e3Sopenharmony_ci    inline bool IsJSInt8Array() const
7694514f5e3Sopenharmony_ci    {
7704514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_INT8_ARRAY;
7714514f5e3Sopenharmony_ci    }
7724514f5e3Sopenharmony_ci
7734514f5e3Sopenharmony_ci    inline bool IsJSUint8Array() const
7744514f5e3Sopenharmony_ci    {
7754514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_UINT8_ARRAY;
7764514f5e3Sopenharmony_ci    }
7774514f5e3Sopenharmony_ci
7784514f5e3Sopenharmony_ci    inline bool IsJSUint8ClampedArray() const
7794514f5e3Sopenharmony_ci    {
7804514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_UINT8_CLAMPED_ARRAY;
7814514f5e3Sopenharmony_ci    }
7824514f5e3Sopenharmony_ci
7834514f5e3Sopenharmony_ci    inline bool IsJSInt16Array() const
7844514f5e3Sopenharmony_ci    {
7854514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_INT16_ARRAY;
7864514f5e3Sopenharmony_ci    }
7874514f5e3Sopenharmony_ci
7884514f5e3Sopenharmony_ci    inline bool IsJSUint16Array() const
7894514f5e3Sopenharmony_ci    {
7904514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_UINT16_ARRAY;
7914514f5e3Sopenharmony_ci    }
7924514f5e3Sopenharmony_ci
7934514f5e3Sopenharmony_ci    inline bool IsJSInt32Array() const
7944514f5e3Sopenharmony_ci    {
7954514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_INT32_ARRAY;
7964514f5e3Sopenharmony_ci    }
7974514f5e3Sopenharmony_ci
7984514f5e3Sopenharmony_ci    inline bool IsJSUint32Array() const
7994514f5e3Sopenharmony_ci    {
8004514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_UINT32_ARRAY;
8014514f5e3Sopenharmony_ci    }
8024514f5e3Sopenharmony_ci
8034514f5e3Sopenharmony_ci    inline bool IsJSFloat32Array() const
8044514f5e3Sopenharmony_ci    {
8054514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_FLOAT32_ARRAY;
8064514f5e3Sopenharmony_ci    }
8074514f5e3Sopenharmony_ci
8084514f5e3Sopenharmony_ci    inline bool IsJSFloat64Array() const
8094514f5e3Sopenharmony_ci    {
8104514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_FLOAT64_ARRAY;
8114514f5e3Sopenharmony_ci    }
8124514f5e3Sopenharmony_ci
8134514f5e3Sopenharmony_ci    inline bool IsJSBigInt64Array() const
8144514f5e3Sopenharmony_ci    {
8154514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_BIGINT64_ARRAY;
8164514f5e3Sopenharmony_ci    }
8174514f5e3Sopenharmony_ci
8184514f5e3Sopenharmony_ci    inline bool IsJSBigUint64Array() const
8194514f5e3Sopenharmony_ci    {
8204514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_BIGUINT64_ARRAY;
8214514f5e3Sopenharmony_ci    }
8224514f5e3Sopenharmony_ci
8234514f5e3Sopenharmony_ci    inline bool IsJSSharedTypedArray() const
8244514f5e3Sopenharmony_ci    {
8254514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_TYPED_ARRAY;
8264514f5e3Sopenharmony_ci    }
8274514f5e3Sopenharmony_ci
8284514f5e3Sopenharmony_ci    inline bool IsJSSharedInt8Array() const
8294514f5e3Sopenharmony_ci    {
8304514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_INT8_ARRAY;
8314514f5e3Sopenharmony_ci    }
8324514f5e3Sopenharmony_ci
8334514f5e3Sopenharmony_ci    inline bool IsJSSharedUint8Array() const
8344514f5e3Sopenharmony_ci    {
8354514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_UINT8_ARRAY;
8364514f5e3Sopenharmony_ci    }
8374514f5e3Sopenharmony_ci
8384514f5e3Sopenharmony_ci    inline bool IsJSSharedUint8ClampedArray() const
8394514f5e3Sopenharmony_ci    {
8404514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_UINT8_CLAMPED_ARRAY;
8414514f5e3Sopenharmony_ci    }
8424514f5e3Sopenharmony_ci
8434514f5e3Sopenharmony_ci    inline bool IsJSSharedInt16Array() const
8444514f5e3Sopenharmony_ci    {
8454514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_INT16_ARRAY;
8464514f5e3Sopenharmony_ci    }
8474514f5e3Sopenharmony_ci
8484514f5e3Sopenharmony_ci    inline bool IsJSSharedUint16Array() const
8494514f5e3Sopenharmony_ci    {
8504514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_UINT16_ARRAY;
8514514f5e3Sopenharmony_ci    }
8524514f5e3Sopenharmony_ci
8534514f5e3Sopenharmony_ci    inline bool IsJSSharedInt32Array() const
8544514f5e3Sopenharmony_ci    {
8554514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_INT32_ARRAY;
8564514f5e3Sopenharmony_ci    }
8574514f5e3Sopenharmony_ci
8584514f5e3Sopenharmony_ci    inline bool IsJSSharedUint32Array() const
8594514f5e3Sopenharmony_ci    {
8604514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_UINT32_ARRAY;
8614514f5e3Sopenharmony_ci    }
8624514f5e3Sopenharmony_ci
8634514f5e3Sopenharmony_ci    inline bool IsJSSharedFloat32Array() const
8644514f5e3Sopenharmony_ci    {
8654514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_FLOAT32_ARRAY;
8664514f5e3Sopenharmony_ci    }
8674514f5e3Sopenharmony_ci
8684514f5e3Sopenharmony_ci    inline bool IsJSSharedFloat64Array() const
8694514f5e3Sopenharmony_ci    {
8704514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_FLOAT64_ARRAY;
8714514f5e3Sopenharmony_ci    }
8724514f5e3Sopenharmony_ci
8734514f5e3Sopenharmony_ci    inline bool IsJSSharedBigInt64Array() const
8744514f5e3Sopenharmony_ci    {
8754514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_BIGINT64_ARRAY;
8764514f5e3Sopenharmony_ci    }
8774514f5e3Sopenharmony_ci
8784514f5e3Sopenharmony_ci    inline bool IsJSSharedBigUint64Array() const
8794514f5e3Sopenharmony_ci    {
8804514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_BIGUINT64_ARRAY;
8814514f5e3Sopenharmony_ci    }
8824514f5e3Sopenharmony_ci
8834514f5e3Sopenharmony_ci    inline bool IsBigInt64Array() const
8844514f5e3Sopenharmony_ci    {
8854514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
8864514f5e3Sopenharmony_ci        return jsType == JSType::JS_SHARED_BIGUINT64_ARRAY || jsType == JSType::JS_SHARED_BIGINT64_ARRAY ||
8874514f5e3Sopenharmony_ci               jsType == JSType::JS_BIGUINT64_ARRAY || jsType == JSType::JS_BIGINT64_ARRAY;
8884514f5e3Sopenharmony_ci    }
8894514f5e3Sopenharmony_ci
8904514f5e3Sopenharmony_ci    inline bool IsJsGlobalEnv() const
8914514f5e3Sopenharmony_ci    {
8924514f5e3Sopenharmony_ci        return GetObjectType() == JSType::GLOBAL_ENV;
8934514f5e3Sopenharmony_ci    }
8944514f5e3Sopenharmony_ci
8954514f5e3Sopenharmony_ci    inline bool IsJSFunctionBase() const
8964514f5e3Sopenharmony_ci    {
8974514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
8984514f5e3Sopenharmony_ci        return jsType >= JSType::JS_FUNCTION_BASE && jsType <= JSType::JS_BOUND_FUNCTION;
8994514f5e3Sopenharmony_ci    }
9004514f5e3Sopenharmony_ci
9014514f5e3Sopenharmony_ci    inline bool IsJsBoundFunction() const
9024514f5e3Sopenharmony_ci    {
9034514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_BOUND_FUNCTION;
9044514f5e3Sopenharmony_ci    }
9054514f5e3Sopenharmony_ci
9064514f5e3Sopenharmony_ci    inline bool IsJSIntlBoundFunction() const
9074514f5e3Sopenharmony_ci    {
9084514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_INTL_BOUND_FUNCTION;
9094514f5e3Sopenharmony_ci    }
9104514f5e3Sopenharmony_ci
9114514f5e3Sopenharmony_ci    inline bool IsJSProxyRevocFunction() const
9124514f5e3Sopenharmony_ci    {
9134514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROXY_REVOC_FUNCTION;
9144514f5e3Sopenharmony_ci    }
9154514f5e3Sopenharmony_ci
9164514f5e3Sopenharmony_ci    inline bool IsJSAsyncFunction() const
9174514f5e3Sopenharmony_ci    {
9184514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_FUNCTION || GetObjectType() == JSType::JS_SHARED_ASYNC_FUNCTION;
9194514f5e3Sopenharmony_ci    }
9204514f5e3Sopenharmony_ci
9214514f5e3Sopenharmony_ci    inline bool IsJSSharedAsyncFunction() const
9224514f5e3Sopenharmony_ci    {
9234514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_ASYNC_FUNCTION;
9244514f5e3Sopenharmony_ci    }
9254514f5e3Sopenharmony_ci
9264514f5e3Sopenharmony_ci    inline bool IsJSAsyncAwaitStatusFunction() const
9274514f5e3Sopenharmony_ci    {
9284514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_AWAIT_STATUS_FUNCTION;
9294514f5e3Sopenharmony_ci    }
9304514f5e3Sopenharmony_ci
9314514f5e3Sopenharmony_ci    inline bool IsJSPromiseReactionFunction() const
9324514f5e3Sopenharmony_ci    {
9334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_REACTIONS_FUNCTION;
9344514f5e3Sopenharmony_ci    }
9354514f5e3Sopenharmony_ci
9364514f5e3Sopenharmony_ci    inline bool IsJSPromiseExecutorFunction() const
9374514f5e3Sopenharmony_ci    {
9384514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_EXECUTOR_FUNCTION;
9394514f5e3Sopenharmony_ci    }
9404514f5e3Sopenharmony_ci
9414514f5e3Sopenharmony_ci    inline bool IsJSAsyncModuleFulfilledFunction() const
9424514f5e3Sopenharmony_ci    {
9434514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_MODULE_FULFILLED_FUNCTION;
9444514f5e3Sopenharmony_ci    }
9454514f5e3Sopenharmony_ci
9464514f5e3Sopenharmony_ci    inline bool IsJSAsyncModuleRejectedFunction() const
9474514f5e3Sopenharmony_ci    {
9484514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_MODULE_REJECTED_FUNCTION;
9494514f5e3Sopenharmony_ci    }
9504514f5e3Sopenharmony_ci
9514514f5e3Sopenharmony_ci    inline bool IsJSAsyncFromSyncIterUnwarpFunction() const
9524514f5e3Sopenharmony_ci    {
9534514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_FROM_SYNC_ITER_UNWARP_FUNCTION;
9544514f5e3Sopenharmony_ci    }
9554514f5e3Sopenharmony_ci
9564514f5e3Sopenharmony_ci    inline bool IsJSPromiseAllResolveElementFunction() const
9574514f5e3Sopenharmony_ci    {
9584514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_ALL_RESOLVE_ELEMENT_FUNCTION;
9594514f5e3Sopenharmony_ci    }
9604514f5e3Sopenharmony_ci
9614514f5e3Sopenharmony_ci    inline bool IsJSAsyncGeneratorResNextRetProRstFtn() const
9624514f5e3Sopenharmony_ci    {
9634514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_GENERATOR_RESUME_NEXT_RETURN_PROCESSOR_RST_FTN;
9644514f5e3Sopenharmony_ci    }
9654514f5e3Sopenharmony_ci
9664514f5e3Sopenharmony_ci    inline bool IsJSPromiseAnyRejectElementFunction() const
9674514f5e3Sopenharmony_ci    {
9684514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_ANY_REJECT_ELEMENT_FUNCTION;
9694514f5e3Sopenharmony_ci    }
9704514f5e3Sopenharmony_ci
9714514f5e3Sopenharmony_ci    inline bool IsJSPromiseAllSettledElementFunction() const
9724514f5e3Sopenharmony_ci    {
9734514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_ALL_SETTLED_ELEMENT_FUNCTION;
9744514f5e3Sopenharmony_ci    }
9754514f5e3Sopenharmony_ci
9764514f5e3Sopenharmony_ci    inline bool IsJSPromiseFinallyFunction() const
9774514f5e3Sopenharmony_ci    {
9784514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_FINALLY_FUNCTION;
9794514f5e3Sopenharmony_ci    }
9804514f5e3Sopenharmony_ci
9814514f5e3Sopenharmony_ci    inline bool IsJSPromiseValueThunkOrThrowerFunction() const
9824514f5e3Sopenharmony_ci    {
9834514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE_VALUE_THUNK_OR_THROWER_FUNCTION;
9844514f5e3Sopenharmony_ci    }
9854514f5e3Sopenharmony_ci
9864514f5e3Sopenharmony_ci    inline bool IsMicroJobQueue() const
9874514f5e3Sopenharmony_ci    {
9884514f5e3Sopenharmony_ci        return GetObjectType() == JSType::MICRO_JOB_QUEUE;
9894514f5e3Sopenharmony_ci    }
9904514f5e3Sopenharmony_ci
9914514f5e3Sopenharmony_ci    inline bool IsPendingJob() const
9924514f5e3Sopenharmony_ci    {
9934514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PENDING_JOB;
9944514f5e3Sopenharmony_ci    }
9954514f5e3Sopenharmony_ci
9964514f5e3Sopenharmony_ci    inline bool IsJsPrimitiveRef() const
9974514f5e3Sopenharmony_ci    {
9984514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PRIMITIVE_REF;
9994514f5e3Sopenharmony_ci    }
10004514f5e3Sopenharmony_ci
10014514f5e3Sopenharmony_ci    bool IsJSSet() const
10024514f5e3Sopenharmony_ci    {
10034514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SET;
10044514f5e3Sopenharmony_ci    }
10054514f5e3Sopenharmony_ci
10064514f5e3Sopenharmony_ci    bool IsJSSharedSet() const
10074514f5e3Sopenharmony_ci    {
10084514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_SET;
10094514f5e3Sopenharmony_ci    }
10104514f5e3Sopenharmony_ci
10114514f5e3Sopenharmony_ci    bool IsJSMap() const
10124514f5e3Sopenharmony_ci    {
10134514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_MAP;
10144514f5e3Sopenharmony_ci    }
10154514f5e3Sopenharmony_ci
10164514f5e3Sopenharmony_ci    bool IsJSSharedMap() const
10174514f5e3Sopenharmony_ci    {
10184514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_MAP;
10194514f5e3Sopenharmony_ci    }
10204514f5e3Sopenharmony_ci
10214514f5e3Sopenharmony_ci    bool IsJSWeakMap() const
10224514f5e3Sopenharmony_ci    {
10234514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_WEAK_MAP;
10244514f5e3Sopenharmony_ci    }
10254514f5e3Sopenharmony_ci
10264514f5e3Sopenharmony_ci    bool IsJSWeakSet() const
10274514f5e3Sopenharmony_ci    {
10284514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_WEAK_SET;
10294514f5e3Sopenharmony_ci    }
10304514f5e3Sopenharmony_ci
10314514f5e3Sopenharmony_ci    bool IsJSWeakRef() const
10324514f5e3Sopenharmony_ci    {
10334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_WEAK_REF;
10344514f5e3Sopenharmony_ci    }
10354514f5e3Sopenharmony_ci
10364514f5e3Sopenharmony_ci    bool IsJSFinalizationRegistry() const
10374514f5e3Sopenharmony_ci    {
10384514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_FINALIZATION_REGISTRY;
10394514f5e3Sopenharmony_ci    }
10404514f5e3Sopenharmony_ci
10414514f5e3Sopenharmony_ci    bool IsJSFunction() const
10424514f5e3Sopenharmony_ci    {
10434514f5e3Sopenharmony_ci        return GetObjectType() >= JSType::JS_FUNCTION_FIRST && GetObjectType() <= JSType::JS_FUNCTION_LAST;
10444514f5e3Sopenharmony_ci    }
10454514f5e3Sopenharmony_ci
10464514f5e3Sopenharmony_ci    bool IsJSSharedFunction() const
10474514f5e3Sopenharmony_ci    {
10484514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_FUNCTION;
10494514f5e3Sopenharmony_ci    }
10504514f5e3Sopenharmony_ci
10514514f5e3Sopenharmony_ci    bool IsJSShared() const
10524514f5e3Sopenharmony_ci    {
10534514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
10544514f5e3Sopenharmony_ci        return IsJSSharedBit::Decode(bits);
10554514f5e3Sopenharmony_ci    }
10564514f5e3Sopenharmony_ci
10574514f5e3Sopenharmony_ci    inline void SetIsJSShared(bool flag) const
10584514f5e3Sopenharmony_ci    {
10594514f5e3Sopenharmony_ci        IsJSSharedBit::Set<uint32_t>(flag, GetBitFieldAddr());
10604514f5e3Sopenharmony_ci    }
10614514f5e3Sopenharmony_ci
10624514f5e3Sopenharmony_ci    inline bool IsJSError() const
10634514f5e3Sopenharmony_ci    {
10644514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
10654514f5e3Sopenharmony_ci        return jsType >= JSType::JS_ERROR_FIRST && jsType <= JSType::JS_ERROR_LAST;
10664514f5e3Sopenharmony_ci    }
10674514f5e3Sopenharmony_ci
10684514f5e3Sopenharmony_ci    inline bool IsArguments() const
10694514f5e3Sopenharmony_ci    {
10704514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ARGUMENTS;
10714514f5e3Sopenharmony_ci    }
10724514f5e3Sopenharmony_ci
10734514f5e3Sopenharmony_ci    inline bool IsDate() const
10744514f5e3Sopenharmony_ci    {
10754514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_DATE;
10764514f5e3Sopenharmony_ci    }
10774514f5e3Sopenharmony_ci
10784514f5e3Sopenharmony_ci    inline bool IsJSRegExp() const
10794514f5e3Sopenharmony_ci    {
10804514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_REG_EXP;
10814514f5e3Sopenharmony_ci    }
10824514f5e3Sopenharmony_ci
10834514f5e3Sopenharmony_ci    inline bool IsJSProxy() const
10844514f5e3Sopenharmony_ci    {
10854514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROXY;
10864514f5e3Sopenharmony_ci    }
10874514f5e3Sopenharmony_ci
10884514f5e3Sopenharmony_ci    inline bool IsJSLocale() const
10894514f5e3Sopenharmony_ci    {
10904514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_LOCALE;
10914514f5e3Sopenharmony_ci    }
10924514f5e3Sopenharmony_ci
10934514f5e3Sopenharmony_ci    inline bool IsJSIntl() const
10944514f5e3Sopenharmony_ci    {
10954514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_INTL;
10964514f5e3Sopenharmony_ci    }
10974514f5e3Sopenharmony_ci
10984514f5e3Sopenharmony_ci    inline bool IsJSDateTimeFormat() const
10994514f5e3Sopenharmony_ci    {
11004514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_DATE_TIME_FORMAT;
11014514f5e3Sopenharmony_ci    }
11024514f5e3Sopenharmony_ci
11034514f5e3Sopenharmony_ci    inline bool IsJSRelativeTimeFormat() const
11044514f5e3Sopenharmony_ci    {
11054514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_RELATIVE_TIME_FORMAT;
11064514f5e3Sopenharmony_ci    }
11074514f5e3Sopenharmony_ci
11084514f5e3Sopenharmony_ci    inline bool IsJSNumberFormat() const
11094514f5e3Sopenharmony_ci    {
11104514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_NUMBER_FORMAT;
11114514f5e3Sopenharmony_ci    }
11124514f5e3Sopenharmony_ci
11134514f5e3Sopenharmony_ci    inline bool IsJSCollator() const
11144514f5e3Sopenharmony_ci    {
11154514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_COLLATOR;
11164514f5e3Sopenharmony_ci    }
11174514f5e3Sopenharmony_ci
11184514f5e3Sopenharmony_ci    inline bool IsJSPluralRules() const
11194514f5e3Sopenharmony_ci    {
11204514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PLURAL_RULES;
11214514f5e3Sopenharmony_ci    }
11224514f5e3Sopenharmony_ci
11234514f5e3Sopenharmony_ci    inline bool IsJSDisplayNames() const
11244514f5e3Sopenharmony_ci    {
11254514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_DISPLAYNAMES;
11264514f5e3Sopenharmony_ci    }
11274514f5e3Sopenharmony_ci
11284514f5e3Sopenharmony_ci    inline bool IsJSSegmenter() const
11294514f5e3Sopenharmony_ci    {
11304514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SEGMENTER;
11314514f5e3Sopenharmony_ci    }
11324514f5e3Sopenharmony_ci
11334514f5e3Sopenharmony_ci    inline bool IsJSSegments() const
11344514f5e3Sopenharmony_ci    {
11354514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SEGMENTS;
11364514f5e3Sopenharmony_ci    }
11374514f5e3Sopenharmony_ci
11384514f5e3Sopenharmony_ci    inline bool IsJSSegmentIterator() const
11394514f5e3Sopenharmony_ci    {
11404514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SEGMENT_ITERATOR;
11414514f5e3Sopenharmony_ci    }
11424514f5e3Sopenharmony_ci
11434514f5e3Sopenharmony_ci    inline bool IsJSListFormat() const
11444514f5e3Sopenharmony_ci    {
11454514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_LIST_FORMAT;
11464514f5e3Sopenharmony_ci    }
11474514f5e3Sopenharmony_ci
11484514f5e3Sopenharmony_ci    inline bool IsMethod() const
11494514f5e3Sopenharmony_ci    {
11504514f5e3Sopenharmony_ci        return GetObjectType() == JSType::METHOD;
11514514f5e3Sopenharmony_ci    }
11524514f5e3Sopenharmony_ci
11534514f5e3Sopenharmony_ci    inline bool IsClassLiteral() const
11544514f5e3Sopenharmony_ci    {
11554514f5e3Sopenharmony_ci        return GetObjectType() == JSType::CLASS_LITERAL;
11564514f5e3Sopenharmony_ci    }
11574514f5e3Sopenharmony_ci
11584514f5e3Sopenharmony_ci    // non ECMA standard jsapi containers.
11594514f5e3Sopenharmony_ci    inline bool IsSpecialContainer() const
11604514f5e3Sopenharmony_ci    {
11614514f5e3Sopenharmony_ci        return GetObjectType() >= JSType::JS_API_ARRAY_LIST && GetObjectType() <= JSType::JS_API_QUEUE;
11624514f5e3Sopenharmony_ci    }
11634514f5e3Sopenharmony_ci
11644514f5e3Sopenharmony_ci    inline bool IsRegularObject() const
11654514f5e3Sopenharmony_ci    {
11664514f5e3Sopenharmony_ci        return GetObjectType() < JSType::JS_API_ARRAY_LIST;
11674514f5e3Sopenharmony_ci    }
11684514f5e3Sopenharmony_ci
11694514f5e3Sopenharmony_ci    inline bool IsJSAPIArrayList() const
11704514f5e3Sopenharmony_ci    {
11714514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_ARRAY_LIST;
11724514f5e3Sopenharmony_ci    }
11734514f5e3Sopenharmony_ci
11744514f5e3Sopenharmony_ci    inline bool IsJSAPIArrayListIterator() const
11754514f5e3Sopenharmony_ci    {
11764514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_ARRAYLIST_ITERATOR;
11774514f5e3Sopenharmony_ci    }
11784514f5e3Sopenharmony_ci    inline bool IsJSAPILightWeightMap() const
11794514f5e3Sopenharmony_ci    {
11804514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIGHT_WEIGHT_MAP;
11814514f5e3Sopenharmony_ci    }
11824514f5e3Sopenharmony_ci    inline bool IsJSAPILightWeightMapIterator() const
11834514f5e3Sopenharmony_ci    {
11844514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIGHT_WEIGHT_MAP_ITERATOR;
11854514f5e3Sopenharmony_ci    }
11864514f5e3Sopenharmony_ci    inline bool IsJSAPILightWeightSet() const
11874514f5e3Sopenharmony_ci    {
11884514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIGHT_WEIGHT_SET;
11894514f5e3Sopenharmony_ci    }
11904514f5e3Sopenharmony_ci    inline bool IsJSAPILightWeightSetIterator() const
11914514f5e3Sopenharmony_ci    {
11924514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIGHT_WEIGHT_SET_ITERATOR;
11934514f5e3Sopenharmony_ci    }
11944514f5e3Sopenharmony_ci    inline bool IsJSAPIStack() const
11954514f5e3Sopenharmony_ci    {
11964514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_STACK;
11974514f5e3Sopenharmony_ci    }
11984514f5e3Sopenharmony_ci    inline bool IsJSAPIDeque() const
11994514f5e3Sopenharmony_ci    {
12004514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_DEQUE;
12014514f5e3Sopenharmony_ci    }
12024514f5e3Sopenharmony_ci    inline bool IsLinkedNode() const
12034514f5e3Sopenharmony_ci    {
12044514f5e3Sopenharmony_ci        return GetObjectType() == JSType::LINKED_NODE;
12054514f5e3Sopenharmony_ci    }
12064514f5e3Sopenharmony_ci
12074514f5e3Sopenharmony_ci    inline bool IsRBTreeNode() const
12084514f5e3Sopenharmony_ci    {
12094514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RB_TREENODE;
12104514f5e3Sopenharmony_ci    }
12114514f5e3Sopenharmony_ci
12124514f5e3Sopenharmony_ci    inline bool IsJSAPIHashMap() const
12134514f5e3Sopenharmony_ci    {
12144514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_HASH_MAP;
12154514f5e3Sopenharmony_ci    }
12164514f5e3Sopenharmony_ci
12174514f5e3Sopenharmony_ci    inline bool IsJSAPIHashSet() const
12184514f5e3Sopenharmony_ci    {
12194514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_HASH_SET;
12204514f5e3Sopenharmony_ci    }
12214514f5e3Sopenharmony_ci
12224514f5e3Sopenharmony_ci    inline bool IsJSAPIHashMapIterator() const
12234514f5e3Sopenharmony_ci    {
12244514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_HASHMAP_ITERATOR;
12254514f5e3Sopenharmony_ci    }
12264514f5e3Sopenharmony_ci
12274514f5e3Sopenharmony_ci    inline bool IsJSAPIHashSetIterator() const
12284514f5e3Sopenharmony_ci    {
12294514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_HASHSET_ITERATOR;
12304514f5e3Sopenharmony_ci    }
12314514f5e3Sopenharmony_ci    inline bool IsJSAPIQueue() const
12324514f5e3Sopenharmony_ci    {
12334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_QUEUE;
12344514f5e3Sopenharmony_ci    }
12354514f5e3Sopenharmony_ci
12364514f5e3Sopenharmony_ci    inline bool IsJSAPIPlainArray() const
12374514f5e3Sopenharmony_ci    {
12384514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_PLAIN_ARRAY;
12394514f5e3Sopenharmony_ci    }
12404514f5e3Sopenharmony_ci
12414514f5e3Sopenharmony_ci    inline bool IsJSAPIQueueIterator() const
12424514f5e3Sopenharmony_ci    {
12434514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_QUEUE_ITERATOR;
12444514f5e3Sopenharmony_ci    }
12454514f5e3Sopenharmony_ci    inline bool IsJSAPIList() const
12464514f5e3Sopenharmony_ci    {
12474514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIST;
12484514f5e3Sopenharmony_ci    }
12494514f5e3Sopenharmony_ci    inline bool IsJSAPILinkedList() const
12504514f5e3Sopenharmony_ci    {
12514514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LINKED_LIST;
12524514f5e3Sopenharmony_ci    }
12534514f5e3Sopenharmony_ci    inline bool IsJSAPITreeMap() const
12544514f5e3Sopenharmony_ci    {
12554514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_TREE_MAP;
12564514f5e3Sopenharmony_ci    }
12574514f5e3Sopenharmony_ci
12584514f5e3Sopenharmony_ci    inline bool IsJSAPITreeSet() const
12594514f5e3Sopenharmony_ci    {
12604514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_TREE_SET;
12614514f5e3Sopenharmony_ci    }
12624514f5e3Sopenharmony_ci
12634514f5e3Sopenharmony_ci    inline bool IsJSAPITreeMapIterator() const
12644514f5e3Sopenharmony_ci    {
12654514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_TREEMAP_ITERATOR;
12664514f5e3Sopenharmony_ci    }
12674514f5e3Sopenharmony_ci
12684514f5e3Sopenharmony_ci    inline bool IsJSAPITreeSetIterator() const
12694514f5e3Sopenharmony_ci    {
12704514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_TREESET_ITERATOR;
12714514f5e3Sopenharmony_ci    }
12724514f5e3Sopenharmony_ci    inline bool IsJSAPIVector() const
12734514f5e3Sopenharmony_ci    {
12744514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_VECTOR;
12754514f5e3Sopenharmony_ci    }
12764514f5e3Sopenharmony_ci    inline bool IsJSAPIVectorIterator() const
12774514f5e3Sopenharmony_ci    {
12784514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_VECTOR_ITERATOR;
12794514f5e3Sopenharmony_ci    }
12804514f5e3Sopenharmony_ci    inline bool IsJSAPIBitVector() const
12814514f5e3Sopenharmony_ci    {
12824514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_BITVECTOR;
12834514f5e3Sopenharmony_ci    }
12844514f5e3Sopenharmony_ci    inline bool IsJSAPIBitVectorIterator() const
12854514f5e3Sopenharmony_ci    {
12864514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_BITVECTOR_ITERATOR;
12874514f5e3Sopenharmony_ci    }
12884514f5e3Sopenharmony_ci
12894514f5e3Sopenharmony_ci    inline bool IsAccessorData() const
12904514f5e3Sopenharmony_ci    {
12914514f5e3Sopenharmony_ci        return GetObjectType() == JSType::ACCESSOR_DATA;
12924514f5e3Sopenharmony_ci    }
12934514f5e3Sopenharmony_ci
12944514f5e3Sopenharmony_ci    inline bool IsInternalAccessor() const
12954514f5e3Sopenharmony_ci    {
12964514f5e3Sopenharmony_ci        return GetObjectType() == JSType::INTERNAL_ACCESSOR;
12974514f5e3Sopenharmony_ci    }
12984514f5e3Sopenharmony_ci
12994514f5e3Sopenharmony_ci    inline bool IsIterator() const
13004514f5e3Sopenharmony_ci    {
13014514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
13024514f5e3Sopenharmony_ci        return jsType >= JSType::JS_ITERATOR_FIRST && jsType <= JSType::JS_ITERATOR_LAST;
13034514f5e3Sopenharmony_ci    }
13044514f5e3Sopenharmony_ci
13054514f5e3Sopenharmony_ci    inline bool IsAsyncIterator() const
13064514f5e3Sopenharmony_ci    {
13074514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNCITERATOR;
13084514f5e3Sopenharmony_ci    }
13094514f5e3Sopenharmony_ci
13104514f5e3Sopenharmony_ci    inline bool IsAsyncFromSyncIterator() const
13114514f5e3Sopenharmony_ci    {
13124514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_FROM_SYNC_ITERATOR;
13134514f5e3Sopenharmony_ci    }
13144514f5e3Sopenharmony_ci
13154514f5e3Sopenharmony_ci    inline bool IsForinIterator() const
13164514f5e3Sopenharmony_ci    {
13174514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_FORIN_ITERATOR;
13184514f5e3Sopenharmony_ci    }
13194514f5e3Sopenharmony_ci
13204514f5e3Sopenharmony_ci    inline bool IsStringIterator() const
13214514f5e3Sopenharmony_ci    {
13224514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_STRING_ITERATOR;
13234514f5e3Sopenharmony_ci    }
13244514f5e3Sopenharmony_ci
13254514f5e3Sopenharmony_ci    inline bool IsArrayBuffer() const
13264514f5e3Sopenharmony_ci    {
13274514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ARRAY_BUFFER;
13284514f5e3Sopenharmony_ci    }
13294514f5e3Sopenharmony_ci
13304514f5e3Sopenharmony_ci    inline bool IsSharedArrayBuffer() const
13314514f5e3Sopenharmony_ci    {
13324514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_ARRAY_BUFFER;
13334514f5e3Sopenharmony_ci    }
13344514f5e3Sopenharmony_ci
13354514f5e3Sopenharmony_ci    inline bool IsSendableArrayBuffer() const
13364514f5e3Sopenharmony_ci    {
13374514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SENDABLE_ARRAY_BUFFER;
13384514f5e3Sopenharmony_ci    }
13394514f5e3Sopenharmony_ci
13404514f5e3Sopenharmony_ci    inline bool IsDataView() const
13414514f5e3Sopenharmony_ci    {
13424514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_DATA_VIEW;
13434514f5e3Sopenharmony_ci    }
13444514f5e3Sopenharmony_ci
13454514f5e3Sopenharmony_ci    inline bool IsJSSetIterator() const
13464514f5e3Sopenharmony_ci    {
13474514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SET_ITERATOR;
13484514f5e3Sopenharmony_ci    }
13494514f5e3Sopenharmony_ci
13504514f5e3Sopenharmony_ci    // iterator of shared set
13514514f5e3Sopenharmony_ci    inline bool IsJSSharedSetIterator() const
13524514f5e3Sopenharmony_ci    {
13534514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_SET_ITERATOR;
13544514f5e3Sopenharmony_ci    }
13554514f5e3Sopenharmony_ci
13564514f5e3Sopenharmony_ci    inline bool IsJSRegExpIterator() const
13574514f5e3Sopenharmony_ci    {
13584514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_REG_EXP_ITERATOR;
13594514f5e3Sopenharmony_ci    }
13604514f5e3Sopenharmony_ci
13614514f5e3Sopenharmony_ci    inline bool IsJSMapIterator() const
13624514f5e3Sopenharmony_ci    {
13634514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_MAP_ITERATOR;
13644514f5e3Sopenharmony_ci    }
13654514f5e3Sopenharmony_ci
13664514f5e3Sopenharmony_ci    // iterator of shared map
13674514f5e3Sopenharmony_ci    inline bool IsJSSharedMapIterator() const
13684514f5e3Sopenharmony_ci    {
13694514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_MAP_ITERATOR;
13704514f5e3Sopenharmony_ci    }
13714514f5e3Sopenharmony_ci
13724514f5e3Sopenharmony_ci    inline bool IsJSArrayIterator() const
13734514f5e3Sopenharmony_ci    {
13744514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ARRAY_ITERATOR;
13754514f5e3Sopenharmony_ci    }
13764514f5e3Sopenharmony_ci
13774514f5e3Sopenharmony_ci    inline bool IsJSSharedArrayIterator() const
13784514f5e3Sopenharmony_ci    {
13794514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_ARRAY_ITERATOR;
13804514f5e3Sopenharmony_ci    }
13814514f5e3Sopenharmony_ci
13824514f5e3Sopenharmony_ci    inline bool IsJSAPIPlainArrayIterator() const
13834514f5e3Sopenharmony_ci    {
13844514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_PLAIN_ARRAY_ITERATOR;
13854514f5e3Sopenharmony_ci    }
13864514f5e3Sopenharmony_ci
13874514f5e3Sopenharmony_ci    inline bool IsJSAPIDequeIterator() const
13884514f5e3Sopenharmony_ci    {
13894514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_DEQUE_ITERATOR;
13904514f5e3Sopenharmony_ci    }
13914514f5e3Sopenharmony_ci
13924514f5e3Sopenharmony_ci    inline bool IsJSAPIStackIterator() const
13934514f5e3Sopenharmony_ci    {
13944514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_STACK_ITERATOR;
13954514f5e3Sopenharmony_ci    }
13964514f5e3Sopenharmony_ci
13974514f5e3Sopenharmony_ci    inline bool IsJSAPILinkedListIterator() const
13984514f5e3Sopenharmony_ci    {
13994514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LINKED_LIST_ITERATOR;
14004514f5e3Sopenharmony_ci    }
14014514f5e3Sopenharmony_ci
14024514f5e3Sopenharmony_ci    inline bool IsJSAPIListIterator() const
14034514f5e3Sopenharmony_ci    {
14044514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_API_LIST_ITERATOR;
14054514f5e3Sopenharmony_ci    }
14064514f5e3Sopenharmony_ci
14074514f5e3Sopenharmony_ci    inline bool IsPrototypeHandler() const
14084514f5e3Sopenharmony_ci    {
14094514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROTOTYPE_HANDLER;
14104514f5e3Sopenharmony_ci    }
14114514f5e3Sopenharmony_ci
14124514f5e3Sopenharmony_ci    inline bool IsTransitionHandler() const
14134514f5e3Sopenharmony_ci    {
14144514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TRANSITION_HANDLER;
14154514f5e3Sopenharmony_ci    }
14164514f5e3Sopenharmony_ci
14174514f5e3Sopenharmony_ci    inline bool IsTransWithProtoHandler() const
14184514f5e3Sopenharmony_ci    {
14194514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TRANS_WITH_PROTO_HANDLER;
14204514f5e3Sopenharmony_ci    }
14214514f5e3Sopenharmony_ci
14224514f5e3Sopenharmony_ci    inline bool IsStoreTSHandler() const
14234514f5e3Sopenharmony_ci    {
14244514f5e3Sopenharmony_ci        return GetObjectType() == JSType::STORE_TS_HANDLER;
14254514f5e3Sopenharmony_ci    }
14264514f5e3Sopenharmony_ci
14274514f5e3Sopenharmony_ci    inline bool IsPropertyBox() const
14284514f5e3Sopenharmony_ci    {
14294514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROPERTY_BOX;
14304514f5e3Sopenharmony_ci    }
14314514f5e3Sopenharmony_ci    inline bool IsProtoChangeMarker() const
14324514f5e3Sopenharmony_ci    {
14334514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROTO_CHANGE_MARKER;
14344514f5e3Sopenharmony_ci    }
14354514f5e3Sopenharmony_ci
14364514f5e3Sopenharmony_ci    inline bool IsMarkerCell() const
14374514f5e3Sopenharmony_ci    {
14384514f5e3Sopenharmony_ci        return GetObjectType() == JSType::MARKER_CELL;
14394514f5e3Sopenharmony_ci    }
14404514f5e3Sopenharmony_ci
14414514f5e3Sopenharmony_ci    inline bool IsTrackInfoObject() const
14424514f5e3Sopenharmony_ci    {
14434514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TRACK_INFO;
14444514f5e3Sopenharmony_ci    }
14454514f5e3Sopenharmony_ci
14464514f5e3Sopenharmony_ci    inline bool IsProtoChangeDetails() const
14474514f5e3Sopenharmony_ci    {
14484514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROTOTYPE_INFO;
14494514f5e3Sopenharmony_ci    }
14504514f5e3Sopenharmony_ci
14514514f5e3Sopenharmony_ci    inline bool IsProgram() const
14524514f5e3Sopenharmony_ci    {
14534514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROGRAM;
14544514f5e3Sopenharmony_ci    }
14554514f5e3Sopenharmony_ci
14564514f5e3Sopenharmony_ci    inline bool IsClassInfoExtractor() const
14574514f5e3Sopenharmony_ci    {
14584514f5e3Sopenharmony_ci        return GetObjectType() == JSType::CLASS_INFO_EXTRACTOR;
14594514f5e3Sopenharmony_ci    }
14604514f5e3Sopenharmony_ci
14614514f5e3Sopenharmony_ci    inline bool IsCallable() const
14624514f5e3Sopenharmony_ci    {
14634514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14644514f5e3Sopenharmony_ci        return CallableBit::Decode(bits);
14654514f5e3Sopenharmony_ci    }
14664514f5e3Sopenharmony_ci
14674514f5e3Sopenharmony_ci    inline bool IsConstructor() const
14684514f5e3Sopenharmony_ci    {
14694514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14704514f5e3Sopenharmony_ci        return ConstructorBit::Decode(bits);
14714514f5e3Sopenharmony_ci    }
14724514f5e3Sopenharmony_ci
14734514f5e3Sopenharmony_ci    inline bool IsExtensible() const
14744514f5e3Sopenharmony_ci    {
14754514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14764514f5e3Sopenharmony_ci        return ExtensibleBit::Decode(bits);
14774514f5e3Sopenharmony_ci    }
14784514f5e3Sopenharmony_ci
14794514f5e3Sopenharmony_ci    inline bool IsPrototype() const
14804514f5e3Sopenharmony_ci    {
14814514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14824514f5e3Sopenharmony_ci        return IsPrototypeBit::Decode(bits);
14834514f5e3Sopenharmony_ci    }
14844514f5e3Sopenharmony_ci
14854514f5e3Sopenharmony_ci    inline bool IsClassConstructor() const
14864514f5e3Sopenharmony_ci    {
14874514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14884514f5e3Sopenharmony_ci        return IsClassConstructorOrPrototypeBit::Decode(bits) && IsConstructor();
14894514f5e3Sopenharmony_ci    }
14904514f5e3Sopenharmony_ci
14914514f5e3Sopenharmony_ci    inline bool IsJSGlobalObject() const
14924514f5e3Sopenharmony_ci    {
14934514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_GLOBAL_OBJECT;
14944514f5e3Sopenharmony_ci    }
14954514f5e3Sopenharmony_ci
14964514f5e3Sopenharmony_ci    inline bool IsClassPrototype() const
14974514f5e3Sopenharmony_ci    {
14984514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
14994514f5e3Sopenharmony_ci        return IsClassConstructorOrPrototypeBit::Decode(bits) && IsPrototype();
15004514f5e3Sopenharmony_ci    }
15014514f5e3Sopenharmony_ci
15024514f5e3Sopenharmony_ci    inline bool IsNativeBindingObject() const
15034514f5e3Sopenharmony_ci    {
15044514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
15054514f5e3Sopenharmony_ci        return IsNativeBindingObjectBit::Decode(bits);
15064514f5e3Sopenharmony_ci    }
15074514f5e3Sopenharmony_ci
15084514f5e3Sopenharmony_ci    inline bool IsDictionaryMode() const
15094514f5e3Sopenharmony_ci    {
15104514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
15114514f5e3Sopenharmony_ci        return IsDictionaryBit::Decode(bits);
15124514f5e3Sopenharmony_ci    }
15134514f5e3Sopenharmony_ci
15144514f5e3Sopenharmony_ci    // created from TypeScript Types
15154514f5e3Sopenharmony_ci    inline bool IsTS() const
15164514f5e3Sopenharmony_ci    {
15174514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
15184514f5e3Sopenharmony_ci        return IsTSBit::Decode(bits);
15194514f5e3Sopenharmony_ci    }
15204514f5e3Sopenharmony_ci
15214514f5e3Sopenharmony_ci    inline bool IsJSFunctionFromBitField() const
15224514f5e3Sopenharmony_ci    {
15234514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
15244514f5e3Sopenharmony_ci        return IsJSFunctionBit::Decode(bits);
15254514f5e3Sopenharmony_ci    }
15264514f5e3Sopenharmony_ci
15274514f5e3Sopenharmony_ci    inline bool IsOnHeapFromBitField() const
15284514f5e3Sopenharmony_ci    {
15294514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
15304514f5e3Sopenharmony_ci        return IsOnHeap::Decode(bits);
15314514f5e3Sopenharmony_ci    }
15324514f5e3Sopenharmony_ci
15334514f5e3Sopenharmony_ci    inline bool IsGeneratorFunction() const
15344514f5e3Sopenharmony_ci    {
15354514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_GENERATOR_FUNCTION;
15364514f5e3Sopenharmony_ci    }
15374514f5e3Sopenharmony_ci
15384514f5e3Sopenharmony_ci    inline bool IsAsyncGeneratorFunction() const
15394514f5e3Sopenharmony_ci    {
15404514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_GENERATOR_FUNCTION;
15414514f5e3Sopenharmony_ci    }
15424514f5e3Sopenharmony_ci
15434514f5e3Sopenharmony_ci    inline bool IsGeneratorObject() const
15444514f5e3Sopenharmony_ci    {
15454514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
15464514f5e3Sopenharmony_ci        return jsType == JSType::JS_GENERATOR_OBJECT || jsType == JSType::JS_ASYNC_FUNC_OBJECT;
15474514f5e3Sopenharmony_ci    }
15484514f5e3Sopenharmony_ci
15494514f5e3Sopenharmony_ci    inline bool IsAsyncGeneratorObject() const
15504514f5e3Sopenharmony_ci    {
15514514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
15524514f5e3Sopenharmony_ci        return jsType == JSType::JS_ASYNC_GENERATOR_OBJECT;
15534514f5e3Sopenharmony_ci    }
15544514f5e3Sopenharmony_ci
15554514f5e3Sopenharmony_ci    inline bool IsGeneratorContext() const
15564514f5e3Sopenharmony_ci    {
15574514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_GENERATOR_CONTEXT;
15584514f5e3Sopenharmony_ci    }
15594514f5e3Sopenharmony_ci
15604514f5e3Sopenharmony_ci    inline bool IsAsyncGeneratorRequest() const
15614514f5e3Sopenharmony_ci    {
15624514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
15634514f5e3Sopenharmony_ci        return jsType == JSType::ASYNC_GENERATOR_REQUEST;
15644514f5e3Sopenharmony_ci    }
15654514f5e3Sopenharmony_ci
15664514f5e3Sopenharmony_ci    inline bool IsAsyncIteratorRecord() const
15674514f5e3Sopenharmony_ci    {
15684514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
15694514f5e3Sopenharmony_ci        return jsType == JSType::ASYNC_ITERATOR_RECORD;
15704514f5e3Sopenharmony_ci    }
15714514f5e3Sopenharmony_ci
15724514f5e3Sopenharmony_ci    inline bool IsAsyncFuncObject() const
15734514f5e3Sopenharmony_ci    {
15744514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_ASYNC_FUNC_OBJECT;
15754514f5e3Sopenharmony_ci    }
15764514f5e3Sopenharmony_ci
15774514f5e3Sopenharmony_ci    inline bool IsJSPromise() const
15784514f5e3Sopenharmony_ci    {
15794514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_PROMISE;
15804514f5e3Sopenharmony_ci    }
15814514f5e3Sopenharmony_ci
15824514f5e3Sopenharmony_ci    inline bool IsResolvingFunctionsRecord() const
15834514f5e3Sopenharmony_ci    {
15844514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RESOLVING_FUNCTIONS_RECORD;
15854514f5e3Sopenharmony_ci    }
15864514f5e3Sopenharmony_ci
15874514f5e3Sopenharmony_ci    inline bool IsPromiseRecord() const
15884514f5e3Sopenharmony_ci    {
15894514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROMISE_RECORD;
15904514f5e3Sopenharmony_ci    }
15914514f5e3Sopenharmony_ci
15924514f5e3Sopenharmony_ci    inline bool IsPromiseIteratorRecord() const
15934514f5e3Sopenharmony_ci    {
15944514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROMISE_ITERATOR_RECORD;
15954514f5e3Sopenharmony_ci    }
15964514f5e3Sopenharmony_ci
15974514f5e3Sopenharmony_ci    inline bool IsPromiseCapability() const
15984514f5e3Sopenharmony_ci    {
15994514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROMISE_CAPABILITY;
16004514f5e3Sopenharmony_ci    }
16014514f5e3Sopenharmony_ci
16024514f5e3Sopenharmony_ci    inline bool IsPromiseReaction() const
16034514f5e3Sopenharmony_ci    {
16044514f5e3Sopenharmony_ci        return GetObjectType() == JSType::PROMISE_REACTIONS;
16054514f5e3Sopenharmony_ci    }
16064514f5e3Sopenharmony_ci
16074514f5e3Sopenharmony_ci    inline bool IsCellRecord() const
16084514f5e3Sopenharmony_ci    {
16094514f5e3Sopenharmony_ci        return GetObjectType() == JSType::CELL_RECORD;
16104514f5e3Sopenharmony_ci    }
16114514f5e3Sopenharmony_ci
16124514f5e3Sopenharmony_ci    inline bool IsCompletionRecord() const
16134514f5e3Sopenharmony_ci    {
16144514f5e3Sopenharmony_ci        return GetObjectType() == JSType::COMPLETION_RECORD;
16154514f5e3Sopenharmony_ci    }
16164514f5e3Sopenharmony_ci
16174514f5e3Sopenharmony_ci    inline bool IsRecord() const
16184514f5e3Sopenharmony_ci    {
16194514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
16204514f5e3Sopenharmony_ci        return jsType >= JSType::JS_RECORD_FIRST && jsType <= JSType::JS_RECORD_LAST;
16214514f5e3Sopenharmony_ci    }
16224514f5e3Sopenharmony_ci
16234514f5e3Sopenharmony_ci    inline bool IsTemplateMap() const
16244514f5e3Sopenharmony_ci    {
16254514f5e3Sopenharmony_ci        return GetObjectType() == JSType::TEMPLATE_MAP;
16264514f5e3Sopenharmony_ci    }
16274514f5e3Sopenharmony_ci
16284514f5e3Sopenharmony_ci    inline bool IsFreeObject() const
16294514f5e3Sopenharmony_ci    {
16304514f5e3Sopenharmony_ci        JSType t = GetObjectType();
16314514f5e3Sopenharmony_ci        return (t >= JSType::FREE_OBJECT_WITH_ONE_FIELD) && (t <= JSType::FREE_OBJECT_WITH_TWO_FIELD);
16324514f5e3Sopenharmony_ci    }
16334514f5e3Sopenharmony_ci
16344514f5e3Sopenharmony_ci    inline bool IsFreeObjectWithShortField() const
16354514f5e3Sopenharmony_ci    {
16364514f5e3Sopenharmony_ci        switch (GetObjectType()) {
16374514f5e3Sopenharmony_ci            case JSType::FREE_OBJECT_WITH_ONE_FIELD:
16384514f5e3Sopenharmony_ci            case JSType::FREE_OBJECT_WITH_NONE_FIELD:
16394514f5e3Sopenharmony_ci                return true;
16404514f5e3Sopenharmony_ci            default:
16414514f5e3Sopenharmony_ci                return false;
16424514f5e3Sopenharmony_ci        }
16434514f5e3Sopenharmony_ci    }
16444514f5e3Sopenharmony_ci
16454514f5e3Sopenharmony_ci    inline bool IsFreeObjectWithOneField() const
16464514f5e3Sopenharmony_ci    {
16474514f5e3Sopenharmony_ci        return GetObjectType() == JSType::FREE_OBJECT_WITH_ONE_FIELD;
16484514f5e3Sopenharmony_ci    }
16494514f5e3Sopenharmony_ci
16504514f5e3Sopenharmony_ci    inline bool IsFreeObjectWithNoneField() const
16514514f5e3Sopenharmony_ci    {
16524514f5e3Sopenharmony_ci        return GetObjectType() == JSType::FREE_OBJECT_WITH_NONE_FIELD;
16534514f5e3Sopenharmony_ci    }
16544514f5e3Sopenharmony_ci
16554514f5e3Sopenharmony_ci    inline bool IsFreeObjectWithTwoField() const
16564514f5e3Sopenharmony_ci    {
16574514f5e3Sopenharmony_ci        return GetObjectType() == JSType::FREE_OBJECT_WITH_TWO_FIELD;
16584514f5e3Sopenharmony_ci    }
16594514f5e3Sopenharmony_ci
16604514f5e3Sopenharmony_ci    inline bool IsMachineCodeObject() const
16614514f5e3Sopenharmony_ci    {
16624514f5e3Sopenharmony_ci        return GetObjectType() == JSType::MACHINE_CODE_OBJECT;
16634514f5e3Sopenharmony_ci    }
16644514f5e3Sopenharmony_ci
16654514f5e3Sopenharmony_ci    inline bool IsAOTLiteralInfo() const
16664514f5e3Sopenharmony_ci    {
16674514f5e3Sopenharmony_ci        return GetObjectType() == JSType::AOT_LITERAL_INFO;
16684514f5e3Sopenharmony_ci    }
16694514f5e3Sopenharmony_ci
16704514f5e3Sopenharmony_ci    inline bool IsExtraProfileTypeInfo() const
16714514f5e3Sopenharmony_ci    {
16724514f5e3Sopenharmony_ci        return GetObjectType() == JSType::EXTRA_PROFILE_TYPE_INFO;
16734514f5e3Sopenharmony_ci    }
16744514f5e3Sopenharmony_ci
16754514f5e3Sopenharmony_ci    inline bool IsProfileTypeInfoCell() const
16764514f5e3Sopenharmony_ci    {
16774514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
16784514f5e3Sopenharmony_ci        return jsType >= JSType::PROFILE_TYPE_INFO_CELL_FIRST && jsType <= JSType::PROFILE_TYPE_INFO_CELL_LAST;
16794514f5e3Sopenharmony_ci    }
16804514f5e3Sopenharmony_ci
16814514f5e3Sopenharmony_ci    inline bool IsProfileTypeInfoCell0() const
16824514f5e3Sopenharmony_ci    {
16834514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
16844514f5e3Sopenharmony_ci        return jsType == JSType::PROFILE_TYPE_INFO_CELL_0;
16854514f5e3Sopenharmony_ci    }
16864514f5e3Sopenharmony_ci
16874514f5e3Sopenharmony_ci    inline bool IsFunctionTemplate() const
16884514f5e3Sopenharmony_ci    {
16894514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
16904514f5e3Sopenharmony_ci        return jsType == JSType::FUNCTION_TEMPLATE;
16914514f5e3Sopenharmony_ci    }
16924514f5e3Sopenharmony_ci
16934514f5e3Sopenharmony_ci    inline bool IsVTable() const
16944514f5e3Sopenharmony_ci    {
16954514f5e3Sopenharmony_ci        return GetObjectType() == JSType::VTABLE;
16964514f5e3Sopenharmony_ci    }
16974514f5e3Sopenharmony_ci
16984514f5e3Sopenharmony_ci    inline bool IsModuleRecord() const
16994514f5e3Sopenharmony_ci    {
17004514f5e3Sopenharmony_ci        JSType jsType = GetObjectType();
17014514f5e3Sopenharmony_ci        return jsType >= JSType::MODULE_RECORD_FIRST && jsType <= JSType::MODULE_RECORD_LAST;
17024514f5e3Sopenharmony_ci    }
17034514f5e3Sopenharmony_ci
17044514f5e3Sopenharmony_ci    inline bool IsSourceTextModule() const
17054514f5e3Sopenharmony_ci    {
17064514f5e3Sopenharmony_ci        return GetObjectType() == JSType::SOURCE_TEXT_MODULE_RECORD;
17074514f5e3Sopenharmony_ci    }
17084514f5e3Sopenharmony_ci
17094514f5e3Sopenharmony_ci    inline bool IsCjsExports() const
17104514f5e3Sopenharmony_ci    {
17114514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_CJS_EXPORTS;
17124514f5e3Sopenharmony_ci    }
17134514f5e3Sopenharmony_ci
17144514f5e3Sopenharmony_ci    inline bool IsCjsModule() const
17154514f5e3Sopenharmony_ci    {
17164514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_CJS_MODULE;
17174514f5e3Sopenharmony_ci    }
17184514f5e3Sopenharmony_ci
17194514f5e3Sopenharmony_ci    inline bool IsCjsRequire() const
17204514f5e3Sopenharmony_ci    {
17214514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_CJS_REQUIRE;
17224514f5e3Sopenharmony_ci    }
17234514f5e3Sopenharmony_ci
17244514f5e3Sopenharmony_ci    inline bool IsImportEntry() const
17254514f5e3Sopenharmony_ci    {
17264514f5e3Sopenharmony_ci        return GetObjectType() == JSType::IMPORTENTRY_RECORD;
17274514f5e3Sopenharmony_ci    }
17284514f5e3Sopenharmony_ci
17294514f5e3Sopenharmony_ci    inline bool IsLocalExportEntry() const
17304514f5e3Sopenharmony_ci    {
17314514f5e3Sopenharmony_ci        return GetObjectType() == JSType::LOCAL_EXPORTENTRY_RECORD;
17324514f5e3Sopenharmony_ci    }
17334514f5e3Sopenharmony_ci
17344514f5e3Sopenharmony_ci    inline bool IsIndirectExportEntry() const
17354514f5e3Sopenharmony_ci    {
17364514f5e3Sopenharmony_ci        return GetObjectType() == JSType::INDIRECT_EXPORTENTRY_RECORD;
17374514f5e3Sopenharmony_ci    }
17384514f5e3Sopenharmony_ci
17394514f5e3Sopenharmony_ci    inline bool IsStarExportEntry() const
17404514f5e3Sopenharmony_ci    {
17414514f5e3Sopenharmony_ci        return GetObjectType() == JSType::STAR_EXPORTENTRY_RECORD;
17424514f5e3Sopenharmony_ci    }
17434514f5e3Sopenharmony_ci
17444514f5e3Sopenharmony_ci    inline bool IsResolvedBinding() const
17454514f5e3Sopenharmony_ci    {
17464514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RESOLVEDBINDING_RECORD;
17474514f5e3Sopenharmony_ci    }
17484514f5e3Sopenharmony_ci
17494514f5e3Sopenharmony_ci    inline bool IsResolvedIndexBinding() const
17504514f5e3Sopenharmony_ci    {
17514514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RESOLVEDINDEXBINDING_RECORD;
17524514f5e3Sopenharmony_ci    }
17534514f5e3Sopenharmony_ci
17544514f5e3Sopenharmony_ci    inline bool IsResolvedRecordIndexBinding() const
17554514f5e3Sopenharmony_ci    {
17564514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RESOLVEDRECORDINDEXBINDING_RECORD;
17574514f5e3Sopenharmony_ci    }
17584514f5e3Sopenharmony_ci
17594514f5e3Sopenharmony_ci    inline bool IsResolvedRecordBinding() const
17604514f5e3Sopenharmony_ci    {
17614514f5e3Sopenharmony_ci        return GetObjectType() == JSType::RESOLVEDRECORDBINDING_RECORD;
17624514f5e3Sopenharmony_ci    }
17634514f5e3Sopenharmony_ci
17644514f5e3Sopenharmony_ci    inline bool IsModuleNamespace() const
17654514f5e3Sopenharmony_ci    {
17664514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_MODULE_NAMESPACE;
17674514f5e3Sopenharmony_ci    }
17684514f5e3Sopenharmony_ci
17694514f5e3Sopenharmony_ci    inline bool IsNativeModuleFailureInfo() const
17704514f5e3Sopenharmony_ci    {
17714514f5e3Sopenharmony_ci        return GetObjectType() == JSType::NATIVE_MODULE_FAILURE_INFO;
17724514f5e3Sopenharmony_ci    }
17734514f5e3Sopenharmony_ci
17744514f5e3Sopenharmony_ci    inline bool IsJSSharedObject() const
17754514f5e3Sopenharmony_ci    {
17764514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_OBJECT;
17774514f5e3Sopenharmony_ci    }
17784514f5e3Sopenharmony_ci
17794514f5e3Sopenharmony_ci    inline bool IsJSSharedArray() const
17804514f5e3Sopenharmony_ci    {
17814514f5e3Sopenharmony_ci        return GetObjectType() == JSType::JS_SHARED_ARRAY;
17824514f5e3Sopenharmony_ci    }
17834514f5e3Sopenharmony_ci
17844514f5e3Sopenharmony_ci    inline void SetElementsKind(ElementsKind kind)
17854514f5e3Sopenharmony_ci    {
17864514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
17874514f5e3Sopenharmony_ci        uint32_t newVal = ElementsKindBits::Update(bits, kind);
17884514f5e3Sopenharmony_ci        SetBitField(newVal);
17894514f5e3Sopenharmony_ci    }
17904514f5e3Sopenharmony_ci
17914514f5e3Sopenharmony_ci    inline ElementsKind GetElementsKind() const
17924514f5e3Sopenharmony_ci    {
17934514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
17944514f5e3Sopenharmony_ci        return ElementsKindBits::Decode(bits);
17954514f5e3Sopenharmony_ci    }
17964514f5e3Sopenharmony_ci
17974514f5e3Sopenharmony_ci    inline void SetLevel(uint8_t level)
17984514f5e3Sopenharmony_ci    {
17994514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
18004514f5e3Sopenharmony_ci        uint32_t newVal = LevelBit::Update(bits, level);
18014514f5e3Sopenharmony_ci        SetBitField(newVal);
18024514f5e3Sopenharmony_ci    }
18034514f5e3Sopenharmony_ci
18044514f5e3Sopenharmony_ci    inline uint8_t GetLevel() const
18054514f5e3Sopenharmony_ci    {
18064514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
18074514f5e3Sopenharmony_ci        return LevelBit::Decode(bits);
18084514f5e3Sopenharmony_ci    }
18094514f5e3Sopenharmony_ci
18104514f5e3Sopenharmony_ci    inline void SetIsDictionaryElement(bool value)
18114514f5e3Sopenharmony_ci    {
18124514f5e3Sopenharmony_ci        uint32_t newVal = DictionaryElementBits::Update(GetBitField(), value);
18134514f5e3Sopenharmony_ci        SetBitField(newVal);
18144514f5e3Sopenharmony_ci    }
18154514f5e3Sopenharmony_ci    inline bool IsDictionaryElement() const
18164514f5e3Sopenharmony_ci    {
18174514f5e3Sopenharmony_ci        return DictionaryElementBits::Decode(GetBitField());
18184514f5e3Sopenharmony_ci    }
18194514f5e3Sopenharmony_ci    inline void SetIsStableElements(bool value)
18204514f5e3Sopenharmony_ci    {
18214514f5e3Sopenharmony_ci        uint32_t newVal = IsStableElementsBit::Update(GetBitField(), value);
18224514f5e3Sopenharmony_ci        SetBitField(newVal);
18234514f5e3Sopenharmony_ci    }
18244514f5e3Sopenharmony_ci    inline bool IsStableElements() const
18254514f5e3Sopenharmony_ci    {
18264514f5e3Sopenharmony_ci        return IsStableElementsBit::Decode(GetBitField());
18274514f5e3Sopenharmony_ci    }
18284514f5e3Sopenharmony_ci    inline bool IsStableJSArguments() const
18294514f5e3Sopenharmony_ci    {
18304514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
18314514f5e3Sopenharmony_ci        auto type = ObjectTypeBits::Decode(bits);
18324514f5e3Sopenharmony_ci        return IsStableElementsBit::Decode(bits) && (type == JSType::JS_ARGUMENTS);
18334514f5e3Sopenharmony_ci    }
18344514f5e3Sopenharmony_ci    inline bool IsStableJSArray() const
18354514f5e3Sopenharmony_ci    {
18364514f5e3Sopenharmony_ci        uint32_t bits = GetBitField();
18374514f5e3Sopenharmony_ci        auto type = ObjectTypeBits::Decode(bits);
18384514f5e3Sopenharmony_ci        return IsStableElementsBit::Decode(bits) && (type == JSType::JS_ARRAY);
18394514f5e3Sopenharmony_ci    }
18404514f5e3Sopenharmony_ci    inline void SetHasConstructor(bool value)
18414514f5e3Sopenharmony_ci    {
18424514f5e3Sopenharmony_ci        JSTaggedType newVal = HasConstructorBits::Update(GetBitField(), value);
18434514f5e3Sopenharmony_ci        SetBitField(newVal);
18444514f5e3Sopenharmony_ci    }
18454514f5e3Sopenharmony_ci    inline bool HasConstructor() const
18464514f5e3Sopenharmony_ci    {
18474514f5e3Sopenharmony_ci        return HasConstructorBits::Decode(GetBitField());
18484514f5e3Sopenharmony_ci    }
18494514f5e3Sopenharmony_ci
18504514f5e3Sopenharmony_ci    inline void SetNumberOfProps(uint32_t num)
18514514f5e3Sopenharmony_ci    {
18524514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
18534514f5e3Sopenharmony_ci        uint32_t newVal = NumberOfPropsBits::Update(bits, num);
18544514f5e3Sopenharmony_ci        SetBitField1(newVal);
18554514f5e3Sopenharmony_ci    }
18564514f5e3Sopenharmony_ci
18574514f5e3Sopenharmony_ci    inline void IncNumberOfProps()
18584514f5e3Sopenharmony_ci    {
18594514f5e3Sopenharmony_ci        ASSERT(NumberOfProps() < PropertyAttributes::MAX_FAST_PROPS_CAPACITY);
18604514f5e3Sopenharmony_ci        SetNumberOfProps(NumberOfProps() + 1);
18614514f5e3Sopenharmony_ci    }
18624514f5e3Sopenharmony_ci
18634514f5e3Sopenharmony_ci    inline uint32_t NumberOfProps() const
18644514f5e3Sopenharmony_ci    {
18654514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
18664514f5e3Sopenharmony_ci        return NumberOfPropsBits::Decode(bits);
18674514f5e3Sopenharmony_ci    }
18684514f5e3Sopenharmony_ci
18694514f5e3Sopenharmony_ci    inline bool HasProps() const
18704514f5e3Sopenharmony_ci    {
18714514f5e3Sopenharmony_ci        return NumberOfProps() > 0;
18724514f5e3Sopenharmony_ci    }
18734514f5e3Sopenharmony_ci
18744514f5e3Sopenharmony_ci    inline bool PropsIsEmpty() const
18754514f5e3Sopenharmony_ci    {
18764514f5e3Sopenharmony_ci        return NumberOfProps() == 0;
18774514f5e3Sopenharmony_ci    }
18784514f5e3Sopenharmony_ci
18794514f5e3Sopenharmony_ci    inline uint32_t LastPropIndex() const
18804514f5e3Sopenharmony_ci    {
18814514f5e3Sopenharmony_ci        ASSERT(NumberOfProps() > 0);
18824514f5e3Sopenharmony_ci        return NumberOfProps() - 1;
18834514f5e3Sopenharmony_ci    }
18844514f5e3Sopenharmony_ci
18854514f5e3Sopenharmony_ci    inline int32_t GetNextInlinedPropsIndex() const
18864514f5e3Sopenharmony_ci    {
18874514f5e3Sopenharmony_ci        uint32_t inlinedProperties = GetInlinedProperties();
18884514f5e3Sopenharmony_ci        uint32_t numberOfProps = NumberOfProps();
18894514f5e3Sopenharmony_ci        if (numberOfProps < inlinedProperties) {
18904514f5e3Sopenharmony_ci            return numberOfProps;
18914514f5e3Sopenharmony_ci        }
18924514f5e3Sopenharmony_ci        return -1;
18934514f5e3Sopenharmony_ci    }
18944514f5e3Sopenharmony_ci
18954514f5e3Sopenharmony_ci    inline int32_t GetNextNonInlinedPropsIndex() const
18964514f5e3Sopenharmony_ci    {
18974514f5e3Sopenharmony_ci        uint32_t inlinedProperties = GetInlinedProperties();
18984514f5e3Sopenharmony_ci        uint32_t numberOfProps = NumberOfProps();
18994514f5e3Sopenharmony_ci        if (numberOfProps >= inlinedProperties) {
19004514f5e3Sopenharmony_ci            return numberOfProps - inlinedProperties;
19014514f5e3Sopenharmony_ci        }
19024514f5e3Sopenharmony_ci        return -1;
19034514f5e3Sopenharmony_ci    }
19044514f5e3Sopenharmony_ci
19054514f5e3Sopenharmony_ci    inline uint32_t GetObjectSize() const
19064514f5e3Sopenharmony_ci    {
19074514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19084514f5e3Sopenharmony_ci        return ObjectSizeInWordsBits::Decode(bits) * JSTaggedValue::TaggedTypeSize();
19094514f5e3Sopenharmony_ci    }
19104514f5e3Sopenharmony_ci
19114514f5e3Sopenharmony_ci    inline uint32_t GetObjectSizeExcludeInlinedProps() const
19124514f5e3Sopenharmony_ci    {
19134514f5e3Sopenharmony_ci        return GetObjectSize() - GetInlinedProperties() * JSTaggedValue::TaggedTypeSize();
19144514f5e3Sopenharmony_ci    }
19154514f5e3Sopenharmony_ci
19164514f5e3Sopenharmony_ci    inline void SetObjectSize(uint32_t num)
19174514f5e3Sopenharmony_ci    {
19184514f5e3Sopenharmony_ci        ASSERT((num / JSTaggedValue::TaggedTypeSize()) <= MAX_OBJECT_SIZE_IN_WORDS);
19194514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19204514f5e3Sopenharmony_ci        uint32_t newVal = ObjectSizeInWordsBits::Update(bits, num / JSTaggedValue::TaggedTypeSize());
19214514f5e3Sopenharmony_ci        SetBitField1(newVal);
19224514f5e3Sopenharmony_ci    }
19234514f5e3Sopenharmony_ci
19244514f5e3Sopenharmony_ci    inline uint32_t GetInlinedPropertiesOffset(uint32_t index) const
19254514f5e3Sopenharmony_ci    {
19264514f5e3Sopenharmony_ci        ASSERT(index < GetInlinedProperties());
19274514f5e3Sopenharmony_ci        return GetInlinedPropertiesIndex(index) * JSTaggedValue::TaggedTypeSize();
19284514f5e3Sopenharmony_ci    }
19294514f5e3Sopenharmony_ci
19304514f5e3Sopenharmony_ci    inline uint32_t GetInlinedPropertiesIndex(uint32_t index) const
19314514f5e3Sopenharmony_ci    {
19324514f5e3Sopenharmony_ci        ASSERT(index < GetInlinedProperties());
19334514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19344514f5e3Sopenharmony_ci        return InlinedPropsStartBits::Decode(bits) + index;
19354514f5e3Sopenharmony_ci    }
19364514f5e3Sopenharmony_ci
19374514f5e3Sopenharmony_ci    inline void SetInlinedPropsStart(uint32_t num)
19384514f5e3Sopenharmony_ci    {
19394514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19404514f5e3Sopenharmony_ci        uint32_t newVal = InlinedPropsStartBits::Update(bits, num / JSTaggedValue::TaggedTypeSize());
19414514f5e3Sopenharmony_ci        SetBitField1(newVal);
19424514f5e3Sopenharmony_ci    }
19434514f5e3Sopenharmony_ci
19444514f5e3Sopenharmony_ci    inline uint32_t GetInlinedPropsStartSize() const
19454514f5e3Sopenharmony_ci    {
19464514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19474514f5e3Sopenharmony_ci        return InlinedPropsStartBits::Decode(bits) * JSTaggedValue::TaggedTypeSize();
19484514f5e3Sopenharmony_ci    }
19494514f5e3Sopenharmony_ci
19504514f5e3Sopenharmony_ci    inline uint32_t GetInlinedProperties() const
19514514f5e3Sopenharmony_ci    {
19524514f5e3Sopenharmony_ci        if (IsJSObject()) {
19534514f5e3Sopenharmony_ci            uint32_t bits = GetBitField1();
19544514f5e3Sopenharmony_ci            return static_cast<uint32_t>(ObjectSizeInWordsBits::Decode(bits) - InlinedPropsStartBits::Decode(bits));
19554514f5e3Sopenharmony_ci        } else {
19564514f5e3Sopenharmony_ci            return 0;
19574514f5e3Sopenharmony_ci        }
19584514f5e3Sopenharmony_ci    }
19594514f5e3Sopenharmony_ci
19604514f5e3Sopenharmony_ci    inline void SetHasDeleteProperty(bool flag) const
19614514f5e3Sopenharmony_ci    {
19624514f5e3Sopenharmony_ci        HasDeletePropertyBit::Set<uint32_t>(flag, GetBitField1Addr());
19634514f5e3Sopenharmony_ci    }
19644514f5e3Sopenharmony_ci
19654514f5e3Sopenharmony_ci    inline bool HasDeleteProperty() const
19664514f5e3Sopenharmony_ci    {
19674514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19684514f5e3Sopenharmony_ci        return HasDeletePropertyBit::Decode(bits);
19694514f5e3Sopenharmony_ci    }
19704514f5e3Sopenharmony_ci
19714514f5e3Sopenharmony_ci    inline void SetIsAllTaggedProp(bool flag) const
19724514f5e3Sopenharmony_ci    {
19734514f5e3Sopenharmony_ci        IsAllTaggedPropBit::Set<uint32_t>(flag, GetBitField1Addr());
19744514f5e3Sopenharmony_ci    }
19754514f5e3Sopenharmony_ci
19764514f5e3Sopenharmony_ci    inline bool IsAllTaggedProp() const
19774514f5e3Sopenharmony_ci    {
19784514f5e3Sopenharmony_ci        uint32_t bits = GetBitField1();
19794514f5e3Sopenharmony_ci        return IsAllTaggedPropBit::Decode(bits);
19804514f5e3Sopenharmony_ci    }
19814514f5e3Sopenharmony_ci
19824514f5e3Sopenharmony_ci    inline static JSHClass *FindRootHClass(JSHClass *hclass);
19834514f5e3Sopenharmony_ci    inline static JSTaggedValue FindProtoHClass(JSHClass *hclass);
19844514f5e3Sopenharmony_ci    inline static JSTaggedValue FindProtoRootHClass(JSHClass *hclass);
19854514f5e3Sopenharmony_ci    inline static void UpdateRootHClass(const JSThread *thread, const JSHandle<JSHClass> &parent,
19864514f5e3Sopenharmony_ci                                        const JSHandle<JSHClass> &child);
19874514f5e3Sopenharmony_ci
19884514f5e3Sopenharmony_ci    inline static int FindPropertyEntry(const JSThread *thread, JSHClass *hclass, JSTaggedValue key);
19894514f5e3Sopenharmony_ci
19904514f5e3Sopenharmony_ci    static PUBLIC_API PropertyLookupResult LookupPropertyInAotHClass(const JSThread *thread, JSHClass *hclass,
19914514f5e3Sopenharmony_ci        JSTaggedValue key);
19924514f5e3Sopenharmony_ci    static PUBLIC_API PropertyLookupResult LookupPropertyInPGOHClass(const JSThread *thread, JSHClass *hclass,
19934514f5e3Sopenharmony_ci        JSTaggedValue key);
19944514f5e3Sopenharmony_ci    static PUBLIC_API PropertyLookupResult LookupPropertyInBuiltinPrototypeHClass(const JSThread *thread,
19954514f5e3Sopenharmony_ci                                                                                  JSHClass *hclass, JSTaggedValue key);
19964514f5e3Sopenharmony_ci    static PUBLIC_API PropertyLookupResult LookupPropertyInBuiltinHClass(const JSThread *thread, JSHClass *hclass,
19974514f5e3Sopenharmony_ci                                                                         JSTaggedValue key);
19984514f5e3Sopenharmony_ci
19994514f5e3Sopenharmony_ci    static constexpr size_t PROTOTYPE_OFFSET = TaggedObjectSize();
20004514f5e3Sopenharmony_ci    ACCESSORS(Proto, PROTOTYPE_OFFSET, LAYOUT_OFFSET);
20014514f5e3Sopenharmony_ci    ACCESSORS_SYNCHRONIZED(Layout, LAYOUT_OFFSET, TRANSTIONS_OFFSET);
20024514f5e3Sopenharmony_ci    ACCESSORS(Transitions, TRANSTIONS_OFFSET, PARENT_OFFSET);
20034514f5e3Sopenharmony_ci    ACCESSORS(Parent, PARENT_OFFSET, PROTO_CHANGE_MARKER_OFFSET);
20044514f5e3Sopenharmony_ci    ACCESSORS(ProtoChangeMarker, PROTO_CHANGE_MARKER_OFFSET, PROTO_CHANGE_DETAILS_OFFSET);
20054514f5e3Sopenharmony_ci    ACCESSORS(ProtoChangeDetails, PROTO_CHANGE_DETAILS_OFFSET, ENUM_CACHE_OFFSET);
20064514f5e3Sopenharmony_ci    ACCESSORS(EnumCache, ENUM_CACHE_OFFSET, PROFILE_TYPE);
20074514f5e3Sopenharmony_ci    ACCESSORS_PRIMITIVE_FIELD(ProfileType, uint64_t, PROFILE_TYPE, BIT_FIELD_OFFSET);
20084514f5e3Sopenharmony_ci    ACCESSORS_PRIMITIVE_FIELD(BitField, uint32_t, BIT_FIELD_OFFSET, BIT_FIELD1_OFFSET);
20094514f5e3Sopenharmony_ci    ACCESSORS_PRIMITIVE_FIELD(BitField1, uint32_t, BIT_FIELD1_OFFSET, LAST_OFFSET);
20104514f5e3Sopenharmony_ci    DEFINE_ALIGN_SIZE(LAST_OFFSET);
20114514f5e3Sopenharmony_ci
20124514f5e3Sopenharmony_ci    static JSHandle<JSHClass> SetPrototypeWithNotification(const JSThread *thread,
20134514f5e3Sopenharmony_ci                                                           const JSHandle<JSHClass> &hclass,
20144514f5e3Sopenharmony_ci                                                           const JSHandle<JSTaggedValue> &proto,
20154514f5e3Sopenharmony_ci                                                           bool isChangeProto = false);
20164514f5e3Sopenharmony_ci    static void SetPrototypeTransition(JSThread *thread, const JSHandle<JSObject> &object,
20174514f5e3Sopenharmony_ci                                       const JSHandle<JSTaggedValue> &proto,
20184514f5e3Sopenharmony_ci                                       bool isChangeProto = false);
20194514f5e3Sopenharmony_ci    void SetPrototype(const JSThread *thread, JSTaggedValue proto, bool isChangeProto = false);
20204514f5e3Sopenharmony_ci    void PUBLIC_API SetPrototype(const JSThread *thread,
20214514f5e3Sopenharmony_ci                                 const JSHandle<JSTaggedValue> &proto,
20224514f5e3Sopenharmony_ci                                 bool isChangeProto = false);
20234514f5e3Sopenharmony_ci    static void OptimizePrototypeForIC(const JSThread *thread,
20244514f5e3Sopenharmony_ci                                       const JSHandle<JSTaggedValue> &proto,
20254514f5e3Sopenharmony_ci                                       bool isChangeProto = false);
20264514f5e3Sopenharmony_ci    inline JSTaggedValue GetPrototype() const
20274514f5e3Sopenharmony_ci    {
20284514f5e3Sopenharmony_ci        return GetProto();
20294514f5e3Sopenharmony_ci    }
20304514f5e3Sopenharmony_ci
20314514f5e3Sopenharmony_ci    inline JSHClass *FindTransitions(const JSTaggedValue &key,
20324514f5e3Sopenharmony_ci                                     const JSTaggedValue &metaData,
20334514f5e3Sopenharmony_ci                                     const Representation &rep);
20344514f5e3Sopenharmony_ci    inline JSHClass *CheckHClassForRep(JSHClass *hclass, const Representation &rep);
20354514f5e3Sopenharmony_ci
20364514f5e3Sopenharmony_ci    DECL_DUMP()
20374514f5e3Sopenharmony_ci
20384514f5e3Sopenharmony_ci    static CString DumpJSType(JSType type);
20394514f5e3Sopenharmony_ci
20404514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateRootHClassFromPGO(const JSThread* thread,
20414514f5e3Sopenharmony_ci                                                      const HClassLayoutDesc* desc,
20424514f5e3Sopenharmony_ci                                                      uint32_t maxNum,
20434514f5e3Sopenharmony_ci                                                      bool isCache);
20444514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateRootHClassWithCached(const JSThread* thread,
20454514f5e3Sopenharmony_ci                                                         const HClassLayoutDesc* desc,
20464514f5e3Sopenharmony_ci                                                         uint32_t maxNum);
20474514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateChildHClassFromPGO(const JSThread* thread,
20484514f5e3Sopenharmony_ci                                                       const JSHandle<JSHClass>& parent,
20494514f5e3Sopenharmony_ci                                                       const HClassLayoutDesc* desc);
20504514f5e3Sopenharmony_ci    static bool DumpRootHClassByPGO(const JSHClass* hclass, HClassLayoutDesc* desc);
20514514f5e3Sopenharmony_ci    static bool DumpChildHClassByPGO(const JSHClass* hclass, HClassLayoutDesc* desc);
20524514f5e3Sopenharmony_ci    static bool UpdateRootLayoutDescByPGO(const JSHClass* hclass, HClassLayoutDesc* rootDesc);
20534514f5e3Sopenharmony_ci    static bool UpdateChildLayoutDescByPGO(const JSHClass* hclass, HClassLayoutDesc* childDesc);
20544514f5e3Sopenharmony_ci    static CString DumpToString(JSTaggedType hclassVal);
20554514f5e3Sopenharmony_ci
20564514f5e3Sopenharmony_ci    DECL_VISIT_OBJECT(PROTOTYPE_OFFSET, PROFILE_TYPE);
20574514f5e3Sopenharmony_ci    inline JSHClass *FindProtoTransitions(const JSTaggedValue &key, const JSTaggedValue &proto);
20584514f5e3Sopenharmony_ci    inline bool HasTransitions() const
20594514f5e3Sopenharmony_ci    {
20604514f5e3Sopenharmony_ci        return !GetTransitions().IsUndefined();
20614514f5e3Sopenharmony_ci    }
20624514f5e3Sopenharmony_ci
20634514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateSHClass(JSThread *thread,
20644514f5e3Sopenharmony_ci                                            const std::vector<PropertyDescriptor> &descs,
20654514f5e3Sopenharmony_ci                                            const JSHClass *parentHClass = nullptr,
20664514f5e3Sopenharmony_ci                                            bool isFunction = false);
20674514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateSConstructorHClass(JSThread *thread, const std::vector<PropertyDescriptor> &descs);
20684514f5e3Sopenharmony_ci    static JSHandle<JSHClass> CreateSPrototypeHClass(JSThread *thread, const std::vector<PropertyDescriptor> &descs);
20694514f5e3Sopenharmony_ci
20704514f5e3Sopenharmony_ciprivate:
20714514f5e3Sopenharmony_ci
20724514f5e3Sopenharmony_ci    static inline bool ProtoIsFastJSArray(const JSThread *thread, const JSHandle<JSTaggedValue> proto,
20734514f5e3Sopenharmony_ci                                          const JSHandle<JSHClass> hclass);
20744514f5e3Sopenharmony_ci
20754514f5e3Sopenharmony_ci    static void CreateSInlinedLayout(JSThread *thread,
20764514f5e3Sopenharmony_ci                                     const std::vector<PropertyDescriptor> &descs,
20774514f5e3Sopenharmony_ci                                     const JSHandle<JSHClass> &hclass,
20784514f5e3Sopenharmony_ci                                     const JSHClass *parentHClass = nullptr);
20794514f5e3Sopenharmony_ci    static void CreateSDictLayout(JSThread *thread,
20804514f5e3Sopenharmony_ci                                  const std::vector<PropertyDescriptor> &descs,
20814514f5e3Sopenharmony_ci                                  const JSHandle<JSHClass> &hclass,
20824514f5e3Sopenharmony_ci                                  const JSHClass *parentHClass = nullptr);
20834514f5e3Sopenharmony_ci    static inline void AddTransitions(const JSThread *thread, const JSHandle<JSHClass> &parent,
20844514f5e3Sopenharmony_ci                                      const JSHandle<JSHClass> &child, const JSHandle<JSTaggedValue> &key,
20854514f5e3Sopenharmony_ci                                      PropertyAttributes attr);
20864514f5e3Sopenharmony_ci    static inline void AddExtensionTransitions(const JSThread *thread, const JSHandle<JSHClass> &parent,
20874514f5e3Sopenharmony_ci                                               const JSHandle<JSHClass> &child, const JSHandle<JSTaggedValue> &key);
20884514f5e3Sopenharmony_ci    static inline void AddProtoTransitions(const JSThread *thread, const JSHandle<JSHClass> &parent,
20894514f5e3Sopenharmony_ci                                           const JSHandle<JSHClass> &child, const JSHandle<JSTaggedValue> &key,
20904514f5e3Sopenharmony_ci                                           const JSHandle<JSTaggedValue> &proto);
20914514f5e3Sopenharmony_ci    template<bool checkDuplicateKeys = false>
20924514f5e3Sopenharmony_ci    static inline void AddPropertyToNewHClass(const JSThread *thread, JSHandle<JSHClass> &jshclass,
20934514f5e3Sopenharmony_ci                                              JSHandle<JSHClass> &newJsHClass, const JSHandle<JSTaggedValue> &key,
20944514f5e3Sopenharmony_ci                                              const PropertyAttributes &attr);
20954514f5e3Sopenharmony_ci
20964514f5e3Sopenharmony_ci    void InitializeWithDefaultValue(const JSThread *thread, uint32_t size, JSType type, uint32_t inlinedProps);
20974514f5e3Sopenharmony_ci
20984514f5e3Sopenharmony_ci    static bool IsJSTypeObject(JSType type)
20994514f5e3Sopenharmony_ci    {
21004514f5e3Sopenharmony_ci        return JSType::JS_OBJECT_FIRST <= type && type <= JSType::JS_OBJECT_LAST;
21014514f5e3Sopenharmony_ci    }
21024514f5e3Sopenharmony_ci
21034514f5e3Sopenharmony_ci    static bool IsJSTypeShared(JSType type);
21044514f5e3Sopenharmony_ci
21054514f5e3Sopenharmony_ci    inline void Copy(const JSThread *thread, const JSHClass *jshclass);
21064514f5e3Sopenharmony_ci
21074514f5e3Sopenharmony_ci    uint32_t *GetBitFieldAddr() const
21084514f5e3Sopenharmony_ci    {
21094514f5e3Sopenharmony_ci        return reinterpret_cast<uint32_t *>(ToUintPtr(this) + BIT_FIELD_OFFSET);
21104514f5e3Sopenharmony_ci    }
21114514f5e3Sopenharmony_ci
21124514f5e3Sopenharmony_ci    uint32_t *GetBitField1Addr() const
21134514f5e3Sopenharmony_ci    {
21144514f5e3Sopenharmony_ci        return reinterpret_cast<uint32_t *>(ToUintPtr(this) + BIT_FIELD1_OFFSET);
21154514f5e3Sopenharmony_ci    }
21164514f5e3Sopenharmony_ci    friend class RuntimeStubs;
21174514f5e3Sopenharmony_ci};
21184514f5e3Sopenharmony_cistatic_assert(JSHClass::BIT_FIELD_OFFSET % static_cast<uint8_t>(MemAlignment::MEM_ALIGN_OBJECT) == 0);
21194514f5e3Sopenharmony_ci
21204514f5e3Sopenharmony_ci// record property look up info in local and vtable
21214514f5e3Sopenharmony_ciclass PropertyLookupResult {
21224514f5e3Sopenharmony_cipublic:
21234514f5e3Sopenharmony_ci    static constexpr uint32_t OFFSET_BITFIELD_NUM = 14;
21244514f5e3Sopenharmony_ci    using IsFoundBit = BitField<bool, 0, 1>;
21254514f5e3Sopenharmony_ci    using IsLocalBit = IsFoundBit::NextFlag;
21264514f5e3Sopenharmony_ci    using IsNotHoleBit = IsLocalBit::NextFlag;
21274514f5e3Sopenharmony_ci    using IsAccessorBit = IsNotHoleBit::NextFlag;
21284514f5e3Sopenharmony_ci    using OffsetBits = IsAccessorBit::NextField<uint32_t, OFFSET_BITFIELD_NUM>;
21294514f5e3Sopenharmony_ci    using WritableField = OffsetBits::NextFlag;
21304514f5e3Sopenharmony_ci    using RepresentationBits = WritableField::NextField<Representation, PropertyAttributes::REPRESENTATION_NUM>;
21314514f5e3Sopenharmony_ci    using IsInlinedPropsBits = RepresentationBits::NextFlag;
21324514f5e3Sopenharmony_ci
21334514f5e3Sopenharmony_ci    explicit PropertyLookupResult(uint32_t data = 0) : data_(data) {}
21344514f5e3Sopenharmony_ci    ~PropertyLookupResult() = default;
21354514f5e3Sopenharmony_ci    DEFAULT_NOEXCEPT_MOVE_SEMANTIC(PropertyLookupResult);
21364514f5e3Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(PropertyLookupResult);
21374514f5e3Sopenharmony_ci
21384514f5e3Sopenharmony_ci    inline bool IsFound() const
21394514f5e3Sopenharmony_ci    {
21404514f5e3Sopenharmony_ci        return IsFoundBit::Get(data_);
21414514f5e3Sopenharmony_ci    }
21424514f5e3Sopenharmony_ci
21434514f5e3Sopenharmony_ci    inline void SetIsFound(bool flag)
21444514f5e3Sopenharmony_ci    {
21454514f5e3Sopenharmony_ci        IsFoundBit::Set(flag, &data_);
21464514f5e3Sopenharmony_ci    }
21474514f5e3Sopenharmony_ci
21484514f5e3Sopenharmony_ci    inline bool IsWritable() const
21494514f5e3Sopenharmony_ci    {
21504514f5e3Sopenharmony_ci        return WritableField::Get(data_);
21514514f5e3Sopenharmony_ci    }
21524514f5e3Sopenharmony_ci
21534514f5e3Sopenharmony_ci    inline void SetIsWritable(bool flag)
21544514f5e3Sopenharmony_ci    {
21554514f5e3Sopenharmony_ci        WritableField::Set(flag, &data_);
21564514f5e3Sopenharmony_ci    }
21574514f5e3Sopenharmony_ci
21584514f5e3Sopenharmony_ci    inline bool IsLocal() const
21594514f5e3Sopenharmony_ci    {
21604514f5e3Sopenharmony_ci        return IsLocalBit::Get(data_);
21614514f5e3Sopenharmony_ci    }
21624514f5e3Sopenharmony_ci
21634514f5e3Sopenharmony_ci    inline void SetIsLocal(bool flag)
21644514f5e3Sopenharmony_ci    {
21654514f5e3Sopenharmony_ci        IsLocalBit::Set(flag, &data_);
21664514f5e3Sopenharmony_ci    }
21674514f5e3Sopenharmony_ci
21684514f5e3Sopenharmony_ci    inline bool IsNotHole() const
21694514f5e3Sopenharmony_ci    {
21704514f5e3Sopenharmony_ci        return IsNotHoleBit::Get(data_);
21714514f5e3Sopenharmony_ci    }
21724514f5e3Sopenharmony_ci
21734514f5e3Sopenharmony_ci    inline void SetIsNotHole(bool flag)
21744514f5e3Sopenharmony_ci    {
21754514f5e3Sopenharmony_ci        IsNotHoleBit::Set(flag, &data_);
21764514f5e3Sopenharmony_ci    }
21774514f5e3Sopenharmony_ci
21784514f5e3Sopenharmony_ci    inline bool IsVtable() const
21794514f5e3Sopenharmony_ci    {
21804514f5e3Sopenharmony_ci        return IsFound() && !IsLocal();
21814514f5e3Sopenharmony_ci    }
21824514f5e3Sopenharmony_ci
21834514f5e3Sopenharmony_ci    inline void SetIsVtable()
21844514f5e3Sopenharmony_ci    {
21854514f5e3Sopenharmony_ci        SetIsFound(true);
21864514f5e3Sopenharmony_ci        SetIsLocal(false);
21874514f5e3Sopenharmony_ci    }
21884514f5e3Sopenharmony_ci
21894514f5e3Sopenharmony_ci    inline bool IsAccessor() const
21904514f5e3Sopenharmony_ci    {
21914514f5e3Sopenharmony_ci        return IsAccessorBit::Get(data_);
21924514f5e3Sopenharmony_ci    }
21934514f5e3Sopenharmony_ci
21944514f5e3Sopenharmony_ci    inline void SetIsAccessor(bool flag)
21954514f5e3Sopenharmony_ci    {
21964514f5e3Sopenharmony_ci        IsAccessorBit::Set(flag, &data_);
21974514f5e3Sopenharmony_ci    }
21984514f5e3Sopenharmony_ci
21994514f5e3Sopenharmony_ci    inline bool IsFunction() const
22004514f5e3Sopenharmony_ci    {
22014514f5e3Sopenharmony_ci        return IsVtable() && !IsAccessor();
22024514f5e3Sopenharmony_ci    }
22034514f5e3Sopenharmony_ci
22044514f5e3Sopenharmony_ci    inline uint32_t GetOffset() const
22054514f5e3Sopenharmony_ci    {
22064514f5e3Sopenharmony_ci        return OffsetBits::Get(data_);
22074514f5e3Sopenharmony_ci    }
22084514f5e3Sopenharmony_ci
22094514f5e3Sopenharmony_ci    inline void SetOffset(uint32_t offset)
22104514f5e3Sopenharmony_ci    {
22114514f5e3Sopenharmony_ci        OffsetBits::Set<uint32_t>(offset, &data_);
22124514f5e3Sopenharmony_ci    }
22134514f5e3Sopenharmony_ci
22144514f5e3Sopenharmony_ci    inline void SetRepresentation(Representation rep)
22154514f5e3Sopenharmony_ci    {
22164514f5e3Sopenharmony_ci        RepresentationBits::Set(rep, &data_);
22174514f5e3Sopenharmony_ci    }
22184514f5e3Sopenharmony_ci
22194514f5e3Sopenharmony_ci    inline Representation GetRepresentation()
22204514f5e3Sopenharmony_ci    {
22214514f5e3Sopenharmony_ci        return RepresentationBits::Get(data_);
22224514f5e3Sopenharmony_ci    }
22234514f5e3Sopenharmony_ci
22244514f5e3Sopenharmony_ci    inline void SetIsInlinedProps(bool flag)
22254514f5e3Sopenharmony_ci    {
22264514f5e3Sopenharmony_ci        IsInlinedPropsBits::Set(flag, &data_);
22274514f5e3Sopenharmony_ci    }
22284514f5e3Sopenharmony_ci
22294514f5e3Sopenharmony_ci    inline bool IsInlinedProps()
22304514f5e3Sopenharmony_ci    {
22314514f5e3Sopenharmony_ci        return IsInlinedPropsBits::Get(data_);
22324514f5e3Sopenharmony_ci    }
22334514f5e3Sopenharmony_ci
22344514f5e3Sopenharmony_ci    inline uint32_t GetData() const
22354514f5e3Sopenharmony_ci    {
22364514f5e3Sopenharmony_ci        return data_;
22374514f5e3Sopenharmony_ci    }
22384514f5e3Sopenharmony_ci
22394514f5e3Sopenharmony_ciprivate:
22404514f5e3Sopenharmony_ci    uint32_t data_ {0};
22414514f5e3Sopenharmony_ci};
22424514f5e3Sopenharmony_cistatic_assert(PropertyLookupResult::OffsetBits::MaxValue() >
22434514f5e3Sopenharmony_ci              (PropertyAttributes::MAX_FAST_PROPS_CAPACITY * JSTaggedValue::TaggedTypeSize()));
22444514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
22454514f5e3Sopenharmony_ci
22464514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_JS_HCLASS_H
2247