14514f5e3Sopenharmony_ci/* 24514f5e3Sopenharmony_ci * Copyright (c) 2023-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#ifndef ECMASCRIPT_ECMA_CONTEXT_H 164514f5e3Sopenharmony_ci#define ECMASCRIPT_ECMA_CONTEXT_H 174514f5e3Sopenharmony_ci 184514f5e3Sopenharmony_ci#include <cstdint> 194514f5e3Sopenharmony_ci#include <optional> 204514f5e3Sopenharmony_ci#include "ecmascript/base/config.h" 214514f5e3Sopenharmony_ci#include "ecmascript/common.h" 224514f5e3Sopenharmony_ci#include "ecmascript/js_handle.h" 234514f5e3Sopenharmony_ci#include "ecmascript/js_tagged_value.h" 244514f5e3Sopenharmony_ci#include "ecmascript/mem/c_containers.h" 254514f5e3Sopenharmony_ci#include "ecmascript/mem/visitor.h" 264514f5e3Sopenharmony_ci#include "ecmascript/patch/patch_loader.h" 274514f5e3Sopenharmony_ci#include "ecmascript/stackmap/ark_stackmap.h" 284514f5e3Sopenharmony_ci#include "ecmascript/waiter_list.h" 294514f5e3Sopenharmony_ci#include "global_handle_collection.h" 304514f5e3Sopenharmony_ci#include "libpandafile/file.h" 314514f5e3Sopenharmony_ci 324514f5e3Sopenharmony_cinamespace panda { 334514f5e3Sopenharmony_ciclass JSNApi; 344514f5e3Sopenharmony_cinamespace panda_file { 354514f5e3Sopenharmony_ciclass File; 364514f5e3Sopenharmony_ci} // namespace panda_file 374514f5e3Sopenharmony_ci 384514f5e3Sopenharmony_cinamespace ecmascript { 394514f5e3Sopenharmony_ciclass GlobalEnv; 404514f5e3Sopenharmony_ciclass ObjectFactory; 414514f5e3Sopenharmony_ciclass EcmaRuntimeStat; 424514f5e3Sopenharmony_ciclass RegExpParserCache; 434514f5e3Sopenharmony_ciclass JSPandaFileManager; 444514f5e3Sopenharmony_ciclass JSPandaFile; 454514f5e3Sopenharmony_ciclass ConstantPool; 464514f5e3Sopenharmony_ciclass JSPromise; 474514f5e3Sopenharmony_ciclass RegExpExecResultCache; 484514f5e3Sopenharmony_ciclass EcmaHandleScope; 494514f5e3Sopenharmony_ciclass GlobalIndexMap; 504514f5e3Sopenharmony_ciclass SustainingJSHandleList; 514514f5e3Sopenharmony_ciclass SustainingJSHandle; 524514f5e3Sopenharmony_cienum class PromiseRejectionEvent : uint8_t; 534514f5e3Sopenharmony_cienum class CompareStringsOption : uint8_t; 544514f5e3Sopenharmony_ci 554514f5e3Sopenharmony_citemplate<typename T> 564514f5e3Sopenharmony_ciclass JSHandle; 574514f5e3Sopenharmony_ciclass JSThread; 584514f5e3Sopenharmony_ciclass JSFunction; 594514f5e3Sopenharmony_ciclass JSPromise; 604514f5e3Sopenharmony_ciclass JSTaggedValue; 614514f5e3Sopenharmony_ciclass EcmaVM; 624514f5e3Sopenharmony_ciclass ModuleManager; 634514f5e3Sopenharmony_ciclass AOTFileManager; 644514f5e3Sopenharmony_ciclass QuickFixManager; 654514f5e3Sopenharmony_ciclass OptCodeProfiler; 664514f5e3Sopenharmony_ciclass TypedOpProfiler; 674514f5e3Sopenharmony_ciclass AbcBufferCache; 684514f5e3Sopenharmony_cistruct CJSInfo; 694514f5e3Sopenharmony_ciclass FunctionProtoTransitionTable; 704514f5e3Sopenharmony_ciclass ModuleLogger; 714514f5e3Sopenharmony_ci 724514f5e3Sopenharmony_cinamespace job { 734514f5e3Sopenharmony_ciclass MicroJobQueue; 744514f5e3Sopenharmony_ci} // namespace job 754514f5e3Sopenharmony_cinamespace tooling { 764514f5e3Sopenharmony_ciclass JsDebuggerManager; 774514f5e3Sopenharmony_ci} // namespace tooling 784514f5e3Sopenharmony_cinamespace kungfu { 794514f5e3Sopenharmony_ciclass PGOTypeManager; 804514f5e3Sopenharmony_ci} // namespace kungfu 814514f5e3Sopenharmony_ci 824514f5e3Sopenharmony_cienum class IcuFormatterType { 834514f5e3Sopenharmony_ci SIMPLE_DATE_FORMAT_DEFAULT, 844514f5e3Sopenharmony_ci SIMPLE_DATE_FORMAT_DATE, 854514f5e3Sopenharmony_ci SIMPLE_DATE_FORMAT_TIME, 864514f5e3Sopenharmony_ci NUMBER_FORMATTER, 874514f5e3Sopenharmony_ci COLLATOR, 884514f5e3Sopenharmony_ci ICU_FORMATTER_TYPE_COUNT 894514f5e3Sopenharmony_ci}; 904514f5e3Sopenharmony_ci 914514f5e3Sopenharmony_ciusing HostPromiseRejectionTracker = void (*)(const EcmaVM* vm, 924514f5e3Sopenharmony_ci const JSHandle<JSPromise> promise, 934514f5e3Sopenharmony_ci const JSHandle<JSTaggedValue> reason, 944514f5e3Sopenharmony_ci PromiseRejectionEvent operation, 954514f5e3Sopenharmony_ci void* data); 964514f5e3Sopenharmony_ciusing PromiseRejectCallback = void (*)(void* info); 974514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 984514f5e3Sopenharmony_ciusing JsAotReaderCallback = std::function<bool(std::string fileName, uint8_t **buff, size_t *buffSize)>; 994514f5e3Sopenharmony_ci#endif 1004514f5e3Sopenharmony_ciclass EcmaContext { 1014514f5e3Sopenharmony_cipublic: 1024514f5e3Sopenharmony_ci static EcmaContext *CreateAndInitialize(JSThread *thread); 1034514f5e3Sopenharmony_ci static void CheckAndDestroy(JSThread *thread, EcmaContext *context); 1044514f5e3Sopenharmony_ci 1054514f5e3Sopenharmony_ci static EcmaContext *Create(JSThread *thread); 1064514f5e3Sopenharmony_ci static bool Destroy(EcmaContext *context); 1074514f5e3Sopenharmony_ci 1084514f5e3Sopenharmony_ci EcmaContext(JSThread *thread); 1094514f5e3Sopenharmony_ci ~EcmaContext(); 1104514f5e3Sopenharmony_ci 1114514f5e3Sopenharmony_ci EcmaVM *GetEcmaVM() const 1124514f5e3Sopenharmony_ci { 1134514f5e3Sopenharmony_ci return vm_; 1144514f5e3Sopenharmony_ci } 1154514f5e3Sopenharmony_ci 1164514f5e3Sopenharmony_ci bool Initialize(); 1174514f5e3Sopenharmony_ci 1184514f5e3Sopenharmony_ci bool IsExecutingPendingJob() const 1194514f5e3Sopenharmony_ci { 1204514f5e3Sopenharmony_ci return isProcessingPendingJob_.load(); 1214514f5e3Sopenharmony_ci } 1224514f5e3Sopenharmony_ci 1234514f5e3Sopenharmony_ci bool HasPendingJob(); 1244514f5e3Sopenharmony_ci 1254514f5e3Sopenharmony_ci bool ExecutePromisePendingJob(); 1264514f5e3Sopenharmony_ci 1274514f5e3Sopenharmony_ci static EcmaContext *ConstCast(const EcmaContext *context) 1284514f5e3Sopenharmony_ci { 1294514f5e3Sopenharmony_ci return const_cast<EcmaContext *>(context); 1304514f5e3Sopenharmony_ci } 1314514f5e3Sopenharmony_ci 1324514f5e3Sopenharmony_ci bool IsInitialized() const 1334514f5e3Sopenharmony_ci { 1344514f5e3Sopenharmony_ci return initialized_; 1354514f5e3Sopenharmony_ci } 1364514f5e3Sopenharmony_ci 1374514f5e3Sopenharmony_ci ModuleManager *GetModuleManager() const 1384514f5e3Sopenharmony_ci { 1394514f5e3Sopenharmony_ci return moduleManager_; 1404514f5e3Sopenharmony_ci } 1414514f5e3Sopenharmony_ci 1424514f5e3Sopenharmony_ci AbcBufferCache *GetAbcBufferCache() const 1434514f5e3Sopenharmony_ci { 1444514f5e3Sopenharmony_ci return abcBufferCache_; 1454514f5e3Sopenharmony_ci } 1464514f5e3Sopenharmony_ci 1474514f5e3Sopenharmony_ci kungfu::PGOTypeManager *GetPTManager() const 1484514f5e3Sopenharmony_ci { 1494514f5e3Sopenharmony_ci return ptManager_; 1504514f5e3Sopenharmony_ci } 1514514f5e3Sopenharmony_ci 1524514f5e3Sopenharmony_ci ARK_INLINE JSThread *GetJSThread() const 1534514f5e3Sopenharmony_ci { 1544514f5e3Sopenharmony_ci return thread_; 1554514f5e3Sopenharmony_ci } 1564514f5e3Sopenharmony_ci PromiseRejectCallback GetPromiseRejectCallback() const 1574514f5e3Sopenharmony_ci { 1584514f5e3Sopenharmony_ci return promiseRejectCallback_; 1594514f5e3Sopenharmony_ci } 1604514f5e3Sopenharmony_ci 1614514f5e3Sopenharmony_ci void SetPromiseRejectCallback(PromiseRejectCallback cb) 1624514f5e3Sopenharmony_ci { 1634514f5e3Sopenharmony_ci promiseRejectCallback_ = cb; 1644514f5e3Sopenharmony_ci } 1654514f5e3Sopenharmony_ci 1664514f5e3Sopenharmony_ci void SetData(void* data) 1674514f5e3Sopenharmony_ci { 1684514f5e3Sopenharmony_ci data_ = data; 1694514f5e3Sopenharmony_ci } 1704514f5e3Sopenharmony_ci 1714514f5e3Sopenharmony_ci void PromiseRejectionTracker(const JSHandle<JSPromise> &promise, 1724514f5e3Sopenharmony_ci const JSHandle<JSTaggedValue> &reason, PromiseRejectionEvent operation) 1734514f5e3Sopenharmony_ci { 1744514f5e3Sopenharmony_ci if (hostPromiseRejectionTracker_ != nullptr) { 1754514f5e3Sopenharmony_ci hostPromiseRejectionTracker_(vm_, promise, reason, operation, data_); 1764514f5e3Sopenharmony_ci } 1774514f5e3Sopenharmony_ci } 1784514f5e3Sopenharmony_ci 1794514f5e3Sopenharmony_ci void SetHostPromiseRejectionTracker(HostPromiseRejectionTracker cb) 1804514f5e3Sopenharmony_ci { 1814514f5e3Sopenharmony_ci hostPromiseRejectionTracker_ = cb; 1824514f5e3Sopenharmony_ci } 1834514f5e3Sopenharmony_ci void SetupRegExpResultCache(); 1844514f5e3Sopenharmony_ci void SetupNumberToStringResultCache(); 1854514f5e3Sopenharmony_ci void SetupStringSplitResultCache(); 1864514f5e3Sopenharmony_ci void SetupStringToListResultCache(); 1874514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> GetRegExpCache() const 1884514f5e3Sopenharmony_ci { 1894514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(reinterpret_cast<uintptr_t>(®expCache_)); 1904514f5e3Sopenharmony_ci } 1914514f5e3Sopenharmony_ci 1924514f5e3Sopenharmony_ci RegExpParserCache *GetRegExpParserCache() const 1934514f5e3Sopenharmony_ci { 1944514f5e3Sopenharmony_ci ASSERT(regExpParserCache_ != nullptr); 1954514f5e3Sopenharmony_ci return regExpParserCache_; 1964514f5e3Sopenharmony_ci } 1974514f5e3Sopenharmony_ci 1984514f5e3Sopenharmony_ci void SetRegExpCache(JSTaggedValue newCache) 1994514f5e3Sopenharmony_ci { 2004514f5e3Sopenharmony_ci regexpCache_ = newCache; 2014514f5e3Sopenharmony_ci } 2024514f5e3Sopenharmony_ci uintptr_t GetExpCacheAddress() 2034514f5e3Sopenharmony_ci { 2044514f5e3Sopenharmony_ci return reinterpret_cast<uintptr_t>(®expCache_); 2054514f5e3Sopenharmony_ci } 2064514f5e3Sopenharmony_ci 2074514f5e3Sopenharmony_ci void SetupRegExpGlobalResult(); 2084514f5e3Sopenharmony_ci 2094514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> GetRegExpGlobalResult() const 2104514f5e3Sopenharmony_ci { 2114514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(reinterpret_cast<uintptr_t>(®expGlobal_)); 2124514f5e3Sopenharmony_ci } 2134514f5e3Sopenharmony_ci 2144514f5e3Sopenharmony_ci void SetRegExpGlobalResult(JSTaggedValue newResult) 2154514f5e3Sopenharmony_ci { 2164514f5e3Sopenharmony_ci regexpGlobal_ = newResult; 2174514f5e3Sopenharmony_ci } 2184514f5e3Sopenharmony_ci 2194514f5e3Sopenharmony_ci WaiterListNode *GetWaiterListNode() 2204514f5e3Sopenharmony_ci { 2214514f5e3Sopenharmony_ci return &waiterListNode_; 2224514f5e3Sopenharmony_ci } 2234514f5e3Sopenharmony_ci 2244514f5e3Sopenharmony_ci void SetAllowAtomicWait(bool wait) 2254514f5e3Sopenharmony_ci { 2264514f5e3Sopenharmony_ci AllowAtomicWait_ = wait; 2274514f5e3Sopenharmony_ci } 2284514f5e3Sopenharmony_ci 2294514f5e3Sopenharmony_ci bool GetAllowAtomicWait() const 2304514f5e3Sopenharmony_ci { 2314514f5e3Sopenharmony_ci return AllowAtomicWait_; 2324514f5e3Sopenharmony_ci } 2334514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> GetNumberToStringResultCache() const 2344514f5e3Sopenharmony_ci { 2354514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(reinterpret_cast<uintptr_t>(&numberToStringResultCache_)); 2364514f5e3Sopenharmony_ci } 2374514f5e3Sopenharmony_ci 2384514f5e3Sopenharmony_ci void SetNumberToStringResultCache(JSTaggedValue newCache) 2394514f5e3Sopenharmony_ci { 2404514f5e3Sopenharmony_ci numberToStringResultCache_ = newCache; 2414514f5e3Sopenharmony_ci } 2424514f5e3Sopenharmony_ci 2434514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> GetStringSplitResultCache() const 2444514f5e3Sopenharmony_ci { 2454514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(reinterpret_cast<uintptr_t>(&stringSplitResultCache_)); 2464514f5e3Sopenharmony_ci } 2474514f5e3Sopenharmony_ci 2484514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> GetStringToListResultCache() const 2494514f5e3Sopenharmony_ci { 2504514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(reinterpret_cast<uintptr_t>(&stringToListResultCache_)); 2514514f5e3Sopenharmony_ci } 2524514f5e3Sopenharmony_ci 2534514f5e3Sopenharmony_ci void SetStringSplitResultCache(JSTaggedValue newCache) 2544514f5e3Sopenharmony_ci { 2554514f5e3Sopenharmony_ci stringSplitResultCache_ = newCache; 2564514f5e3Sopenharmony_ci } 2574514f5e3Sopenharmony_ci JSHandle<ecmascript::JSTaggedValue> GetAndClearEcmaUncaughtException() const; 2584514f5e3Sopenharmony_ci JSHandle<ecmascript::JSTaggedValue> GetEcmaUncaughtException() const; 2594514f5e3Sopenharmony_ci void EnableUserUncaughtErrorHandler(); 2604514f5e3Sopenharmony_ci 2614514f5e3Sopenharmony_ci JSHandle<ConstantPool> AddOrUpdateConstpool(const JSPandaFile *jsPandaFile, 2624514f5e3Sopenharmony_ci JSHandle<ConstantPool> constpool, 2634514f5e3Sopenharmony_ci int32_t index = 0); 2644514f5e3Sopenharmony_ci void AddContextConstpoolCache(const JSPandaFile *jsPandaFile, 2654514f5e3Sopenharmony_ci JSHandle<ConstantPool> constpool, 2664514f5e3Sopenharmony_ci int32_t index); 2674514f5e3Sopenharmony_ci 2684514f5e3Sopenharmony_ci void UpdateConstpoolWhenDeserialAI(const std::string& fileName, 2694514f5e3Sopenharmony_ci JSHandle<ConstantPool> aiCP, 2704514f5e3Sopenharmony_ci int32_t index = 0); 2714514f5e3Sopenharmony_ci 2724514f5e3Sopenharmony_ci bool HasCachedConstpool(const JSPandaFile *jsPandaFile) const; 2734514f5e3Sopenharmony_ci 2744514f5e3Sopenharmony_ci void SetUnsharedConstpool(JSHandle<ConstantPool> sharedConstpool, JSTaggedValue unsharedConstpool); 2754514f5e3Sopenharmony_ci void SetUnsharedConstpool(int32_t constpoolIndex, JSTaggedValue unsharedConstpool); 2764514f5e3Sopenharmony_ci 2774514f5e3Sopenharmony_ci JSTaggedValue PUBLIC_API FindConstpool(const JSPandaFile *jsPandaFile, int32_t index); 2784514f5e3Sopenharmony_ci // For new version instruction. 2794514f5e3Sopenharmony_ci JSTaggedValue PUBLIC_API FindConstpool(const JSPandaFile *jsPandaFile, panda_file::File::EntityId id); 2804514f5e3Sopenharmony_ci JSTaggedValue PUBLIC_API FindOrCreateUnsharedConstpool(JSTaggedValue sharedConstpool); 2814514f5e3Sopenharmony_ci JSTaggedValue PUBLIC_API FindUnsharedConstpool(JSTaggedValue sharedConstpool); 2824514f5e3Sopenharmony_ci void PUBLIC_API LoadProtoTransitionTable(JSTaggedValue constpool); 2834514f5e3Sopenharmony_ci void PUBLIC_API ResetProtoTransitionTableOnConstpool(JSTaggedValue constpool); 2844514f5e3Sopenharmony_ci JSTaggedValue FindCachedConstpoolAndLoadAiIfNeeded(const JSPandaFile *jsPandaFile, int32_t index); 2854514f5e3Sopenharmony_ci void EraseUnusedConstpool(const JSPandaFile *jsPandaFile, int32_t index, int32_t constpoolIndex); 2864514f5e3Sopenharmony_ci std::optional<std::reference_wrapper<CMap<int32_t, JSTaggedValue>>> FindConstpools( 2874514f5e3Sopenharmony_ci const JSPandaFile *jsPandaFile); 2884514f5e3Sopenharmony_ci 2894514f5e3Sopenharmony_ci JSHandle<ConstantPool> PUBLIC_API FindOrCreateConstPool(const JSPandaFile *jsPandaFile, 2904514f5e3Sopenharmony_ci panda_file::File::EntityId id); 2914514f5e3Sopenharmony_ci void CreateAllConstpool(const JSPandaFile *jsPandaFile); 2924514f5e3Sopenharmony_ci 2934514f5e3Sopenharmony_ci void HandleUncaughtException(JSTaggedValue exception); 2944514f5e3Sopenharmony_ci void HandleUncaughtException(); 2954514f5e3Sopenharmony_ci JSHandle<GlobalEnv> GetGlobalEnv() const; 2964514f5e3Sopenharmony_ci bool GlobalEnvIsHole() 2974514f5e3Sopenharmony_ci { 2984514f5e3Sopenharmony_ci return globalEnv_.IsHole(); 2994514f5e3Sopenharmony_ci } 3004514f5e3Sopenharmony_ci 3014514f5e3Sopenharmony_ci JSHandle<job::MicroJobQueue> GetMicroJobQueue() const; 3024514f5e3Sopenharmony_ci 3034514f5e3Sopenharmony_ci static void PrintJSErrorInfo(JSThread *thread, const JSHandle<JSTaggedValue> &exceptionInfo); 3044514f5e3Sopenharmony_ci void Iterate(const RootVisitor &v, const RootRangeVisitor &rv); 3054514f5e3Sopenharmony_ci static void MountContext(JSThread *thread); 3064514f5e3Sopenharmony_ci static void UnmountContext(JSThread *thread); 3074514f5e3Sopenharmony_ci void SetMicroJobQueue(job::MicroJobQueue *queue); 3084514f5e3Sopenharmony_ci void SetGlobalEnv(GlobalEnv *global); 3094514f5e3Sopenharmony_ci void PrintOptStat(); 3104514f5e3Sopenharmony_ci 3114514f5e3Sopenharmony_ci OptCodeProfiler *GetOptCodeProfiler() const 3124514f5e3Sopenharmony_ci { 3134514f5e3Sopenharmony_ci return optCodeProfiler_; 3144514f5e3Sopenharmony_ci } 3154514f5e3Sopenharmony_ci 3164514f5e3Sopenharmony_ci TypedOpProfiler *GetTypdOpProfiler() const 3174514f5e3Sopenharmony_ci { 3184514f5e3Sopenharmony_ci return typedOpProfiler_; 3194514f5e3Sopenharmony_ci } 3204514f5e3Sopenharmony_ci 3214514f5e3Sopenharmony_ci ModuleLogger *GetModuleLogger() const 3224514f5e3Sopenharmony_ci { 3234514f5e3Sopenharmony_ci return moduleLogger_; 3244514f5e3Sopenharmony_ci } 3254514f5e3Sopenharmony_ci 3264514f5e3Sopenharmony_ci void SetModuleLogger(ModuleLogger *moduleLogger) 3274514f5e3Sopenharmony_ci { 3284514f5e3Sopenharmony_ci moduleLogger_ = moduleLogger; 3294514f5e3Sopenharmony_ci } 3304514f5e3Sopenharmony_ci 3314514f5e3Sopenharmony_ci void SetDefaultLocale(const std::string& locale) 3324514f5e3Sopenharmony_ci { 3334514f5e3Sopenharmony_ci defaultLocale_ = locale; 3344514f5e3Sopenharmony_ci } 3354514f5e3Sopenharmony_ci 3364514f5e3Sopenharmony_ci const std::string& GetDefaultLocale() const 3374514f5e3Sopenharmony_ci { 3384514f5e3Sopenharmony_ci return defaultLocale_; 3394514f5e3Sopenharmony_ci } 3404514f5e3Sopenharmony_ci 3414514f5e3Sopenharmony_ci void InitializeDefaultLocale() 3424514f5e3Sopenharmony_ci { 3434514f5e3Sopenharmony_ci defaultLocale_ = ""; 3444514f5e3Sopenharmony_ci } 3454514f5e3Sopenharmony_ci 3464514f5e3Sopenharmony_ci void ClearDefaultLocale() 3474514f5e3Sopenharmony_ci { 3484514f5e3Sopenharmony_ci defaultLocale_.clear(); 3494514f5e3Sopenharmony_ci } 3504514f5e3Sopenharmony_ci 3514514f5e3Sopenharmony_ci void SetDefaultCompareStringsOption(const CompareStringsOption csOption) 3524514f5e3Sopenharmony_ci { 3534514f5e3Sopenharmony_ci defaultComapreStringsOption_ = csOption; 3544514f5e3Sopenharmony_ci } 3554514f5e3Sopenharmony_ci 3564514f5e3Sopenharmony_ci const std::optional<CompareStringsOption> GetDefaultCompareStringsOption() const 3574514f5e3Sopenharmony_ci { 3584514f5e3Sopenharmony_ci return defaultComapreStringsOption_; 3594514f5e3Sopenharmony_ci } 3604514f5e3Sopenharmony_ci 3614514f5e3Sopenharmony_ci void InitializeDefaultCompareStringsOption() 3624514f5e3Sopenharmony_ci { 3634514f5e3Sopenharmony_ci defaultComapreStringsOption_ = std::nullopt; 3644514f5e3Sopenharmony_ci } 3654514f5e3Sopenharmony_ci 3664514f5e3Sopenharmony_ci void ClearDefaultComapreStringsOption() 3674514f5e3Sopenharmony_ci { 3684514f5e3Sopenharmony_ci defaultComapreStringsOption_ = std::nullopt; 3694514f5e3Sopenharmony_ci } 3704514f5e3Sopenharmony_ci 3714514f5e3Sopenharmony_ci FunctionProtoTransitionTable *GetFunctionProtoTransitionTable() const 3724514f5e3Sopenharmony_ci { 3734514f5e3Sopenharmony_ci return functionProtoTransitionTable_; 3744514f5e3Sopenharmony_ci } 3754514f5e3Sopenharmony_ci 3764514f5e3Sopenharmony_ci // For icu objects cache 3774514f5e3Sopenharmony_ci void SetIcuFormatterToCache(IcuFormatterType type, const std::string &locale, void *icuObj, 3784514f5e3Sopenharmony_ci NativePointerCallback deleteEntry = nullptr) 3794514f5e3Sopenharmony_ci { 3804514f5e3Sopenharmony_ci EcmaContext::IcuFormatter icuFormatter = IcuFormatter(locale, icuObj, deleteEntry); 3814514f5e3Sopenharmony_ci icuObjCache_[static_cast<int>(type)] = icuFormatter; 3824514f5e3Sopenharmony_ci } 3834514f5e3Sopenharmony_ci 3844514f5e3Sopenharmony_ci ARK_INLINE void *GetIcuFormatterFromCache(IcuFormatterType type, std::string &locale) 3854514f5e3Sopenharmony_ci { 3864514f5e3Sopenharmony_ci auto &icuFormatter = icuObjCache_[static_cast<int>(type)]; 3874514f5e3Sopenharmony_ci if (icuFormatter.locale == locale) { 3884514f5e3Sopenharmony_ci return icuFormatter.icuObj; 3894514f5e3Sopenharmony_ci } 3904514f5e3Sopenharmony_ci return nullptr; 3914514f5e3Sopenharmony_ci } 3924514f5e3Sopenharmony_ci 3934514f5e3Sopenharmony_ci void ClearIcuCache(JSThread *thread); 3944514f5e3Sopenharmony_ci 3954514f5e3Sopenharmony_ci EcmaRuntimeStat *GetRuntimeStat() const 3964514f5e3Sopenharmony_ci { 3974514f5e3Sopenharmony_ci return runtimeStat_; 3984514f5e3Sopenharmony_ci } 3994514f5e3Sopenharmony_ci 4004514f5e3Sopenharmony_ci void SetRuntimeStatEnable(bool flag); 4014514f5e3Sopenharmony_ci void InitializeEcmaScriptRunStat(); 4024514f5e3Sopenharmony_ci void DumpAOTInfo() const DUMP_API_ATTR; 4034514f5e3Sopenharmony_ci 4044514f5e3Sopenharmony_ci JSTaggedValue ExecuteAot(size_t actualNumArgs, JSTaggedType *args, const JSTaggedType *prevFp, 4054514f5e3Sopenharmony_ci bool needPushArgv); 4064514f5e3Sopenharmony_ci void LoadStubFile(); 4074514f5e3Sopenharmony_ci 4084514f5e3Sopenharmony_ci JSTaggedType *GetHandleScopeStorageNext() const 4094514f5e3Sopenharmony_ci { 4104514f5e3Sopenharmony_ci return handleScopeStorageNext_; 4114514f5e3Sopenharmony_ci } 4124514f5e3Sopenharmony_ci 4134514f5e3Sopenharmony_ci void SetHandleScopeStorageNext(JSTaggedType *value) 4144514f5e3Sopenharmony_ci { 4154514f5e3Sopenharmony_ci handleScopeStorageNext_ = value; 4164514f5e3Sopenharmony_ci } 4174514f5e3Sopenharmony_ci 4184514f5e3Sopenharmony_ci JSTaggedType *GetHandleScopeStorageEnd() const 4194514f5e3Sopenharmony_ci { 4204514f5e3Sopenharmony_ci return handleScopeStorageEnd_; 4214514f5e3Sopenharmony_ci } 4224514f5e3Sopenharmony_ci 4234514f5e3Sopenharmony_ci void SetHandleScopeStorageEnd(JSTaggedType *value) 4244514f5e3Sopenharmony_ci { 4254514f5e3Sopenharmony_ci handleScopeStorageEnd_ = value; 4264514f5e3Sopenharmony_ci } 4274514f5e3Sopenharmony_ci 4284514f5e3Sopenharmony_ci int GetCurrentHandleStorageIndex() const 4294514f5e3Sopenharmony_ci { 4304514f5e3Sopenharmony_ci return currentHandleStorageIndex_; 4314514f5e3Sopenharmony_ci } 4324514f5e3Sopenharmony_ci 4334514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_HANDLE_LEAK_CHECK 4344514f5e3Sopenharmony_ci void HandleScopeCountAdd() 4354514f5e3Sopenharmony_ci { 4364514f5e3Sopenharmony_ci handleScopeCount_++; 4374514f5e3Sopenharmony_ci } 4384514f5e3Sopenharmony_ci 4394514f5e3Sopenharmony_ci void HandleScopeCountDec() 4404514f5e3Sopenharmony_ci { 4414514f5e3Sopenharmony_ci handleScopeCount_--; 4424514f5e3Sopenharmony_ci } 4434514f5e3Sopenharmony_ci 4444514f5e3Sopenharmony_ci void PrimitiveScopeCountAdd() 4454514f5e3Sopenharmony_ci { 4464514f5e3Sopenharmony_ci primitiveScopeCount_++; 4474514f5e3Sopenharmony_ci } 4484514f5e3Sopenharmony_ci 4494514f5e3Sopenharmony_ci void PrimitiveScopeCountDec() 4504514f5e3Sopenharmony_ci { 4514514f5e3Sopenharmony_ci primitiveScopeCount_--; 4524514f5e3Sopenharmony_ci } 4534514f5e3Sopenharmony_ci#endif 4544514f5e3Sopenharmony_ci 4554514f5e3Sopenharmony_ci void SetLastHandleScope(EcmaHandleScope *scope) 4564514f5e3Sopenharmony_ci { 4574514f5e3Sopenharmony_ci lastHandleScope_ = scope; 4584514f5e3Sopenharmony_ci } 4594514f5e3Sopenharmony_ci 4604514f5e3Sopenharmony_ci EcmaHandleScope *GetLastHandleScope() const 4614514f5e3Sopenharmony_ci { 4624514f5e3Sopenharmony_ci return lastHandleScope_; 4634514f5e3Sopenharmony_ci } 4644514f5e3Sopenharmony_ci 4654514f5e3Sopenharmony_ci JSTaggedType *GetPrimitiveScopeStorageNext() const 4664514f5e3Sopenharmony_ci { 4674514f5e3Sopenharmony_ci return primitiveScopeStorageNext_; 4684514f5e3Sopenharmony_ci } 4694514f5e3Sopenharmony_ci 4704514f5e3Sopenharmony_ci void SetPrimitiveScopeStorageNext(JSTaggedType *value) 4714514f5e3Sopenharmony_ci { 4724514f5e3Sopenharmony_ci primitiveScopeStorageNext_ = value; 4734514f5e3Sopenharmony_ci } 4744514f5e3Sopenharmony_ci 4754514f5e3Sopenharmony_ci JSTaggedType *GetPrimitiveScopeStorageEnd() const 4764514f5e3Sopenharmony_ci { 4774514f5e3Sopenharmony_ci return primitiveScopeStorageEnd_; 4784514f5e3Sopenharmony_ci } 4794514f5e3Sopenharmony_ci 4804514f5e3Sopenharmony_ci void SetPrimitiveScopeStorageEnd(JSTaggedType *value) 4814514f5e3Sopenharmony_ci { 4824514f5e3Sopenharmony_ci primitiveScopeStorageEnd_ = value; 4834514f5e3Sopenharmony_ci } 4844514f5e3Sopenharmony_ci 4854514f5e3Sopenharmony_ci int GetCurrentPrimitiveStorageIndex() const 4864514f5e3Sopenharmony_ci { 4874514f5e3Sopenharmony_ci return currentPrimitiveStorageIndex_; 4884514f5e3Sopenharmony_ci } 4894514f5e3Sopenharmony_ci 4904514f5e3Sopenharmony_ci void SetLastPrimitiveScope(EcmaHandleScope *scope) 4914514f5e3Sopenharmony_ci { 4924514f5e3Sopenharmony_ci lastPrimitiveScope_ = scope; 4934514f5e3Sopenharmony_ci } 4944514f5e3Sopenharmony_ci 4954514f5e3Sopenharmony_ci EcmaHandleScope *GetLastPrimitiveScope() const 4964514f5e3Sopenharmony_ci { 4974514f5e3Sopenharmony_ci return lastPrimitiveScope_; 4984514f5e3Sopenharmony_ci } 4994514f5e3Sopenharmony_ci 5004514f5e3Sopenharmony_ci size_t IterateHandle(const RootRangeVisitor &rangeVisitor); 5014514f5e3Sopenharmony_ci uintptr_t *ExpandHandleStorage(); 5024514f5e3Sopenharmony_ci void ShrinkHandleStorage(int prevIndex); 5034514f5e3Sopenharmony_ci uintptr_t *ExpandPrimitiveStorage(); 5044514f5e3Sopenharmony_ci void ShrinkPrimitiveStorage(int prevIndex); 5054514f5e3Sopenharmony_ci 5064514f5e3Sopenharmony_ci JSTaggedType *GetCurrentFrame() const 5074514f5e3Sopenharmony_ci { 5084514f5e3Sopenharmony_ci return currentFrame_; 5094514f5e3Sopenharmony_ci } 5104514f5e3Sopenharmony_ci 5114514f5e3Sopenharmony_ci JSTaggedType *GetLeaveFrame() const 5124514f5e3Sopenharmony_ci { 5134514f5e3Sopenharmony_ci return leaveFrame_; 5144514f5e3Sopenharmony_ci } 5154514f5e3Sopenharmony_ci 5164514f5e3Sopenharmony_ci JSTaggedType *GetLastFp() const 5174514f5e3Sopenharmony_ci { 5184514f5e3Sopenharmony_ci return lastFp_; 5194514f5e3Sopenharmony_ci } 5204514f5e3Sopenharmony_ci 5214514f5e3Sopenharmony_ci void SetFramePointers(JSTaggedType *currentFrame, JSTaggedType *leaveFrame, JSTaggedType *lastFp) 5224514f5e3Sopenharmony_ci { 5234514f5e3Sopenharmony_ci currentFrame_ = currentFrame; 5244514f5e3Sopenharmony_ci leaveFrame_ = leaveFrame; 5254514f5e3Sopenharmony_ci lastFp_ = lastFp; 5264514f5e3Sopenharmony_ci } 5274514f5e3Sopenharmony_ci void SetFrameBase(JSTaggedType *frameBase) 5284514f5e3Sopenharmony_ci { 5294514f5e3Sopenharmony_ci frameBase_ = frameBase; 5304514f5e3Sopenharmony_ci } 5314514f5e3Sopenharmony_ci JSTaggedType *GetFrameBase() const 5324514f5e3Sopenharmony_ci { 5334514f5e3Sopenharmony_ci return frameBase_; 5344514f5e3Sopenharmony_ci } 5354514f5e3Sopenharmony_ci 5364514f5e3Sopenharmony_ci void SetStackStart(uint64_t stackStart) 5374514f5e3Sopenharmony_ci { 5384514f5e3Sopenharmony_ci stackStart_ = stackStart; 5394514f5e3Sopenharmony_ci } 5404514f5e3Sopenharmony_ci uint64_t GetStackStart() const 5414514f5e3Sopenharmony_ci { 5424514f5e3Sopenharmony_ci return stackStart_; 5434514f5e3Sopenharmony_ci } 5444514f5e3Sopenharmony_ci void SetStackLimit(uint64_t stackLimit) 5454514f5e3Sopenharmony_ci { 5464514f5e3Sopenharmony_ci stackLimit_ = stackLimit; 5474514f5e3Sopenharmony_ci } 5484514f5e3Sopenharmony_ci uint64_t GetStackLimit() const 5494514f5e3Sopenharmony_ci { 5504514f5e3Sopenharmony_ci return stackLimit_; 5514514f5e3Sopenharmony_ci } 5524514f5e3Sopenharmony_ci 5534514f5e3Sopenharmony_ci PropertiesCache *GetPropertiesCache() const 5544514f5e3Sopenharmony_ci { 5554514f5e3Sopenharmony_ci return propertiesCache_; 5564514f5e3Sopenharmony_ci } 5574514f5e3Sopenharmony_ci void ClearBufferData(); 5584514f5e3Sopenharmony_ci const GlobalEnvConstants *GlobalConstants() const 5594514f5e3Sopenharmony_ci { 5604514f5e3Sopenharmony_ci return &globalConst_; 5614514f5e3Sopenharmony_ci } 5624514f5e3Sopenharmony_ci 5634514f5e3Sopenharmony_ci void AddPatchModule(const CString &recordName, const JSHandle<JSTaggedValue> moduleRecord) 5644514f5e3Sopenharmony_ci { 5654514f5e3Sopenharmony_ci cachedPatchModules_.emplace(recordName, moduleRecord); 5664514f5e3Sopenharmony_ci } 5674514f5e3Sopenharmony_ci JSHandle<JSTaggedValue> FindPatchModule(const CString &recordName) const 5684514f5e3Sopenharmony_ci { 5694514f5e3Sopenharmony_ci auto iter = cachedPatchModules_.find(recordName); 5704514f5e3Sopenharmony_ci if (iter != cachedPatchModules_.end()) { 5714514f5e3Sopenharmony_ci return iter->second; 5724514f5e3Sopenharmony_ci } 5734514f5e3Sopenharmony_ci return JSHandle<JSTaggedValue>(thread_, JSTaggedValue::Hole()); 5744514f5e3Sopenharmony_ci } 5754514f5e3Sopenharmony_ci void ClearPatchModules() 5764514f5e3Sopenharmony_ci { 5774514f5e3Sopenharmony_ci GlobalHandleCollection gloalHandleCollection(thread_); 5784514f5e3Sopenharmony_ci for (auto &item : cachedPatchModules_) { 5794514f5e3Sopenharmony_ci gloalHandleCollection.Dispose(item.second); 5804514f5e3Sopenharmony_ci } 5814514f5e3Sopenharmony_ci cachedPatchModules_.clear(); 5824514f5e3Sopenharmony_ci } 5834514f5e3Sopenharmony_ci 5844514f5e3Sopenharmony_ci StageOfHotReload GetStageOfHotReload() const 5854514f5e3Sopenharmony_ci { 5864514f5e3Sopenharmony_ci return stageOfHotReload_; 5874514f5e3Sopenharmony_ci } 5884514f5e3Sopenharmony_ci void SetStageOfHotReload(StageOfHotReload stageOfHotReload) 5894514f5e3Sopenharmony_ci { 5904514f5e3Sopenharmony_ci stageOfHotReload_ = stageOfHotReload; 5914514f5e3Sopenharmony_ci } 5924514f5e3Sopenharmony_ci 5934514f5e3Sopenharmony_ci StageOfColdReload GetStageOfColdReload() const 5944514f5e3Sopenharmony_ci { 5954514f5e3Sopenharmony_ci return stageOfColdReload_; 5964514f5e3Sopenharmony_ci } 5974514f5e3Sopenharmony_ci void SetStageOfColdReload(StageOfColdReload stageOfColdReload) 5984514f5e3Sopenharmony_ci { 5994514f5e3Sopenharmony_ci stageOfColdReload_ = stageOfColdReload; 6004514f5e3Sopenharmony_ci } 6014514f5e3Sopenharmony_ci 6024514f5e3Sopenharmony_ci bool JoinStackPushFastPath(JSHandle<JSTaggedValue> receiver); 6034514f5e3Sopenharmony_ci bool JoinStackPush(JSHandle<JSTaggedValue> receiver); 6044514f5e3Sopenharmony_ci void JoinStackPopFastPath(JSHandle<JSTaggedValue> receiver); 6054514f5e3Sopenharmony_ci void JoinStackPop(JSHandle<JSTaggedValue> receiver); 6064514f5e3Sopenharmony_ci 6074514f5e3Sopenharmony_ci void SetJsonStringifyCache(size_t index, CVector<std::pair<CString, int>> &value) 6084514f5e3Sopenharmony_ci { 6094514f5e3Sopenharmony_ci stringifyCache_[index] = value; 6104514f5e3Sopenharmony_ci } 6114514f5e3Sopenharmony_ci 6124514f5e3Sopenharmony_ci CVector<std::pair<CString, int>> GetJsonStringifyCache(size_t index) 6134514f5e3Sopenharmony_ci { 6144514f5e3Sopenharmony_ci return stringifyCache_[index]; 6154514f5e3Sopenharmony_ci } 6164514f5e3Sopenharmony_ci 6174514f5e3Sopenharmony_ci bool IsAotEntry() 6184514f5e3Sopenharmony_ci { 6194514f5e3Sopenharmony_ci return isAotEntry_; 6204514f5e3Sopenharmony_ci } 6214514f5e3Sopenharmony_ci 6224514f5e3Sopenharmony_ci std::tuple<uint64_t, uint8_t *, int, kungfu::CalleeRegAndOffsetVec> CalCallSiteInfo(uintptr_t retAddr, 6234514f5e3Sopenharmony_ci bool isDeopt) const; 6244514f5e3Sopenharmony_ci 6254514f5e3Sopenharmony_ci void AddSustainingJSHandle(SustainingJSHandle*); 6264514f5e3Sopenharmony_ci void RemoveSustainingJSHandle(SustainingJSHandle*); 6274514f5e3Sopenharmony_ci void ClearKeptObjects(); 6284514f5e3Sopenharmony_ci void AddToKeptObjects(JSHandle<JSTaggedValue> value); 6294514f5e3Sopenharmony_ci inline bool HasKeptObjects() const 6304514f5e3Sopenharmony_ci { 6314514f5e3Sopenharmony_ci return hasKeptObjects_; 6324514f5e3Sopenharmony_ci } 6334514f5e3Sopenharmony_ci 6344514f5e3Sopenharmony_ci void ClearCachedConstantPool() 6354514f5e3Sopenharmony_ci { 6364514f5e3Sopenharmony_ci cachedSharedConstpools_.clear(); 6374514f5e3Sopenharmony_ci } 6384514f5e3Sopenharmony_ci 6394514f5e3Sopenharmony_ciprivate: 6404514f5e3Sopenharmony_ci void CJSExecution(JSHandle<JSFunction> &func, JSHandle<JSTaggedValue> &thisArg, 6414514f5e3Sopenharmony_ci const JSPandaFile *jsPandaFile, std::string_view entryPoint); 6424514f5e3Sopenharmony_ci JSTaggedValue InvokeEcmaAotEntrypoint(JSHandle<JSFunction> mainFunc, JSHandle<JSTaggedValue> &thisArg, 6434514f5e3Sopenharmony_ci const JSPandaFile *jsPandaFile, std::string_view entryPoint, 6444514f5e3Sopenharmony_ci CJSInfo *cjsInfo = nullptr); 6454514f5e3Sopenharmony_ci Expected<JSTaggedValue, bool> InvokeEcmaEntrypoint(const JSPandaFile *jsPandaFile, std::string_view entryPoint, 6464514f5e3Sopenharmony_ci bool executeFromJob = false); 6474514f5e3Sopenharmony_ci Expected<JSTaggedValue, bool> InvokeEcmaEntrypointForHotReload( 6484514f5e3Sopenharmony_ci const JSPandaFile *jsPandaFile, std::string_view entryPoint, bool executeFromJob); 6494514f5e3Sopenharmony_ci Expected<JSTaggedValue, bool> CommonInvokeEcmaEntrypoint(const JSPandaFile *jsPandaFile, 6504514f5e3Sopenharmony_ci std::string_view entryPoint, JSHandle<JSFunction> &func, bool executeFromJob); 6514514f5e3Sopenharmony_ci bool LoadAOTFilesInternal(const std::string& aotFileName); 6524514f5e3Sopenharmony_ci bool LoadAOTFiles(const std::string &aotFileName); 6534514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM) 6544514f5e3Sopenharmony_ci bool LoadAOTFiles(const std::string &aotFileName, 6554514f5e3Sopenharmony_ci std::function<bool(std::string fileName, uint8_t **buff, size_t *buffSize)> cb); 6564514f5e3Sopenharmony_ci#endif 6574514f5e3Sopenharmony_ci void RelocateConstantString(const JSPandaFile *jsPandaFile); 6584514f5e3Sopenharmony_ci JSTaggedValue FindConstpoolFromContextCache(const JSPandaFile *jsPandaFile, int32_t index); 6594514f5e3Sopenharmony_ci 6604514f5e3Sopenharmony_ci void CheckUnsharedConstpoolArrayLimit(int32_t index) 6614514f5e3Sopenharmony_ci { 6624514f5e3Sopenharmony_ci if (index >= UNSHARED_CONSTANTPOOL_COUNT) { 6634514f5e3Sopenharmony_ci LOG_ECMA(FATAL) << "the unshared constpool array need to expanding capacity, index :" << index; 6644514f5e3Sopenharmony_ci UNREACHABLE(); 6654514f5e3Sopenharmony_ci } 6664514f5e3Sopenharmony_ci } 6674514f5e3Sopenharmony_ci 6684514f5e3Sopenharmony_ci NO_MOVE_SEMANTIC(EcmaContext); 6694514f5e3Sopenharmony_ci NO_COPY_SEMANTIC(EcmaContext); 6704514f5e3Sopenharmony_ci 6714514f5e3Sopenharmony_ci PropertiesCache *propertiesCache_ {nullptr}; 6724514f5e3Sopenharmony_ci JSThread *thread_ {nullptr}; 6734514f5e3Sopenharmony_ci EcmaVM *vm_ {nullptr}; 6744514f5e3Sopenharmony_ci 6754514f5e3Sopenharmony_ci bool isUncaughtExceptionRegistered_ {false}; 6764514f5e3Sopenharmony_ci bool initialized_ {false}; 6774514f5e3Sopenharmony_ci std::atomic<bool> isProcessingPendingJob_ {false}; 6784514f5e3Sopenharmony_ci ObjectFactory *factory_ {nullptr}; 6794514f5e3Sopenharmony_ci 6804514f5e3Sopenharmony_ci // VM execution states. 6814514f5e3Sopenharmony_ci RegExpParserCache *regExpParserCache_ {nullptr}; 6824514f5e3Sopenharmony_ci JSTaggedValue numberToStringResultCache_ {JSTaggedValue::Hole()}; 6834514f5e3Sopenharmony_ci JSTaggedValue stringSplitResultCache_ {JSTaggedValue::Hole()}; 6844514f5e3Sopenharmony_ci JSTaggedValue stringToListResultCache_ {JSTaggedValue::Hole()}; 6854514f5e3Sopenharmony_ci JSTaggedValue globalEnv_ {JSTaggedValue::Hole()}; 6864514f5e3Sopenharmony_ci JSTaggedValue pointerToIndexDictionary_ {JSTaggedValue::Hole()}; 6874514f5e3Sopenharmony_ci JSTaggedValue regexpCache_ {JSTaggedValue::Hole()}; 6884514f5e3Sopenharmony_ci JSTaggedValue regexpGlobal_ {JSTaggedValue::Hole()}; 6894514f5e3Sopenharmony_ci JSTaggedValue microJobQueue_ {JSTaggedValue::Hole()}; 6904514f5e3Sopenharmony_ci EcmaRuntimeStat *runtimeStat_ {nullptr}; 6914514f5e3Sopenharmony_ci 6924514f5e3Sopenharmony_ci CMap<const JSPandaFile *, CMap<int32_t, JSTaggedValue>> cachedSharedConstpools_ {}; 6934514f5e3Sopenharmony_ci std::array<JSTaggedValue, UNSHARED_CONSTANTPOOL_COUNT> unsharedConstpools_ {}; 6944514f5e3Sopenharmony_ci static constexpr int32_t SHARED_CONSTPOOL_KEY_NOT_FOUND = INT32_MAX; // INT32_MAX :invalid value. 6954514f5e3Sopenharmony_ci 6964514f5e3Sopenharmony_ci // for HotReload of module. 6974514f5e3Sopenharmony_ci CMap<CString, JSHandle<JSTaggedValue>> cachedPatchModules_ {}; 6984514f5e3Sopenharmony_ci StageOfHotReload stageOfHotReload_ = StageOfHotReload::INITIALIZE_STAGE_OF_HOTRELOAD; 6994514f5e3Sopenharmony_ci StageOfColdReload stageOfColdReload_ = StageOfColdReload::NOT_COLD_RELOAD; 7004514f5e3Sopenharmony_ci 7014514f5e3Sopenharmony_ci // VM resources. 7024514f5e3Sopenharmony_ci ModuleManager *moduleManager_ {nullptr}; 7034514f5e3Sopenharmony_ci kungfu::PGOTypeManager *ptManager_ {nullptr}; 7044514f5e3Sopenharmony_ci AOTFileManager *aotFileManager_ {nullptr}; 7054514f5e3Sopenharmony_ci AbcBufferCache *abcBufferCache_ {nullptr}; 7064514f5e3Sopenharmony_ci 7074514f5e3Sopenharmony_ci // for recording the transition of function prototype 7084514f5e3Sopenharmony_ci FunctionProtoTransitionTable *functionProtoTransitionTable_ {nullptr}; 7094514f5e3Sopenharmony_ci 7104514f5e3Sopenharmony_ci // atomics 7114514f5e3Sopenharmony_ci bool AllowAtomicWait_ {true}; 7124514f5e3Sopenharmony_ci WaiterListNode waiterListNode_; 7134514f5e3Sopenharmony_ci 7144514f5e3Sopenharmony_ci // Registered Callbacks 7154514f5e3Sopenharmony_ci PromiseRejectCallback promiseRejectCallback_ {nullptr}; 7164514f5e3Sopenharmony_ci HostPromiseRejectionTracker hostPromiseRejectionTracker_ {nullptr}; 7174514f5e3Sopenharmony_ci void* data_{nullptr}; 7184514f5e3Sopenharmony_ci 7194514f5e3Sopenharmony_ci // opt code Profiler 7204514f5e3Sopenharmony_ci OptCodeProfiler *optCodeProfiler_ {nullptr}; 7214514f5e3Sopenharmony_ci 7224514f5e3Sopenharmony_ci // opt code loop hoist 7234514f5e3Sopenharmony_ci TypedOpProfiler *typedOpProfiler_ {nullptr}; 7244514f5e3Sopenharmony_ci 7254514f5e3Sopenharmony_ci ModuleLogger *moduleLogger_ {nullptr}; 7264514f5e3Sopenharmony_ci 7274514f5e3Sopenharmony_ci std::string defaultLocale_; 7284514f5e3Sopenharmony_ci std::optional<CompareStringsOption> defaultComapreStringsOption_; 7294514f5e3Sopenharmony_ci 7304514f5e3Sopenharmony_ci // For icu objects cache 7314514f5e3Sopenharmony_ci struct IcuFormatter { 7324514f5e3Sopenharmony_ci std::string locale; 7334514f5e3Sopenharmony_ci void *icuObj {nullptr}; 7344514f5e3Sopenharmony_ci NativePointerCallback deleteEntry {nullptr}; 7354514f5e3Sopenharmony_ci 7364514f5e3Sopenharmony_ci IcuFormatter() = default; 7374514f5e3Sopenharmony_ci IcuFormatter(const std::string &locale, void *icuObj, NativePointerCallback deleteEntry = nullptr) 7384514f5e3Sopenharmony_ci : locale(locale), icuObj(icuObj), deleteEntry(deleteEntry) {} 7394514f5e3Sopenharmony_ci }; 7404514f5e3Sopenharmony_ci IcuFormatter icuObjCache_[static_cast<uint32_t>(IcuFormatterType::ICU_FORMATTER_TYPE_COUNT)]; 7414514f5e3Sopenharmony_ci // Handlescope 7424514f5e3Sopenharmony_ci static const uint32_t NODE_BLOCK_SIZE_LOG2 = 10; 7434514f5e3Sopenharmony_ci static const uint32_t NODE_BLOCK_SIZE = 1U << NODE_BLOCK_SIZE_LOG2; 7444514f5e3Sopenharmony_ci static constexpr int32_t MIN_HANDLE_STORAGE_SIZE = 2; 7454514f5e3Sopenharmony_ci JSTaggedType *handleScopeStorageNext_ {nullptr}; 7464514f5e3Sopenharmony_ci JSTaggedType *handleScopeStorageEnd_ {nullptr}; 7474514f5e3Sopenharmony_ci std::vector<std::array<JSTaggedType, NODE_BLOCK_SIZE> *> handleStorageNodes_ {}; 7484514f5e3Sopenharmony_ci int32_t currentHandleStorageIndex_ {-1}; 7494514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_HANDLE_LEAK_CHECK 7504514f5e3Sopenharmony_ci int32_t handleScopeCount_ {0}; 7514514f5e3Sopenharmony_ci int32_t primitiveScopeCount_ {0}; 7524514f5e3Sopenharmony_ci#endif 7534514f5e3Sopenharmony_ci EcmaHandleScope *lastHandleScope_ {nullptr}; 7544514f5e3Sopenharmony_ci // PrimitveScope 7554514f5e3Sopenharmony_ci static constexpr int32_t MIN_PRIMITIVE_STORAGE_SIZE = 2; 7564514f5e3Sopenharmony_ci JSTaggedType *primitiveScopeStorageNext_ {nullptr}; 7574514f5e3Sopenharmony_ci JSTaggedType *primitiveScopeStorageEnd_ {nullptr}; 7584514f5e3Sopenharmony_ci std::vector<std::array<JSTaggedType, NODE_BLOCK_SIZE> *> primitiveStorageNodes_ {}; 7594514f5e3Sopenharmony_ci int32_t currentPrimitiveStorageIndex_ {-1}; 7604514f5e3Sopenharmony_ci EcmaHandleScope *lastPrimitiveScope_ {nullptr}; 7614514f5e3Sopenharmony_ci 7624514f5e3Sopenharmony_ci // Frame pointer 7634514f5e3Sopenharmony_ci JSTaggedType *currentFrame_ {nullptr}; 7644514f5e3Sopenharmony_ci JSTaggedType *leaveFrame_ {nullptr}; 7654514f5e3Sopenharmony_ci JSTaggedType *lastFp_ {nullptr}; 7664514f5e3Sopenharmony_ci JSTaggedType *frameBase_ {nullptr}; 7674514f5e3Sopenharmony_ci uint64_t stackStart_ {0}; 7684514f5e3Sopenharmony_ci uint64_t stackLimit_ {0}; 7694514f5e3Sopenharmony_ci GlobalEnvConstants globalConst_; 7704514f5e3Sopenharmony_ci // Join Stack 7714514f5e3Sopenharmony_ci static constexpr uint32_t MIN_JOIN_STACK_SIZE = 2; 7724514f5e3Sopenharmony_ci CVector<JSTaggedValue> joinStack_ {JSTaggedValue::Hole(), JSTaggedValue::Hole()}; 7734514f5e3Sopenharmony_ci // json stringify cache 7744514f5e3Sopenharmony_ci static constexpr uint32_t STRINGIFY_CACHE_SIZE = 64; 7754514f5e3Sopenharmony_ci std::array<CVector<std::pair<CString, int>>, STRINGIFY_CACHE_SIZE> stringifyCache_ {}; 7764514f5e3Sopenharmony_ci bool isAotEntry_ { false }; 7774514f5e3Sopenharmony_ci 7784514f5e3Sopenharmony_ci // SustainingJSHandleList for jit compile hold ref 7794514f5e3Sopenharmony_ci SustainingJSHandleList *sustainingJSHandleList_ {nullptr}; 7804514f5e3Sopenharmony_ci 7814514f5e3Sopenharmony_ci bool hasKeptObjects_ {false}; 7824514f5e3Sopenharmony_ci 7834514f5e3Sopenharmony_ci friend class EcmaHandleScope; 7844514f5e3Sopenharmony_ci friend class JSPandaFileExecutor; 7854514f5e3Sopenharmony_ci friend class ObjectFactory; 7864514f5e3Sopenharmony_ci friend class panda::JSNApi; 7874514f5e3Sopenharmony_ci friend class AOTFileManager; 7884514f5e3Sopenharmony_ci friend class GlobalIndexMap; 7894514f5e3Sopenharmony_ci}; 7904514f5e3Sopenharmony_ci} // namespace ecmascript 7914514f5e3Sopenharmony_ci} // namespace panda 7924514f5e3Sopenharmony_ci#endif // ECMASCRIPT_ECMA_CONTEXT_H 793