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_ECMA_VM_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_ECMA_VM_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <mutex>
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ci#include "ecmascript/base/config.h"
224514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_method_index.h"
234514f5e3Sopenharmony_ci#include "ecmascript/js_runtime_options.h"
244514f5e3Sopenharmony_ci#include "ecmascript/mem/c_containers.h"
254514f5e3Sopenharmony_ci#include "ecmascript/mem/c_string.h"
264514f5e3Sopenharmony_ci#include "ecmascript/mem/gc_stats.h"
274514f5e3Sopenharmony_ci#include "ecmascript/mem/gc_key_stats.h"
284514f5e3Sopenharmony_ci#include "ecmascript/mem/heap_region_allocator.h"
294514f5e3Sopenharmony_ci#include "ecmascript/napi/include/dfx_jsnapi.h"
304514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi.h"
314514f5e3Sopenharmony_ci#include "ecmascript/taskpool/taskpool.h"
324514f5e3Sopenharmony_ci
334514f5e3Sopenharmony_cinamespace panda {
344514f5e3Sopenharmony_ciclass JSNApi;
354514f5e3Sopenharmony_cistruct HmsMap;
364514f5e3Sopenharmony_cinamespace panda_file {
374514f5e3Sopenharmony_ciclass File;
384514f5e3Sopenharmony_ci}  // namespace panda_file
394514f5e3Sopenharmony_ci
404514f5e3Sopenharmony_cinamespace ecmascript {
414514f5e3Sopenharmony_ciclass GlobalEnv;
424514f5e3Sopenharmony_ciclass ObjectFactory;
434514f5e3Sopenharmony_ciclass RegExpParserCache;
444514f5e3Sopenharmony_ciclass EcmaRuntimeStat;
454514f5e3Sopenharmony_ciclass Heap;
464514f5e3Sopenharmony_ciclass HeapTracker;
474514f5e3Sopenharmony_ciclass JSNativePointer;
484514f5e3Sopenharmony_ciclass Program;
494514f5e3Sopenharmony_ciclass GCStats;
504514f5e3Sopenharmony_ciclass GCKeyStats;
514514f5e3Sopenharmony_ciclass CpuProfiler;
524514f5e3Sopenharmony_ciclass Tracing;
534514f5e3Sopenharmony_ciclass RegExpExecResultCache;
544514f5e3Sopenharmony_ciclass JSPromise;
554514f5e3Sopenharmony_cienum class PromiseRejectionEvent : uint8_t;
564514f5e3Sopenharmony_cienum class Concurrent { YES, NO };
574514f5e3Sopenharmony_ciclass JSPandaFileManager;
584514f5e3Sopenharmony_ciclass JSPandaFile;
594514f5e3Sopenharmony_ciclass EcmaStringTable;
604514f5e3Sopenharmony_ciclass SnapshotEnv;
614514f5e3Sopenharmony_ciclass SnapshotSerialize;
624514f5e3Sopenharmony_ciclass SnapshotProcessor;
634514f5e3Sopenharmony_ciclass JSThread;
644514f5e3Sopenharmony_ci
654514f5e3Sopenharmony_cinamespace pgo {
664514f5e3Sopenharmony_ci    class PGOProfiler;
674514f5e3Sopenharmony_ci} // namespace pgo
684514f5e3Sopenharmony_ci
694514f5e3Sopenharmony_ciusing PGOProfiler = pgo::PGOProfiler;
704514f5e3Sopenharmony_ci#if !WIN_OR_MAC_OR_IOS_PLATFORM
714514f5e3Sopenharmony_ciclass HeapProfilerInterface;
724514f5e3Sopenharmony_ciclass HeapProfiler;
734514f5e3Sopenharmony_ci#endif
744514f5e3Sopenharmony_cinamespace job {
754514f5e3Sopenharmony_ciclass MicroJobQueue;
764514f5e3Sopenharmony_ci}  // namespace job
774514f5e3Sopenharmony_ci
784514f5e3Sopenharmony_cinamespace tooling {
794514f5e3Sopenharmony_ciclass JsDebuggerManager;
804514f5e3Sopenharmony_ci}  // namespace tooling
814514f5e3Sopenharmony_ci
824514f5e3Sopenharmony_citemplate<typename T>
834514f5e3Sopenharmony_ciclass JSHandle;
844514f5e3Sopenharmony_ciclass JSArrayBuffer;
854514f5e3Sopenharmony_ciclass JSFunction;
864514f5e3Sopenharmony_ciclass SourceTextModule;
874514f5e3Sopenharmony_ciclass Program;
884514f5e3Sopenharmony_ciclass AOTFileManager;
894514f5e3Sopenharmony_ciclass SlowRuntimeStub;
904514f5e3Sopenharmony_ciclass RequireManager;
914514f5e3Sopenharmony_ciclass QuickFixManager;
924514f5e3Sopenharmony_ciclass ConstantPool;
934514f5e3Sopenharmony_ciclass FunctionCallTimer;
944514f5e3Sopenharmony_ciclass EcmaStringTable;
954514f5e3Sopenharmony_ciclass JSObjectResizingStrategy;
964514f5e3Sopenharmony_ciclass Jit;
974514f5e3Sopenharmony_ciclass JitThread;
984514f5e3Sopenharmony_ci
994514f5e3Sopenharmony_ciusing NativePtrGetter = void* (*)(void* info);
1004514f5e3Sopenharmony_ciusing SourceMapCallback = std::function<std::string(const std::string& rawStack)>;
1014514f5e3Sopenharmony_ciusing SourceMapTranslateCallback = std::function<bool(std::string& url, int& line, int& column)>;
1024514f5e3Sopenharmony_ciusing ResolveBufferCallback =
1034514f5e3Sopenharmony_ci    std::function<bool(std::string dirPath, uint8_t **buff, size_t *buffSize, std::string &errorMsg)>;
1044514f5e3Sopenharmony_ciusing UnloadNativeModuleCallback = std::function<bool(const std::string &moduleKey)>;
1054514f5e3Sopenharmony_ciusing RequestAotCallback =
1064514f5e3Sopenharmony_ci    std::function<int32_t(const std::string &bundleName, const std::string &moduleName, int32_t triggerMode)>;
1074514f5e3Sopenharmony_ciusing SearchHapPathCallBack = std::function<bool(const std::string moduleName, std::string &hapPath)>;
1084514f5e3Sopenharmony_ciusing DeviceDisconnectCallback = std::function<bool()>;
1094514f5e3Sopenharmony_ciusing UncatchableErrorHandler = std::function<void(panda::TryCatch&)>;
1104514f5e3Sopenharmony_ci
1114514f5e3Sopenharmony_ciclass EcmaVM {
1124514f5e3Sopenharmony_cipublic:
1134514f5e3Sopenharmony_ci    static EcmaVM *Create(const JSRuntimeOptions &options);
1144514f5e3Sopenharmony_ci
1154514f5e3Sopenharmony_ci    static bool Destroy(EcmaVM *vm);
1164514f5e3Sopenharmony_ci
1174514f5e3Sopenharmony_ci    EcmaVM(JSRuntimeOptions options, EcmaParamConfiguration config);
1184514f5e3Sopenharmony_ci
1194514f5e3Sopenharmony_ci    EcmaVM();
1204514f5e3Sopenharmony_ci
1214514f5e3Sopenharmony_ci    ~EcmaVM();
1224514f5e3Sopenharmony_ci
1234514f5e3Sopenharmony_ci    void SetLoop(void *loop)
1244514f5e3Sopenharmony_ci    {
1254514f5e3Sopenharmony_ci        loop_ = loop;
1264514f5e3Sopenharmony_ci    }
1274514f5e3Sopenharmony_ci
1284514f5e3Sopenharmony_ci    void *GetLoop() const
1294514f5e3Sopenharmony_ci    {
1304514f5e3Sopenharmony_ci        return loop_;
1314514f5e3Sopenharmony_ci    }
1324514f5e3Sopenharmony_ci
1334514f5e3Sopenharmony_ci    bool IsInitialized() const
1344514f5e3Sopenharmony_ci    {
1354514f5e3Sopenharmony_ci        return initialized_;
1364514f5e3Sopenharmony_ci    }
1374514f5e3Sopenharmony_ci
1384514f5e3Sopenharmony_ci    void SetPostForked(bool isPostForked)
1394514f5e3Sopenharmony_ci    {
1404514f5e3Sopenharmony_ci        isPostForked_ = isPostForked;
1414514f5e3Sopenharmony_ci    }
1424514f5e3Sopenharmony_ci
1434514f5e3Sopenharmony_ci    bool IsPostForked() const
1444514f5e3Sopenharmony_ci    {
1454514f5e3Sopenharmony_ci        return isPostForked_;
1464514f5e3Sopenharmony_ci    }
1474514f5e3Sopenharmony_ci
1484514f5e3Sopenharmony_ci    bool IsAsynTranslateClasses()
1494514f5e3Sopenharmony_ci    {
1504514f5e3Sopenharmony_ci        if (!GetJSOptions().IsAsyncLoadAbcTest()) {
1514514f5e3Sopenharmony_ci            return IsPostForked() && GetJSOptions().IsAsyncLoadAbc();
1524514f5e3Sopenharmony_ci        }
1534514f5e3Sopenharmony_ci        return GetJSOptions().IsAsyncLoadAbc();
1544514f5e3Sopenharmony_ci    }
1554514f5e3Sopenharmony_ci
1564514f5e3Sopenharmony_ci    ObjectFactory *GetFactory() const
1574514f5e3Sopenharmony_ci    {
1584514f5e3Sopenharmony_ci        return factory_;
1594514f5e3Sopenharmony_ci    }
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_ci    void InitializePGOProfiler();
1624514f5e3Sopenharmony_ci    void ResetPGOProfiler();
1634514f5e3Sopenharmony_ci    void DisablePGOProfilerWithAOTFile(const std::string &aotFileName);
1644514f5e3Sopenharmony_ci
1654514f5e3Sopenharmony_ci    bool PUBLIC_API IsEnablePGOProfiler() const;
1664514f5e3Sopenharmony_ci    bool PUBLIC_API IsEnableElementsKind() const;
1674514f5e3Sopenharmony_ci    bool PUBLIC_API IsEnableForceIC() const;
1684514f5e3Sopenharmony_ci
1694514f5e3Sopenharmony_ci    void SetEnableForceIC(bool isEnableForceIC);
1704514f5e3Sopenharmony_ci
1714514f5e3Sopenharmony_ci    bool Initialize();
1724514f5e3Sopenharmony_ci    void InitializeForJit(JitThread *thread);
1734514f5e3Sopenharmony_ci
1744514f5e3Sopenharmony_ci    GCStats *GetEcmaGCStats() const
1754514f5e3Sopenharmony_ci    {
1764514f5e3Sopenharmony_ci        return gcStats_;
1774514f5e3Sopenharmony_ci    }
1784514f5e3Sopenharmony_ci
1794514f5e3Sopenharmony_ci    GCKeyStats *GetEcmaGCKeyStats() const
1804514f5e3Sopenharmony_ci    {
1814514f5e3Sopenharmony_ci        return gcKeyStats_;
1824514f5e3Sopenharmony_ci    }
1834514f5e3Sopenharmony_ci
1844514f5e3Sopenharmony_ci    JSThread *GetAssociatedJSThread() const
1854514f5e3Sopenharmony_ci    {
1864514f5e3Sopenharmony_ci        return thread_;
1874514f5e3Sopenharmony_ci    }
1884514f5e3Sopenharmony_ci
1894514f5e3Sopenharmony_ci    JSRuntimeOptions &GetJSOptions()
1904514f5e3Sopenharmony_ci    {
1914514f5e3Sopenharmony_ci        return options_;
1924514f5e3Sopenharmony_ci    }
1934514f5e3Sopenharmony_ci
1944514f5e3Sopenharmony_ci    const EcmaParamConfiguration &GetEcmaParamConfiguration() const
1954514f5e3Sopenharmony_ci    {
1964514f5e3Sopenharmony_ci        return ecmaParamConfiguration_;
1974514f5e3Sopenharmony_ci    }
1984514f5e3Sopenharmony_ci
1994514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> PUBLIC_API GetGlobalEnv() const;
2004514f5e3Sopenharmony_ci
2014514f5e3Sopenharmony_ci    static EcmaVM *ConstCast(const EcmaVM *vm)
2024514f5e3Sopenharmony_ci    {
2034514f5e3Sopenharmony_ci        return const_cast<EcmaVM *>(vm);
2044514f5e3Sopenharmony_ci    }
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci    void PUBLIC_API CheckThread() const;
2074514f5e3Sopenharmony_ci    JSThread *GetAndFastCheckJSThread() const;
2084514f5e3Sopenharmony_ci    bool CheckSingleThread() const;
2094514f5e3Sopenharmony_ci
2104514f5e3Sopenharmony_ci    ARK_INLINE bool GetThreadCheckStatus() const
2114514f5e3Sopenharmony_ci    {
2124514f5e3Sopenharmony_ci        return options_.EnableThreadCheck() || EcmaVM::GetMultiThreadCheck();
2134514f5e3Sopenharmony_ci    }
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_ci    ARK_INLINE JSThread *GetJSThread() const
2164514f5e3Sopenharmony_ci    {
2174514f5e3Sopenharmony_ci        // default enable multi-thread check in asan
2184514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_ASAN_THREAD_CHECK
2194514f5e3Sopenharmony_ci        CheckThread();
2204514f5e3Sopenharmony_ci#else
2214514f5e3Sopenharmony_ci        if (GetThreadCheckStatus()) {
2224514f5e3Sopenharmony_ci            CheckThread();
2234514f5e3Sopenharmony_ci        }
2244514f5e3Sopenharmony_ci#endif
2254514f5e3Sopenharmony_ci        return thread_;
2264514f5e3Sopenharmony_ci    }
2274514f5e3Sopenharmony_ci
2284514f5e3Sopenharmony_ci    JSThread *GetJSThreadNoCheck() const
2294514f5e3Sopenharmony_ci    {
2304514f5e3Sopenharmony_ci        return thread_;
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci
2334514f5e3Sopenharmony_ci    bool ICEnabled() const
2344514f5e3Sopenharmony_ci    {
2354514f5e3Sopenharmony_ci        return icEnabled_;
2364514f5e3Sopenharmony_ci    }
2374514f5e3Sopenharmony_ci
2384514f5e3Sopenharmony_ci    void PushToNativePointerList(JSNativePointer *pointer, Concurrent isConcurrent = Concurrent::NO);
2394514f5e3Sopenharmony_ci    void RemoveFromNativePointerList(JSNativePointer *pointer);
2404514f5e3Sopenharmony_ci    void PushToDeregisterModuleList(const CString &module);
2414514f5e3Sopenharmony_ci    void RemoveFromDeregisterModuleList(CString module);
2424514f5e3Sopenharmony_ci    bool ContainInDeregisterModuleList(CString module);
2434514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> GetAndClearEcmaUncaughtException() const;
2444514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> GetEcmaUncaughtException() const;
2454514f5e3Sopenharmony_ci    bool IsOptionalLogEnabled() const
2464514f5e3Sopenharmony_ci    {
2474514f5e3Sopenharmony_ci        return optionalLogEnabled_;
2484514f5e3Sopenharmony_ci    }
2494514f5e3Sopenharmony_ci
2504514f5e3Sopenharmony_ci    void Iterate(const RootVisitor &v, const RootRangeVisitor &rv, VMRootVisitType type);
2514514f5e3Sopenharmony_ci
2524514f5e3Sopenharmony_ci    const Heap *GetHeap() const
2534514f5e3Sopenharmony_ci    {
2544514f5e3Sopenharmony_ci        return heap_;
2554514f5e3Sopenharmony_ci    }
2564514f5e3Sopenharmony_ci    void CollectGarbage(TriggerGCType gcType, GCReason reason = GCReason::OTHER) const;
2574514f5e3Sopenharmony_ci
2584514f5e3Sopenharmony_ci    NativeAreaAllocator *GetNativeAreaAllocator() const
2594514f5e3Sopenharmony_ci    {
2604514f5e3Sopenharmony_ci        return nativeAreaAllocator_.get();
2614514f5e3Sopenharmony_ci    }
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_ci    HeapRegionAllocator *GetHeapRegionAllocator() const
2644514f5e3Sopenharmony_ci    {
2654514f5e3Sopenharmony_ci        return heapRegionAllocator_.get();
2664514f5e3Sopenharmony_ci    }
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci    Chunk *GetChunk() const
2694514f5e3Sopenharmony_ci    {
2704514f5e3Sopenharmony_ci        return const_cast<Chunk *>(&chunk_);
2714514f5e3Sopenharmony_ci    }
2724514f5e3Sopenharmony_ci    void ProcessNativeDelete(const WeakRootVisitor &visitor);
2734514f5e3Sopenharmony_ci    void ProcessReferences(const WeakRootVisitor &visitor);
2744514f5e3Sopenharmony_ci
2754514f5e3Sopenharmony_ci    SnapshotEnv *GetSnapshotEnv() const
2764514f5e3Sopenharmony_ci    {
2774514f5e3Sopenharmony_ci        return snapshotEnv_;
2784514f5e3Sopenharmony_ci    }
2794514f5e3Sopenharmony_ci
2804514f5e3Sopenharmony_ci    tooling::JsDebuggerManager *GetJsDebuggerManager() const
2814514f5e3Sopenharmony_ci    {
2824514f5e3Sopenharmony_ci        return debuggerManager_;
2834514f5e3Sopenharmony_ci    }
2844514f5e3Sopenharmony_ci
2854514f5e3Sopenharmony_ci    void SetDeviceDisconnectCallback(DeviceDisconnectCallback cb)
2864514f5e3Sopenharmony_ci    {
2874514f5e3Sopenharmony_ci        deviceDisconnectCallback_ = cb;
2884514f5e3Sopenharmony_ci    }
2894514f5e3Sopenharmony_ci
2904514f5e3Sopenharmony_ci    DeviceDisconnectCallback GetDeviceDisconnectCallback() const
2914514f5e3Sopenharmony_ci    {
2924514f5e3Sopenharmony_ci        return deviceDisconnectCallback_;
2934514f5e3Sopenharmony_ci    }
2944514f5e3Sopenharmony_ci
2954514f5e3Sopenharmony_ci    void SetEnableForceGC(bool enable)
2964514f5e3Sopenharmony_ci    {
2974514f5e3Sopenharmony_ci        options_.SetEnableForceGC(enable);
2984514f5e3Sopenharmony_ci    }
2994514f5e3Sopenharmony_ci
3004514f5e3Sopenharmony_ci    void SetNativePtrGetter(NativePtrGetter cb)
3014514f5e3Sopenharmony_ci    {
3024514f5e3Sopenharmony_ci        nativePtrGetter_ = cb;
3034514f5e3Sopenharmony_ci    }
3044514f5e3Sopenharmony_ci
3054514f5e3Sopenharmony_ci    NativePtrGetter GetNativePtrGetter() const
3064514f5e3Sopenharmony_ci    {
3074514f5e3Sopenharmony_ci        return nativePtrGetter_;
3084514f5e3Sopenharmony_ci    }
3094514f5e3Sopenharmony_ci
3104514f5e3Sopenharmony_ci    void SetSourceMapCallback(SourceMapCallback cb)
3114514f5e3Sopenharmony_ci    {
3124514f5e3Sopenharmony_ci        sourceMapCallback_ = cb;
3134514f5e3Sopenharmony_ci    }
3144514f5e3Sopenharmony_ci
3154514f5e3Sopenharmony_ci    SourceMapCallback GetSourceMapCallback() const
3164514f5e3Sopenharmony_ci    {
3174514f5e3Sopenharmony_ci        return sourceMapCallback_;
3184514f5e3Sopenharmony_ci    }
3194514f5e3Sopenharmony_ci
3204514f5e3Sopenharmony_ci    void SetSourceMapTranslateCallback(SourceMapTranslateCallback cb)
3214514f5e3Sopenharmony_ci    {
3224514f5e3Sopenharmony_ci        sourceMapTranslateCallback_ = cb;
3234514f5e3Sopenharmony_ci    }
3244514f5e3Sopenharmony_ci
3254514f5e3Sopenharmony_ci    SourceMapTranslateCallback GetSourceMapTranslateCallback() const
3264514f5e3Sopenharmony_ci    {
3274514f5e3Sopenharmony_ci        return sourceMapTranslateCallback_;
3284514f5e3Sopenharmony_ci    }
3294514f5e3Sopenharmony_ci
3304514f5e3Sopenharmony_ci    void SetResolveBufferCallback(ResolveBufferCallback cb)
3314514f5e3Sopenharmony_ci    {
3324514f5e3Sopenharmony_ci        resolveBufferCallback_ = cb;
3334514f5e3Sopenharmony_ci    }
3344514f5e3Sopenharmony_ci
3354514f5e3Sopenharmony_ci    ResolveBufferCallback GetResolveBufferCallback() const
3364514f5e3Sopenharmony_ci    {
3374514f5e3Sopenharmony_ci        return resolveBufferCallback_;
3384514f5e3Sopenharmony_ci    }
3394514f5e3Sopenharmony_ci
3404514f5e3Sopenharmony_ci    void SetSearchHapPathCallBack(SearchHapPathCallBack cb)
3414514f5e3Sopenharmony_ci    {
3424514f5e3Sopenharmony_ci        SearchHapPathCallBack_ = cb;
3434514f5e3Sopenharmony_ci    }
3444514f5e3Sopenharmony_ci
3454514f5e3Sopenharmony_ci    SearchHapPathCallBack GetSearchHapPathCallBack() const
3464514f5e3Sopenharmony_ci    {
3474514f5e3Sopenharmony_ci        return SearchHapPathCallBack_;
3484514f5e3Sopenharmony_ci    }
3494514f5e3Sopenharmony_ci
3504514f5e3Sopenharmony_ci    void SetUnloadNativeModuleCallback(const UnloadNativeModuleCallback &cb)
3514514f5e3Sopenharmony_ci    {
3524514f5e3Sopenharmony_ci        unloadNativeModuleCallback_ = cb;
3534514f5e3Sopenharmony_ci    }
3544514f5e3Sopenharmony_ci
3554514f5e3Sopenharmony_ci    UnloadNativeModuleCallback GetUnloadNativeModuleCallback() const
3564514f5e3Sopenharmony_ci    {
3574514f5e3Sopenharmony_ci        return unloadNativeModuleCallback_;
3584514f5e3Sopenharmony_ci    }
3594514f5e3Sopenharmony_ci
3604514f5e3Sopenharmony_ci    void SetConcurrentCallback(ConcurrentCallback callback, void *data)
3614514f5e3Sopenharmony_ci    {
3624514f5e3Sopenharmony_ci        concurrentCallback_ = callback;
3634514f5e3Sopenharmony_ci        concurrentData_ = data;
3644514f5e3Sopenharmony_ci    }
3654514f5e3Sopenharmony_ci
3664514f5e3Sopenharmony_ci    void TriggerConcurrentCallback(JSTaggedValue result, JSTaggedValue hint);
3674514f5e3Sopenharmony_ci
3684514f5e3Sopenharmony_ci    void WorkersetInfo(EcmaVM *workerVm);
3694514f5e3Sopenharmony_ci
3704514f5e3Sopenharmony_ci    EcmaVM *GetWorkerVm(uint32_t tid);
3714514f5e3Sopenharmony_ci
3724514f5e3Sopenharmony_ci    bool DeleteWorker(EcmaVM *workerVm);
3734514f5e3Sopenharmony_ci
3744514f5e3Sopenharmony_ci    bool SuspendWorkerVm(uint32_t tid);
3754514f5e3Sopenharmony_ci
3764514f5e3Sopenharmony_ci    void ResumeWorkerVm(uint32_t tid);
3774514f5e3Sopenharmony_ci
3784514f5e3Sopenharmony_ci    template<typename Callback>
3794514f5e3Sopenharmony_ci    void EnumerateWorkerVm(Callback cb)
3804514f5e3Sopenharmony_ci    {
3814514f5e3Sopenharmony_ci        // since there is a lock, so cannot mark function const
3824514f5e3Sopenharmony_ci        LockHolder lock(mutex_);
3834514f5e3Sopenharmony_ci        for (const auto &item : workerList_) {
3844514f5e3Sopenharmony_ci            cb(item.second);
3854514f5e3Sopenharmony_ci        }
3864514f5e3Sopenharmony_ci    }
3874514f5e3Sopenharmony_ci
3884514f5e3Sopenharmony_ci    bool IsWorkerThread() const
3894514f5e3Sopenharmony_ci    {
3904514f5e3Sopenharmony_ci        return options_.IsWorker();
3914514f5e3Sopenharmony_ci    }
3924514f5e3Sopenharmony_ci
3934514f5e3Sopenharmony_ci    bool IsRestrictedWorkerThread() const
3944514f5e3Sopenharmony_ci    {
3954514f5e3Sopenharmony_ci        return options_.IsRestrictedWorker();
3964514f5e3Sopenharmony_ci    }
3974514f5e3Sopenharmony_ci
3984514f5e3Sopenharmony_ci    bool IsBundlePack() const
3994514f5e3Sopenharmony_ci    {
4004514f5e3Sopenharmony_ci        return isBundlePack_;
4014514f5e3Sopenharmony_ci    }
4024514f5e3Sopenharmony_ci
4034514f5e3Sopenharmony_ci    void SetIsBundlePack(bool value)
4044514f5e3Sopenharmony_ci    {
4054514f5e3Sopenharmony_ci        isBundlePack_ = value;
4064514f5e3Sopenharmony_ci    }
4074514f5e3Sopenharmony_ci
4084514f5e3Sopenharmony_ci    // UnifiedOhmUrlPack means app compiles ohmurl using old format like "@bundle:",
4094514f5e3Sopenharmony_ci    // or new unified rules like "@normalize:"
4104514f5e3Sopenharmony_ci    // if pkgContextInfoList is empty, means use old ohmurl packing.
4114514f5e3Sopenharmony_ci    bool IsNormalizedOhmUrlPack() const
4124514f5e3Sopenharmony_ci    {
4134514f5e3Sopenharmony_ci        return !pkgContextInfoList_.empty();
4144514f5e3Sopenharmony_ci    }
4154514f5e3Sopenharmony_ci
4164514f5e3Sopenharmony_ci    void SetPkgNameList(const CMap<CString, CString> &list)
4174514f5e3Sopenharmony_ci    {
4184514f5e3Sopenharmony_ci        pkgNameList_ = list;
4194514f5e3Sopenharmony_ci    }
4204514f5e3Sopenharmony_ci
4214514f5e3Sopenharmony_ci    CMap<CString, CString> GetPkgNameList() const
4224514f5e3Sopenharmony_ci    {
4234514f5e3Sopenharmony_ci        return pkgNameList_;
4244514f5e3Sopenharmony_ci    }
4254514f5e3Sopenharmony_ci
4264514f5e3Sopenharmony_ci    inline CString GetPkgName(const CString &moduleName) const
4274514f5e3Sopenharmony_ci    {
4284514f5e3Sopenharmony_ci        auto it = pkgNameList_.find(moduleName);
4294514f5e3Sopenharmony_ci        if (it == pkgNameList_.end()) {
4304514f5e3Sopenharmony_ci            LOG_ECMA(INFO) << " Get Pkg Name failed";
4314514f5e3Sopenharmony_ci            return moduleName;
4324514f5e3Sopenharmony_ci        }
4334514f5e3Sopenharmony_ci        return it->second;
4344514f5e3Sopenharmony_ci    }
4354514f5e3Sopenharmony_ci
4364514f5e3Sopenharmony_ci    inline CMap<CString, CMap<CString, CVector<CString>>> GetPkgContextInfoLit() const
4374514f5e3Sopenharmony_ci    {
4384514f5e3Sopenharmony_ci        return pkgContextInfoList_;
4394514f5e3Sopenharmony_ci    }
4404514f5e3Sopenharmony_ci
4414514f5e3Sopenharmony_ci    inline CString GetPkgNameWithAlias(const CString &alias) const
4424514f5e3Sopenharmony_ci    {
4434514f5e3Sopenharmony_ci        auto it = pkgAliasList_.find(alias);
4444514f5e3Sopenharmony_ci        if (it == pkgAliasList_.end()) {
4454514f5e3Sopenharmony_ci            return alias;
4464514f5e3Sopenharmony_ci        }
4474514f5e3Sopenharmony_ci        return it->second;
4484514f5e3Sopenharmony_ci    }
4494514f5e3Sopenharmony_ci
4504514f5e3Sopenharmony_ci    void SetPkgAliasList(const CMap<CString, CString> &list)
4514514f5e3Sopenharmony_ci    {
4524514f5e3Sopenharmony_ci        pkgAliasList_ = list;
4534514f5e3Sopenharmony_ci    }
4544514f5e3Sopenharmony_ci
4554514f5e3Sopenharmony_ci    CMap<CString, CString> GetPkgAliasList() const
4564514f5e3Sopenharmony_ci    {
4574514f5e3Sopenharmony_ci        return pkgAliasList_;
4584514f5e3Sopenharmony_ci    }
4594514f5e3Sopenharmony_ci
4604514f5e3Sopenharmony_ci    void SetMockModuleList(const std::map<std::string, std::string> &list)
4614514f5e3Sopenharmony_ci    {
4624514f5e3Sopenharmony_ci        for (auto it = list.begin(); it != list.end(); ++it) {
4634514f5e3Sopenharmony_ci            mockModuleList_.emplace(it->first.c_str(), it->second.c_str());
4644514f5e3Sopenharmony_ci        }
4654514f5e3Sopenharmony_ci    }
4664514f5e3Sopenharmony_ci
4674514f5e3Sopenharmony_ci    inline bool IsMockModule(const CString &moduleStr) const
4684514f5e3Sopenharmony_ci    {
4694514f5e3Sopenharmony_ci        if (mockModuleList_.empty()) {
4704514f5e3Sopenharmony_ci            return false;
4714514f5e3Sopenharmony_ci        }
4724514f5e3Sopenharmony_ci        auto it = mockModuleList_.find(moduleStr);
4734514f5e3Sopenharmony_ci        if (it == mockModuleList_.end()) {
4744514f5e3Sopenharmony_ci            return false;
4754514f5e3Sopenharmony_ci        }
4764514f5e3Sopenharmony_ci        return true;
4774514f5e3Sopenharmony_ci    }
4784514f5e3Sopenharmony_ci
4794514f5e3Sopenharmony_ci    inline CString GetMockModule(const CString &module) const
4804514f5e3Sopenharmony_ci    {
4814514f5e3Sopenharmony_ci        auto it = mockModuleList_.find(module);
4824514f5e3Sopenharmony_ci        if (it == mockModuleList_.end()) {
4834514f5e3Sopenharmony_ci            LOG_ECMA(FATAL) << " Get Mock Module failed";
4844514f5e3Sopenharmony_ci        }
4854514f5e3Sopenharmony_ci        return it->second;
4864514f5e3Sopenharmony_ci    }
4874514f5e3Sopenharmony_ci
4884514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_HEAPPROFILER)
4894514f5e3Sopenharmony_ci    void DeleteHeapProfile();
4904514f5e3Sopenharmony_ci    HeapProfilerInterface *GetHeapProfile();
4914514f5e3Sopenharmony_ci    void  SetHeapProfile(HeapProfilerInterface *heapProfile) { heapProfile_ = heapProfile; }
4924514f5e3Sopenharmony_ci    HeapProfilerInterface *GetOrNewHeapProfile();
4934514f5e3Sopenharmony_ci    void StartHeapTracking();
4944514f5e3Sopenharmony_ci    void StopHeapTracking();
4954514f5e3Sopenharmony_ci#endif
4964514f5e3Sopenharmony_ci
4974514f5e3Sopenharmony_ci    void SetAssetPath(const CString &assetPath)
4984514f5e3Sopenharmony_ci    {
4994514f5e3Sopenharmony_ci        assetPath_ = assetPath;
5004514f5e3Sopenharmony_ci    }
5014514f5e3Sopenharmony_ci
5024514f5e3Sopenharmony_ci    CString GetAssetPath() const
5034514f5e3Sopenharmony_ci    {
5044514f5e3Sopenharmony_ci        return assetPath_;
5054514f5e3Sopenharmony_ci    }
5064514f5e3Sopenharmony_ci
5074514f5e3Sopenharmony_ci    void SetBundleName(const CString &bundleName)
5084514f5e3Sopenharmony_ci    {
5094514f5e3Sopenharmony_ci        bundleName_ = bundleName;
5104514f5e3Sopenharmony_ci    }
5114514f5e3Sopenharmony_ci
5124514f5e3Sopenharmony_ci    CString GetBundleName() const
5134514f5e3Sopenharmony_ci    {
5144514f5e3Sopenharmony_ci        return bundleName_;
5154514f5e3Sopenharmony_ci    }
5164514f5e3Sopenharmony_ci
5174514f5e3Sopenharmony_ci    void SetModuleName(const CString &moduleName)
5184514f5e3Sopenharmony_ci    {
5194514f5e3Sopenharmony_ci        moduleName_ = moduleName;
5204514f5e3Sopenharmony_ci    }
5214514f5e3Sopenharmony_ci
5224514f5e3Sopenharmony_ci    CString GetModuleName() const
5234514f5e3Sopenharmony_ci    {
5244514f5e3Sopenharmony_ci        return moduleName_;
5254514f5e3Sopenharmony_ci    }
5264514f5e3Sopenharmony_ci
5274514f5e3Sopenharmony_ci    std::pair<std::string, std::string> GetCurrentModuleInfo(bool needRecordName = false);
5284514f5e3Sopenharmony_ci
5294514f5e3Sopenharmony_ci    void SetHmsModuleList(const std::vector<panda::HmsMap> &list);
5304514f5e3Sopenharmony_ci
5314514f5e3Sopenharmony_ci    bool IsHmsModule(const CString &moduleStr) const;
5324514f5e3Sopenharmony_ci
5334514f5e3Sopenharmony_ci    CString GetHmsModule(const CString &module) const;
5344514f5e3Sopenharmony_ci
5354514f5e3Sopenharmony_ci    void SetpkgContextInfoList(const CMap<CString, CMap<CString, CVector<CString>>> &list);
5364514f5e3Sopenharmony_ci
5374514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
5384514f5e3Sopenharmony_ci    CpuProfiler *GetProfiler() const
5394514f5e3Sopenharmony_ci    {
5404514f5e3Sopenharmony_ci        return profiler_;
5414514f5e3Sopenharmony_ci    }
5424514f5e3Sopenharmony_ci
5434514f5e3Sopenharmony_ci    void SetProfiler(CpuProfiler *profiler)
5444514f5e3Sopenharmony_ci    {
5454514f5e3Sopenharmony_ci        profiler_ = profiler;
5464514f5e3Sopenharmony_ci    }
5474514f5e3Sopenharmony_ci#endif
5484514f5e3Sopenharmony_ci
5494514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_TRACING)
5504514f5e3Sopenharmony_ci    Tracing *GetTracing() const
5514514f5e3Sopenharmony_ci    {
5524514f5e3Sopenharmony_ci        return tracing_;
5534514f5e3Sopenharmony_ci    }
5544514f5e3Sopenharmony_ci
5554514f5e3Sopenharmony_ci    void SetTracing(Tracing *tracing)
5564514f5e3Sopenharmony_ci    {
5574514f5e3Sopenharmony_ci        tracing_ = tracing;
5584514f5e3Sopenharmony_ci    }
5594514f5e3Sopenharmony_ci#endif
5604514f5e3Sopenharmony_ci
5614514f5e3Sopenharmony_ci    std::shared_ptr<PGOProfiler> GetPGOProfiler() const
5624514f5e3Sopenharmony_ci    {
5634514f5e3Sopenharmony_ci        return pgoProfiler_;
5644514f5e3Sopenharmony_ci    }
5654514f5e3Sopenharmony_ci
5664514f5e3Sopenharmony_ci    void PreFork();
5674514f5e3Sopenharmony_ci    void PostFork();
5684514f5e3Sopenharmony_ci
5694514f5e3Sopenharmony_ci    // For Internal Native MethodLiteral.
5704514f5e3Sopenharmony_ci    JSTaggedValue GetMethodByIndex(MethodIndex idx);
5714514f5e3Sopenharmony_ci
5724514f5e3Sopenharmony_ci    QuickFixManager *GetQuickFixManager() const
5734514f5e3Sopenharmony_ci    {
5744514f5e3Sopenharmony_ci        return quickFixManager_;
5754514f5e3Sopenharmony_ci    }
5764514f5e3Sopenharmony_ci
5774514f5e3Sopenharmony_ci    JSTaggedValue FastCallAot(size_t actualNumArgs, JSTaggedType *args, const JSTaggedType *prevFp);
5784514f5e3Sopenharmony_ci
5794514f5e3Sopenharmony_ci    void RegisterUncatchableErrorHandler(const UncatchableErrorHandler &uncatchableErrorHandler)
5804514f5e3Sopenharmony_ci    {
5814514f5e3Sopenharmony_ci        uncatchableErrorHandler_ = uncatchableErrorHandler;
5824514f5e3Sopenharmony_ci    }
5834514f5e3Sopenharmony_ci
5844514f5e3Sopenharmony_ci    // handle uncatchable errors, such as oom
5854514f5e3Sopenharmony_ci    void HandleUncatchableError()
5864514f5e3Sopenharmony_ci    {
5874514f5e3Sopenharmony_ci        if (uncatchableErrorHandler_ != nullptr) {
5884514f5e3Sopenharmony_ci            panda::TryCatch trycatch(this);
5894514f5e3Sopenharmony_ci            uncatchableErrorHandler_(trycatch);
5904514f5e3Sopenharmony_ci        }
5914514f5e3Sopenharmony_ci        LOG_ECMA_MEM(FATAL) << "Out of Memory";
5924514f5e3Sopenharmony_ci    }
5934514f5e3Sopenharmony_ci
5944514f5e3Sopenharmony_ci    void DumpCallTimeInfo();
5954514f5e3Sopenharmony_ci
5964514f5e3Sopenharmony_ci    FunctionCallTimer *GetCallTimer() const
5974514f5e3Sopenharmony_ci    {
5984514f5e3Sopenharmony_ci        return callTimer_;
5994514f5e3Sopenharmony_ci    }
6004514f5e3Sopenharmony_ci
6014514f5e3Sopenharmony_ci    EcmaStringTable *GetEcmaStringTable() const
6024514f5e3Sopenharmony_ci    {
6034514f5e3Sopenharmony_ci        ASSERT(stringTable_ != nullptr);
6044514f5e3Sopenharmony_ci        return stringTable_;
6054514f5e3Sopenharmony_ci    }
6064514f5e3Sopenharmony_ci
6074514f5e3Sopenharmony_ci    void IncreaseCallDepth()
6084514f5e3Sopenharmony_ci    {
6094514f5e3Sopenharmony_ci        callDepth_++;
6104514f5e3Sopenharmony_ci    }
6114514f5e3Sopenharmony_ci
6124514f5e3Sopenharmony_ci    void DecreaseCallDepth()
6134514f5e3Sopenharmony_ci    {
6144514f5e3Sopenharmony_ci        ASSERT(callDepth_ > 0);
6154514f5e3Sopenharmony_ci        callDepth_--;
6164514f5e3Sopenharmony_ci    }
6174514f5e3Sopenharmony_ci
6184514f5e3Sopenharmony_ci    bool IsTopLevelCallDepth()
6194514f5e3Sopenharmony_ci    {
6204514f5e3Sopenharmony_ci        return callDepth_ == 0;
6214514f5e3Sopenharmony_ci    }
6224514f5e3Sopenharmony_ci
6234514f5e3Sopenharmony_ci    void SetProfilerState(bool state)
6244514f5e3Sopenharmony_ci    {
6254514f5e3Sopenharmony_ci        isProfiling_ = state;
6264514f5e3Sopenharmony_ci    }
6274514f5e3Sopenharmony_ci
6284514f5e3Sopenharmony_ci    bool GetProfilerState()
6294514f5e3Sopenharmony_ci    {
6304514f5e3Sopenharmony_ci        return isProfiling_;
6314514f5e3Sopenharmony_ci    }
6324514f5e3Sopenharmony_ci
6334514f5e3Sopenharmony_ci    JSObjectResizingStrategy *GetJSObjectResizingStrategy()
6344514f5e3Sopenharmony_ci    {
6354514f5e3Sopenharmony_ci        return strategy_;
6364514f5e3Sopenharmony_ci    }
6374514f5e3Sopenharmony_ci
6384514f5e3Sopenharmony_ci    CMap<uint32_t, EcmaVM *> GetWorkList() const
6394514f5e3Sopenharmony_ci    {
6404514f5e3Sopenharmony_ci        return workerList_;
6414514f5e3Sopenharmony_ci    }
6424514f5e3Sopenharmony_ci
6434514f5e3Sopenharmony_ci    int GetProcessStartRealtime() const
6444514f5e3Sopenharmony_ci    {
6454514f5e3Sopenharmony_ci        return processStartRealtime_;
6464514f5e3Sopenharmony_ci    }
6474514f5e3Sopenharmony_ci
6484514f5e3Sopenharmony_ci    void SetProcessStartRealtime(int value)
6494514f5e3Sopenharmony_ci    {
6504514f5e3Sopenharmony_ci        processStartRealtime_ = value;
6514514f5e3Sopenharmony_ci    }
6524514f5e3Sopenharmony_ci
6534514f5e3Sopenharmony_ci    Jit *GetJit() const;
6544514f5e3Sopenharmony_ci    bool PUBLIC_API IsEnableFastJit() const;
6554514f5e3Sopenharmony_ci    bool PUBLIC_API IsEnableBaselineJit() const;
6564514f5e3Sopenharmony_ci
6574514f5e3Sopenharmony_ci    bool IsEnableOsr() const
6584514f5e3Sopenharmony_ci    {
6594514f5e3Sopenharmony_ci        return isEnableOsr_;
6604514f5e3Sopenharmony_ci    }
6614514f5e3Sopenharmony_ci
6624514f5e3Sopenharmony_ci    void SetEnableOsr(bool state)
6634514f5e3Sopenharmony_ci    {
6644514f5e3Sopenharmony_ci        isEnableOsr_ = state;
6654514f5e3Sopenharmony_ci    }
6664514f5e3Sopenharmony_ci
6674514f5e3Sopenharmony_ci    AOTFileManager *GetAOTFileManager() const
6684514f5e3Sopenharmony_ci    {
6694514f5e3Sopenharmony_ci        return aotFileManager_;
6704514f5e3Sopenharmony_ci    }
6714514f5e3Sopenharmony_ci
6724514f5e3Sopenharmony_ci    uint32_t GetTid() const;
6734514f5e3Sopenharmony_ci
6744514f5e3Sopenharmony_ci    std::vector<NativePointerCallbackData> &GetConcurrentNativePointerCallbacks()
6754514f5e3Sopenharmony_ci    {
6764514f5e3Sopenharmony_ci        return concurrentNativeCallbacks_;
6774514f5e3Sopenharmony_ci    }
6784514f5e3Sopenharmony_ci
6794514f5e3Sopenharmony_ci    AsyncNativeCallbacksPack &GetAsyncNativePointerCallbacksPack()
6804514f5e3Sopenharmony_ci    {
6814514f5e3Sopenharmony_ci        return asyncNativeCallbacksPack_;
6824514f5e3Sopenharmony_ci    }
6834514f5e3Sopenharmony_ci
6844514f5e3Sopenharmony_ci    void SetIsJitCompileVM(bool isJitCompileVM)
6854514f5e3Sopenharmony_ci    {
6864514f5e3Sopenharmony_ci        isJitCompileVM_ = isJitCompileVM;
6874514f5e3Sopenharmony_ci    }
6884514f5e3Sopenharmony_ci
6894514f5e3Sopenharmony_ci    bool IsJitCompileVM() const
6904514f5e3Sopenharmony_ci    {
6914514f5e3Sopenharmony_ci        return isJitCompileVM_;
6924514f5e3Sopenharmony_ci    }
6934514f5e3Sopenharmony_ci
6944514f5e3Sopenharmony_ci    static void SetMultiThreadCheck(bool multiThreadCheck)
6954514f5e3Sopenharmony_ci    {
6964514f5e3Sopenharmony_ci        multiThreadCheck_ = multiThreadCheck;
6974514f5e3Sopenharmony_ci    }
6984514f5e3Sopenharmony_ci
6994514f5e3Sopenharmony_ci    PUBLIC_API static bool GetMultiThreadCheck()
7004514f5e3Sopenharmony_ci    {
7014514f5e3Sopenharmony_ci        return multiThreadCheck_;
7024514f5e3Sopenharmony_ci    }
7034514f5e3Sopenharmony_ci
7044514f5e3Sopenharmony_ci    static void SetErrorInfoEnhance(bool errorInfoEnhance)
7054514f5e3Sopenharmony_ci    {
7064514f5e3Sopenharmony_ci        errorInfoEnhanced_ = errorInfoEnhance;
7074514f5e3Sopenharmony_ci    }
7084514f5e3Sopenharmony_ci
7094514f5e3Sopenharmony_ci    static bool GetErrorInfoEnhance()
7104514f5e3Sopenharmony_ci    {
7114514f5e3Sopenharmony_ci        return errorInfoEnhanced_;
7124514f5e3Sopenharmony_ci    }
7134514f5e3Sopenharmony_ci
7144514f5e3Sopenharmony_ci    static void InitializeIcuData(const JSRuntimeOptions &options);
7154514f5e3Sopenharmony_ci
7164514f5e3Sopenharmony_ci    static int InitializeStartRealTime();
7174514f5e3Sopenharmony_ci
7184514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_SCOPE_LOCK_STAT
7194514f5e3Sopenharmony_ci    void ResetScopeLockStats()
7204514f5e3Sopenharmony_ci    {
7214514f5e3Sopenharmony_ci        enterThreadManagedScopeCount_ = 0;
7224514f5e3Sopenharmony_ci        enterJsiNativeScopeCount_ = 0;
7234514f5e3Sopenharmony_ci        enterFastNativeScopeCount_ = 0;
7244514f5e3Sopenharmony_ci        updateThreadStateTransCount_ = 0;
7254514f5e3Sopenharmony_ci        stringTableLockCount_ = 0;
7264514f5e3Sopenharmony_ci    }
7274514f5e3Sopenharmony_ci
7284514f5e3Sopenharmony_ci    bool IsCollectingScopeLockStats() const
7294514f5e3Sopenharmony_ci    {
7304514f5e3Sopenharmony_ci        return isCollectingScopeLockStats_;
7314514f5e3Sopenharmony_ci    }
7324514f5e3Sopenharmony_ci
7334514f5e3Sopenharmony_ci    void StartCollectingScopeLockStats()
7344514f5e3Sopenharmony_ci    {
7354514f5e3Sopenharmony_ci        isCollectingScopeLockStats_ = true;
7364514f5e3Sopenharmony_ci    }
7374514f5e3Sopenharmony_ci
7384514f5e3Sopenharmony_ci    void StopCollectingScopeLockStats()
7394514f5e3Sopenharmony_ci    {
7404514f5e3Sopenharmony_ci        isCollectingScopeLockStats_ = false;
7414514f5e3Sopenharmony_ci    }
7424514f5e3Sopenharmony_ci
7434514f5e3Sopenharmony_ci    int GetEnterThreadManagedScopeCount() const
7444514f5e3Sopenharmony_ci    {
7454514f5e3Sopenharmony_ci        return enterThreadManagedScopeCount_;
7464514f5e3Sopenharmony_ci    }
7474514f5e3Sopenharmony_ci
7484514f5e3Sopenharmony_ci    void IncreaseEnterThreadManagedScopeCount()
7494514f5e3Sopenharmony_ci    {
7504514f5e3Sopenharmony_ci        enterThreadManagedScopeCount_++;
7514514f5e3Sopenharmony_ci    }
7524514f5e3Sopenharmony_ci
7534514f5e3Sopenharmony_ci    int GetEnterFastNativeScopeCount() const
7544514f5e3Sopenharmony_ci    {
7554514f5e3Sopenharmony_ci        return enterFastNativeScopeCount_;
7564514f5e3Sopenharmony_ci    }
7574514f5e3Sopenharmony_ci
7584514f5e3Sopenharmony_ci    void IncreaseEnterFastNativeScopeCount()
7594514f5e3Sopenharmony_ci    {
7604514f5e3Sopenharmony_ci        enterFastNativeScopeCount_++;
7614514f5e3Sopenharmony_ci    }
7624514f5e3Sopenharmony_ci
7634514f5e3Sopenharmony_ci    int GetEnterJsiNativeScopeCount() const
7644514f5e3Sopenharmony_ci    {
7654514f5e3Sopenharmony_ci        return enterJsiNativeScopeCount_;
7664514f5e3Sopenharmony_ci    }
7674514f5e3Sopenharmony_ci
7684514f5e3Sopenharmony_ci    void IncreaseEnterJsiNativeScopeCount()
7694514f5e3Sopenharmony_ci    {
7704514f5e3Sopenharmony_ci        enterJsiNativeScopeCount_++;
7714514f5e3Sopenharmony_ci    }
7724514f5e3Sopenharmony_ci
7734514f5e3Sopenharmony_ci    int GetUpdateThreadStateTransCount() const
7744514f5e3Sopenharmony_ci    {
7754514f5e3Sopenharmony_ci        return updateThreadStateTransCount_;
7764514f5e3Sopenharmony_ci    }
7774514f5e3Sopenharmony_ci
7784514f5e3Sopenharmony_ci    void IncreaseUpdateThreadStateTransCount()
7794514f5e3Sopenharmony_ci    {
7804514f5e3Sopenharmony_ci        updateThreadStateTransCount_++;
7814514f5e3Sopenharmony_ci    }
7824514f5e3Sopenharmony_ci
7834514f5e3Sopenharmony_ci    int GetStringTableLockCount() const
7844514f5e3Sopenharmony_ci    {
7854514f5e3Sopenharmony_ci        return stringTableLockCount_;
7864514f5e3Sopenharmony_ci    }
7874514f5e3Sopenharmony_ci
7884514f5e3Sopenharmony_ci    void IncreaseStringTableLockCount()
7894514f5e3Sopenharmony_ci    {
7904514f5e3Sopenharmony_ci        stringTableLockCount_++;
7914514f5e3Sopenharmony_ci    }
7924514f5e3Sopenharmony_ci#endif
7934514f5e3Sopenharmony_ci
7944514f5e3Sopenharmony_ci    bool GetEnableJitLogSkip() const
7954514f5e3Sopenharmony_ci    {
7964514f5e3Sopenharmony_ci        return enableJitLogSkip_;
7974514f5e3Sopenharmony_ci    }
7984514f5e3Sopenharmony_ci
7994514f5e3Sopenharmony_ci    void SetEnableJitLogSkip(bool flag)
8004514f5e3Sopenharmony_ci    {
8014514f5e3Sopenharmony_ci        enableJitLogSkip_ = flag;
8024514f5e3Sopenharmony_ci    }
8034514f5e3Sopenharmony_ci
8044514f5e3Sopenharmony_ci    void AddAOTSnapShotStats(std::string tag, uint32_t count = 1)
8054514f5e3Sopenharmony_ci    {
8064514f5e3Sopenharmony_ci        aotSnapShotStatsMap_[tag] += count;
8074514f5e3Sopenharmony_ci    }
8084514f5e3Sopenharmony_ci
8094514f5e3Sopenharmony_ci    void PUBLIC_API PrintAOTSnapShotStats();
8104514f5e3Sopenharmony_ci
8114514f5e3Sopenharmony_ciprotected:
8124514f5e3Sopenharmony_ci
8134514f5e3Sopenharmony_ci    void PrintJSErrorInfo(const JSHandle<JSTaggedValue> &exceptionInfo) const;
8144514f5e3Sopenharmony_ci
8154514f5e3Sopenharmony_ciprivate:
8164514f5e3Sopenharmony_ci    void ClearBufferData();
8174514f5e3Sopenharmony_ci    void CheckStartCpuProfiler();
8184514f5e3Sopenharmony_ci
8194514f5e3Sopenharmony_ci    // For Internal Native MethodLiteral.
8204514f5e3Sopenharmony_ci    void GenerateInternalNativeMethods();
8214514f5e3Sopenharmony_ci    void CacheToGlobalConstants(JSTaggedValue value, ConstantIndex constant);
8224514f5e3Sopenharmony_ci
8234514f5e3Sopenharmony_ci    NO_MOVE_SEMANTIC(EcmaVM);
8244514f5e3Sopenharmony_ci    NO_COPY_SEMANTIC(EcmaVM);
8254514f5e3Sopenharmony_ci
8264514f5e3Sopenharmony_ci    // VM startup states.
8274514f5e3Sopenharmony_ci    JSRuntimeOptions options_;
8284514f5e3Sopenharmony_ci    bool icEnabled_ {true};
8294514f5e3Sopenharmony_ci    bool initialized_ {false};
8304514f5e3Sopenharmony_ci    bool isPostForked_ {false};
8314514f5e3Sopenharmony_ci    GCStats *gcStats_ {nullptr};
8324514f5e3Sopenharmony_ci    GCKeyStats *gcKeyStats_ {nullptr};
8334514f5e3Sopenharmony_ci    EcmaStringTable *stringTable_ {nullptr};
8344514f5e3Sopenharmony_ci    PUBLIC_API static bool multiThreadCheck_;
8354514f5e3Sopenharmony_ci    static bool errorInfoEnhanced_;
8364514f5e3Sopenharmony_ci
8374514f5e3Sopenharmony_ci    // VM memory management.
8384514f5e3Sopenharmony_ci    std::unique_ptr<NativeAreaAllocator> nativeAreaAllocator_;
8394514f5e3Sopenharmony_ci    std::unique_ptr<HeapRegionAllocator> heapRegionAllocator_;
8404514f5e3Sopenharmony_ci    Chunk chunk_;
8414514f5e3Sopenharmony_ci    Heap *heap_ {nullptr};
8424514f5e3Sopenharmony_ci    ObjectFactory *factory_ {nullptr};
8434514f5e3Sopenharmony_ci
8444514f5e3Sopenharmony_ci    std::vector<NativePointerCallbackData> concurrentNativeCallbacks_ {};
8454514f5e3Sopenharmony_ci    AsyncNativeCallbacksPack asyncNativeCallbacksPack_ {};
8464514f5e3Sopenharmony_ci    // VM execution states.
8474514f5e3Sopenharmony_ci    JSThread *thread_ {nullptr};
8484514f5e3Sopenharmony_ci
8494514f5e3Sopenharmony_ci    CUnorderedMap<std::string, uint32_t> aotSnapShotStatsMap_;
8504514f5e3Sopenharmony_ci
8514514f5e3Sopenharmony_ci    // VM resources.
8524514f5e3Sopenharmony_ci    SnapshotEnv *snapshotEnv_ {nullptr};
8534514f5e3Sopenharmony_ci    bool optionalLogEnabled_ {false};
8544514f5e3Sopenharmony_ci    // Debugger
8554514f5e3Sopenharmony_ci    tooling::JsDebuggerManager *debuggerManager_ {nullptr};
8564514f5e3Sopenharmony_ci    // isBundle means app compile mode is JSBundle
8574514f5e3Sopenharmony_ci    bool isBundlePack_ {true};
8584514f5e3Sopenharmony_ci#if !WIN_OR_MAC_OR_IOS_PLATFORM
8594514f5e3Sopenharmony_ci    HeapProfilerInterface *heapProfile_ {nullptr};
8604514f5e3Sopenharmony_ci#endif
8614514f5e3Sopenharmony_ci    CString assetPath_;
8624514f5e3Sopenharmony_ci    CString bundleName_;
8634514f5e3Sopenharmony_ci    CString moduleName_;
8644514f5e3Sopenharmony_ci    CList<CString> deregisterModuleList_;
8654514f5e3Sopenharmony_ci    CMap<CString, CString> mockModuleList_;
8664514f5e3Sopenharmony_ci    CMap<CString, HmsMap> hmsModuleList_;
8674514f5e3Sopenharmony_ci    CMap<CString, CString> pkgNameList_;
8684514f5e3Sopenharmony_ci    CMap<CString, CMap<CString, CVector<CString>>> pkgContextInfoList_;
8694514f5e3Sopenharmony_ci    CMap<CString, CString> pkgAliasList_;
8704514f5e3Sopenharmony_ci    NativePtrGetter nativePtrGetter_ {nullptr};
8714514f5e3Sopenharmony_ci    SourceMapCallback sourceMapCallback_ {nullptr};
8724514f5e3Sopenharmony_ci    SourceMapTranslateCallback sourceMapTranslateCallback_ {nullptr};
8734514f5e3Sopenharmony_ci    void *loop_ {nullptr};
8744514f5e3Sopenharmony_ci
8754514f5e3Sopenharmony_ci    // resolve path to get abc's buffer
8764514f5e3Sopenharmony_ci    ResolveBufferCallback resolveBufferCallback_ {nullptr};
8774514f5e3Sopenharmony_ci
8784514f5e3Sopenharmony_ci    // delete the native module and dlclose so from NativeModuleManager
8794514f5e3Sopenharmony_ci    UnloadNativeModuleCallback unloadNativeModuleCallback_ {nullptr};
8804514f5e3Sopenharmony_ci
8814514f5e3Sopenharmony_ci    // Concurrent taskpool callback and data
8824514f5e3Sopenharmony_ci    ConcurrentCallback concurrentCallback_ {nullptr};
8834514f5e3Sopenharmony_ci    void *concurrentData_ {nullptr};
8844514f5e3Sopenharmony_ci
8854514f5e3Sopenharmony_ci    // serch happath callback
8864514f5e3Sopenharmony_ci    SearchHapPathCallBack SearchHapPathCallBack_ {nullptr};
8874514f5e3Sopenharmony_ci
8884514f5e3Sopenharmony_ci    // vm parameter configurations
8894514f5e3Sopenharmony_ci    EcmaParamConfiguration ecmaParamConfiguration_;
8904514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
8914514f5e3Sopenharmony_ci    CpuProfiler *profiler_ {nullptr};
8924514f5e3Sopenharmony_ci#endif
8934514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_TRACING)
8944514f5e3Sopenharmony_ci    Tracing *tracing_ {nullptr};
8954514f5e3Sopenharmony_ci#endif
8964514f5e3Sopenharmony_ci    FunctionCallTimer *callTimer_ {nullptr};
8974514f5e3Sopenharmony_ci    JSObjectResizingStrategy *strategy_ {nullptr};
8984514f5e3Sopenharmony_ci
8994514f5e3Sopenharmony_ci    // For Native MethodLiteral
9004514f5e3Sopenharmony_ci    static void *InternalMethodTable[static_cast<uint8_t>(MethodIndex::METHOD_END)];
9014514f5e3Sopenharmony_ci    CVector<JSTaggedValue> internalNativeMethods_;
9024514f5e3Sopenharmony_ci
9034514f5e3Sopenharmony_ci    // For repair patch.
9044514f5e3Sopenharmony_ci    QuickFixManager *quickFixManager_ {nullptr};
9054514f5e3Sopenharmony_ci
9064514f5e3Sopenharmony_ci    // PGO Profiler
9074514f5e3Sopenharmony_ci    std::shared_ptr<PGOProfiler> pgoProfiler_ {nullptr};
9084514f5e3Sopenharmony_ci
9094514f5e3Sopenharmony_ci    //AOT File Manager
9104514f5e3Sopenharmony_ci    AOTFileManager *aotFileManager_ {nullptr};
9114514f5e3Sopenharmony_ci
9124514f5e3Sopenharmony_ci    // c++ call js
9134514f5e3Sopenharmony_ci    size_t callDepth_ {0};
9144514f5e3Sopenharmony_ci
9154514f5e3Sopenharmony_ci    bool isProfiling_ {false};
9164514f5e3Sopenharmony_ci
9174514f5e3Sopenharmony_ci    DeviceDisconnectCallback deviceDisconnectCallback_ {nullptr};
9184514f5e3Sopenharmony_ci
9194514f5e3Sopenharmony_ci    UncatchableErrorHandler uncatchableErrorHandler_ {nullptr};
9204514f5e3Sopenharmony_ci
9214514f5e3Sopenharmony_ci    friend class Snapshot;
9224514f5e3Sopenharmony_ci    friend class SnapshotProcessor;
9234514f5e3Sopenharmony_ci    friend class ObjectFactory;
9244514f5e3Sopenharmony_ci    friend class ValueSerializer;
9254514f5e3Sopenharmony_ci    friend class panda::JSNApi;
9264514f5e3Sopenharmony_ci    friend class JSPandaFileExecutor;
9274514f5e3Sopenharmony_ci    friend class EcmaContext;
9284514f5e3Sopenharmony_ci    friend class JitVM;
9294514f5e3Sopenharmony_ci    CMap<uint32_t, EcmaVM *> workerList_ {};
9304514f5e3Sopenharmony_ci    Mutex mutex_;
9314514f5e3Sopenharmony_ci    bool isEnableOsr_ {false};
9324514f5e3Sopenharmony_ci    bool isJitCompileVM_ {false};
9334514f5e3Sopenharmony_ci
9344514f5e3Sopenharmony_ci    // process StartRealTime
9354514f5e3Sopenharmony_ci    int processStartRealtime_ = 0;
9364514f5e3Sopenharmony_ci
9374514f5e3Sopenharmony_ci    bool enableJitLogSkip_ = true;
9384514f5e3Sopenharmony_ci
9394514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_SCOPE_LOCK_STAT
9404514f5e3Sopenharmony_ci    // Stats for Thread-State-Transition and String-Table Locks
9414514f5e3Sopenharmony_ci    bool isCollectingScopeLockStats_ = false;
9424514f5e3Sopenharmony_ci    int enterThreadManagedScopeCount_ = 0;
9434514f5e3Sopenharmony_ci    int enterFastNativeScopeCount_ = 0;
9444514f5e3Sopenharmony_ci    int enterJsiNativeScopeCount_ = 0;
9454514f5e3Sopenharmony_ci    int updateThreadStateTransCount_ = 0;
9464514f5e3Sopenharmony_ci    int stringTableLockCount_ = 0;
9474514f5e3Sopenharmony_ci#endif
9484514f5e3Sopenharmony_ci};
9494514f5e3Sopenharmony_ci}  // namespace ecmascript
9504514f5e3Sopenharmony_ci}  // namespace panda
9514514f5e3Sopenharmony_ci
9524514f5e3Sopenharmony_ci#endif
953