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_THREAD_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_JS_THREAD_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <atomic>
204514f5e3Sopenharmony_ci#include <sstream>
214514f5e3Sopenharmony_ci#include <string>
224514f5e3Sopenharmony_ci#include <cstdint>
234514f5e3Sopenharmony_ci
244514f5e3Sopenharmony_ci#include "ecmascript/platform/ffrt.h"
254514f5e3Sopenharmony_ci#include "ecmascript/base/aligned_struct.h"
264514f5e3Sopenharmony_ci#include "ecmascript/builtin_entries.h"
274514f5e3Sopenharmony_ci#include "ecmascript/daemon/daemon_task.h"
284514f5e3Sopenharmony_ci#include "ecmascript/global_index.h"
294514f5e3Sopenharmony_ci#include "ecmascript/js_object_resizing_strategy.h"
304514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h"
314514f5e3Sopenharmony_ci#include "ecmascript/js_thread_hclass_entries.h"
324514f5e3Sopenharmony_ci#include "ecmascript/js_thread_stub_entries.h"
334514f5e3Sopenharmony_ci#include "ecmascript/log_wrapper.h"
344514f5e3Sopenharmony_ci#include "ecmascript/mem/visitor.h"
354514f5e3Sopenharmony_ci#include "ecmascript/mutator_lock.h"
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_ci#if defined(ENABLE_FFRT_INTERFACES)
384514f5e3Sopenharmony_ci#include "ffrt.h"
394514f5e3Sopenharmony_ci#include "c/executor_task.h"
404514f5e3Sopenharmony_ci#endif
414514f5e3Sopenharmony_ci
424514f5e3Sopenharmony_cinamespace panda::ecmascript {
434514f5e3Sopenharmony_ciclass EcmaContext;
444514f5e3Sopenharmony_ciclass EcmaVM;
454514f5e3Sopenharmony_ciclass EcmaHandleScope;
464514f5e3Sopenharmony_ciclass GlobalIndex;
474514f5e3Sopenharmony_ciclass HeapRegionAllocator;
484514f5e3Sopenharmony_ciclass PropertiesCache;
494514f5e3Sopenharmony_citemplate<typename T>
504514f5e3Sopenharmony_ciclass EcmaGlobalStorage;
514514f5e3Sopenharmony_ciclass Node;
524514f5e3Sopenharmony_ciclass DebugNode;
534514f5e3Sopenharmony_ciclass VmThreadControl;
544514f5e3Sopenharmony_ciclass GlobalEnvConstants;
554514f5e3Sopenharmony_cienum class ElementsKind : uint8_t;
564514f5e3Sopenharmony_ci
574514f5e3Sopenharmony_ci// NOTE: remove
584514f5e3Sopenharmony_ciclass MachineCode;
594514f5e3Sopenharmony_ciusing JitCodeVector = std::vector<std::tuple<MachineCode*, std::string, uintptr_t>>;
604514f5e3Sopenharmony_ciusing JitCodeMapVisitor = std::function<void(std::map<JSTaggedType, JitCodeVector*>&)>;
614514f5e3Sopenharmony_ci
624514f5e3Sopenharmony_ciusing WeakClearCallback = void (*)(void *);
634514f5e3Sopenharmony_ci
644514f5e3Sopenharmony_cienum class MarkStatus : uint8_t {
654514f5e3Sopenharmony_ci    READY_TO_MARK,
664514f5e3Sopenharmony_ci    MARKING,
674514f5e3Sopenharmony_ci    MARK_FINISHED,
684514f5e3Sopenharmony_ci};
694514f5e3Sopenharmony_ci
704514f5e3Sopenharmony_cienum class GCKind : uint8_t {
714514f5e3Sopenharmony_ci    LOCAL_GC,
724514f5e3Sopenharmony_ci    SHARED_GC
734514f5e3Sopenharmony_ci};
744514f5e3Sopenharmony_ci
754514f5e3Sopenharmony_cienum class PGOProfilerStatus : uint8_t {
764514f5e3Sopenharmony_ci    PGO_PROFILER_DISABLE,
774514f5e3Sopenharmony_ci    PGO_PROFILER_ENABLE,
784514f5e3Sopenharmony_ci};
794514f5e3Sopenharmony_ci
804514f5e3Sopenharmony_cienum class BCStubStatus: uint8_t {
814514f5e3Sopenharmony_ci    NORMAL_BC_STUB,
824514f5e3Sopenharmony_ci    PROFILE_BC_STUB,
834514f5e3Sopenharmony_ci    JIT_PROFILE_BC_STUB,
844514f5e3Sopenharmony_ci};
854514f5e3Sopenharmony_ci
864514f5e3Sopenharmony_cienum class StableArrayChangeKind { PROTO, NOT_PROTO };
874514f5e3Sopenharmony_ci
884514f5e3Sopenharmony_cienum ThreadType : uint8_t {
894514f5e3Sopenharmony_ci    JS_THREAD,
904514f5e3Sopenharmony_ci    JIT_THREAD,
914514f5e3Sopenharmony_ci    DAEMON_THREAD,
924514f5e3Sopenharmony_ci};
934514f5e3Sopenharmony_ci
944514f5e3Sopenharmony_cienum ThreadFlag : uint16_t {
954514f5e3Sopenharmony_ci    NO_FLAGS = 0 << 0,
964514f5e3Sopenharmony_ci    SUSPEND_REQUEST = 1 << 0,
974514f5e3Sopenharmony_ci    ACTIVE_BARRIER = 1 << 1,
984514f5e3Sopenharmony_ci};
994514f5e3Sopenharmony_ci
1004514f5e3Sopenharmony_cistatic constexpr uint32_t THREAD_STATE_OFFSET = 16;
1014514f5e3Sopenharmony_cistatic constexpr uint32_t THREAD_FLAGS_MASK = (0x1 << THREAD_STATE_OFFSET) - 1;
1024514f5e3Sopenharmony_cienum class ThreadState : uint16_t {
1034514f5e3Sopenharmony_ci    CREATED = 0,
1044514f5e3Sopenharmony_ci    RUNNING = 1,
1054514f5e3Sopenharmony_ci    NATIVE = 2,
1064514f5e3Sopenharmony_ci    WAIT = 3,
1074514f5e3Sopenharmony_ci    IS_SUSPENDED = 4,
1084514f5e3Sopenharmony_ci    TERMINATED = 5,
1094514f5e3Sopenharmony_ci};
1104514f5e3Sopenharmony_ci
1114514f5e3Sopenharmony_ciunion ThreadStateAndFlags {
1124514f5e3Sopenharmony_ci    explicit ThreadStateAndFlags(uint32_t val = 0): asInt(val) {}
1134514f5e3Sopenharmony_ci    struct {
1144514f5e3Sopenharmony_ci        volatile uint16_t flags;
1154514f5e3Sopenharmony_ci        volatile ThreadState state;
1164514f5e3Sopenharmony_ci    } asStruct;
1174514f5e3Sopenharmony_ci    struct {
1184514f5e3Sopenharmony_ci        uint16_t flags;
1194514f5e3Sopenharmony_ci        ThreadState state;
1204514f5e3Sopenharmony_ci    } asNonvolatileStruct;
1214514f5e3Sopenharmony_ci    volatile uint32_t asInt;
1224514f5e3Sopenharmony_ci    uint32_t asNonvolatileInt;
1234514f5e3Sopenharmony_ci    std::atomic<uint32_t> asAtomicInt;
1244514f5e3Sopenharmony_ciprivate:
1254514f5e3Sopenharmony_ci    NO_COPY_SEMANTIC(ThreadStateAndFlags);
1264514f5e3Sopenharmony_ci};
1274514f5e3Sopenharmony_ci
1284514f5e3Sopenharmony_cistatic constexpr uint32_t MAIN_THREAD_INDEX = 0;
1294514f5e3Sopenharmony_ci
1304514f5e3Sopenharmony_ciclass JSThread {
1314514f5e3Sopenharmony_cipublic:
1324514f5e3Sopenharmony_ci    static constexpr int CONCURRENT_MARKING_BITFIELD_NUM = 2;
1334514f5e3Sopenharmony_ci    static constexpr int CONCURRENT_MARKING_BITFIELD_MASK = 0x3;
1344514f5e3Sopenharmony_ci    static constexpr int SHARED_CONCURRENT_MARKING_BITFIELD_NUM = 1;
1354514f5e3Sopenharmony_ci    static constexpr int SHARED_CONCURRENT_MARKING_BITFIELD_MASK = 0x1;
1364514f5e3Sopenharmony_ci    static constexpr int CHECK_SAFEPOINT_BITFIELD_NUM = 8;
1374514f5e3Sopenharmony_ci    static constexpr int PGO_PROFILER_BITFIELD_START = 16;
1384514f5e3Sopenharmony_ci    static constexpr int BOOL_BITFIELD_NUM = 1;
1394514f5e3Sopenharmony_ci    static constexpr int BCSTUBSTATUS_BITFIELD_NUM = 2;
1404514f5e3Sopenharmony_ci    static constexpr uint32_t RESERVE_STACK_SIZE = 128;
1414514f5e3Sopenharmony_ci    using MarkStatusBits = BitField<MarkStatus, 0, CONCURRENT_MARKING_BITFIELD_NUM>;
1424514f5e3Sopenharmony_ci    using SharedMarkStatusBits = BitField<SharedMarkStatus, 0, SHARED_CONCURRENT_MARKING_BITFIELD_NUM>;
1434514f5e3Sopenharmony_ci    using CheckSafePointBit = BitField<bool, 0, BOOL_BITFIELD_NUM>;
1444514f5e3Sopenharmony_ci    using VMNeedSuspensionBit = BitField<bool, CHECK_SAFEPOINT_BITFIELD_NUM, BOOL_BITFIELD_NUM>;
1454514f5e3Sopenharmony_ci    using VMHasSuspendedBit = VMNeedSuspensionBit::NextFlag;
1464514f5e3Sopenharmony_ci    using InstallMachineCodeBit = VMHasSuspendedBit::NextFlag;
1474514f5e3Sopenharmony_ci    using PGOStatusBits = BitField<PGOProfilerStatus, PGO_PROFILER_BITFIELD_START, BOOL_BITFIELD_NUM>;
1484514f5e3Sopenharmony_ci    using BCStubStatusBits = PGOStatusBits::NextField<BCStubStatus, BCSTUBSTATUS_BITFIELD_NUM>;
1494514f5e3Sopenharmony_ci    using ThreadId = uint32_t;
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ci    enum FrameDroppedState {
1524514f5e3Sopenharmony_ci        StateFalse = 0,
1534514f5e3Sopenharmony_ci        StateTrue,
1544514f5e3Sopenharmony_ci        StatePending
1554514f5e3Sopenharmony_ci    };
1564514f5e3Sopenharmony_ci
1574514f5e3Sopenharmony_ci    explicit JSThread(EcmaVM *vm);
1584514f5e3Sopenharmony_ci    // only used in jit thread
1594514f5e3Sopenharmony_ci    explicit JSThread(EcmaVM *vm, ThreadType threadType);
1604514f5e3Sopenharmony_ci    // only used in daemon thread
1614514f5e3Sopenharmony_ci    explicit JSThread(ThreadType threadType);
1624514f5e3Sopenharmony_ci
1634514f5e3Sopenharmony_ci    PUBLIC_API ~JSThread();
1644514f5e3Sopenharmony_ci
1654514f5e3Sopenharmony_ci    EcmaVM *GetEcmaVM() const
1664514f5e3Sopenharmony_ci    {
1674514f5e3Sopenharmony_ci        return vm_;
1684514f5e3Sopenharmony_ci    }
1694514f5e3Sopenharmony_ci
1704514f5e3Sopenharmony_ci    static JSThread *Create(EcmaVM *vm);
1714514f5e3Sopenharmony_ci    static JSThread *GetCurrent();
1724514f5e3Sopenharmony_ci
1734514f5e3Sopenharmony_ci    int GetNestedLevel() const
1744514f5e3Sopenharmony_ci    {
1754514f5e3Sopenharmony_ci        return nestedLevel_;
1764514f5e3Sopenharmony_ci    }
1774514f5e3Sopenharmony_ci
1784514f5e3Sopenharmony_ci    void SetNestedLevel(int level)
1794514f5e3Sopenharmony_ci    {
1804514f5e3Sopenharmony_ci        nestedLevel_ = level;
1814514f5e3Sopenharmony_ci    }
1824514f5e3Sopenharmony_ci
1834514f5e3Sopenharmony_ci    void SetLastFp(JSTaggedType *fp)
1844514f5e3Sopenharmony_ci    {
1854514f5e3Sopenharmony_ci        glueData_.lastFp_ = fp;
1864514f5e3Sopenharmony_ci    }
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ci    const JSTaggedType *GetLastFp() const
1894514f5e3Sopenharmony_ci    {
1904514f5e3Sopenharmony_ci        return glueData_.lastFp_;
1914514f5e3Sopenharmony_ci    }
1924514f5e3Sopenharmony_ci
1934514f5e3Sopenharmony_ci    const JSTaggedType *GetCurrentSPFrame() const
1944514f5e3Sopenharmony_ci    {
1954514f5e3Sopenharmony_ci        return glueData_.currentFrame_;
1964514f5e3Sopenharmony_ci    }
1974514f5e3Sopenharmony_ci
1984514f5e3Sopenharmony_ci    void SetCurrentSPFrame(JSTaggedType *sp)
1994514f5e3Sopenharmony_ci    {
2004514f5e3Sopenharmony_ci        glueData_.currentFrame_ = sp;
2014514f5e3Sopenharmony_ci    }
2024514f5e3Sopenharmony_ci
2034514f5e3Sopenharmony_ci    const JSTaggedType *GetLastLeaveFrame() const
2044514f5e3Sopenharmony_ci    {
2054514f5e3Sopenharmony_ci        return glueData_.leaveFrame_;
2064514f5e3Sopenharmony_ci    }
2074514f5e3Sopenharmony_ci
2084514f5e3Sopenharmony_ci    void SetLastLeaveFrame(JSTaggedType *sp)
2094514f5e3Sopenharmony_ci    {
2104514f5e3Sopenharmony_ci        glueData_.leaveFrame_ = sp;
2114514f5e3Sopenharmony_ci    }
2124514f5e3Sopenharmony_ci
2134514f5e3Sopenharmony_ci    const JSTaggedType *GetCurrentFrame() const;
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_ci    void SetCurrentFrame(JSTaggedType *sp);
2164514f5e3Sopenharmony_ci
2174514f5e3Sopenharmony_ci    const JSTaggedType *GetCurrentInterpretedFrame() const;
2184514f5e3Sopenharmony_ci
2194514f5e3Sopenharmony_ci    bool DoStackOverflowCheck(const JSTaggedType *sp);
2204514f5e3Sopenharmony_ci
2214514f5e3Sopenharmony_ci    bool DoStackLimitCheck();
2224514f5e3Sopenharmony_ci
2234514f5e3Sopenharmony_ci    NativeAreaAllocator *GetNativeAreaAllocator() const
2244514f5e3Sopenharmony_ci    {
2254514f5e3Sopenharmony_ci        return nativeAreaAllocator_;
2264514f5e3Sopenharmony_ci    }
2274514f5e3Sopenharmony_ci
2284514f5e3Sopenharmony_ci    HeapRegionAllocator *GetHeapRegionAllocator() const
2294514f5e3Sopenharmony_ci    {
2304514f5e3Sopenharmony_ci        return heapRegionAllocator_;
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci
2334514f5e3Sopenharmony_ci    void ReSetNewSpaceAllocationAddress(const uintptr_t *top, const uintptr_t* end)
2344514f5e3Sopenharmony_ci    {
2354514f5e3Sopenharmony_ci        glueData_.newSpaceAllocationTopAddress_ = top;
2364514f5e3Sopenharmony_ci        glueData_.newSpaceAllocationEndAddress_ = end;
2374514f5e3Sopenharmony_ci    }
2384514f5e3Sopenharmony_ci
2394514f5e3Sopenharmony_ci    void ReSetSOldSpaceAllocationAddress(const uintptr_t *top, const uintptr_t* end)
2404514f5e3Sopenharmony_ci    {
2414514f5e3Sopenharmony_ci        glueData_.sOldSpaceAllocationTopAddress_ = top;
2424514f5e3Sopenharmony_ci        glueData_.sOldSpaceAllocationEndAddress_ = end;
2434514f5e3Sopenharmony_ci    }
2444514f5e3Sopenharmony_ci
2454514f5e3Sopenharmony_ci    void ReSetSNonMovableSpaceAllocationAddress(const uintptr_t *top, const uintptr_t* end)
2464514f5e3Sopenharmony_ci    {
2474514f5e3Sopenharmony_ci        glueData_.sNonMovableSpaceAllocationTopAddress_ = top;
2484514f5e3Sopenharmony_ci        glueData_.sNonMovableSpaceAllocationEndAddress_ = end;
2494514f5e3Sopenharmony_ci    }
2504514f5e3Sopenharmony_ci
2514514f5e3Sopenharmony_ci    uintptr_t GetUnsharedConstpools() const
2524514f5e3Sopenharmony_ci    {
2534514f5e3Sopenharmony_ci        return glueData_.unsharedConstpools_;
2544514f5e3Sopenharmony_ci    }
2554514f5e3Sopenharmony_ci
2564514f5e3Sopenharmony_ci    void SetUnsharedConstpools(uintptr_t unsharedConstpools)
2574514f5e3Sopenharmony_ci    {
2584514f5e3Sopenharmony_ci        glueData_.unsharedConstpools_ = unsharedConstpools;
2594514f5e3Sopenharmony_ci    }
2604514f5e3Sopenharmony_ci
2614514f5e3Sopenharmony_ci    void SetIsStartHeapSampling(bool isStart)
2624514f5e3Sopenharmony_ci    {
2634514f5e3Sopenharmony_ci        glueData_.isStartHeapSampling_ = isStart ? JSTaggedValue::True() : JSTaggedValue::False();
2644514f5e3Sopenharmony_ci    }
2654514f5e3Sopenharmony_ci
2664514f5e3Sopenharmony_ci    void SetIsTracing(bool isTracing)
2674514f5e3Sopenharmony_ci    {
2684514f5e3Sopenharmony_ci        glueData_.isTracing_ = isTracing;
2694514f5e3Sopenharmony_ci    }
2704514f5e3Sopenharmony_ci
2714514f5e3Sopenharmony_ci    void Iterate(const RootVisitor &visitor, const RootRangeVisitor &rangeVisitor,
2724514f5e3Sopenharmony_ci        const RootBaseAndDerivedVisitor &derivedVisitor);
2734514f5e3Sopenharmony_ci
2744514f5e3Sopenharmony_ci    void IterateJitCodeMap(const JitCodeMapVisitor &updater);
2754514f5e3Sopenharmony_ci
2764514f5e3Sopenharmony_ci    void IterateHandleWithCheck(const RootVisitor &visitor, const RootRangeVisitor &rangeVisitor);
2774514f5e3Sopenharmony_ci
2784514f5e3Sopenharmony_ci    uintptr_t* PUBLIC_API ExpandHandleStorage();
2794514f5e3Sopenharmony_ci    void PUBLIC_API ShrinkHandleStorage(int prevIndex);
2804514f5e3Sopenharmony_ci    void PUBLIC_API CheckJSTaggedType(JSTaggedType value) const;
2814514f5e3Sopenharmony_ci    bool PUBLIC_API CpuProfilerCheckJSTaggedType(JSTaggedType value) const;
2824514f5e3Sopenharmony_ci
2834514f5e3Sopenharmony_ci    void PUBLIC_API SetException(JSTaggedValue exception);
2844514f5e3Sopenharmony_ci
2854514f5e3Sopenharmony_ci    JSTaggedValue GetException() const
2864514f5e3Sopenharmony_ci    {
2874514f5e3Sopenharmony_ci        return glueData_.exception_;
2884514f5e3Sopenharmony_ci    }
2894514f5e3Sopenharmony_ci
2904514f5e3Sopenharmony_ci    bool HasPendingException() const
2914514f5e3Sopenharmony_ci    {
2924514f5e3Sopenharmony_ci        return !glueData_.exception_.IsHole();
2934514f5e3Sopenharmony_ci    }
2944514f5e3Sopenharmony_ci
2954514f5e3Sopenharmony_ci    void ClearException();
2964514f5e3Sopenharmony_ci
2974514f5e3Sopenharmony_ci    void SetEnableForceIC(bool isEnableForceIC);
2984514f5e3Sopenharmony_ci
2994514f5e3Sopenharmony_ci    bool IsEnableForceIC() const;
3004514f5e3Sopenharmony_ci
3014514f5e3Sopenharmony_ci    void SetGlobalObject(JSTaggedValue globalObject)
3024514f5e3Sopenharmony_ci    {
3034514f5e3Sopenharmony_ci        glueData_.globalObject_ = globalObject;
3044514f5e3Sopenharmony_ci    }
3054514f5e3Sopenharmony_ci
3064514f5e3Sopenharmony_ci    const GlobalEnv *GetGlobalEnv() const
3074514f5e3Sopenharmony_ci    {
3084514f5e3Sopenharmony_ci        return glueData_.glueGlobalEnv_;
3094514f5e3Sopenharmony_ci    }
3104514f5e3Sopenharmony_ci
3114514f5e3Sopenharmony_ci    const GlobalEnvConstants *GlobalConstants() const
3124514f5e3Sopenharmony_ci    {
3134514f5e3Sopenharmony_ci        return glueData_.globalConst_;
3144514f5e3Sopenharmony_ci    }
3154514f5e3Sopenharmony_ci
3164514f5e3Sopenharmony_ci    void SetGlobalConstants(const GlobalEnvConstants *constants)
3174514f5e3Sopenharmony_ci    {
3184514f5e3Sopenharmony_ci        glueData_.globalConst_ = const_cast<GlobalEnvConstants*>(constants);
3194514f5e3Sopenharmony_ci    }
3204514f5e3Sopenharmony_ci
3214514f5e3Sopenharmony_ci    const BuiltinEntries GetBuiltinEntries() const
3224514f5e3Sopenharmony_ci    {
3234514f5e3Sopenharmony_ci        return glueData_.builtinEntries_;
3244514f5e3Sopenharmony_ci    }
3254514f5e3Sopenharmony_ci
3264514f5e3Sopenharmony_ci    BuiltinEntries* GetBuiltinEntriesPointer()
3274514f5e3Sopenharmony_ci    {
3284514f5e3Sopenharmony_ci        return &glueData_.builtinEntries_;
3294514f5e3Sopenharmony_ci    }
3304514f5e3Sopenharmony_ci
3314514f5e3Sopenharmony_ci    const CMap<ElementsKind, std::pair<ConstantIndex, ConstantIndex>> &GetArrayHClassIndexMap() const
3324514f5e3Sopenharmony_ci    {
3334514f5e3Sopenharmony_ci        return arrayHClassIndexMap_;
3344514f5e3Sopenharmony_ci    }
3354514f5e3Sopenharmony_ci
3364514f5e3Sopenharmony_ci    const CMap<JSHClass *, GlobalIndex> &GetCtorHclassEntries() const
3374514f5e3Sopenharmony_ci    {
3384514f5e3Sopenharmony_ci        return ctorHclassEntries_;
3394514f5e3Sopenharmony_ci    }
3404514f5e3Sopenharmony_ci
3414514f5e3Sopenharmony_ci    void NotifyStableArrayElementsGuardians(JSHandle<JSObject> receiver, StableArrayChangeKind changeKind);
3424514f5e3Sopenharmony_ci
3434514f5e3Sopenharmony_ci    bool IsStableArrayElementsGuardiansInvalid() const
3444514f5e3Sopenharmony_ci    {
3454514f5e3Sopenharmony_ci        return !glueData_.stableArrayElementsGuardians_;
3464514f5e3Sopenharmony_ci    }
3474514f5e3Sopenharmony_ci
3484514f5e3Sopenharmony_ci    void ResetGuardians();
3494514f5e3Sopenharmony_ci
3504514f5e3Sopenharmony_ci    void SetInitialBuiltinHClass(
3514514f5e3Sopenharmony_ci        BuiltinTypeId type, JSHClass *builtinHClass, JSHClass *instanceHClass,
3524514f5e3Sopenharmony_ci                            JSHClass *prototypeHClass, JSHClass *prototypeOfPrototypeHClass = nullptr,
3534514f5e3Sopenharmony_ci                            JSHClass *extraHClass = nullptr);
3544514f5e3Sopenharmony_ci
3554514f5e3Sopenharmony_ci    void SetInitialBuiltinGlobalHClass(JSHClass *builtinHClass, GlobalIndex globalIndex);
3564514f5e3Sopenharmony_ci
3574514f5e3Sopenharmony_ci    JSHClass *GetBuiltinHClass(BuiltinTypeId type) const;
3584514f5e3Sopenharmony_ci
3594514f5e3Sopenharmony_ci    JSHClass *GetBuiltinInstanceHClass(BuiltinTypeId type) const;
3604514f5e3Sopenharmony_ci    JSHClass *GetBuiltinExtraHClass(BuiltinTypeId type) const;
3614514f5e3Sopenharmony_ci    JSHClass *GetArrayInstanceHClass(ElementsKind kind, bool isPrototype) const;
3624514f5e3Sopenharmony_ci
3634514f5e3Sopenharmony_ci    PUBLIC_API JSHClass *GetBuiltinPrototypeHClass(BuiltinTypeId type) const;
3644514f5e3Sopenharmony_ci    PUBLIC_API JSHClass *GetBuiltinPrototypeOfPrototypeHClass(BuiltinTypeId type) const;
3654514f5e3Sopenharmony_ci
3664514f5e3Sopenharmony_ci    static size_t GetBuiltinHClassOffset(BuiltinTypeId, bool isArch32);
3674514f5e3Sopenharmony_ci
3684514f5e3Sopenharmony_ci    static size_t GetBuiltinPrototypeHClassOffset(BuiltinTypeId, bool isArch32);
3694514f5e3Sopenharmony_ci
3704514f5e3Sopenharmony_ci    const BuiltinHClassEntries &GetBuiltinHClassEntries() const
3714514f5e3Sopenharmony_ci    {
3724514f5e3Sopenharmony_ci        return glueData_.builtinHClassEntries_;
3734514f5e3Sopenharmony_ci    }
3744514f5e3Sopenharmony_ci
3754514f5e3Sopenharmony_ci    JSTaggedValue GetCurrentLexenv() const;
3764514f5e3Sopenharmony_ci    JSTaggedValue GetCurrentFunction() const;
3774514f5e3Sopenharmony_ci
3784514f5e3Sopenharmony_ci    void RegisterRTInterface(size_t id, Address addr)
3794514f5e3Sopenharmony_ci    {
3804514f5e3Sopenharmony_ci        ASSERT(id < kungfu::RuntimeStubCSigns::NUM_OF_STUBS);
3814514f5e3Sopenharmony_ci        glueData_.rtStubEntries_.Set(id, addr);
3824514f5e3Sopenharmony_ci    }
3834514f5e3Sopenharmony_ci
3844514f5e3Sopenharmony_ci    Address GetRTInterface(size_t id) const
3854514f5e3Sopenharmony_ci    {
3864514f5e3Sopenharmony_ci        ASSERT(id < kungfu::RuntimeStubCSigns::NUM_OF_STUBS);
3874514f5e3Sopenharmony_ci        return glueData_.rtStubEntries_.Get(id);
3884514f5e3Sopenharmony_ci    }
3894514f5e3Sopenharmony_ci
3904514f5e3Sopenharmony_ci    Address GetFastStubEntry(uint32_t id) const
3914514f5e3Sopenharmony_ci    {
3924514f5e3Sopenharmony_ci        return glueData_.coStubEntries_.Get(id);
3934514f5e3Sopenharmony_ci    }
3944514f5e3Sopenharmony_ci
3954514f5e3Sopenharmony_ci    void SetFastStubEntry(size_t id, Address entry)
3964514f5e3Sopenharmony_ci    {
3974514f5e3Sopenharmony_ci        glueData_.coStubEntries_.Set(id, entry);
3984514f5e3Sopenharmony_ci    }
3994514f5e3Sopenharmony_ci
4004514f5e3Sopenharmony_ci    Address GetBuiltinStubEntry(uint32_t id) const
4014514f5e3Sopenharmony_ci    {
4024514f5e3Sopenharmony_ci        return glueData_.builtinStubEntries_.Get(id);
4034514f5e3Sopenharmony_ci    }
4044514f5e3Sopenharmony_ci
4054514f5e3Sopenharmony_ci    void SetBuiltinStubEntry(size_t id, Address entry)
4064514f5e3Sopenharmony_ci    {
4074514f5e3Sopenharmony_ci        glueData_.builtinStubEntries_.Set(id, entry);
4084514f5e3Sopenharmony_ci    }
4094514f5e3Sopenharmony_ci
4104514f5e3Sopenharmony_ci    Address GetBCStubEntry(uint32_t id) const
4114514f5e3Sopenharmony_ci    {
4124514f5e3Sopenharmony_ci        return glueData_.bcStubEntries_.Get(id);
4134514f5e3Sopenharmony_ci    }
4144514f5e3Sopenharmony_ci
4154514f5e3Sopenharmony_ci    void SetBCStubEntry(size_t id, Address entry)
4164514f5e3Sopenharmony_ci    {
4174514f5e3Sopenharmony_ci        glueData_.bcStubEntries_.Set(id, entry);
4184514f5e3Sopenharmony_ci    }
4194514f5e3Sopenharmony_ci
4204514f5e3Sopenharmony_ci    Address GetBaselineStubEntry(uint32_t id) const
4214514f5e3Sopenharmony_ci    {
4224514f5e3Sopenharmony_ci        return glueData_.baselineStubEntries_.Get(id);
4234514f5e3Sopenharmony_ci    }
4244514f5e3Sopenharmony_ci
4254514f5e3Sopenharmony_ci    void SetBaselineStubEntry(size_t id, Address entry)
4264514f5e3Sopenharmony_ci    {
4274514f5e3Sopenharmony_ci        glueData_.baselineStubEntries_.Set(id, entry);
4284514f5e3Sopenharmony_ci    }
4294514f5e3Sopenharmony_ci
4304514f5e3Sopenharmony_ci    void SetBCDebugStubEntry(size_t id, Address entry)
4314514f5e3Sopenharmony_ci    {
4324514f5e3Sopenharmony_ci        glueData_.bcDebuggerStubEntries_.Set(id, entry);
4334514f5e3Sopenharmony_ci    }
4344514f5e3Sopenharmony_ci
4354514f5e3Sopenharmony_ci    Address *GetBytecodeHandler()
4364514f5e3Sopenharmony_ci    {
4374514f5e3Sopenharmony_ci        return glueData_.bcStubEntries_.GetAddr();
4384514f5e3Sopenharmony_ci    }
4394514f5e3Sopenharmony_ci
4404514f5e3Sopenharmony_ci    void PUBLIC_API CheckSwitchDebuggerBCStub();
4414514f5e3Sopenharmony_ci    void CheckOrSwitchPGOStubs();
4424514f5e3Sopenharmony_ci    void SwitchJitProfileStubs(bool isEnablePgo);
4434514f5e3Sopenharmony_ci
4444514f5e3Sopenharmony_ci    ThreadId GetThreadId() const
4454514f5e3Sopenharmony_ci    {
4464514f5e3Sopenharmony_ci        return id_.load(std::memory_order_acquire);
4474514f5e3Sopenharmony_ci    }
4484514f5e3Sopenharmony_ci
4494514f5e3Sopenharmony_ci    void PostFork();
4504514f5e3Sopenharmony_ci
4514514f5e3Sopenharmony_ci    static ThreadId GetCurrentThreadId();
4524514f5e3Sopenharmony_ci
4534514f5e3Sopenharmony_ci    void IterateWeakEcmaGlobalStorage(const WeakRootVisitor &visitor, GCKind gcKind = GCKind::LOCAL_GC);
4544514f5e3Sopenharmony_ci
4554514f5e3Sopenharmony_ci    void UpdateJitCodeMapReference(const WeakRootVisitor &visitor);
4564514f5e3Sopenharmony_ci
4574514f5e3Sopenharmony_ci    PUBLIC_API PropertiesCache *GetPropertiesCache() const;
4584514f5e3Sopenharmony_ci
4594514f5e3Sopenharmony_ci    MarkStatus GetMarkStatus() const
4604514f5e3Sopenharmony_ci    {
4614514f5e3Sopenharmony_ci        return MarkStatusBits::Decode(glueData_.gcStateBitField_);
4624514f5e3Sopenharmony_ci    }
4634514f5e3Sopenharmony_ci
4644514f5e3Sopenharmony_ci    void SetMarkStatus(MarkStatus status)
4654514f5e3Sopenharmony_ci    {
4664514f5e3Sopenharmony_ci        MarkStatusBits::Set(status, &glueData_.gcStateBitField_);
4674514f5e3Sopenharmony_ci    }
4684514f5e3Sopenharmony_ci
4694514f5e3Sopenharmony_ci    bool IsConcurrentMarkingOrFinished() const
4704514f5e3Sopenharmony_ci    {
4714514f5e3Sopenharmony_ci        return !IsReadyToConcurrentMark();
4724514f5e3Sopenharmony_ci    }
4734514f5e3Sopenharmony_ci
4744514f5e3Sopenharmony_ci    bool IsReadyToConcurrentMark() const
4754514f5e3Sopenharmony_ci    {
4764514f5e3Sopenharmony_ci        auto status = MarkStatusBits::Decode(glueData_.gcStateBitField_);
4774514f5e3Sopenharmony_ci        return status == MarkStatus::READY_TO_MARK;
4784514f5e3Sopenharmony_ci    }
4794514f5e3Sopenharmony_ci
4804514f5e3Sopenharmony_ci    bool IsMarking() const
4814514f5e3Sopenharmony_ci    {
4824514f5e3Sopenharmony_ci        auto status = MarkStatusBits::Decode(glueData_.gcStateBitField_);
4834514f5e3Sopenharmony_ci        return status == MarkStatus::MARKING;
4844514f5e3Sopenharmony_ci    }
4854514f5e3Sopenharmony_ci
4864514f5e3Sopenharmony_ci    bool IsMarkFinished() const
4874514f5e3Sopenharmony_ci    {
4884514f5e3Sopenharmony_ci        auto status = MarkStatusBits::Decode(glueData_.gcStateBitField_);
4894514f5e3Sopenharmony_ci        return status == MarkStatus::MARK_FINISHED;
4904514f5e3Sopenharmony_ci    }
4914514f5e3Sopenharmony_ci
4924514f5e3Sopenharmony_ci    SharedMarkStatus GetSharedMarkStatus() const
4934514f5e3Sopenharmony_ci    {
4944514f5e3Sopenharmony_ci        return SharedMarkStatusBits::Decode(glueData_.sharedGCStateBitField_);
4954514f5e3Sopenharmony_ci    }
4964514f5e3Sopenharmony_ci
4974514f5e3Sopenharmony_ci    void SetSharedMarkStatus(SharedMarkStatus status)
4984514f5e3Sopenharmony_ci    {
4994514f5e3Sopenharmony_ci        SharedMarkStatusBits::Set(status, &glueData_.sharedGCStateBitField_);
5004514f5e3Sopenharmony_ci    }
5014514f5e3Sopenharmony_ci
5024514f5e3Sopenharmony_ci    bool IsSharedConcurrentMarkingOrFinished() const
5034514f5e3Sopenharmony_ci    {
5044514f5e3Sopenharmony_ci        auto status = SharedMarkStatusBits::Decode(glueData_.sharedGCStateBitField_);
5054514f5e3Sopenharmony_ci        return status == SharedMarkStatus::CONCURRENT_MARKING_OR_FINISHED;
5064514f5e3Sopenharmony_ci    }
5074514f5e3Sopenharmony_ci
5084514f5e3Sopenharmony_ci    bool IsReadyToSharedConcurrentMark() const
5094514f5e3Sopenharmony_ci    {
5104514f5e3Sopenharmony_ci        auto status = SharedMarkStatusBits::Decode(glueData_.sharedGCStateBitField_);
5114514f5e3Sopenharmony_ci        return status == SharedMarkStatus::READY_TO_CONCURRENT_MARK;
5124514f5e3Sopenharmony_ci    }
5134514f5e3Sopenharmony_ci
5144514f5e3Sopenharmony_ci    void SetPGOProfilerEnable(bool enable)
5154514f5e3Sopenharmony_ci    {
5164514f5e3Sopenharmony_ci        PGOProfilerStatus status =
5174514f5e3Sopenharmony_ci            enable ? PGOProfilerStatus::PGO_PROFILER_ENABLE : PGOProfilerStatus::PGO_PROFILER_DISABLE;
5184514f5e3Sopenharmony_ci        SetInterruptValue<PGOStatusBits>(status);
5194514f5e3Sopenharmony_ci    }
5204514f5e3Sopenharmony_ci
5214514f5e3Sopenharmony_ci    bool IsPGOProfilerEnable() const
5224514f5e3Sopenharmony_ci    {
5234514f5e3Sopenharmony_ci        auto status = PGOStatusBits::Decode(glueData_.interruptVector_);
5244514f5e3Sopenharmony_ci        return status == PGOProfilerStatus::PGO_PROFILER_ENABLE;
5254514f5e3Sopenharmony_ci    }
5264514f5e3Sopenharmony_ci
5274514f5e3Sopenharmony_ci    void SetBCStubStatus(BCStubStatus status)
5284514f5e3Sopenharmony_ci    {
5294514f5e3Sopenharmony_ci        SetInterruptValue<BCStubStatusBits>(status);
5304514f5e3Sopenharmony_ci    }
5314514f5e3Sopenharmony_ci
5324514f5e3Sopenharmony_ci    BCStubStatus GetBCStubStatus() const
5334514f5e3Sopenharmony_ci    {
5344514f5e3Sopenharmony_ci        return BCStubStatusBits::Decode(glueData_.interruptVector_);
5354514f5e3Sopenharmony_ci    }
5364514f5e3Sopenharmony_ci
5374514f5e3Sopenharmony_ci    bool CheckSafepoint();
5384514f5e3Sopenharmony_ci
5394514f5e3Sopenharmony_ci    void CheckAndPassActiveBarrier();
5404514f5e3Sopenharmony_ci
5414514f5e3Sopenharmony_ci    bool PassSuspendBarrier();
5424514f5e3Sopenharmony_ci
5434514f5e3Sopenharmony_ci    void SetGetStackSignal(bool isParseStack)
5444514f5e3Sopenharmony_ci    {
5454514f5e3Sopenharmony_ci        getStackSignal_ = isParseStack;
5464514f5e3Sopenharmony_ci    }
5474514f5e3Sopenharmony_ci
5484514f5e3Sopenharmony_ci    bool GetStackSignal() const
5494514f5e3Sopenharmony_ci    {
5504514f5e3Sopenharmony_ci        return getStackSignal_;
5514514f5e3Sopenharmony_ci    }
5524514f5e3Sopenharmony_ci
5534514f5e3Sopenharmony_ci    void SetNeedProfiling(bool needProfiling)
5544514f5e3Sopenharmony_ci    {
5554514f5e3Sopenharmony_ci        needProfiling_.store(needProfiling);
5564514f5e3Sopenharmony_ci    }
5574514f5e3Sopenharmony_ci
5584514f5e3Sopenharmony_ci    void SetIsProfiling(bool isProfiling)
5594514f5e3Sopenharmony_ci    {
5604514f5e3Sopenharmony_ci        isProfiling_ = isProfiling;
5614514f5e3Sopenharmony_ci    }
5624514f5e3Sopenharmony_ci
5634514f5e3Sopenharmony_ci    bool GetIsProfiling() const
5644514f5e3Sopenharmony_ci    {
5654514f5e3Sopenharmony_ci        return isProfiling_;
5664514f5e3Sopenharmony_ci    }
5674514f5e3Sopenharmony_ci
5684514f5e3Sopenharmony_ci    void SetGcState(bool gcState)
5694514f5e3Sopenharmony_ci    {
5704514f5e3Sopenharmony_ci        gcState_ = gcState;
5714514f5e3Sopenharmony_ci    }
5724514f5e3Sopenharmony_ci
5734514f5e3Sopenharmony_ci    bool GetGcState() const
5744514f5e3Sopenharmony_ci    {
5754514f5e3Sopenharmony_ci        return gcState_;
5764514f5e3Sopenharmony_ci    }
5774514f5e3Sopenharmony_ci
5784514f5e3Sopenharmony_ci    void SetRuntimeState(bool runtimeState)
5794514f5e3Sopenharmony_ci    {
5804514f5e3Sopenharmony_ci        runtimeState_ = runtimeState;
5814514f5e3Sopenharmony_ci    }
5824514f5e3Sopenharmony_ci
5834514f5e3Sopenharmony_ci    bool GetRuntimeState() const
5844514f5e3Sopenharmony_ci    {
5854514f5e3Sopenharmony_ci        return runtimeState_;
5864514f5e3Sopenharmony_ci    }
5874514f5e3Sopenharmony_ci
5884514f5e3Sopenharmony_ci    bool SetMainThread()
5894514f5e3Sopenharmony_ci    {
5904514f5e3Sopenharmony_ci        return isMainThread_ = true;
5914514f5e3Sopenharmony_ci    }
5924514f5e3Sopenharmony_ci
5934514f5e3Sopenharmony_ci    bool IsMainThreadFast() const
5944514f5e3Sopenharmony_ci    {
5954514f5e3Sopenharmony_ci        return isMainThread_;
5964514f5e3Sopenharmony_ci    }
5974514f5e3Sopenharmony_ci
5984514f5e3Sopenharmony_ci    void SetCpuProfileName(std::string &profileName)
5994514f5e3Sopenharmony_ci    {
6004514f5e3Sopenharmony_ci        profileName_ = profileName;
6014514f5e3Sopenharmony_ci    }
6024514f5e3Sopenharmony_ci
6034514f5e3Sopenharmony_ci    void EnableAsmInterpreter()
6044514f5e3Sopenharmony_ci    {
6054514f5e3Sopenharmony_ci        isAsmInterpreter_ = true;
6064514f5e3Sopenharmony_ci    }
6074514f5e3Sopenharmony_ci
6084514f5e3Sopenharmony_ci    bool IsAsmInterpreter() const
6094514f5e3Sopenharmony_ci    {
6104514f5e3Sopenharmony_ci        return isAsmInterpreter_;
6114514f5e3Sopenharmony_ci    }
6124514f5e3Sopenharmony_ci
6134514f5e3Sopenharmony_ci    VmThreadControl *GetVmThreadControl() const
6144514f5e3Sopenharmony_ci    {
6154514f5e3Sopenharmony_ci        return vmThreadControl_;
6164514f5e3Sopenharmony_ci    }
6174514f5e3Sopenharmony_ci
6184514f5e3Sopenharmony_ci    void SetEnableStackSourceFile(bool value)
6194514f5e3Sopenharmony_ci    {
6204514f5e3Sopenharmony_ci        enableStackSourceFile_ = value;
6214514f5e3Sopenharmony_ci    }
6224514f5e3Sopenharmony_ci
6234514f5e3Sopenharmony_ci    bool GetEnableStackSourceFile() const
6244514f5e3Sopenharmony_ci    {
6254514f5e3Sopenharmony_ci        return enableStackSourceFile_;
6264514f5e3Sopenharmony_ci    }
6274514f5e3Sopenharmony_ci
6284514f5e3Sopenharmony_ci    void SetEnableLazyBuiltins(bool value)
6294514f5e3Sopenharmony_ci    {
6304514f5e3Sopenharmony_ci        enableLazyBuiltins_ = value;
6314514f5e3Sopenharmony_ci    }
6324514f5e3Sopenharmony_ci
6334514f5e3Sopenharmony_ci    bool GetEnableLazyBuiltins() const
6344514f5e3Sopenharmony_ci    {
6354514f5e3Sopenharmony_ci        return enableLazyBuiltins_;
6364514f5e3Sopenharmony_ci    }
6374514f5e3Sopenharmony_ci
6384514f5e3Sopenharmony_ci    void SetReadyForGCIterating(bool flag)
6394514f5e3Sopenharmony_ci    {
6404514f5e3Sopenharmony_ci        readyForGCIterating_ = flag;
6414514f5e3Sopenharmony_ci    }
6424514f5e3Sopenharmony_ci
6434514f5e3Sopenharmony_ci    bool ReadyForGCIterating() const
6444514f5e3Sopenharmony_ci    {
6454514f5e3Sopenharmony_ci        return readyForGCIterating_;
6464514f5e3Sopenharmony_ci    }
6474514f5e3Sopenharmony_ci
6484514f5e3Sopenharmony_ci    static constexpr size_t GetGlueDataOffset()
6494514f5e3Sopenharmony_ci    {
6504514f5e3Sopenharmony_ci        return MEMBER_OFFSET(JSThread, glueData_);
6514514f5e3Sopenharmony_ci    }
6524514f5e3Sopenharmony_ci
6534514f5e3Sopenharmony_ci    uintptr_t GetGlueAddr() const
6544514f5e3Sopenharmony_ci    {
6554514f5e3Sopenharmony_ci        return reinterpret_cast<uintptr_t>(this) + GetGlueDataOffset();
6564514f5e3Sopenharmony_ci    }
6574514f5e3Sopenharmony_ci
6584514f5e3Sopenharmony_ci    static JSThread *GlueToJSThread(uintptr_t glue)
6594514f5e3Sopenharmony_ci    {
6604514f5e3Sopenharmony_ci        // very careful to modify here
6614514f5e3Sopenharmony_ci        return reinterpret_cast<JSThread *>(glue - GetGlueDataOffset());
6624514f5e3Sopenharmony_ci    }
6634514f5e3Sopenharmony_ci
6644514f5e3Sopenharmony_ci    void SetCheckSafePointStatus()
6654514f5e3Sopenharmony_ci    {
6664514f5e3Sopenharmony_ci        ASSERT(static_cast<uint8_t>(glueData_.interruptVector_ & 0xFF) <= 1);
6674514f5e3Sopenharmony_ci        SetInterruptValue<CheckSafePointBit>(true);
6684514f5e3Sopenharmony_ci    }
6694514f5e3Sopenharmony_ci
6704514f5e3Sopenharmony_ci    void ResetCheckSafePointStatus()
6714514f5e3Sopenharmony_ci    {
6724514f5e3Sopenharmony_ci        ASSERT(static_cast<uint8_t>(glueData_.interruptVector_ & 0xFF) <= 1);
6734514f5e3Sopenharmony_ci        SetInterruptValue<CheckSafePointBit>(false);
6744514f5e3Sopenharmony_ci    }
6754514f5e3Sopenharmony_ci
6764514f5e3Sopenharmony_ci    void SetVMNeedSuspension(bool flag)
6774514f5e3Sopenharmony_ci    {
6784514f5e3Sopenharmony_ci        SetInterruptValue<VMNeedSuspensionBit>(flag);
6794514f5e3Sopenharmony_ci    }
6804514f5e3Sopenharmony_ci
6814514f5e3Sopenharmony_ci    bool VMNeedSuspension()
6824514f5e3Sopenharmony_ci    {
6834514f5e3Sopenharmony_ci        return VMNeedSuspensionBit::Decode(glueData_.interruptVector_);
6844514f5e3Sopenharmony_ci    }
6854514f5e3Sopenharmony_ci
6864514f5e3Sopenharmony_ci    void SetVMSuspended(bool flag)
6874514f5e3Sopenharmony_ci    {
6884514f5e3Sopenharmony_ci        SetInterruptValue<VMHasSuspendedBit>(flag);
6894514f5e3Sopenharmony_ci    }
6904514f5e3Sopenharmony_ci
6914514f5e3Sopenharmony_ci    bool IsVMSuspended()
6924514f5e3Sopenharmony_ci    {
6934514f5e3Sopenharmony_ci        return VMHasSuspendedBit::Decode(glueData_.interruptVector_);
6944514f5e3Sopenharmony_ci    }
6954514f5e3Sopenharmony_ci
6964514f5e3Sopenharmony_ci    bool HasTerminationRequest() const
6974514f5e3Sopenharmony_ci    {
6984514f5e3Sopenharmony_ci        return needTermination_;
6994514f5e3Sopenharmony_ci    }
7004514f5e3Sopenharmony_ci
7014514f5e3Sopenharmony_ci    void SetTerminationRequest(bool flag)
7024514f5e3Sopenharmony_ci    {
7034514f5e3Sopenharmony_ci        needTermination_ = flag;
7044514f5e3Sopenharmony_ci    }
7054514f5e3Sopenharmony_ci
7064514f5e3Sopenharmony_ci    void SetVMTerminated(bool flag)
7074514f5e3Sopenharmony_ci    {
7084514f5e3Sopenharmony_ci        hasTerminated_ = flag;
7094514f5e3Sopenharmony_ci    }
7104514f5e3Sopenharmony_ci
7114514f5e3Sopenharmony_ci    bool HasTerminated() const
7124514f5e3Sopenharmony_ci    {
7134514f5e3Sopenharmony_ci        return hasTerminated_;
7144514f5e3Sopenharmony_ci    }
7154514f5e3Sopenharmony_ci
7164514f5e3Sopenharmony_ci    void TerminateExecution();
7174514f5e3Sopenharmony_ci
7184514f5e3Sopenharmony_ci    void SetInstallMachineCode(bool flag)
7194514f5e3Sopenharmony_ci    {
7204514f5e3Sopenharmony_ci        SetInterruptValue<InstallMachineCodeBit>(flag);
7214514f5e3Sopenharmony_ci    }
7224514f5e3Sopenharmony_ci
7234514f5e3Sopenharmony_ci    bool HasInstallMachineCode() const
7244514f5e3Sopenharmony_ci    {
7254514f5e3Sopenharmony_ci        return InstallMachineCodeBit::Decode(glueData_.interruptVector_);
7264514f5e3Sopenharmony_ci    }
7274514f5e3Sopenharmony_ci
7284514f5e3Sopenharmony_ci    static uintptr_t GetCurrentStackPosition()
7294514f5e3Sopenharmony_ci    {
7304514f5e3Sopenharmony_ci        return reinterpret_cast<uintptr_t>(__builtin_frame_address(0));
7314514f5e3Sopenharmony_ci    }
7324514f5e3Sopenharmony_ci
7334514f5e3Sopenharmony_ci    bool IsLegalAsmSp(uintptr_t sp) const;
7344514f5e3Sopenharmony_ci
7354514f5e3Sopenharmony_ci    bool IsLegalThreadSp(uintptr_t sp) const;
7364514f5e3Sopenharmony_ci
7374514f5e3Sopenharmony_ci    bool IsLegalSp(uintptr_t sp) const;
7384514f5e3Sopenharmony_ci
7394514f5e3Sopenharmony_ci    void SetCheckAndCallEnterState(bool state)
7404514f5e3Sopenharmony_ci    {
7414514f5e3Sopenharmony_ci        finalizationCheckState_ = state;
7424514f5e3Sopenharmony_ci    }
7434514f5e3Sopenharmony_ci
7444514f5e3Sopenharmony_ci    bool GetCheckAndCallEnterState() const
7454514f5e3Sopenharmony_ci    {
7464514f5e3Sopenharmony_ci        return finalizationCheckState_;
7474514f5e3Sopenharmony_ci    }
7484514f5e3Sopenharmony_ci
7494514f5e3Sopenharmony_ci    uint64_t GetStackStart() const
7504514f5e3Sopenharmony_ci    {
7514514f5e3Sopenharmony_ci        return glueData_.stackStart_;
7524514f5e3Sopenharmony_ci    }
7534514f5e3Sopenharmony_ci
7544514f5e3Sopenharmony_ci    uint64_t GetStackLimit() const
7554514f5e3Sopenharmony_ci    {
7564514f5e3Sopenharmony_ci        return glueData_.stackLimit_;
7574514f5e3Sopenharmony_ci    }
7584514f5e3Sopenharmony_ci
7594514f5e3Sopenharmony_ci    GlobalEnv *GetGlueGlobalEnv()
7604514f5e3Sopenharmony_ci    {
7614514f5e3Sopenharmony_ci        return glueData_.glueGlobalEnv_;
7624514f5e3Sopenharmony_ci    }
7634514f5e3Sopenharmony_ci
7644514f5e3Sopenharmony_ci    void SetGlueGlobalEnv(GlobalEnv *global)
7654514f5e3Sopenharmony_ci    {
7664514f5e3Sopenharmony_ci        ASSERT(global != nullptr);
7674514f5e3Sopenharmony_ci        glueData_.glueGlobalEnv_ = global;
7684514f5e3Sopenharmony_ci    }
7694514f5e3Sopenharmony_ci
7704514f5e3Sopenharmony_ci    inline uintptr_t NewGlobalHandle(JSTaggedType value)
7714514f5e3Sopenharmony_ci    {
7724514f5e3Sopenharmony_ci        return newGlobalHandle_(value);
7734514f5e3Sopenharmony_ci    }
7744514f5e3Sopenharmony_ci
7754514f5e3Sopenharmony_ci    inline void DisposeGlobalHandle(uintptr_t nodeAddr)
7764514f5e3Sopenharmony_ci    {
7774514f5e3Sopenharmony_ci        disposeGlobalHandle_(nodeAddr);
7784514f5e3Sopenharmony_ci    }
7794514f5e3Sopenharmony_ci
7804514f5e3Sopenharmony_ci    inline uintptr_t SetWeak(uintptr_t nodeAddr, void *ref = nullptr, WeakClearCallback freeGlobalCallBack = nullptr,
7814514f5e3Sopenharmony_ci                             WeakClearCallback nativeFinalizeCallBack = nullptr)
7824514f5e3Sopenharmony_ci    {
7834514f5e3Sopenharmony_ci        return setWeak_(nodeAddr, ref, freeGlobalCallBack, nativeFinalizeCallBack);
7844514f5e3Sopenharmony_ci    }
7854514f5e3Sopenharmony_ci
7864514f5e3Sopenharmony_ci    inline uintptr_t ClearWeak(uintptr_t nodeAddr)
7874514f5e3Sopenharmony_ci    {
7884514f5e3Sopenharmony_ci        return clearWeak_(nodeAddr);
7894514f5e3Sopenharmony_ci    }
7904514f5e3Sopenharmony_ci
7914514f5e3Sopenharmony_ci    inline bool IsWeak(uintptr_t addr) const
7924514f5e3Sopenharmony_ci    {
7934514f5e3Sopenharmony_ci        return isWeak_(addr);
7944514f5e3Sopenharmony_ci    }
7954514f5e3Sopenharmony_ci
7964514f5e3Sopenharmony_ci    void EnableCrossThreadExecution()
7974514f5e3Sopenharmony_ci    {
7984514f5e3Sopenharmony_ci        glueData_.allowCrossThreadExecution_ = true;
7994514f5e3Sopenharmony_ci    }
8004514f5e3Sopenharmony_ci
8014514f5e3Sopenharmony_ci    bool IsCrossThreadExecutionEnable() const
8024514f5e3Sopenharmony_ci    {
8034514f5e3Sopenharmony_ci        return glueData_.allowCrossThreadExecution_;
8044514f5e3Sopenharmony_ci    }
8054514f5e3Sopenharmony_ci
8064514f5e3Sopenharmony_ci    bool IsFrameDropped()
8074514f5e3Sopenharmony_ci    {
8084514f5e3Sopenharmony_ci        return glueData_.isFrameDropped_;
8094514f5e3Sopenharmony_ci    }
8104514f5e3Sopenharmony_ci
8114514f5e3Sopenharmony_ci    void SetFrameDroppedState()
8124514f5e3Sopenharmony_ci    {
8134514f5e3Sopenharmony_ci        glueData_.isFrameDropped_ = true;
8144514f5e3Sopenharmony_ci    }
8154514f5e3Sopenharmony_ci
8164514f5e3Sopenharmony_ci    void ResetFrameDroppedState()
8174514f5e3Sopenharmony_ci    {
8184514f5e3Sopenharmony_ci        glueData_.isFrameDropped_ = false;
8194514f5e3Sopenharmony_ci    }
8204514f5e3Sopenharmony_ci
8214514f5e3Sopenharmony_ci    bool IsEntryFrameDroppedTrue()
8224514f5e3Sopenharmony_ci    {
8234514f5e3Sopenharmony_ci        return glueData_.entryFrameDroppedState_ == FrameDroppedState::StateTrue;
8244514f5e3Sopenharmony_ci    }
8254514f5e3Sopenharmony_ci
8264514f5e3Sopenharmony_ci    bool IsEntryFrameDroppedPending()
8274514f5e3Sopenharmony_ci    {
8284514f5e3Sopenharmony_ci        return glueData_.entryFrameDroppedState_ == FrameDroppedState::StatePending;
8294514f5e3Sopenharmony_ci    }
8304514f5e3Sopenharmony_ci
8314514f5e3Sopenharmony_ci    void SetEntryFrameDroppedState()
8324514f5e3Sopenharmony_ci    {
8334514f5e3Sopenharmony_ci        glueData_.entryFrameDroppedState_ = FrameDroppedState::StateTrue;
8344514f5e3Sopenharmony_ci    }
8354514f5e3Sopenharmony_ci
8364514f5e3Sopenharmony_ci    void ResetEntryFrameDroppedState()
8374514f5e3Sopenharmony_ci    {
8384514f5e3Sopenharmony_ci        glueData_.entryFrameDroppedState_ = FrameDroppedState::StateFalse;
8394514f5e3Sopenharmony_ci    }
8404514f5e3Sopenharmony_ci
8414514f5e3Sopenharmony_ci    void PendingEntryFrameDroppedState()
8424514f5e3Sopenharmony_ci    {
8434514f5e3Sopenharmony_ci        glueData_.entryFrameDroppedState_ = FrameDroppedState::StatePending;
8444514f5e3Sopenharmony_ci    }
8454514f5e3Sopenharmony_ci
8464514f5e3Sopenharmony_ci    bool IsDebugMode()
8474514f5e3Sopenharmony_ci    {
8484514f5e3Sopenharmony_ci        return glueData_.isDebugMode_;
8494514f5e3Sopenharmony_ci    }
8504514f5e3Sopenharmony_ci
8514514f5e3Sopenharmony_ci    void SetDebugModeState()
8524514f5e3Sopenharmony_ci    {
8534514f5e3Sopenharmony_ci        glueData_.isDebugMode_ = true;
8544514f5e3Sopenharmony_ci    }
8554514f5e3Sopenharmony_ci
8564514f5e3Sopenharmony_ci    void ResetDebugModeState()
8574514f5e3Sopenharmony_ci    {
8584514f5e3Sopenharmony_ci        glueData_.isDebugMode_ = false;
8594514f5e3Sopenharmony_ci    }
8604514f5e3Sopenharmony_ci
8614514f5e3Sopenharmony_ci    template<typename T, typename V>
8624514f5e3Sopenharmony_ci    void SetInterruptValue(V value)
8634514f5e3Sopenharmony_ci    {
8644514f5e3Sopenharmony_ci        volatile auto interruptValue =
8654514f5e3Sopenharmony_ci            reinterpret_cast<volatile std::atomic<uint64_t> *>(&glueData_.interruptVector_);
8664514f5e3Sopenharmony_ci        uint64_t oldValue = interruptValue->load(std::memory_order_relaxed);
8674514f5e3Sopenharmony_ci        auto newValue = oldValue;
8684514f5e3Sopenharmony_ci        do {
8694514f5e3Sopenharmony_ci            newValue = oldValue;
8704514f5e3Sopenharmony_ci            T::Set(value, &newValue);
8714514f5e3Sopenharmony_ci        } while (!std::atomic_compare_exchange_strong_explicit(interruptValue, &oldValue, newValue,
8724514f5e3Sopenharmony_ci                                                               std::memory_order_release,
8734514f5e3Sopenharmony_ci                                                               std::memory_order_relaxed));
8744514f5e3Sopenharmony_ci    }
8754514f5e3Sopenharmony_ci
8764514f5e3Sopenharmony_ci    void InvokeWeakNodeFreeGlobalCallBack();
8774514f5e3Sopenharmony_ci    void InvokeWeakNodeNativeFinalizeCallback();
8784514f5e3Sopenharmony_ci    bool IsStartGlobalLeakCheck() const;
8794514f5e3Sopenharmony_ci    bool EnableGlobalObjectLeakCheck() const;
8804514f5e3Sopenharmony_ci    bool EnableGlobalPrimitiveLeakCheck() const;
8814514f5e3Sopenharmony_ci    void WriteToStackTraceFd(std::ostringstream &buffer) const;
8824514f5e3Sopenharmony_ci    void SetStackTraceFd(int32_t fd);
8834514f5e3Sopenharmony_ci    void CloseStackTraceFd();
8844514f5e3Sopenharmony_ci    uint32_t IncreaseGlobalNumberCount()
8854514f5e3Sopenharmony_ci    {
8864514f5e3Sopenharmony_ci        return ++globalNumberCount_;
8874514f5e3Sopenharmony_ci    }
8884514f5e3Sopenharmony_ci
8894514f5e3Sopenharmony_ci    void SetPropertiesGrowStep(uint32_t step)
8904514f5e3Sopenharmony_ci    {
8914514f5e3Sopenharmony_ci        glueData_.propertiesGrowStep_ = step;
8924514f5e3Sopenharmony_ci    }
8934514f5e3Sopenharmony_ci
8944514f5e3Sopenharmony_ci    uint32_t GetPropertiesGrowStep() const
8954514f5e3Sopenharmony_ci    {
8964514f5e3Sopenharmony_ci        return glueData_.propertiesGrowStep_;
8974514f5e3Sopenharmony_ci    }
8984514f5e3Sopenharmony_ci
8994514f5e3Sopenharmony_ci    void SetRandomStatePtr(uint64_t *ptr)
9004514f5e3Sopenharmony_ci    {
9014514f5e3Sopenharmony_ci        glueData_.randomStatePtr_ = reinterpret_cast<uintptr_t>(ptr);
9024514f5e3Sopenharmony_ci    }
9034514f5e3Sopenharmony_ci
9044514f5e3Sopenharmony_ci    void SetTaskInfo(uintptr_t taskInfo)
9054514f5e3Sopenharmony_ci    {
9064514f5e3Sopenharmony_ci        glueData_.taskInfo_ = taskInfo;
9074514f5e3Sopenharmony_ci    }
9084514f5e3Sopenharmony_ci
9094514f5e3Sopenharmony_ci    uintptr_t GetTaskInfo() const
9104514f5e3Sopenharmony_ci    {
9114514f5e3Sopenharmony_ci        return glueData_.taskInfo_;
9124514f5e3Sopenharmony_ci    }
9134514f5e3Sopenharmony_ci
9144514f5e3Sopenharmony_ci    void SetJitCodeMap(JSTaggedType exception,  MachineCode* machineCode, std::string &methodName, uintptr_t offset);
9154514f5e3Sopenharmony_ci
9164514f5e3Sopenharmony_ci    std::map<JSTaggedType, JitCodeVector*> &GetJitCodeMaps()
9174514f5e3Sopenharmony_ci    {
9184514f5e3Sopenharmony_ci        return jitCodeMaps_;
9194514f5e3Sopenharmony_ci    }
9204514f5e3Sopenharmony_ci
9214514f5e3Sopenharmony_ci    struct GlueData : public base::AlignedStruct<JSTaggedValue::TaggedTypeSize(),
9224514f5e3Sopenharmony_ci                                                 BCStubEntries,
9234514f5e3Sopenharmony_ci                                                 JSTaggedValue,
9244514f5e3Sopenharmony_ci                                                 JSTaggedValue,
9254514f5e3Sopenharmony_ci                                                 base::AlignedBool,
9264514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9274514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9284514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9294514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9304514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9314514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9324514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9334514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9344514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9354514f5e3Sopenharmony_ci                                                 RTStubEntries,
9364514f5e3Sopenharmony_ci                                                 COStubEntries,
9374514f5e3Sopenharmony_ci                                                 BuiltinStubEntries,
9384514f5e3Sopenharmony_ci                                                 BuiltinHClassEntries,
9394514f5e3Sopenharmony_ci                                                 BCDebuggerStubEntries,
9404514f5e3Sopenharmony_ci                                                 BaselineStubEntries,
9414514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9424514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9434514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9444514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9454514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9464514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9474514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9484514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9494514f5e3Sopenharmony_ci                                                 base::AlignedUint64,
9504514f5e3Sopenharmony_ci                                                 JSTaggedValue,
9514514f5e3Sopenharmony_ci                                                 base::AlignedBool,
9524514f5e3Sopenharmony_ci                                                 base::AlignedBool,
9534514f5e3Sopenharmony_ci                                                 base::AlignedUint32,
9544514f5e3Sopenharmony_ci                                                 JSTaggedValue,
9554514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9564514f5e3Sopenharmony_ci                                                 BuiltinEntries,
9574514f5e3Sopenharmony_ci                                                 base::AlignedBool,
9584514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9594514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9604514f5e3Sopenharmony_ci                                                 base::AlignedPointer,
9614514f5e3Sopenharmony_ci                                                 base::AlignedUint32,
9624514f5e3Sopenharmony_ci                                                 base::AlignedBool,
9634514f5e3Sopenharmony_ci                                                 base::AlignedBool> {
9644514f5e3Sopenharmony_ci        enum class Index : size_t {
9654514f5e3Sopenharmony_ci            BcStubEntriesIndex = 0,
9664514f5e3Sopenharmony_ci            ExceptionIndex,
9674514f5e3Sopenharmony_ci            GlobalObjIndex,
9684514f5e3Sopenharmony_ci            StableArrayElementsGuardiansIndex,
9694514f5e3Sopenharmony_ci            CurrentFrameIndex,
9704514f5e3Sopenharmony_ci            LeaveFrameIndex,
9714514f5e3Sopenharmony_ci            LastFpIndex,
9724514f5e3Sopenharmony_ci            NewSpaceAllocationTopAddressIndex,
9734514f5e3Sopenharmony_ci            NewSpaceAllocationEndAddressIndex,
9744514f5e3Sopenharmony_ci            SOldSpaceAllocationTopAddressIndex,
9754514f5e3Sopenharmony_ci            SOldSpaceAllocationEndAddressIndex,
9764514f5e3Sopenharmony_ci            SNonMovableSpaceAllocationTopAddressIndex,
9774514f5e3Sopenharmony_ci            SNonMovableSpaceAllocationEndAddressIndex,
9784514f5e3Sopenharmony_ci            RTStubEntriesIndex,
9794514f5e3Sopenharmony_ci            COStubEntriesIndex,
9804514f5e3Sopenharmony_ci            BuiltinsStubEntriesIndex,
9814514f5e3Sopenharmony_ci            BuiltinHClassEntriesIndex,
9824514f5e3Sopenharmony_ci            BcDebuggerStubEntriesIndex,
9834514f5e3Sopenharmony_ci            BaselineStubEntriesIndex,
9844514f5e3Sopenharmony_ci            GCStateBitFieldIndex,
9854514f5e3Sopenharmony_ci            SharedGCStateBitFieldIndex,
9864514f5e3Sopenharmony_ci            FrameBaseIndex,
9874514f5e3Sopenharmony_ci            StackStartIndex,
9884514f5e3Sopenharmony_ci            StackLimitIndex,
9894514f5e3Sopenharmony_ci            GlueGlobalEnvIndex,
9904514f5e3Sopenharmony_ci            GlobalConstIndex,
9914514f5e3Sopenharmony_ci            AllowCrossThreadExecutionIndex,
9924514f5e3Sopenharmony_ci            InterruptVectorIndex,
9934514f5e3Sopenharmony_ci            IsStartHeapSamplingIndex,
9944514f5e3Sopenharmony_ci            IsDebugModeIndex,
9954514f5e3Sopenharmony_ci            IsFrameDroppedIndex,
9964514f5e3Sopenharmony_ci            PropertiesGrowStepIndex,
9974514f5e3Sopenharmony_ci            EntryFrameDroppedStateIndex,
9984514f5e3Sopenharmony_ci            CurrentContextIndex,
9994514f5e3Sopenharmony_ci            BuiltinEntriesIndex,
10004514f5e3Sopenharmony_ci            IsTracingIndex,
10014514f5e3Sopenharmony_ci            UnsharedConstpoolsIndex,
10024514f5e3Sopenharmony_ci            RandomStatePtrIndex,
10034514f5e3Sopenharmony_ci            StateAndFlagsIndex,
10044514f5e3Sopenharmony_ci            TaskInfoIndex,
10054514f5e3Sopenharmony_ci            IsEnableElementsKindIndex,
10064514f5e3Sopenharmony_ci            IsEnableForceIC,
10074514f5e3Sopenharmony_ci            NumOfMembers
10084514f5e3Sopenharmony_ci        };
10094514f5e3Sopenharmony_ci        static_assert(static_cast<size_t>(Index::NumOfMembers) == NumOfTypes);
10104514f5e3Sopenharmony_ci
10114514f5e3Sopenharmony_ci        static size_t GetExceptionOffset(bool isArch32)
10124514f5e3Sopenharmony_ci        {
10134514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::ExceptionIndex)>(isArch32);
10144514f5e3Sopenharmony_ci        }
10154514f5e3Sopenharmony_ci
10164514f5e3Sopenharmony_ci        static size_t GetGlobalObjOffset(bool isArch32)
10174514f5e3Sopenharmony_ci        {
10184514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::GlobalObjIndex)>(isArch32);
10194514f5e3Sopenharmony_ci        }
10204514f5e3Sopenharmony_ci
10214514f5e3Sopenharmony_ci        static size_t GetStableArrayElementsGuardiansOffset(bool isArch32)
10224514f5e3Sopenharmony_ci        {
10234514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::StableArrayElementsGuardiansIndex)>(isArch32);
10244514f5e3Sopenharmony_ci        }
10254514f5e3Sopenharmony_ci
10264514f5e3Sopenharmony_ci        static size_t GetGlobalConstOffset(bool isArch32)
10274514f5e3Sopenharmony_ci        {
10284514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::GlobalConstIndex)>(isArch32);
10294514f5e3Sopenharmony_ci        }
10304514f5e3Sopenharmony_ci
10314514f5e3Sopenharmony_ci        static size_t GetGCStateBitFieldOffset(bool isArch32)
10324514f5e3Sopenharmony_ci        {
10334514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::GCStateBitFieldIndex)>(isArch32);
10344514f5e3Sopenharmony_ci        }
10354514f5e3Sopenharmony_ci
10364514f5e3Sopenharmony_ci        static size_t GetSharedGCStateBitFieldOffset(bool isArch32)
10374514f5e3Sopenharmony_ci        {
10384514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::SharedGCStateBitFieldIndex)>(isArch32);
10394514f5e3Sopenharmony_ci        }
10404514f5e3Sopenharmony_ci
10414514f5e3Sopenharmony_ci        static size_t GetCurrentFrameOffset(bool isArch32)
10424514f5e3Sopenharmony_ci        {
10434514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::CurrentFrameIndex)>(isArch32);
10444514f5e3Sopenharmony_ci        }
10454514f5e3Sopenharmony_ci
10464514f5e3Sopenharmony_ci        static size_t GetLeaveFrameOffset(bool isArch32)
10474514f5e3Sopenharmony_ci        {
10484514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::LeaveFrameIndex)>(isArch32);
10494514f5e3Sopenharmony_ci        }
10504514f5e3Sopenharmony_ci
10514514f5e3Sopenharmony_ci        static size_t GetLastFpOffset(bool isArch32)
10524514f5e3Sopenharmony_ci        {
10534514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::LastFpIndex)>(isArch32);
10544514f5e3Sopenharmony_ci        }
10554514f5e3Sopenharmony_ci
10564514f5e3Sopenharmony_ci        static size_t GetNewSpaceAllocationTopAddressOffset(bool isArch32)
10574514f5e3Sopenharmony_ci        {
10584514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::NewSpaceAllocationTopAddressIndex)>(isArch32);
10594514f5e3Sopenharmony_ci        }
10604514f5e3Sopenharmony_ci
10614514f5e3Sopenharmony_ci        static size_t GetNewSpaceAllocationEndAddressOffset(bool isArch32)
10624514f5e3Sopenharmony_ci        {
10634514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::NewSpaceAllocationEndAddressIndex)>(isArch32);
10644514f5e3Sopenharmony_ci        }
10654514f5e3Sopenharmony_ci
10664514f5e3Sopenharmony_ci        static size_t GetSOldSpaceAllocationTopAddressOffset(bool isArch32)
10674514f5e3Sopenharmony_ci        {
10684514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::SOldSpaceAllocationTopAddressIndex)>(isArch32);
10694514f5e3Sopenharmony_ci        }
10704514f5e3Sopenharmony_ci
10714514f5e3Sopenharmony_ci        static size_t GetSOldSpaceAllocationEndAddressOffset(bool isArch32)
10724514f5e3Sopenharmony_ci        {
10734514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::SOldSpaceAllocationEndAddressIndex)>(isArch32);
10744514f5e3Sopenharmony_ci        }
10754514f5e3Sopenharmony_ci
10764514f5e3Sopenharmony_ci        static size_t GetSNonMovableSpaceAllocationTopAddressOffset(bool isArch32)
10774514f5e3Sopenharmony_ci        {
10784514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::SNonMovableSpaceAllocationTopAddressIndex)>(isArch32);
10794514f5e3Sopenharmony_ci        }
10804514f5e3Sopenharmony_ci
10814514f5e3Sopenharmony_ci        static size_t GetSNonMovableSpaceAllocationEndAddressOffset(bool isArch32)
10824514f5e3Sopenharmony_ci        {
10834514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::SNonMovableSpaceAllocationEndAddressIndex)>(isArch32);
10844514f5e3Sopenharmony_ci        }
10854514f5e3Sopenharmony_ci
10864514f5e3Sopenharmony_ci        static size_t GetBCStubEntriesOffset(bool isArch32)
10874514f5e3Sopenharmony_ci        {
10884514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BcStubEntriesIndex)>(isArch32);
10894514f5e3Sopenharmony_ci        }
10904514f5e3Sopenharmony_ci
10914514f5e3Sopenharmony_ci        static size_t GetRTStubEntriesOffset(bool isArch32)
10924514f5e3Sopenharmony_ci        {
10934514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::RTStubEntriesIndex)>(isArch32);
10944514f5e3Sopenharmony_ci        }
10954514f5e3Sopenharmony_ci
10964514f5e3Sopenharmony_ci        static size_t GetCOStubEntriesOffset(bool isArch32)
10974514f5e3Sopenharmony_ci        {
10984514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::COStubEntriesIndex)>(isArch32);
10994514f5e3Sopenharmony_ci        }
11004514f5e3Sopenharmony_ci
11014514f5e3Sopenharmony_ci        static size_t GetBaselineStubEntriesOffset(bool isArch32)
11024514f5e3Sopenharmony_ci        {
11034514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BaselineStubEntriesIndex)>(isArch32);
11044514f5e3Sopenharmony_ci        }
11054514f5e3Sopenharmony_ci
11064514f5e3Sopenharmony_ci        static size_t GetBuiltinsStubEntriesOffset(bool isArch32)
11074514f5e3Sopenharmony_ci        {
11084514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BuiltinsStubEntriesIndex)>(isArch32);
11094514f5e3Sopenharmony_ci        }
11104514f5e3Sopenharmony_ci
11114514f5e3Sopenharmony_ci        static size_t GetBuiltinHClassEntriesOffset(bool isArch32)
11124514f5e3Sopenharmony_ci        {
11134514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BuiltinHClassEntriesIndex)>(isArch32);
11144514f5e3Sopenharmony_ci        }
11154514f5e3Sopenharmony_ci
11164514f5e3Sopenharmony_ci        static size_t GetBuiltinHClassOffset(BuiltinTypeId type, bool isArch32)
11174514f5e3Sopenharmony_ci        {
11184514f5e3Sopenharmony_ci            return GetBuiltinHClassEntriesOffset(isArch32) + BuiltinHClassEntries::GetBuiltinHClassOffset(type);
11194514f5e3Sopenharmony_ci        }
11204514f5e3Sopenharmony_ci
11214514f5e3Sopenharmony_ci        static size_t GetBuiltinInstanceHClassOffset(BuiltinTypeId type, bool isArch32)
11224514f5e3Sopenharmony_ci        {
11234514f5e3Sopenharmony_ci            return GetBuiltinHClassEntriesOffset(isArch32) + BuiltinHClassEntries::GetInstanceHClassOffset(type);
11244514f5e3Sopenharmony_ci        }
11254514f5e3Sopenharmony_ci
11264514f5e3Sopenharmony_ci        static size_t GetBuiltinPrototypeHClassOffset(BuiltinTypeId type, bool isArch32)
11274514f5e3Sopenharmony_ci        {
11284514f5e3Sopenharmony_ci            return GetBuiltinHClassEntriesOffset(isArch32) + BuiltinHClassEntries::GetPrototypeHClassOffset(type);
11294514f5e3Sopenharmony_ci        }
11304514f5e3Sopenharmony_ci
11314514f5e3Sopenharmony_ci        static size_t GetBuiltinPrototypeOfPrototypeHClassOffset(BuiltinTypeId type, bool isArch32)
11324514f5e3Sopenharmony_ci        {
11334514f5e3Sopenharmony_ci            return GetBuiltinHClassEntriesOffset(isArch32) +
11344514f5e3Sopenharmony_ci                   BuiltinHClassEntries::GetPrototypeOfPrototypeHClassOffset(type);
11354514f5e3Sopenharmony_ci        }
11364514f5e3Sopenharmony_ci
11374514f5e3Sopenharmony_ci        static size_t GetBuiltinExtraHClassOffset(BuiltinTypeId type, bool isArch32)
11384514f5e3Sopenharmony_ci        {
11394514f5e3Sopenharmony_ci            return GetBuiltinHClassEntriesOffset(isArch32) + BuiltinHClassEntries::GetExtraHClassOffset(type);
11404514f5e3Sopenharmony_ci        }
11414514f5e3Sopenharmony_ci
11424514f5e3Sopenharmony_ci        static size_t GetBCDebuggerStubEntriesOffset(bool isArch32)
11434514f5e3Sopenharmony_ci        {
11444514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BcDebuggerStubEntriesIndex)>(isArch32);
11454514f5e3Sopenharmony_ci        }
11464514f5e3Sopenharmony_ci
11474514f5e3Sopenharmony_ci        static size_t GetFrameBaseOffset(bool isArch32)
11484514f5e3Sopenharmony_ci        {
11494514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::FrameBaseIndex)>(isArch32);
11504514f5e3Sopenharmony_ci        }
11514514f5e3Sopenharmony_ci
11524514f5e3Sopenharmony_ci        static size_t GetStackLimitOffset(bool isArch32)
11534514f5e3Sopenharmony_ci        {
11544514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::StackLimitIndex)>(isArch32);
11554514f5e3Sopenharmony_ci        }
11564514f5e3Sopenharmony_ci
11574514f5e3Sopenharmony_ci        static size_t GetGlueGlobalEnvOffset(bool isArch32)
11584514f5e3Sopenharmony_ci        {
11594514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::GlueGlobalEnvIndex)>(isArch32);
11604514f5e3Sopenharmony_ci        }
11614514f5e3Sopenharmony_ci
11624514f5e3Sopenharmony_ci        static size_t GetAllowCrossThreadExecutionOffset(bool isArch32)
11634514f5e3Sopenharmony_ci        {
11644514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::AllowCrossThreadExecutionIndex)>(isArch32);
11654514f5e3Sopenharmony_ci        }
11664514f5e3Sopenharmony_ci
11674514f5e3Sopenharmony_ci        static size_t GetInterruptVectorOffset(bool isArch32)
11684514f5e3Sopenharmony_ci        {
11694514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::InterruptVectorIndex)>(isArch32);
11704514f5e3Sopenharmony_ci        }
11714514f5e3Sopenharmony_ci
11724514f5e3Sopenharmony_ci        static size_t GetIsStartHeapSamplingOffset(bool isArch32)
11734514f5e3Sopenharmony_ci        {
11744514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsStartHeapSamplingIndex)>(isArch32);
11754514f5e3Sopenharmony_ci        }
11764514f5e3Sopenharmony_ci
11774514f5e3Sopenharmony_ci        static size_t GetIsDebugModeOffset(bool isArch32)
11784514f5e3Sopenharmony_ci        {
11794514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsDebugModeIndex)>(isArch32);
11804514f5e3Sopenharmony_ci        }
11814514f5e3Sopenharmony_ci
11824514f5e3Sopenharmony_ci        static size_t GetIsFrameDroppedOffset(bool isArch32)
11834514f5e3Sopenharmony_ci        {
11844514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsFrameDroppedIndex)>(isArch32);
11854514f5e3Sopenharmony_ci        }
11864514f5e3Sopenharmony_ci
11874514f5e3Sopenharmony_ci        static size_t GetPropertiesGrowStepOffset(bool isArch32)
11884514f5e3Sopenharmony_ci        {
11894514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::PropertiesGrowStepIndex)>(isArch32);
11904514f5e3Sopenharmony_ci        }
11914514f5e3Sopenharmony_ci
11924514f5e3Sopenharmony_ci        static size_t GetEntryFrameDroppedStateOffset(bool isArch32)
11934514f5e3Sopenharmony_ci        {
11944514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::EntryFrameDroppedStateIndex)>(isArch32);
11954514f5e3Sopenharmony_ci        }
11964514f5e3Sopenharmony_ci
11974514f5e3Sopenharmony_ci        static size_t GetCurrentContextOffset(bool isArch32)
11984514f5e3Sopenharmony_ci        {
11994514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::CurrentContextIndex)>(isArch32);
12004514f5e3Sopenharmony_ci        }
12014514f5e3Sopenharmony_ci
12024514f5e3Sopenharmony_ci        static size_t GetBuiltinEntriesOffset(bool isArch32)
12034514f5e3Sopenharmony_ci        {
12044514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::BuiltinEntriesIndex)>(isArch32);
12054514f5e3Sopenharmony_ci        }
12064514f5e3Sopenharmony_ci
12074514f5e3Sopenharmony_ci        static size_t GetIsTracingOffset(bool isArch32)
12084514f5e3Sopenharmony_ci        {
12094514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsTracingIndex)>(isArch32);
12104514f5e3Sopenharmony_ci        }
12114514f5e3Sopenharmony_ci
12124514f5e3Sopenharmony_ci        static size_t GetUnSharedConstpoolsOffset(bool isArch32)
12134514f5e3Sopenharmony_ci        {
12144514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::UnsharedConstpoolsIndex)>(isArch32);
12154514f5e3Sopenharmony_ci        }
12164514f5e3Sopenharmony_ci
12174514f5e3Sopenharmony_ci        static size_t GetStateAndFlagsOffset(bool isArch32)
12184514f5e3Sopenharmony_ci        {
12194514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::StateAndFlagsIndex)>(isArch32);
12204514f5e3Sopenharmony_ci        }
12214514f5e3Sopenharmony_ci
12224514f5e3Sopenharmony_ci        static size_t GetRandomStatePtrOffset(bool isArch32)
12234514f5e3Sopenharmony_ci        {
12244514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::RandomStatePtrIndex)>(isArch32);
12254514f5e3Sopenharmony_ci        }
12264514f5e3Sopenharmony_ci
12274514f5e3Sopenharmony_ci        static size_t GetTaskInfoOffset(bool isArch32)
12284514f5e3Sopenharmony_ci        {
12294514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::TaskInfoIndex)>(isArch32);
12304514f5e3Sopenharmony_ci        }
12314514f5e3Sopenharmony_ci
12324514f5e3Sopenharmony_ci        static size_t GetIsEnableElementsKindOffset(bool isArch32)
12334514f5e3Sopenharmony_ci        {
12344514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsEnableElementsKindIndex)>(isArch32);
12354514f5e3Sopenharmony_ci        }
12364514f5e3Sopenharmony_ci
12374514f5e3Sopenharmony_ci        static size_t GetIsEnableForceICOffSet(bool isArch32)
12384514f5e3Sopenharmony_ci        {
12394514f5e3Sopenharmony_ci            return GetOffset<static_cast<size_t>(Index::IsEnableForceIC)>(isArch32);
12404514f5e3Sopenharmony_ci        }
12414514f5e3Sopenharmony_ci
12424514f5e3Sopenharmony_ci        alignas(EAS) BCStubEntries bcStubEntries_ {};
12434514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedValue exception_ {JSTaggedValue::Hole()};
12444514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedValue globalObject_ {JSTaggedValue::Hole()};
12454514f5e3Sopenharmony_ci        alignas(EAS) bool stableArrayElementsGuardians_ {true};
12464514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedType *currentFrame_ {nullptr};
12474514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedType *leaveFrame_ {nullptr};
12484514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedType *lastFp_ {nullptr};
12494514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *newSpaceAllocationTopAddress_ {nullptr};
12504514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *newSpaceAllocationEndAddress_ {nullptr};
12514514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *sOldSpaceAllocationTopAddress_ {nullptr};
12524514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *sOldSpaceAllocationEndAddress_ {nullptr};
12534514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *sNonMovableSpaceAllocationTopAddress_ {nullptr};
12544514f5e3Sopenharmony_ci        alignas(EAS) const uintptr_t *sNonMovableSpaceAllocationEndAddress_ {nullptr};
12554514f5e3Sopenharmony_ci        alignas(EAS) RTStubEntries rtStubEntries_ {};
12564514f5e3Sopenharmony_ci        alignas(EAS) COStubEntries coStubEntries_ {};
12574514f5e3Sopenharmony_ci        alignas(EAS) BuiltinStubEntries builtinStubEntries_ {};
12584514f5e3Sopenharmony_ci        alignas(EAS) BuiltinHClassEntries builtinHClassEntries_ {};
12594514f5e3Sopenharmony_ci        alignas(EAS) BCDebuggerStubEntries bcDebuggerStubEntries_ {};
12604514f5e3Sopenharmony_ci        alignas(EAS) BaselineStubEntries baselineStubEntries_ {};
12614514f5e3Sopenharmony_ci        alignas(EAS) volatile uint64_t gcStateBitField_ {0ULL};
12624514f5e3Sopenharmony_ci        alignas(EAS) volatile uint64_t sharedGCStateBitField_ {0ULL};
12634514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedType *frameBase_ {nullptr};
12644514f5e3Sopenharmony_ci        alignas(EAS) uint64_t stackStart_ {0};
12654514f5e3Sopenharmony_ci        alignas(EAS) uint64_t stackLimit_ {0};
12664514f5e3Sopenharmony_ci        alignas(EAS) GlobalEnv *glueGlobalEnv_ {nullptr};
12674514f5e3Sopenharmony_ci        alignas(EAS) GlobalEnvConstants *globalConst_ {nullptr};
12684514f5e3Sopenharmony_ci        alignas(EAS) bool allowCrossThreadExecution_ {false};
12694514f5e3Sopenharmony_ci        alignas(EAS) volatile uint64_t interruptVector_ {0};
12704514f5e3Sopenharmony_ci        alignas(EAS) JSTaggedValue isStartHeapSampling_ {JSTaggedValue::False()};
12714514f5e3Sopenharmony_ci        alignas(EAS) bool isDebugMode_ {false};
12724514f5e3Sopenharmony_ci        alignas(EAS) bool isFrameDropped_ {false};
12734514f5e3Sopenharmony_ci        alignas(EAS) uint32_t propertiesGrowStep_ {JSObjectResizingStrategy::PROPERTIES_GROW_SIZE};
12744514f5e3Sopenharmony_ci        alignas(EAS) uint64_t entryFrameDroppedState_ {FrameDroppedState::StateFalse};
12754514f5e3Sopenharmony_ci        alignas(EAS) EcmaContext *currentContext_ {nullptr};
12764514f5e3Sopenharmony_ci        alignas(EAS) BuiltinEntries builtinEntries_ {};
12774514f5e3Sopenharmony_ci        alignas(EAS) bool isTracing_ {false};
12784514f5e3Sopenharmony_ci        alignas(EAS) uintptr_t unsharedConstpools_ {0};
12794514f5e3Sopenharmony_ci        alignas(EAS) uintptr_t randomStatePtr_ {0};
12804514f5e3Sopenharmony_ci        alignas(EAS) ThreadStateAndFlags stateAndFlags_ {};
12814514f5e3Sopenharmony_ci        alignas(EAS) uintptr_t taskInfo_ {0};
12824514f5e3Sopenharmony_ci        alignas(EAS) bool isEnableElementsKind_ {false};
12834514f5e3Sopenharmony_ci        alignas(EAS) bool isEnableForceIC_ {true};
12844514f5e3Sopenharmony_ci    };
12854514f5e3Sopenharmony_ci    STATIC_ASSERT_EQ_ARCH(sizeof(GlueData), GlueData::SizeArch32, GlueData::SizeArch64);
12864514f5e3Sopenharmony_ci
12874514f5e3Sopenharmony_ci    void PushContext(EcmaContext *context);
12884514f5e3Sopenharmony_ci    void PopContext();
12894514f5e3Sopenharmony_ci
12904514f5e3Sopenharmony_ci    EcmaContext *GetCurrentEcmaContext() const
12914514f5e3Sopenharmony_ci    {
12924514f5e3Sopenharmony_ci        return glueData_.currentContext_;
12934514f5e3Sopenharmony_ci    }
12944514f5e3Sopenharmony_ci
12954514f5e3Sopenharmony_ci    JSTaggedValue GetSingleCharTable() const
12964514f5e3Sopenharmony_ci    {
12974514f5e3Sopenharmony_ci        ASSERT(glueData_.globalConst_->GetSingleCharTable() != JSTaggedValue::Hole());
12984514f5e3Sopenharmony_ci        return glueData_.globalConst_->GetSingleCharTable();
12994514f5e3Sopenharmony_ci    }
13004514f5e3Sopenharmony_ci
13014514f5e3Sopenharmony_ci    void SwitchCurrentContext(EcmaContext *currentContext, bool isInIterate = false);
13024514f5e3Sopenharmony_ci
13034514f5e3Sopenharmony_ci    CVector<EcmaContext *> GetEcmaContexts()
13044514f5e3Sopenharmony_ci    {
13054514f5e3Sopenharmony_ci        return contexts_;
13064514f5e3Sopenharmony_ci    }
13074514f5e3Sopenharmony_ci
13084514f5e3Sopenharmony_ci    bool IsPropertyCacheCleared() const;
13094514f5e3Sopenharmony_ci
13104514f5e3Sopenharmony_ci    bool EraseContext(EcmaContext *context);
13114514f5e3Sopenharmony_ci    void ClearContextCachedConstantPool();
13124514f5e3Sopenharmony_ci
13134514f5e3Sopenharmony_ci    const GlobalEnvConstants *GetFirstGlobalConst() const;
13144514f5e3Sopenharmony_ci    bool IsAllContextsInitialized() const;
13154514f5e3Sopenharmony_ci    bool IsReadyToUpdateDetector() const;
13164514f5e3Sopenharmony_ci    Area *GetOrCreateRegExpCache();
13174514f5e3Sopenharmony_ci
13184514f5e3Sopenharmony_ci    void InitializeBuiltinObject(const std::string& key);
13194514f5e3Sopenharmony_ci    void InitializeBuiltinObject();
13204514f5e3Sopenharmony_ci
13214514f5e3Sopenharmony_ci    void SetFullMarkRequest()
13224514f5e3Sopenharmony_ci    {
13234514f5e3Sopenharmony_ci        fullMarkRequest_ = true;
13244514f5e3Sopenharmony_ci    }
13254514f5e3Sopenharmony_ci
13264514f5e3Sopenharmony_ci    inline bool IsThreadSafe() const
13274514f5e3Sopenharmony_ci    {
13284514f5e3Sopenharmony_ci        return IsMainThread() || HasSuspendRequest();
13294514f5e3Sopenharmony_ci    }
13304514f5e3Sopenharmony_ci
13314514f5e3Sopenharmony_ci    bool IsSuspended() const
13324514f5e3Sopenharmony_ci    {
13334514f5e3Sopenharmony_ci        bool f = ReadFlag(ThreadFlag::SUSPEND_REQUEST);
13344514f5e3Sopenharmony_ci        bool s = (GetState() != ThreadState::RUNNING);
13354514f5e3Sopenharmony_ci        return f && s;
13364514f5e3Sopenharmony_ci    }
13374514f5e3Sopenharmony_ci
13384514f5e3Sopenharmony_ci    inline bool HasSuspendRequest() const
13394514f5e3Sopenharmony_ci    {
13404514f5e3Sopenharmony_ci        return ReadFlag(ThreadFlag::SUSPEND_REQUEST);
13414514f5e3Sopenharmony_ci    }
13424514f5e3Sopenharmony_ci
13434514f5e3Sopenharmony_ci    void CheckSafepointIfSuspended()
13444514f5e3Sopenharmony_ci    {
13454514f5e3Sopenharmony_ci        if (HasSuspendRequest()) {
13464514f5e3Sopenharmony_ci            WaitSuspension();
13474514f5e3Sopenharmony_ci        }
13484514f5e3Sopenharmony_ci    }
13494514f5e3Sopenharmony_ci
13504514f5e3Sopenharmony_ci    bool IsInSuspendedState() const
13514514f5e3Sopenharmony_ci    {
13524514f5e3Sopenharmony_ci        return GetState() == ThreadState::IS_SUSPENDED;
13534514f5e3Sopenharmony_ci    }
13544514f5e3Sopenharmony_ci
13554514f5e3Sopenharmony_ci    bool IsInRunningState() const
13564514f5e3Sopenharmony_ci    {
13574514f5e3Sopenharmony_ci        return GetState() == ThreadState::RUNNING;
13584514f5e3Sopenharmony_ci    }
13594514f5e3Sopenharmony_ci
13604514f5e3Sopenharmony_ci    bool IsInRunningStateOrProfiling() const;
13614514f5e3Sopenharmony_ci
13624514f5e3Sopenharmony_ci    ThreadState GetState() const
13634514f5e3Sopenharmony_ci    {
13644514f5e3Sopenharmony_ci        uint32_t stateAndFlags = glueData_.stateAndFlags_.asAtomicInt.load(std::memory_order_acquire);
13654514f5e3Sopenharmony_ci        return static_cast<enum ThreadState>(stateAndFlags >> THREAD_STATE_OFFSET);
13664514f5e3Sopenharmony_ci    }
13674514f5e3Sopenharmony_ci    void PUBLIC_API UpdateState(ThreadState newState);
13684514f5e3Sopenharmony_ci    void SuspendThread(bool internalSuspend, SuspendBarrier* barrier = nullptr);
13694514f5e3Sopenharmony_ci    void ResumeThread(bool internalSuspend);
13704514f5e3Sopenharmony_ci    void WaitSuspension();
13714514f5e3Sopenharmony_ci    static bool IsMainThread();
13724514f5e3Sopenharmony_ci    PUBLIC_API void ManagedCodeBegin();
13734514f5e3Sopenharmony_ci    PUBLIC_API void ManagedCodeEnd();
13744514f5e3Sopenharmony_ci#ifndef NDEBUG
13754514f5e3Sopenharmony_ci    bool IsInManagedState() const;
13764514f5e3Sopenharmony_ci    MutatorLock::MutatorLockState GetMutatorLockState() const;
13774514f5e3Sopenharmony_ci    void SetMutatorLockState(MutatorLock::MutatorLockState newState);
13784514f5e3Sopenharmony_ci#endif
13794514f5e3Sopenharmony_ci    void SetWeakFinalizeTaskCallback(const WeakFinalizeTaskCallback &callback)
13804514f5e3Sopenharmony_ci    {
13814514f5e3Sopenharmony_ci        finalizeTaskCallback_ = callback;
13824514f5e3Sopenharmony_ci    }
13834514f5e3Sopenharmony_ci
13844514f5e3Sopenharmony_ci    uint64_t GetJobId()
13854514f5e3Sopenharmony_ci    {
13864514f5e3Sopenharmony_ci        if (jobId_ == UINT64_MAX) {
13874514f5e3Sopenharmony_ci            jobId_ = 0;
13884514f5e3Sopenharmony_ci        }
13894514f5e3Sopenharmony_ci        return ++jobId_;
13904514f5e3Sopenharmony_ci    }
13914514f5e3Sopenharmony_ci
13924514f5e3Sopenharmony_ci    void SetAsyncCleanTaskCallback(const NativePointerTaskCallback &callback)
13934514f5e3Sopenharmony_ci    {
13944514f5e3Sopenharmony_ci        asyncCleanTaskCb_ = callback;
13954514f5e3Sopenharmony_ci    }
13964514f5e3Sopenharmony_ci
13974514f5e3Sopenharmony_ci    NativePointerTaskCallback GetAsyncCleanTaskCallback() const
13984514f5e3Sopenharmony_ci    {
13994514f5e3Sopenharmony_ci        return asyncCleanTaskCb_;
14004514f5e3Sopenharmony_ci    }
14014514f5e3Sopenharmony_ci
14024514f5e3Sopenharmony_ci    static void RegisterThread(JSThread *jsThread);
14034514f5e3Sopenharmony_ci
14044514f5e3Sopenharmony_ci    static void UnregisterThread(JSThread *jsThread);
14054514f5e3Sopenharmony_ci
14064514f5e3Sopenharmony_ci    bool IsJSThread() const
14074514f5e3Sopenharmony_ci    {
14084514f5e3Sopenharmony_ci        return threadType_ == ThreadType::JS_THREAD;
14094514f5e3Sopenharmony_ci    }
14104514f5e3Sopenharmony_ci
14114514f5e3Sopenharmony_ci    bool IsJitThread() const
14124514f5e3Sopenharmony_ci    {
14134514f5e3Sopenharmony_ci        return threadType_ == ThreadType::JIT_THREAD;
14144514f5e3Sopenharmony_ci    }
14154514f5e3Sopenharmony_ci
14164514f5e3Sopenharmony_ci    bool IsDaemonThread() const
14174514f5e3Sopenharmony_ci    {
14184514f5e3Sopenharmony_ci        return threadType_ == ThreadType::DAEMON_THREAD;
14194514f5e3Sopenharmony_ci    }
14204514f5e3Sopenharmony_ci
14214514f5e3Sopenharmony_ci    // Daemon_Thread and JS_Thread have some difference in transition, for example, when transition to running,
14224514f5e3Sopenharmony_ci    // JS_Thread may take some local_gc actions, but Daemon_Thread do not need.
14234514f5e3Sopenharmony_ci    void TransferDaemonThreadToRunning();
14244514f5e3Sopenharmony_ci
14254514f5e3Sopenharmony_ci    RecursiveMutex *GetJitLock()
14264514f5e3Sopenharmony_ci    {
14274514f5e3Sopenharmony_ci        return &jitMutex_;
14284514f5e3Sopenharmony_ci    }
14294514f5e3Sopenharmony_ci
14304514f5e3Sopenharmony_ci    RecursiveMutex &GetProfileTypeAccessorLock()
14314514f5e3Sopenharmony_ci    {
14324514f5e3Sopenharmony_ci        return profileTypeAccessorLockMutex_;
14334514f5e3Sopenharmony_ci    }
14344514f5e3Sopenharmony_ci
14354514f5e3Sopenharmony_ci    void SetMachineCodeLowMemory(bool isLow)
14364514f5e3Sopenharmony_ci    {
14374514f5e3Sopenharmony_ci        machineCodeLowMemory_ = isLow;
14384514f5e3Sopenharmony_ci    }
14394514f5e3Sopenharmony_ci
14404514f5e3Sopenharmony_ci    bool IsMachineCodeLowMemory()
14414514f5e3Sopenharmony_ci    {
14424514f5e3Sopenharmony_ci        return machineCodeLowMemory_;
14434514f5e3Sopenharmony_ci    }
14444514f5e3Sopenharmony_ci
14454514f5e3Sopenharmony_ci    void *GetEnv() const
14464514f5e3Sopenharmony_ci    {
14474514f5e3Sopenharmony_ci        return env_;
14484514f5e3Sopenharmony_ci    }
14494514f5e3Sopenharmony_ci
14504514f5e3Sopenharmony_ci    void SetEnv(void *env)
14514514f5e3Sopenharmony_ci    {
14524514f5e3Sopenharmony_ci        env_ = env;
14534514f5e3Sopenharmony_ci    }
14544514f5e3Sopenharmony_ci
14554514f5e3Sopenharmony_ci    void SetIsInConcurrentScope(bool flag)
14564514f5e3Sopenharmony_ci    {
14574514f5e3Sopenharmony_ci        isInConcurrentScope_ = flag;
14584514f5e3Sopenharmony_ci    }
14594514f5e3Sopenharmony_ci
14604514f5e3Sopenharmony_ci    bool IsInConcurrentScope()
14614514f5e3Sopenharmony_ci    {
14624514f5e3Sopenharmony_ci        return isInConcurrentScope_;
14634514f5e3Sopenharmony_ci    }
14644514f5e3Sopenharmony_ci
14654514f5e3Sopenharmony_ci    void EnableEdenGCBarriers()
14664514f5e3Sopenharmony_ci    {
14674514f5e3Sopenharmony_ci        auto setValueStub = GetFastStubEntry(kungfu::CommonStubCSigns::SetValueWithEdenBarrier);
14684514f5e3Sopenharmony_ci        SetFastStubEntry(kungfu::CommonStubCSigns::SetValueWithBarrier, setValueStub);
14694514f5e3Sopenharmony_ci        auto markStub = GetRTInterface(kungfu::RuntimeStubCSigns::ID_MarkingBarrierWithEden);
14704514f5e3Sopenharmony_ci        RegisterRTInterface(kungfu::RuntimeStubCSigns::ID_MarkingBarrier, markStub);
14714514f5e3Sopenharmony_ci        auto setNotShareValueStub = GetFastStubEntry(kungfu::CommonStubCSigns::SetNonSValueWithEdenBarrier);
14724514f5e3Sopenharmony_ci        SetFastStubEntry(kungfu::CommonStubCSigns::SetNonSValueWithBarrier, setNotShareValueStub);
14734514f5e3Sopenharmony_ci        auto asmCheckStub = GetRTInterface(kungfu::RuntimeStubCSigns::ID_ASMWriteBarrierWithEden);
14744514f5e3Sopenharmony_ci        RegisterRTInterface(kungfu::RuntimeStubCSigns::ID_ASMFastWriteBarrier, asmCheckStub);
14754514f5e3Sopenharmony_ci    }
14764514f5e3Sopenharmony_ci
14774514f5e3Sopenharmony_ci
14784514f5e3Sopenharmony_ci
14794514f5e3Sopenharmony_ci#ifndef NDEBUG
14804514f5e3Sopenharmony_ci    inline void LaunchSuspendAll()
14814514f5e3Sopenharmony_ci    {
14824514f5e3Sopenharmony_ci        launchedSuspendAll_ = true;
14834514f5e3Sopenharmony_ci    }
14844514f5e3Sopenharmony_ci
14854514f5e3Sopenharmony_ci    inline bool HasLaunchedSuspendAll() const
14864514f5e3Sopenharmony_ci    {
14874514f5e3Sopenharmony_ci        return launchedSuspendAll_;
14884514f5e3Sopenharmony_ci    }
14894514f5e3Sopenharmony_ci
14904514f5e3Sopenharmony_ci    inline void CompleteSuspendAll()
14914514f5e3Sopenharmony_ci    {
14924514f5e3Sopenharmony_ci        launchedSuspendAll_ = false;
14934514f5e3Sopenharmony_ci    }
14944514f5e3Sopenharmony_ci#endif
14954514f5e3Sopenharmony_ci
14964514f5e3Sopenharmony_ciprotected:
14974514f5e3Sopenharmony_ci    void SetThreadId()
14984514f5e3Sopenharmony_ci    {
14994514f5e3Sopenharmony_ci        id_.store(JSThread::GetCurrentThreadId(), std::memory_order_release);
15004514f5e3Sopenharmony_ci    }
15014514f5e3Sopenharmony_ci
15024514f5e3Sopenharmony_ci    // When call EcmaVM::PreFork(), the std::thread for Daemon_Thread is finished, but the Daemon_Thread instance
15034514f5e3Sopenharmony_ci    // is still alive, and need to reset ThreadId to 0.
15044514f5e3Sopenharmony_ci    void ResetThreadId()
15054514f5e3Sopenharmony_ci    {
15064514f5e3Sopenharmony_ci        id_.store(0, std::memory_order_release);
15074514f5e3Sopenharmony_ci    }
15084514f5e3Sopenharmony_ciprivate:
15094514f5e3Sopenharmony_ci    NO_COPY_SEMANTIC(JSThread);
15104514f5e3Sopenharmony_ci    NO_MOVE_SEMANTIC(JSThread);
15114514f5e3Sopenharmony_ci    void SetGlobalConst(GlobalEnvConstants *globalConst)
15124514f5e3Sopenharmony_ci    {
15134514f5e3Sopenharmony_ci        glueData_.globalConst_ = globalConst;
15144514f5e3Sopenharmony_ci    }
15154514f5e3Sopenharmony_ci    void SetCurrentEcmaContext(EcmaContext *context)
15164514f5e3Sopenharmony_ci    {
15174514f5e3Sopenharmony_ci        glueData_.currentContext_ = context;
15184514f5e3Sopenharmony_ci    }
15194514f5e3Sopenharmony_ci
15204514f5e3Sopenharmony_ci    void SetArrayHClassIndexMap(const CMap<ElementsKind, std::pair<ConstantIndex, ConstantIndex>> &map)
15214514f5e3Sopenharmony_ci    {
15224514f5e3Sopenharmony_ci        arrayHClassIndexMap_ = map;
15234514f5e3Sopenharmony_ci    }
15244514f5e3Sopenharmony_ci
15254514f5e3Sopenharmony_ci    void TransferFromRunningToSuspended(ThreadState newState);
15264514f5e3Sopenharmony_ci
15274514f5e3Sopenharmony_ci    void TransferToRunning();
15284514f5e3Sopenharmony_ci
15294514f5e3Sopenharmony_ci    inline void StoreState(ThreadState newState);
15304514f5e3Sopenharmony_ci
15314514f5e3Sopenharmony_ci    void StoreRunningState(ThreadState newState);
15324514f5e3Sopenharmony_ci
15334514f5e3Sopenharmony_ci    void StoreSuspendedState(ThreadState newState);
15344514f5e3Sopenharmony_ci
15354514f5e3Sopenharmony_ci    bool ReadFlag(ThreadFlag flag) const
15364514f5e3Sopenharmony_ci    {
15374514f5e3Sopenharmony_ci        uint32_t stateAndFlags = glueData_.stateAndFlags_.asAtomicInt.load(std::memory_order_acquire);
15384514f5e3Sopenharmony_ci        uint16_t flags = (stateAndFlags & THREAD_FLAGS_MASK);
15394514f5e3Sopenharmony_ci        return (flags & static_cast<uint16_t>(flag)) != 0;
15404514f5e3Sopenharmony_ci    }
15414514f5e3Sopenharmony_ci
15424514f5e3Sopenharmony_ci    void SetFlag(ThreadFlag flag)
15434514f5e3Sopenharmony_ci    {
15444514f5e3Sopenharmony_ci        glueData_.stateAndFlags_.asAtomicInt.fetch_or(flag, std::memory_order_seq_cst);
15454514f5e3Sopenharmony_ci    }
15464514f5e3Sopenharmony_ci
15474514f5e3Sopenharmony_ci    void ClearFlag(ThreadFlag flag)
15484514f5e3Sopenharmony_ci    {
15494514f5e3Sopenharmony_ci        glueData_.stateAndFlags_.asAtomicInt.fetch_and(UINT32_MAX ^ flag, std::memory_order_seq_cst);
15504514f5e3Sopenharmony_ci    }
15514514f5e3Sopenharmony_ci
15524514f5e3Sopenharmony_ci    void DumpStack() DUMP_API_ATTR;
15534514f5e3Sopenharmony_ci
15544514f5e3Sopenharmony_ci    static size_t GetAsmStackLimit();
15554514f5e3Sopenharmony_ci
15564514f5e3Sopenharmony_ci    static constexpr size_t DEFAULT_MAX_SYSTEM_STACK_SIZE = 8_MB;
15574514f5e3Sopenharmony_ci
15584514f5e3Sopenharmony_ci    GlueData glueData_;
15594514f5e3Sopenharmony_ci    std::atomic<ThreadId> id_ {0};
15604514f5e3Sopenharmony_ci    EcmaVM *vm_ {nullptr};
15614514f5e3Sopenharmony_ci    void *env_ {nullptr};
15624514f5e3Sopenharmony_ci    Area *regExpCache_ {nullptr};
15634514f5e3Sopenharmony_ci
15644514f5e3Sopenharmony_ci    // MM: handles, global-handles, and aot-stubs.
15654514f5e3Sopenharmony_ci    int nestedLevel_ = 0;
15664514f5e3Sopenharmony_ci    NativeAreaAllocator *nativeAreaAllocator_ {nullptr};
15674514f5e3Sopenharmony_ci    HeapRegionAllocator *heapRegionAllocator_ {nullptr};
15684514f5e3Sopenharmony_ci    bool runningNativeFinalizeCallbacks_ {false};
15694514f5e3Sopenharmony_ci    std::vector<std::pair<WeakClearCallback, void *>> weakNodeFreeGlobalCallbacks_ {};
15704514f5e3Sopenharmony_ci    std::vector<std::pair<WeakClearCallback, void *>> weakNodeNativeFinalizeCallbacks_ {};
15714514f5e3Sopenharmony_ci
15724514f5e3Sopenharmony_ci    EcmaGlobalStorage<Node> *globalStorage_ {nullptr};
15734514f5e3Sopenharmony_ci    EcmaGlobalStorage<DebugNode> *globalDebugStorage_ {nullptr};
15744514f5e3Sopenharmony_ci    int32_t stackTraceFd_ {-1};
15754514f5e3Sopenharmony_ci
15764514f5e3Sopenharmony_ci    std::function<uintptr_t(JSTaggedType value)> newGlobalHandle_;
15774514f5e3Sopenharmony_ci    std::function<void(uintptr_t nodeAddr)> disposeGlobalHandle_;
15784514f5e3Sopenharmony_ci    std::function<uintptr_t(uintptr_t nodeAddr, void *ref, WeakClearCallback freeGlobalCallBack_,
15794514f5e3Sopenharmony_ci         WeakClearCallback nativeFinalizeCallBack)> setWeak_;
15804514f5e3Sopenharmony_ci    std::function<uintptr_t(uintptr_t nodeAddr)> clearWeak_;
15814514f5e3Sopenharmony_ci    std::function<bool(uintptr_t addr)> isWeak_;
15824514f5e3Sopenharmony_ci    NativePointerTaskCallback asyncCleanTaskCb_ {nullptr};
15834514f5e3Sopenharmony_ci    WeakFinalizeTaskCallback finalizeTaskCallback_ {nullptr};
15844514f5e3Sopenharmony_ci    uint32_t globalNumberCount_ {0};
15854514f5e3Sopenharmony_ci
15864514f5e3Sopenharmony_ci    // Run-time state
15874514f5e3Sopenharmony_ci    bool getStackSignal_ {false};
15884514f5e3Sopenharmony_ci    bool runtimeState_ {false};
15894514f5e3Sopenharmony_ci    bool isAsmInterpreter_ {false};
15904514f5e3Sopenharmony_ci    VmThreadControl *vmThreadControl_ {nullptr};
15914514f5e3Sopenharmony_ci    bool enableStackSourceFile_ {true};
15924514f5e3Sopenharmony_ci    bool enableLazyBuiltins_ {false};
15934514f5e3Sopenharmony_ci    bool readyForGCIterating_ {false};
15944514f5e3Sopenharmony_ci    // CpuProfiler
15954514f5e3Sopenharmony_ci    bool isProfiling_ {false};
15964514f5e3Sopenharmony_ci    bool gcState_ {false};
15974514f5e3Sopenharmony_ci    std::atomic_bool needProfiling_ {false};
15984514f5e3Sopenharmony_ci    std::string profileName_ {""};
15994514f5e3Sopenharmony_ci
16004514f5e3Sopenharmony_ci    bool finalizationCheckState_ {false};
16014514f5e3Sopenharmony_ci    // Shared heap
16024514f5e3Sopenharmony_ci    bool isMainThread_ {false};
16034514f5e3Sopenharmony_ci    bool fullMarkRequest_ {false};
16044514f5e3Sopenharmony_ci
16054514f5e3Sopenharmony_ci    // { ElementsKind, (hclass, hclassWithProto) }
16064514f5e3Sopenharmony_ci    CMap<ElementsKind, std::pair<ConstantIndex, ConstantIndex>> arrayHClassIndexMap_;
16074514f5e3Sopenharmony_ci    CMap<JSHClass *, GlobalIndex> ctorHclassEntries_;
16084514f5e3Sopenharmony_ci
16094514f5e3Sopenharmony_ci    CVector<EcmaContext *> contexts_;
16104514f5e3Sopenharmony_ci    EcmaContext *currentContext_ {nullptr};
16114514f5e3Sopenharmony_ci
16124514f5e3Sopenharmony_ci    Mutex suspendLock_;
16134514f5e3Sopenharmony_ci    int32_t suspendCount_ {0};
16144514f5e3Sopenharmony_ci    ConditionVariable suspendCondVar_;
16154514f5e3Sopenharmony_ci    SuspendBarrier *suspendBarrier_ {nullptr};
16164514f5e3Sopenharmony_ci
16174514f5e3Sopenharmony_ci    uint64_t jobId_ {0};
16184514f5e3Sopenharmony_ci
16194514f5e3Sopenharmony_ci    ThreadType threadType_ {ThreadType::JS_THREAD};
16204514f5e3Sopenharmony_ci    RecursiveMutex jitMutex_;
16214514f5e3Sopenharmony_ci    bool machineCodeLowMemory_ {false};
16224514f5e3Sopenharmony_ci    RecursiveMutex profileTypeAccessorLockMutex_;
16234514f5e3Sopenharmony_ci
16244514f5e3Sopenharmony_ci#ifndef NDEBUG
16254514f5e3Sopenharmony_ci    MutatorLock::MutatorLockState mutatorLockState_ = MutatorLock::MutatorLockState::UNLOCKED;
16264514f5e3Sopenharmony_ci    std::atomic<bool> launchedSuspendAll_ {false};
16274514f5e3Sopenharmony_ci#endif
16284514f5e3Sopenharmony_ci    // Collect a map from JsError to MachineCode objects, JsError objects with stack frame generated by jit in the map.
16294514f5e3Sopenharmony_ci    // It will be used to keep MachineCode objects alive (for dump) before JsError object be free.
16304514f5e3Sopenharmony_ci    std::map<JSTaggedType, JitCodeVector*> jitCodeMaps_;
16314514f5e3Sopenharmony_ci
16324514f5e3Sopenharmony_ci    std::atomic<bool> needTermination_ {false};
16334514f5e3Sopenharmony_ci    std::atomic<bool> hasTerminated_ {false};
16344514f5e3Sopenharmony_ci
16354514f5e3Sopenharmony_ci    bool isInConcurrentScope_ {false};
16364514f5e3Sopenharmony_ci
16374514f5e3Sopenharmony_ci    friend class GlobalHandleCollection;
16384514f5e3Sopenharmony_ci    friend class EcmaVM;
16394514f5e3Sopenharmony_ci    friend class EcmaContext;
16404514f5e3Sopenharmony_ci    friend class JitVM;
16414514f5e3Sopenharmony_ci};
16424514f5e3Sopenharmony_ci}  // namespace panda::ecmascript
16434514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_JS_THREAD_H
1644