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>(&regexpCache_));
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>(&regexpCache_);
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>(&regexpGlobal_));
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