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