14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2021-2023 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_NAPI_INCLUDE_JSNAPI_H
174514f5e3Sopenharmony_ci#define ECMASCRIPT_NAPI_INCLUDE_JSNAPI_H
184514f5e3Sopenharmony_ci
194514f5e3Sopenharmony_ci#include <cassert>
204514f5e3Sopenharmony_ci#include <cstdint>
214514f5e3Sopenharmony_ci#include <functional>
224514f5e3Sopenharmony_ci#include <memory>
234514f5e3Sopenharmony_ci#include <shared_mutex>
244514f5e3Sopenharmony_ci#include <string>
254514f5e3Sopenharmony_ci#include <vector>
264514f5e3Sopenharmony_ci#include <map>
274514f5e3Sopenharmony_ci#include <sys/time.h>
284514f5e3Sopenharmony_ci
294514f5e3Sopenharmony_ci#include "ecmascript/base/aligned_struct.h"
304514f5e3Sopenharmony_ci#include "ecmascript/base/config.h"
314514f5e3Sopenharmony_ci#include "ecmascript/mem/mem_common.h"
324514f5e3Sopenharmony_ci#include "ecmascript/napi/include/jsnapi_expo.h"
334514f5e3Sopenharmony_ci#ifndef NDEBUG
344514f5e3Sopenharmony_ci#include "libpandabase/utils/debug.h"
354514f5e3Sopenharmony_ci#endif
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_ci#ifdef ERROR
384514f5e3Sopenharmony_ci#undef ERROR
394514f5e3Sopenharmony_ci#endif
404514f5e3Sopenharmony_ci
414514f5e3Sopenharmony_cinamespace panda {
424514f5e3Sopenharmony_ciclass JSNApiHelper;
434514f5e3Sopenharmony_ciclass EscapeLocalScope;
444514f5e3Sopenharmony_ciclass PromiseRejectInfo;
454514f5e3Sopenharmony_citemplate<typename T>
464514f5e3Sopenharmony_ciclass CopyableGlobal;
474514f5e3Sopenharmony_citemplate<typename T>
484514f5e3Sopenharmony_ciclass Global;
494514f5e3Sopenharmony_ciclass JSNApi;
504514f5e3Sopenharmony_citemplate<typename T>
514514f5e3Sopenharmony_ciclass Local;
524514f5e3Sopenharmony_ciclass JSValueRef;
534514f5e3Sopenharmony_ciclass PrimitiveRef;
544514f5e3Sopenharmony_ciclass ArrayRef;
554514f5e3Sopenharmony_ciclass BigIntRef;
564514f5e3Sopenharmony_ciclass StringRef;
574514f5e3Sopenharmony_ciclass ObjectRef;
584514f5e3Sopenharmony_ciclass FunctionRef;
594514f5e3Sopenharmony_ciclass NumberRef;
604514f5e3Sopenharmony_ciclass BooleanRef;
614514f5e3Sopenharmony_ciclass NativePointerRef;
624514f5e3Sopenharmony_ciclass JsiRuntimeCallInfo;
634514f5e3Sopenharmony_cinamespace test {
644514f5e3Sopenharmony_ciclass JSNApiTests;
654514f5e3Sopenharmony_ci}  // namespace test
664514f5e3Sopenharmony_ciclass BufferRef;
674514f5e3Sopenharmony_cinamespace ecmascript {
684514f5e3Sopenharmony_ciclass EcmaVM;
694514f5e3Sopenharmony_ciclass JSTaggedValue;
704514f5e3Sopenharmony_ciclass EcmaContext;
714514f5e3Sopenharmony_ciclass JSRuntimeOptions;
724514f5e3Sopenharmony_ciclass JSThread;
734514f5e3Sopenharmony_cistruct EcmaRuntimeCallInfo;
744514f5e3Sopenharmony_cistatic constexpr uint32_t DEFAULT_GC_POOL_SIZE = 256_MB;
754514f5e3Sopenharmony_cinamespace base {
764514f5e3Sopenharmony_citemplate<size_t ElementAlign, typename... Ts>
774514f5e3Sopenharmony_cistruct AlignedStruct;
784514f5e3Sopenharmony_cistruct AlignedPointer;
794514f5e3Sopenharmony_ci}
804514f5e3Sopenharmony_ci}  // namespace ecmascript
814514f5e3Sopenharmony_ci
824514f5e3Sopenharmony_ciusing WeakRefClearCallBack = void (*)(void *);
834514f5e3Sopenharmony_ciusing EcmaVM = ecmascript::EcmaVM;
844514f5e3Sopenharmony_ciusing EcmaContext = ecmascript::EcmaContext;
854514f5e3Sopenharmony_ciusing JSThread = ecmascript::JSThread;
864514f5e3Sopenharmony_ciusing JSTaggedType = uint64_t;
874514f5e3Sopenharmony_ciusing ConcurrentCallback = void (*)(Local<JSValueRef> result, bool success, void *taskInfo, void *data);
884514f5e3Sopenharmony_ciusing SourceMapTranslateCallback = std::function<bool(std::string& url, int& line, int& column)>;
894514f5e3Sopenharmony_ciusing DeviceDisconnectCallback = std::function<bool()>;
904514f5e3Sopenharmony_ci
914514f5e3Sopenharmony_cistatic constexpr size_t DEFAULT_GC_THREAD_NUM = 7;
924514f5e3Sopenharmony_cistatic constexpr size_t DEFAULT_LONG_PAUSE_TIME = 40;
934514f5e3Sopenharmony_ci
944514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API RegExpRef : public ObjectRef {
954514f5e3Sopenharmony_cipublic:
964514f5e3Sopenharmony_ci    Local<StringRef> GetOriginalSource(const EcmaVM *vm);
974514f5e3Sopenharmony_ci    std::string GetOriginalFlags(const EcmaVM *vm);
984514f5e3Sopenharmony_ci    Local<JSValueRef> IsGlobal(const EcmaVM *vm);
994514f5e3Sopenharmony_ci    Local<JSValueRef> IsIgnoreCase(const EcmaVM *vm);
1004514f5e3Sopenharmony_ci    Local<JSValueRef> IsMultiline(const EcmaVM *vm);
1014514f5e3Sopenharmony_ci    Local<JSValueRef> IsDotAll(const EcmaVM *vm);
1024514f5e3Sopenharmony_ci    Local<JSValueRef> IsUtf16(const EcmaVM *vm);
1034514f5e3Sopenharmony_ci    Local<JSValueRef> IsStick(const EcmaVM *vm);
1044514f5e3Sopenharmony_ci};
1054514f5e3Sopenharmony_ci
1064514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API GeneratorFunctionRef : public ObjectRef {
1074514f5e3Sopenharmony_cipublic:
1084514f5e3Sopenharmony_ci    bool IsGenerator(const EcmaVM *vm);
1094514f5e3Sopenharmony_ci};
1104514f5e3Sopenharmony_ci
1114514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API GeneratorObjectRef : public ObjectRef {
1124514f5e3Sopenharmony_cipublic:
1134514f5e3Sopenharmony_ci    Local<JSValueRef> GetGeneratorState(const EcmaVM *vm);
1144514f5e3Sopenharmony_ci    Local<JSValueRef> GetGeneratorFunction(const EcmaVM *vm);
1154514f5e3Sopenharmony_ci    Local<JSValueRef> GetGeneratorReceiver(const EcmaVM *vm);
1164514f5e3Sopenharmony_ci};
1174514f5e3Sopenharmony_ci
1184514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API CollatorRef : public ObjectRef {
1194514f5e3Sopenharmony_cipublic:
1204514f5e3Sopenharmony_ci    Local<JSValueRef> GetCompareFunction(const EcmaVM *vm);
1214514f5e3Sopenharmony_ci};
1224514f5e3Sopenharmony_ci
1234514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API DataTimeFormatRef : public ObjectRef {
1244514f5e3Sopenharmony_cipublic:
1254514f5e3Sopenharmony_ci    Local<JSValueRef> GetFormatFunction(const EcmaVM *vm);
1264514f5e3Sopenharmony_ci};
1274514f5e3Sopenharmony_ci
1284514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API NumberFormatRef : public ObjectRef {
1294514f5e3Sopenharmony_cipublic:
1304514f5e3Sopenharmony_ci    Local<JSValueRef> GetFormatFunction(const EcmaVM *vm);
1314514f5e3Sopenharmony_ci};
1324514f5e3Sopenharmony_ci
1334514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API JSON {
1344514f5e3Sopenharmony_cipublic:
1354514f5e3Sopenharmony_ci    static Local<JSValueRef> Parse(const EcmaVM *vm, Local<StringRef> string);
1364514f5e3Sopenharmony_ci    static Local<JSValueRef> Stringify(const EcmaVM *vm, Local<JSValueRef> json);
1374514f5e3Sopenharmony_ci};
1384514f5e3Sopenharmony_ci
1394514f5e3Sopenharmony_ciusing LOG_PRINT = int (*)(int id, int level, const char *tag, const char *fmt, const char *message);
1404514f5e3Sopenharmony_ci
1414514f5e3Sopenharmony_ciclass ECMA_PUBLIC_API RuntimeOption {
1424514f5e3Sopenharmony_cipublic:
1434514f5e3Sopenharmony_ci    enum class ECMA_PUBLIC_API GC_TYPE : uint8_t { EPSILON, GEN_GC, STW };
1444514f5e3Sopenharmony_ci    enum class ECMA_PUBLIC_API LOG_LEVEL : uint8_t {
1454514f5e3Sopenharmony_ci        DEBUG = 3,
1464514f5e3Sopenharmony_ci        INFO = 4,
1474514f5e3Sopenharmony_ci        WARN = 5,
1484514f5e3Sopenharmony_ci        ERROR = 6,
1494514f5e3Sopenharmony_ci        FATAL = 7,
1504514f5e3Sopenharmony_ci        FOLLOW = 100, // if hilog enabled follow hilog, otherwise use INFO level
1514514f5e3Sopenharmony_ci    };
1524514f5e3Sopenharmony_ci
1534514f5e3Sopenharmony_ci    // This enum should follow the same value as defined in the BMS subsystem.
1544514f5e3Sopenharmony_ci    // Refer to the specification in aot-guide_zh.md.
1554514f5e3Sopenharmony_ci    enum class AOTCompileStatus {
1564514f5e3Sopenharmony_ci        NOT_COMPILED = 0,
1574514f5e3Sopenharmony_ci        COMPILE_SUCCESS = 1,
1584514f5e3Sopenharmony_ci        COMPILE_FAILED = 2,
1594514f5e3Sopenharmony_ci        COMPILE_CRASH = 3,
1604514f5e3Sopenharmony_ci        COMPILE_CANCELLED = 4,
1614514f5e3Sopenharmony_ci    };
1624514f5e3Sopenharmony_ci
1634514f5e3Sopenharmony_ci    void SetGcType(GC_TYPE type)
1644514f5e3Sopenharmony_ci    {
1654514f5e3Sopenharmony_ci        gcType_ = type;
1664514f5e3Sopenharmony_ci    }
1674514f5e3Sopenharmony_ci
1684514f5e3Sopenharmony_ci    void SetGcPoolSize(uint32_t size)
1694514f5e3Sopenharmony_ci    {
1704514f5e3Sopenharmony_ci        gcPoolSize_ = size;
1714514f5e3Sopenharmony_ci    }
1724514f5e3Sopenharmony_ci
1734514f5e3Sopenharmony_ci    void SetLogLevel(LOG_LEVEL logLevel)
1744514f5e3Sopenharmony_ci    {
1754514f5e3Sopenharmony_ci        logLevel_ = logLevel;
1764514f5e3Sopenharmony_ci    }
1774514f5e3Sopenharmony_ci
1784514f5e3Sopenharmony_ci    void SetLogBufPrint(LOG_PRINT out)
1794514f5e3Sopenharmony_ci    {
1804514f5e3Sopenharmony_ci        logBufPrint_ = out;
1814514f5e3Sopenharmony_ci    }
1824514f5e3Sopenharmony_ci
1834514f5e3Sopenharmony_ci    void SetDebuggerLibraryPath(const std::string &path)
1844514f5e3Sopenharmony_ci    {
1854514f5e3Sopenharmony_ci        debuggerLibraryPath_ = path;
1864514f5e3Sopenharmony_ci    }
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ci    void SetEnableArkTools(bool value)
1894514f5e3Sopenharmony_ci    {
1904514f5e3Sopenharmony_ci        enableArkTools_ = value;
1914514f5e3Sopenharmony_ci    }
1924514f5e3Sopenharmony_ci
1934514f5e3Sopenharmony_ci    void SetEnableCpuprofiler(bool value)
1944514f5e3Sopenharmony_ci    {
1954514f5e3Sopenharmony_ci        enableCpuprofiler_ = value;
1964514f5e3Sopenharmony_ci    }
1974514f5e3Sopenharmony_ci
1984514f5e3Sopenharmony_ci    void SetArkProperties(int prop)
1994514f5e3Sopenharmony_ci    {
2004514f5e3Sopenharmony_ci        arkProperties_ = prop;
2014514f5e3Sopenharmony_ci    }
2024514f5e3Sopenharmony_ci
2034514f5e3Sopenharmony_ci    void SetArkBundleName(const std::string &bundleName)
2044514f5e3Sopenharmony_ci    {
2054514f5e3Sopenharmony_ci        arkBundleName_ = bundleName;
2064514f5e3Sopenharmony_ci    }
2074514f5e3Sopenharmony_ci
2084514f5e3Sopenharmony_ci    void SetMemConfigProperty(std::string configProperty)
2094514f5e3Sopenharmony_ci    {
2104514f5e3Sopenharmony_ci        memConfigProperty_ = configProperty;
2114514f5e3Sopenharmony_ci    }
2124514f5e3Sopenharmony_ci
2134514f5e3Sopenharmony_ci    void SetGcThreadNum(size_t num)
2144514f5e3Sopenharmony_ci    {
2154514f5e3Sopenharmony_ci        gcThreadNum_ = num;
2164514f5e3Sopenharmony_ci    }
2174514f5e3Sopenharmony_ci
2184514f5e3Sopenharmony_ci    void SetLongPauseTime(size_t time)
2194514f5e3Sopenharmony_ci    {
2204514f5e3Sopenharmony_ci        longPauseTime_ = time;
2214514f5e3Sopenharmony_ci    }
2224514f5e3Sopenharmony_ci
2234514f5e3Sopenharmony_ci    void SetEnableAsmInterpreter(bool value)
2244514f5e3Sopenharmony_ci    {
2254514f5e3Sopenharmony_ci        enableAsmInterpreter_ = value;
2264514f5e3Sopenharmony_ci    }
2274514f5e3Sopenharmony_ci
2284514f5e3Sopenharmony_ci    void SetEnableBuiltinsLazy(bool value)
2294514f5e3Sopenharmony_ci    {
2304514f5e3Sopenharmony_ci        enableBuiltinsLazy_ = value;
2314514f5e3Sopenharmony_ci    }
2324514f5e3Sopenharmony_ci
2334514f5e3Sopenharmony_ci    void SetAsmOpcodeDisableRange(const std::string &value)
2344514f5e3Sopenharmony_ci    {
2354514f5e3Sopenharmony_ci        asmOpcodeDisableRange_ = value;
2364514f5e3Sopenharmony_ci    }
2374514f5e3Sopenharmony_ci
2384514f5e3Sopenharmony_ci    void SetIsWorker()
2394514f5e3Sopenharmony_ci    {
2404514f5e3Sopenharmony_ci        isWorker_ = true;
2414514f5e3Sopenharmony_ci    }
2424514f5e3Sopenharmony_ci
2434514f5e3Sopenharmony_ci    bool GetIsWorker() const
2444514f5e3Sopenharmony_ci    {
2454514f5e3Sopenharmony_ci        return isWorker_;
2464514f5e3Sopenharmony_ci    }
2474514f5e3Sopenharmony_ci
2484514f5e3Sopenharmony_ci    inline void SetIsRestrictedWorker(bool isRestrictedWorker)
2494514f5e3Sopenharmony_ci    {
2504514f5e3Sopenharmony_ci        isRestrictedWorker_ = isRestrictedWorker;
2514514f5e3Sopenharmony_ci    }
2524514f5e3Sopenharmony_ci
2534514f5e3Sopenharmony_ci    bool GetIsRestrictedWorker() const
2544514f5e3Sopenharmony_ci    {
2554514f5e3Sopenharmony_ci        return isRestrictedWorker_;
2564514f5e3Sopenharmony_ci    }
2574514f5e3Sopenharmony_ci
2584514f5e3Sopenharmony_ci    void SetBundleName(const std::string &value)
2594514f5e3Sopenharmony_ci    {
2604514f5e3Sopenharmony_ci        bundleName_ = value;
2614514f5e3Sopenharmony_ci    }
2624514f5e3Sopenharmony_ci
2634514f5e3Sopenharmony_ci    void SetEnableAOT(bool value)
2644514f5e3Sopenharmony_ci    {
2654514f5e3Sopenharmony_ci        enableAOT_ = value;
2664514f5e3Sopenharmony_ci    }
2674514f5e3Sopenharmony_ci
2684514f5e3Sopenharmony_ci    void SetAnDir(const std::string &value)
2694514f5e3Sopenharmony_ci    {
2704514f5e3Sopenharmony_ci        anDir_ = value;
2714514f5e3Sopenharmony_ci    }
2724514f5e3Sopenharmony_ci
2734514f5e3Sopenharmony_ci    void SetEnableProfile(bool value)
2744514f5e3Sopenharmony_ci    {
2754514f5e3Sopenharmony_ci        enableProfile_ = value;
2764514f5e3Sopenharmony_ci    }
2774514f5e3Sopenharmony_ci
2784514f5e3Sopenharmony_ci    // Valid only when SetEnableProfile(true)
2794514f5e3Sopenharmony_ci    void SetProfileDir(const std::string &value)
2804514f5e3Sopenharmony_ci    {
2814514f5e3Sopenharmony_ci        profileDir_ = value;
2824514f5e3Sopenharmony_ci    }
2834514f5e3Sopenharmony_ci
2844514f5e3Sopenharmony_ci    void SetEnableJIT(bool value)
2854514f5e3Sopenharmony_ci    {
2864514f5e3Sopenharmony_ci        enableFastJIT_ = value;
2874514f5e3Sopenharmony_ci    }
2884514f5e3Sopenharmony_ci
2894514f5e3Sopenharmony_ci    void SetEnableBaselineJIT(bool value)
2904514f5e3Sopenharmony_ci    {
2914514f5e3Sopenharmony_ci        enableBaselineJIT_ = value;
2924514f5e3Sopenharmony_ci    }
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_ci    void SetAOTCompileStatusMap(const std::map<std::string, int32_t> &value)
2954514f5e3Sopenharmony_ci    {
2964514f5e3Sopenharmony_ci        aotCompileStatusMap_ = value;
2974514f5e3Sopenharmony_ci    }
2984514f5e3Sopenharmony_ci
2994514f5e3Sopenharmony_ci    const std::map<std::string, int32_t> &GetAOTCompileStatusMap() const
3004514f5e3Sopenharmony_ci    {
3014514f5e3Sopenharmony_ci        return aotCompileStatusMap_;
3024514f5e3Sopenharmony_ci    }
3034514f5e3Sopenharmony_ci
3044514f5e3Sopenharmony_ciprivate:
3054514f5e3Sopenharmony_ci    std::string GetGcType() const
3064514f5e3Sopenharmony_ci    {
3074514f5e3Sopenharmony_ci        std::string gcType;
3084514f5e3Sopenharmony_ci        switch (gcType_) {
3094514f5e3Sopenharmony_ci            case GC_TYPE::GEN_GC:
3104514f5e3Sopenharmony_ci                gcType = "gen-gc";
3114514f5e3Sopenharmony_ci                break;
3124514f5e3Sopenharmony_ci            case GC_TYPE::STW:
3134514f5e3Sopenharmony_ci                gcType = "stw";
3144514f5e3Sopenharmony_ci                break;
3154514f5e3Sopenharmony_ci            case GC_TYPE::EPSILON:
3164514f5e3Sopenharmony_ci                gcType = "epsilon";
3174514f5e3Sopenharmony_ci                break;
3184514f5e3Sopenharmony_ci            default:
3194514f5e3Sopenharmony_ci                break;
3204514f5e3Sopenharmony_ci        }
3214514f5e3Sopenharmony_ci        return gcType;
3224514f5e3Sopenharmony_ci    }
3234514f5e3Sopenharmony_ci
3244514f5e3Sopenharmony_ci    LOG_LEVEL GetLogLevel() const
3254514f5e3Sopenharmony_ci    {
3264514f5e3Sopenharmony_ci        return logLevel_;
3274514f5e3Sopenharmony_ci    }
3284514f5e3Sopenharmony_ci
3294514f5e3Sopenharmony_ci    uint32_t GetGcPoolSize() const
3304514f5e3Sopenharmony_ci    {
3314514f5e3Sopenharmony_ci        return gcPoolSize_;
3324514f5e3Sopenharmony_ci    }
3334514f5e3Sopenharmony_ci
3344514f5e3Sopenharmony_ci    LOG_PRINT GetLogBufPrint() const
3354514f5e3Sopenharmony_ci    {
3364514f5e3Sopenharmony_ci        return logBufPrint_;
3374514f5e3Sopenharmony_ci    }
3384514f5e3Sopenharmony_ci
3394514f5e3Sopenharmony_ci    std::string GetDebuggerLibraryPath() const
3404514f5e3Sopenharmony_ci    {
3414514f5e3Sopenharmony_ci        return debuggerLibraryPath_;
3424514f5e3Sopenharmony_ci    }
3434514f5e3Sopenharmony_ci
3444514f5e3Sopenharmony_ci    bool GetEnableArkTools() const
3454514f5e3Sopenharmony_ci    {
3464514f5e3Sopenharmony_ci        return enableArkTools_;
3474514f5e3Sopenharmony_ci    }
3484514f5e3Sopenharmony_ci
3494514f5e3Sopenharmony_ci    bool GetEnableCpuprofiler() const
3504514f5e3Sopenharmony_ci    {
3514514f5e3Sopenharmony_ci        return enableCpuprofiler_;
3524514f5e3Sopenharmony_ci    }
3534514f5e3Sopenharmony_ci
3544514f5e3Sopenharmony_ci    int GetArkProperties() const
3554514f5e3Sopenharmony_ci    {
3564514f5e3Sopenharmony_ci        return arkProperties_;
3574514f5e3Sopenharmony_ci    }
3584514f5e3Sopenharmony_ci
3594514f5e3Sopenharmony_ci    std::string GetArkBundleName() const
3604514f5e3Sopenharmony_ci    {
3614514f5e3Sopenharmony_ci        return arkBundleName_;
3624514f5e3Sopenharmony_ci    }
3634514f5e3Sopenharmony_ci
3644514f5e3Sopenharmony_ci    std::string GetMemConfigProperty() const
3654514f5e3Sopenharmony_ci    {
3664514f5e3Sopenharmony_ci        return memConfigProperty_;
3674514f5e3Sopenharmony_ci    }
3684514f5e3Sopenharmony_ci
3694514f5e3Sopenharmony_ci    size_t GetGcThreadNum() const
3704514f5e3Sopenharmony_ci    {
3714514f5e3Sopenharmony_ci        return gcThreadNum_;
3724514f5e3Sopenharmony_ci    }
3734514f5e3Sopenharmony_ci
3744514f5e3Sopenharmony_ci    size_t GetLongPauseTime() const
3754514f5e3Sopenharmony_ci    {
3764514f5e3Sopenharmony_ci        return longPauseTime_;
3774514f5e3Sopenharmony_ci    }
3784514f5e3Sopenharmony_ci
3794514f5e3Sopenharmony_ci    bool GetEnableAsmInterpreter() const
3804514f5e3Sopenharmony_ci    {
3814514f5e3Sopenharmony_ci        return enableAsmInterpreter_;
3824514f5e3Sopenharmony_ci    }
3834514f5e3Sopenharmony_ci
3844514f5e3Sopenharmony_ci    bool GetEnableBuiltinsLazy() const
3854514f5e3Sopenharmony_ci    {
3864514f5e3Sopenharmony_ci        return enableBuiltinsLazy_;
3874514f5e3Sopenharmony_ci    }
3884514f5e3Sopenharmony_ci
3894514f5e3Sopenharmony_ci    std::string GetAsmOpcodeDisableRange() const
3904514f5e3Sopenharmony_ci    {
3914514f5e3Sopenharmony_ci        return asmOpcodeDisableRange_;
3924514f5e3Sopenharmony_ci    }
3934514f5e3Sopenharmony_ci
3944514f5e3Sopenharmony_ci    std::string GetBundleName() const
3954514f5e3Sopenharmony_ci    {
3964514f5e3Sopenharmony_ci        return bundleName_;
3974514f5e3Sopenharmony_ci    }
3984514f5e3Sopenharmony_ci
3994514f5e3Sopenharmony_ci    bool GetEnableAOT() const
4004514f5e3Sopenharmony_ci    {
4014514f5e3Sopenharmony_ci        return enableAOT_;
4024514f5e3Sopenharmony_ci    }
4034514f5e3Sopenharmony_ci
4044514f5e3Sopenharmony_ci    std::string GetAnDir() const
4054514f5e3Sopenharmony_ci    {
4064514f5e3Sopenharmony_ci        return anDir_;
4074514f5e3Sopenharmony_ci    }
4084514f5e3Sopenharmony_ci
4094514f5e3Sopenharmony_ci    bool GetEnableProfile() const
4104514f5e3Sopenharmony_ci    {
4114514f5e3Sopenharmony_ci        return enableProfile_;
4124514f5e3Sopenharmony_ci    }
4134514f5e3Sopenharmony_ci
4144514f5e3Sopenharmony_ci    std::string GetProfileDir() const
4154514f5e3Sopenharmony_ci    {
4164514f5e3Sopenharmony_ci        return profileDir_;
4174514f5e3Sopenharmony_ci    }
4184514f5e3Sopenharmony_ci
4194514f5e3Sopenharmony_ci    bool GetEnableJIT() const
4204514f5e3Sopenharmony_ci    {
4214514f5e3Sopenharmony_ci        return enableFastJIT_;
4224514f5e3Sopenharmony_ci    }
4234514f5e3Sopenharmony_ci
4244514f5e3Sopenharmony_ci    bool GetEnableBaselineJIT() const
4254514f5e3Sopenharmony_ci    {
4264514f5e3Sopenharmony_ci        return enableBaselineJIT_;
4274514f5e3Sopenharmony_ci    }
4284514f5e3Sopenharmony_ci
4294514f5e3Sopenharmony_ci    GC_TYPE gcType_ = GC_TYPE::EPSILON;
4304514f5e3Sopenharmony_ci    LOG_LEVEL logLevel_ = LOG_LEVEL::DEBUG;
4314514f5e3Sopenharmony_ci    uint32_t gcPoolSize_ = ecmascript::DEFAULT_GC_POOL_SIZE;
4324514f5e3Sopenharmony_ci    LOG_PRINT logBufPrint_ {nullptr};
4334514f5e3Sopenharmony_ci    std::string debuggerLibraryPath_ {};
4344514f5e3Sopenharmony_ci    bool enableArkTools_ {false};
4354514f5e3Sopenharmony_ci    bool enableCpuprofiler_ {false};
4364514f5e3Sopenharmony_ci    int arkProperties_ {-1};
4374514f5e3Sopenharmony_ci    std::string arkBundleName_ = {""};
4384514f5e3Sopenharmony_ci    std::string memConfigProperty_ = {""};
4394514f5e3Sopenharmony_ci    size_t gcThreadNum_ {DEFAULT_GC_THREAD_NUM};
4404514f5e3Sopenharmony_ci    size_t longPauseTime_ {DEFAULT_LONG_PAUSE_TIME};
4414514f5e3Sopenharmony_ci    bool enableAsmInterpreter_ {true};
4424514f5e3Sopenharmony_ci    bool enableBuiltinsLazy_ {true};
4434514f5e3Sopenharmony_ci    bool isWorker_ {false};
4444514f5e3Sopenharmony_ci    bool isRestrictedWorker_ {false};
4454514f5e3Sopenharmony_ci    std::string asmOpcodeDisableRange_ {""};
4464514f5e3Sopenharmony_ci    std::string bundleName_ {};
4474514f5e3Sopenharmony_ci    bool enableAOT_ {false};
4484514f5e3Sopenharmony_ci    std::string anDir_ {};
4494514f5e3Sopenharmony_ci    bool enableProfile_ {false};
4504514f5e3Sopenharmony_ci    std::string profileDir_ {};
4514514f5e3Sopenharmony_ci    bool enableFastJIT_ {false};
4524514f5e3Sopenharmony_ci    bool enableBaselineJIT_ {false};
4534514f5e3Sopenharmony_ci    std::map<std::string, int32_t> aotCompileStatusMap_;
4544514f5e3Sopenharmony_ci    friend JSNApi;
4554514f5e3Sopenharmony_ci};
4564514f5e3Sopenharmony_ci
4574514f5e3Sopenharmony_citemplate<typename T>
4584514f5e3Sopenharmony_citemplate<typename S>
4594514f5e3Sopenharmony_ciGlobal<T>::Global(const EcmaVM *vm, const Local<S> &current) : vm_(vm)
4604514f5e3Sopenharmony_ci{
4614514f5e3Sopenharmony_ci    if (!current.IsEmpty()) {
4624514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*current));
4634514f5e3Sopenharmony_ci    }
4644514f5e3Sopenharmony_ci}
4654514f5e3Sopenharmony_ci
4664514f5e3Sopenharmony_citemplate<typename T>
4674514f5e3Sopenharmony_citemplate<typename S>
4684514f5e3Sopenharmony_ciGlobal<T>::Global(const EcmaVM *vm, const Global<S> &current) : vm_(vm)
4694514f5e3Sopenharmony_ci{
4704514f5e3Sopenharmony_ci    if (!current.IsEmpty()) {
4714514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*current));
4724514f5e3Sopenharmony_ci    }
4734514f5e3Sopenharmony_ci}
4744514f5e3Sopenharmony_ci
4754514f5e3Sopenharmony_citemplate<typename T>
4764514f5e3Sopenharmony_ciCopyableGlobal<T>::CopyableGlobal(const EcmaVM *vm, const Local<T> &current) : vm_(vm)
4774514f5e3Sopenharmony_ci{
4784514f5e3Sopenharmony_ci    if (!current.IsEmpty()) {
4794514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*current));
4804514f5e3Sopenharmony_ci    }
4814514f5e3Sopenharmony_ci}
4824514f5e3Sopenharmony_ci
4834514f5e3Sopenharmony_citemplate<typename T>
4844514f5e3Sopenharmony_citemplate<typename S>
4854514f5e3Sopenharmony_ciCopyableGlobal<T>::CopyableGlobal(const EcmaVM *vm, const Local<S> &current) : vm_(vm)
4864514f5e3Sopenharmony_ci{
4874514f5e3Sopenharmony_ci    if (!current.IsEmpty()) {
4884514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*current));
4894514f5e3Sopenharmony_ci    }
4904514f5e3Sopenharmony_ci}
4914514f5e3Sopenharmony_ci
4924514f5e3Sopenharmony_citemplate<typename T>
4934514f5e3Sopenharmony_civoid CopyableGlobal<T>::Copy(const CopyableGlobal &that)
4944514f5e3Sopenharmony_ci{
4954514f5e3Sopenharmony_ci    Free();
4964514f5e3Sopenharmony_ci    vm_ = that.vm_;
4974514f5e3Sopenharmony_ci    if (!that.IsEmpty()) {
4984514f5e3Sopenharmony_ci        ECMA_ASSERT(vm_ != nullptr);
4994514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*that));
5004514f5e3Sopenharmony_ci    }
5014514f5e3Sopenharmony_ci}
5024514f5e3Sopenharmony_ci
5034514f5e3Sopenharmony_citemplate<typename T>
5044514f5e3Sopenharmony_citemplate<typename S>
5054514f5e3Sopenharmony_civoid CopyableGlobal<T>::Copy(const CopyableGlobal<S> &that)
5064514f5e3Sopenharmony_ci{
5074514f5e3Sopenharmony_ci    Free();
5084514f5e3Sopenharmony_ci    vm_ = that.GetEcmaVM();
5094514f5e3Sopenharmony_ci    if (!that.IsEmpty()) {
5104514f5e3Sopenharmony_ci        ECMA_ASSERT(vm_ != nullptr);
5114514f5e3Sopenharmony_ci        address_ = JSNApi::GetGlobalHandleAddr(vm_, reinterpret_cast<uintptr_t>(*that));
5124514f5e3Sopenharmony_ci    }
5134514f5e3Sopenharmony_ci}
5144514f5e3Sopenharmony_ci
5154514f5e3Sopenharmony_citemplate<typename T>
5164514f5e3Sopenharmony_civoid CopyableGlobal<T>::Move(CopyableGlobal &that)
5174514f5e3Sopenharmony_ci{
5184514f5e3Sopenharmony_ci    Free();
5194514f5e3Sopenharmony_ci    vm_ = that.vm_;
5204514f5e3Sopenharmony_ci    address_ = that.address_;
5214514f5e3Sopenharmony_ci    that.vm_ = nullptr;
5224514f5e3Sopenharmony_ci    that.address_ = 0U;
5234514f5e3Sopenharmony_ci}
5244514f5e3Sopenharmony_ci
5254514f5e3Sopenharmony_citemplate<typename T>
5264514f5e3Sopenharmony_ciinline void CopyableGlobal<T>::Free()
5274514f5e3Sopenharmony_ci{
5284514f5e3Sopenharmony_ci    if (!IsEmpty()) {
5294514f5e3Sopenharmony_ci        JSNApi::DisposeGlobalHandleAddr(vm_, address_);
5304514f5e3Sopenharmony_ci        address_ = 0U;
5314514f5e3Sopenharmony_ci    }
5324514f5e3Sopenharmony_ci}
5334514f5e3Sopenharmony_ci
5344514f5e3Sopenharmony_citemplate <typename T>
5354514f5e3Sopenharmony_civoid CopyableGlobal<T>::SetWeakCallback(void *ref, WeakRefClearCallBack freeGlobalCallBack,
5364514f5e3Sopenharmony_ci                                        WeakRefClearCallBack nativeFinalizeCallback)
5374514f5e3Sopenharmony_ci{
5384514f5e3Sopenharmony_ci    address_ = JSNApi::SetWeakCallback(vm_, address_, ref, freeGlobalCallBack, nativeFinalizeCallback);
5394514f5e3Sopenharmony_ci}
5404514f5e3Sopenharmony_ci
5414514f5e3Sopenharmony_citemplate<typename T>
5424514f5e3Sopenharmony_civoid CopyableGlobal<T>::SetWeak()
5434514f5e3Sopenharmony_ci{
5444514f5e3Sopenharmony_ci    address_ = JSNApi::SetWeak(vm_, address_);
5454514f5e3Sopenharmony_ci}
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_citemplate<typename T>
5484514f5e3Sopenharmony_civoid CopyableGlobal<T>::ClearWeak()
5494514f5e3Sopenharmony_ci{
5504514f5e3Sopenharmony_ci    address_ = JSNApi::ClearWeak(vm_, address_);
5514514f5e3Sopenharmony_ci}
5524514f5e3Sopenharmony_ci
5534514f5e3Sopenharmony_citemplate<typename T>
5544514f5e3Sopenharmony_cibool CopyableGlobal<T>::IsWeak() const
5554514f5e3Sopenharmony_ci{
5564514f5e3Sopenharmony_ci    return JSNApi::IsWeak(vm_, address_);
5574514f5e3Sopenharmony_ci}
5584514f5e3Sopenharmony_ci
5594514f5e3Sopenharmony_citemplate<typename T>
5604514f5e3Sopenharmony_civoid Global<T>::Update(const Global &that)
5614514f5e3Sopenharmony_ci{
5624514f5e3Sopenharmony_ci    if (address_ != 0) {
5634514f5e3Sopenharmony_ci        JSNApi::DisposeGlobalHandleAddr(vm_, address_);
5644514f5e3Sopenharmony_ci    }
5654514f5e3Sopenharmony_ci    address_ = that.address_;
5664514f5e3Sopenharmony_ci    vm_ = that.vm_;
5674514f5e3Sopenharmony_ci}
5684514f5e3Sopenharmony_ci
5694514f5e3Sopenharmony_citemplate<typename T>
5704514f5e3Sopenharmony_civoid Global<T>::FreeGlobalHandleAddr()
5714514f5e3Sopenharmony_ci{
5724514f5e3Sopenharmony_ci    if (address_ == 0) {
5734514f5e3Sopenharmony_ci        return;
5744514f5e3Sopenharmony_ci    }
5754514f5e3Sopenharmony_ci    JSNApi::DisposeGlobalHandleAddr(vm_, address_);
5764514f5e3Sopenharmony_ci    address_ = 0;
5774514f5e3Sopenharmony_ci}
5784514f5e3Sopenharmony_ci
5794514f5e3Sopenharmony_citemplate<typename T>
5804514f5e3Sopenharmony_civoid Global<T>::SetWeak()
5814514f5e3Sopenharmony_ci{
5824514f5e3Sopenharmony_ci    address_ = JSNApi::SetWeak(vm_, address_);
5834514f5e3Sopenharmony_ci}
5844514f5e3Sopenharmony_ci
5854514f5e3Sopenharmony_citemplate <typename T>
5864514f5e3Sopenharmony_civoid Global<T>::SetWeakCallback(void *ref, WeakRefClearCallBack freeGlobalCallBack,
5874514f5e3Sopenharmony_ci                                WeakRefClearCallBack nativeFinalizeCallback)
5884514f5e3Sopenharmony_ci{
5894514f5e3Sopenharmony_ci    address_ = JSNApi::SetWeakCallback(vm_, address_, ref, freeGlobalCallBack, nativeFinalizeCallback);
5904514f5e3Sopenharmony_ci}
5914514f5e3Sopenharmony_ci
5924514f5e3Sopenharmony_citemplate<typename T>
5934514f5e3Sopenharmony_civoid Global<T>::ClearWeak()
5944514f5e3Sopenharmony_ci{
5954514f5e3Sopenharmony_ci    address_ = JSNApi::ClearWeak(vm_, address_);
5964514f5e3Sopenharmony_ci}
5974514f5e3Sopenharmony_ci
5984514f5e3Sopenharmony_citemplate<typename T>
5994514f5e3Sopenharmony_cibool Global<T>::IsWeak() const
6004514f5e3Sopenharmony_ci{
6014514f5e3Sopenharmony_ci    return JSNApi::IsWeak(vm_, address_);
6024514f5e3Sopenharmony_ci}
6034514f5e3Sopenharmony_ci
6044514f5e3Sopenharmony_ci// ---------------------------------- Local --------------------------------------------
6054514f5e3Sopenharmony_citemplate<typename T>
6064514f5e3Sopenharmony_ciLocal<T>::Local(const EcmaVM *vm, const CopyableGlobal<T> &current)
6074514f5e3Sopenharmony_ci{
6084514f5e3Sopenharmony_ci    address_ = JSNApi::GetHandleAddr(vm, reinterpret_cast<uintptr_t>(*current));
6094514f5e3Sopenharmony_ci}
6104514f5e3Sopenharmony_ci
6114514f5e3Sopenharmony_citemplate<typename T>
6124514f5e3Sopenharmony_ciLocal<T>::Local(const EcmaVM *vm, const Global<T> &current)
6134514f5e3Sopenharmony_ci{
6144514f5e3Sopenharmony_ci    address_ = JSNApi::GetHandleAddr(vm, reinterpret_cast<uintptr_t>(*current));
6154514f5e3Sopenharmony_ci}
6164514f5e3Sopenharmony_ci}  // namespace panda
6174514f5e3Sopenharmony_ci
6184514f5e3Sopenharmony_ci#undef ECMA_ASSERT
6194514f5e3Sopenharmony_ci#undef ECMA_PUBLIC_API
6204514f5e3Sopenharmony_ci#endif  // ECMASCRIPT_NAPI_INCLUDE_JSNAPI_H
621