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