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