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#include <array>
174514f5e3Sopenharmony_ci#include <cstdint>
184514f5e3Sopenharmony_ci#include <fcntl.h>
194514f5e3Sopenharmony_ci
204514f5e3Sopenharmony_ci#include "ecmascript/base/json_stringifier.h"
214514f5e3Sopenharmony_ci#include "ecmascript/base/typed_array_helper-inl.h"
224514f5e3Sopenharmony_ci#include "ecmascript/builtins/builtins_object.h"
234514f5e3Sopenharmony_ci#include "ecmascript/pgo_profiler/pgo_profiler_manager.h"
244514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
254514f5e3Sopenharmony_ci#include "ecmascript/dfx/cpu_profiler/cpu_profiler.h"
264514f5e3Sopenharmony_ci#endif
274514f5e3Sopenharmony_ci#include "ecmascript/checkpoint/thread_state_transition.h"
284514f5e3Sopenharmony_ci#include "ecmascript/ecma_global_storage.h"
294514f5e3Sopenharmony_ci#include "ecmascript/interpreter/fast_runtime_stub-inl.h"
304514f5e3Sopenharmony_ci#include "ecmascript/interpreter/interpreter_assembly.h"
314514f5e3Sopenharmony_ci#include "ecmascript/jsnapi_sendable.h"
324514f5e3Sopenharmony_ci#include "ecmascript/jspandafile/js_pandafile_executor.h"
334514f5e3Sopenharmony_ci#include "ecmascript/linked_hash_table.h"
344514f5e3Sopenharmony_ci#include "ecmascript/module/napi_module_loader.h"
354514f5e3Sopenharmony_ci#if defined(ENABLE_EXCEPTION_BACKTRACE)
364514f5e3Sopenharmony_ci#include "ecmascript/platform/backtrace.h"
374514f5e3Sopenharmony_ci#endif
384514f5e3Sopenharmony_ci#include "ecmascript/regexp/regexp_parser.h"
394514f5e3Sopenharmony_ci#include "ecmascript/serializer/base_deserializer.h"
404514f5e3Sopenharmony_ci#include "ecmascript/serializer/value_serializer.h"
414514f5e3Sopenharmony_ci#include "ecmascript/ohos/ohos_preload_app_info.h"
424514f5e3Sopenharmony_ci#include "ecmascript/platform/aot_crash_info.h"
434514f5e3Sopenharmony_ci#ifdef ARK_SUPPORT_INTL
444514f5e3Sopenharmony_ci#include "ecmascript/js_bigint.h"
454514f5e3Sopenharmony_ci#include "ecmascript/js_collator.h"
464514f5e3Sopenharmony_ci#include "ecmascript/js_date_time_format.h"
474514f5e3Sopenharmony_ci#include "ecmascript/js_number_format.h"
484514f5e3Sopenharmony_ci#endif
494514f5e3Sopenharmony_ci
504514f5e3Sopenharmony_cinamespace panda {
514514f5e3Sopenharmony_ciusing ecmascript::AccessorData;
524514f5e3Sopenharmony_ciusing ecmascript::BigInt;
534514f5e3Sopenharmony_ciusing ecmascript::ByteArray;
544514f5e3Sopenharmony_ciusing ecmascript::DataViewType;
554514f5e3Sopenharmony_ciusing ecmascript::ECMAObject;
564514f5e3Sopenharmony_ciusing ecmascript::EcmaRuntimeCallInfo;
574514f5e3Sopenharmony_ciusing ecmascript::EcmaString;
584514f5e3Sopenharmony_ciusing ecmascript::EcmaStringAccessor;
594514f5e3Sopenharmony_ciusing ecmascript::ErrorType;
604514f5e3Sopenharmony_ciusing ecmascript::FastRuntimeStub;
614514f5e3Sopenharmony_ciusing ecmascript::GeneratorContext;
624514f5e3Sopenharmony_ciusing ecmascript::GlobalEnv;
634514f5e3Sopenharmony_ciusing ecmascript::GlobalEnvConstants;
644514f5e3Sopenharmony_ciusing ecmascript::IterationKind;
654514f5e3Sopenharmony_ciusing ecmascript::JSArray;
664514f5e3Sopenharmony_ciusing ecmascript::JSArrayBuffer;
674514f5e3Sopenharmony_ciusing ecmascript::JSDataView;
684514f5e3Sopenharmony_ciusing ecmascript::JSDate;
694514f5e3Sopenharmony_ciusing ecmascript::JSFunction;
704514f5e3Sopenharmony_ciusing ecmascript::JSFunctionBase;
714514f5e3Sopenharmony_ciusing ecmascript::JSGeneratorFunction;
724514f5e3Sopenharmony_ciusing ecmascript::JSGeneratorObject;
734514f5e3Sopenharmony_ciusing ecmascript::JSGeneratorState;
744514f5e3Sopenharmony_ciusing ecmascript::JSHClass;
754514f5e3Sopenharmony_ciusing ecmascript::JSIterator;
764514f5e3Sopenharmony_ciusing ecmascript::JSMap;
774514f5e3Sopenharmony_ciusing ecmascript::JSMapIterator;
784514f5e3Sopenharmony_ciusing ecmascript::JSNapiSendable;
794514f5e3Sopenharmony_ciusing ecmascript::JSNativePointer;
804514f5e3Sopenharmony_ciusing ecmascript::JSObject;
814514f5e3Sopenharmony_ciusing ecmascript::JSPandaFile;
824514f5e3Sopenharmony_ciusing ecmascript::JSPandaFileManager;
834514f5e3Sopenharmony_ciusing ecmascript::JSPrimitiveRef;
844514f5e3Sopenharmony_ciusing ecmascript::JSPromise;
854514f5e3Sopenharmony_ciusing ecmascript::JSProxy;
864514f5e3Sopenharmony_ciusing ecmascript::ObjectFastOperator;
874514f5e3Sopenharmony_ciusing ecmascript::JSRegExp;
884514f5e3Sopenharmony_ciusing ecmascript::JSRuntimeOptions;
894514f5e3Sopenharmony_ciusing ecmascript::JSSet;
904514f5e3Sopenharmony_ciusing ecmascript::JSSetIterator;
914514f5e3Sopenharmony_ciusing ecmascript::JSSymbol;
924514f5e3Sopenharmony_ciusing ecmascript::JSTaggedNumber;
934514f5e3Sopenharmony_ciusing ecmascript::JSTaggedType;
944514f5e3Sopenharmony_ciusing ecmascript::JSTaggedValue;
954514f5e3Sopenharmony_ciusing ecmascript::JSThread;
964514f5e3Sopenharmony_ciusing ecmascript::JSTypedArray;
974514f5e3Sopenharmony_ciusing ecmascript::LinkedHashMap;
984514f5e3Sopenharmony_ciusing ecmascript::LinkedHashSet;
994514f5e3Sopenharmony_ciusing ecmascript::LockHolder;
1004514f5e3Sopenharmony_ciusing ecmascript::MemMapAllocator;
1014514f5e3Sopenharmony_ciusing ecmascript::Method;
1024514f5e3Sopenharmony_ciusing ecmascript::NativeModuleFailureInfo;
1034514f5e3Sopenharmony_ciusing ecmascript::Mutex;
1044514f5e3Sopenharmony_ciusing ecmascript::ObjectFactory;
1054514f5e3Sopenharmony_ciusing ecmascript::OperationResult;
1064514f5e3Sopenharmony_ciusing ecmascript::PromiseCapability;
1074514f5e3Sopenharmony_ciusing ecmascript::PropertyDescriptor;
1084514f5e3Sopenharmony_ciusing ecmascript::Region;
1094514f5e3Sopenharmony_ciusing ecmascript::TaggedArray;
1104514f5e3Sopenharmony_ciusing ecmascript::base::BuiltinsBase;
1114514f5e3Sopenharmony_ciusing ecmascript::base::JsonStringifier;
1124514f5e3Sopenharmony_ciusing ecmascript::base::StringHelper;
1134514f5e3Sopenharmony_ciusing ecmascript::base::TypedArrayHelper;
1144514f5e3Sopenharmony_ciusing ecmascript::base::Utf16JsonParser;
1154514f5e3Sopenharmony_ciusing ecmascript::base::Utf8JsonParser;
1164514f5e3Sopenharmony_ciusing ecmascript::builtins::BuiltinsObject;
1174514f5e3Sopenharmony_ciusing ecmascript::job::MicroJobQueue;
1184514f5e3Sopenharmony_ciusing ecmascript::job::QueueType;
1194514f5e3Sopenharmony_ci#ifdef ARK_SUPPORT_INTL
1204514f5e3Sopenharmony_ciusing ecmascript::JSCollator;
1214514f5e3Sopenharmony_ciusing ecmascript::JSDateTimeFormat;
1224514f5e3Sopenharmony_ciusing ecmascript::JSNumberFormat;
1234514f5e3Sopenharmony_ci#endif
1244514f5e3Sopenharmony_ciusing ecmascript::DebugInfoExtractor;
1254514f5e3Sopenharmony_ciusing ecmascript::EcmaContext;
1264514f5e3Sopenharmony_ciusing ecmascript::JSWeakMap;
1274514f5e3Sopenharmony_ciusing ecmascript::JSWeakSet;
1284514f5e3Sopenharmony_ciusing ecmascript::Log;
1294514f5e3Sopenharmony_ciusing ecmascript::PatchErrorCode;
1304514f5e3Sopenharmony_ciusing ecmascript::RegExpParser;
1314514f5e3Sopenharmony_ciusing ecmascript::base::NumberHelper;
1324514f5e3Sopenharmony_citemplate <typename T>
1334514f5e3Sopenharmony_ciusing JSHandle = ecmascript::JSHandle<T>;
1344514f5e3Sopenharmony_citemplate <typename T>
1354514f5e3Sopenharmony_ciusing JSMutableHandle = ecmascript::JSMutableHandle<T>;
1364514f5e3Sopenharmony_ci
1374514f5e3Sopenharmony_ciusing PathHelper = ecmascript::base::PathHelper;
1384514f5e3Sopenharmony_ciusing ModulePathHelper = ecmascript::ModulePathHelper;
1394514f5e3Sopenharmony_ciusing JsDebuggerManager = ecmascript::tooling::JsDebuggerManager;
1404514f5e3Sopenharmony_ciusing FrameIterator = ecmascript::FrameIterator;
1414514f5e3Sopenharmony_ciusing Concurrent = ecmascript::Concurrent;
1424514f5e3Sopenharmony_ciusing EnableAotJitListHelper = ecmascript::ohos::EnableAotJitListHelper;
1434514f5e3Sopenharmony_ciusing PGOProfilerManager = ecmascript::pgo::PGOProfilerManager;
1444514f5e3Sopenharmony_ciusing AotRuntimeInfo = ecmascript::ohos::AotRuntimeInfo;
1454514f5e3Sopenharmony_ci
1464514f5e3Sopenharmony_cinamespace {
1474514f5e3Sopenharmony_ci// NOLINTNEXTLINE(fuchsia-statically-constructed-objects)
1484514f5e3Sopenharmony_ciconstexpr std::string_view ENTRY_POINTER = "_GLOBAL::func_main_0";
1494514f5e3Sopenharmony_ci}
1504514f5e3Sopenharmony_ci
1514514f5e3Sopenharmony_ciint JSNApi::vmCount_ = 0;
1524514f5e3Sopenharmony_cibool JSNApi::initialize_ = false;
1534514f5e3Sopenharmony_cibool JSNApi::isForked_ = false;
1544514f5e3Sopenharmony_cistatic Mutex *mutex = new panda::Mutex();
1554514f5e3Sopenharmony_ciStartIdleMonitorCallback JSNApi::startIdleMonitorCallback_ = nullptr;
1564514f5e3Sopenharmony_ci
1574514f5e3Sopenharmony_ci// ----------------------------------- JSValueRef --------------------------------------
1584514f5e3Sopenharmony_ciLocal<PrimitiveRef> JSValueRef::Undefined(const EcmaVM *vm)
1594514f5e3Sopenharmony_ci{
1604514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PrimitiveRef>(
1614514f5e3Sopenharmony_ci        vm->GetJSThread()->GlobalConstants()->GetHandledUndefined());
1624514f5e3Sopenharmony_ci}
1634514f5e3Sopenharmony_ci
1644514f5e3Sopenharmony_ciLocal<PrimitiveRef> JSValueRef::Null(const EcmaVM *vm)
1654514f5e3Sopenharmony_ci{
1664514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PrimitiveRef>(
1674514f5e3Sopenharmony_ci        vm->GetJSThread()->GlobalConstants()->GetHandledNull());
1684514f5e3Sopenharmony_ci}
1694514f5e3Sopenharmony_ci
1704514f5e3Sopenharmony_ciLocal<PrimitiveRef> JSValueRef::Hole(const EcmaVM *vm)
1714514f5e3Sopenharmony_ci{
1724514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PrimitiveRef>(
1734514f5e3Sopenharmony_ci        vm->GetJSThread()->GlobalConstants()->GetHandledHole());
1744514f5e3Sopenharmony_ci}
1754514f5e3Sopenharmony_ci
1764514f5e3Sopenharmony_ciLocal<PrimitiveRef> JSValueRef::True(const EcmaVM *vm)
1774514f5e3Sopenharmony_ci{
1784514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PrimitiveRef>(
1794514f5e3Sopenharmony_ci        vm->GetJSThread()->GlobalConstants()->GetHandledTrue());
1804514f5e3Sopenharmony_ci}
1814514f5e3Sopenharmony_ci
1824514f5e3Sopenharmony_ciLocal<PrimitiveRef> JSValueRef::False(const EcmaVM *vm)
1834514f5e3Sopenharmony_ci{
1844514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PrimitiveRef>(
1854514f5e3Sopenharmony_ci        vm->GetJSThread()->GlobalConstants()->GetHandledFalse());
1864514f5e3Sopenharmony_ci}
1874514f5e3Sopenharmony_ci
1884514f5e3Sopenharmony_ciLocal<ObjectRef> JSValueRef::ToObject(const EcmaVM *vm)
1894514f5e3Sopenharmony_ci{
1904514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
1914514f5e3Sopenharmony_ci    if (IsUndefined() || IsNull()) {
1924514f5e3Sopenharmony_ci        return Undefined(vm);
1934514f5e3Sopenharmony_ci    }
1944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
1954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(JSTaggedValue::ToObject(thread, JSNApiHelper::ToJSHandle(this)));
1964514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
1974514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
1984514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(obj);
1994514f5e3Sopenharmony_ci}
2004514f5e3Sopenharmony_ci
2014514f5e3Sopenharmony_ciLocal<ObjectRef> JSValueRef::ToEcmaObject(const EcmaVM *vm)
2024514f5e3Sopenharmony_ci{
2034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
2044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2054514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
2064514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
2074514f5e3Sopenharmony_ci    if (obj->IsECMAObject()) {
2084514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
2094514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<ObjectRef>(obj);
2104514f5e3Sopenharmony_ci    }
2114514f5e3Sopenharmony_ci
2124514f5e3Sopenharmony_ci    return Undefined(vm);
2134514f5e3Sopenharmony_ci}
2144514f5e3Sopenharmony_ci
2154514f5e3Sopenharmony_ciLocal<StringRef> JSValueRef::ToString(const EcmaVM *vm)
2164514f5e3Sopenharmony_ci{
2174514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
2184514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
2204514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
2214514f5e3Sopenharmony_ci    if (!obj->IsString()) {
2224514f5e3Sopenharmony_ci        obj = JSHandle<JSTaggedValue>(JSTaggedValue::ToString(thread, obj));
2234514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
2244514f5e3Sopenharmony_ci    }
2254514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(obj);
2264514f5e3Sopenharmony_ci}
2274514f5e3Sopenharmony_ci
2284514f5e3Sopenharmony_ciLocal<NativePointerRef> JSValueRef::ToNativePointer(const EcmaVM *vm)
2294514f5e3Sopenharmony_ci{
2304514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
2314514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2324514f5e3Sopenharmony_ci    // The function just get handle' value, and will not read and write js object. Don't need to switch state.
2334514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
2344514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
2354514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NativePointerRef>(obj);
2364514f5e3Sopenharmony_ci}
2374514f5e3Sopenharmony_ci
2384514f5e3Sopenharmony_cibool JSValueRef::BooleaValue(const EcmaVM *vm)
2394514f5e3Sopenharmony_ci{
2404514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2414514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).ToBoolean();
2424514f5e3Sopenharmony_ci}
2434514f5e3Sopenharmony_ci
2444514f5e3Sopenharmony_ciint64_t JSValueRef::IntegerValue(const EcmaVM *vm)
2454514f5e3Sopenharmony_ci{
2464514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
2474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> tagged = JSNApiHelper::ToJSHandle(this);
2494514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(tagged, ERROR);
2504514f5e3Sopenharmony_ci    if (tagged->IsNumber()) {
2514514f5e3Sopenharmony_ci        if (!NumberHelper::IsFinite(tagged.GetTaggedValue()) || NumberHelper::IsNaN(tagged.GetTaggedValue())) {
2524514f5e3Sopenharmony_ci            return 0;
2534514f5e3Sopenharmony_ci        } else {
2544514f5e3Sopenharmony_ci            return NumberHelper::DoubleToInt64(tagged->GetNumber());
2554514f5e3Sopenharmony_ci        }
2564514f5e3Sopenharmony_ci    }
2574514f5e3Sopenharmony_ci    JSTaggedNumber number = JSTaggedValue::ToInteger(thread, tagged);
2584514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, 0);
2594514f5e3Sopenharmony_ci    return NumberHelper::DoubleToInt64(number.GetNumber());
2604514f5e3Sopenharmony_ci}
2614514f5e3Sopenharmony_ci
2624514f5e3Sopenharmony_ciuint32_t JSValueRef::Uint32Value(const EcmaVM *vm)
2634514f5e3Sopenharmony_ci{
2644514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
2654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> tagged = JSNApiHelper::ToJSHandle(this);
2674514f5e3Sopenharmony_ci    uint32_t number = 0;
2684514f5e3Sopenharmony_ci    if (!tagged->IsECMAObject()) {
2694514f5e3Sopenharmony_ci        number = JSTaggedValue::ToUint32(thread, tagged);
2704514f5e3Sopenharmony_ci    } else {
2714514f5e3Sopenharmony_ci        // EcmaObject may call [Symbol.toPrimitive].
2724514f5e3Sopenharmony_ci        number = JSTaggedValue::ToUint32(thread, tagged);
2734514f5e3Sopenharmony_ci    }
2744514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, 0);
2754514f5e3Sopenharmony_ci    return number;
2764514f5e3Sopenharmony_ci}
2774514f5e3Sopenharmony_ci
2784514f5e3Sopenharmony_ciint32_t JSValueRef::Int32Value(const EcmaVM *vm)
2794514f5e3Sopenharmony_ci{
2804514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
2814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
2824514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> tagged = JSNApiHelper::ToJSHandle(this);
2834514f5e3Sopenharmony_ci    int32_t number = 0;
2844514f5e3Sopenharmony_ci    if (!tagged->IsECMAObject()) {
2854514f5e3Sopenharmony_ci        number = JSTaggedValue::ToInt32(thread, tagged);
2864514f5e3Sopenharmony_ci    } else {
2874514f5e3Sopenharmony_ci        // EcmaObject may call [Symbol.toPrimitive].
2884514f5e3Sopenharmony_ci        number = JSTaggedValue::ToInt32(thread, tagged);
2894514f5e3Sopenharmony_ci    }
2904514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, 0);
2914514f5e3Sopenharmony_ci    return number;
2924514f5e3Sopenharmony_ci}
2934514f5e3Sopenharmony_ci
2944514f5e3Sopenharmony_cidouble JSValueRef::GetValueDouble(bool &isNumber)
2954514f5e3Sopenharmony_ci{
2964514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
2974514f5e3Sopenharmony_ci    if (value.IsInt()) {
2984514f5e3Sopenharmony_ci        isNumber = true;
2994514f5e3Sopenharmony_ci        return static_cast<double>(value.GetInt());
3004514f5e3Sopenharmony_ci    }
3014514f5e3Sopenharmony_ci    if (value.IsDouble()) {
3024514f5e3Sopenharmony_ci        isNumber = true;
3034514f5e3Sopenharmony_ci        return value.GetDouble();
3044514f5e3Sopenharmony_ci    }
3054514f5e3Sopenharmony_ci    isNumber = false;
3064514f5e3Sopenharmony_ci    return 0.0;
3074514f5e3Sopenharmony_ci}
3084514f5e3Sopenharmony_ci
3094514f5e3Sopenharmony_ciint32_t JSValueRef::GetValueInt32(bool &isNumber)
3104514f5e3Sopenharmony_ci{
3114514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
3124514f5e3Sopenharmony_ci    if (value.IsInt()) {
3134514f5e3Sopenharmony_ci        isNumber = true;
3144514f5e3Sopenharmony_ci        return value.GetInt();
3154514f5e3Sopenharmony_ci    }
3164514f5e3Sopenharmony_ci    if (value.IsDouble()) {
3174514f5e3Sopenharmony_ci        isNumber = true;
3184514f5e3Sopenharmony_ci        return static_cast<int32_t>(ecmascript::base::NumberHelper::DoubleToInt(value.GetDouble(),
3194514f5e3Sopenharmony_ci            ecmascript::base::INT32_BITS));
3204514f5e3Sopenharmony_ci    }
3214514f5e3Sopenharmony_ci    isNumber = false;
3224514f5e3Sopenharmony_ci    return 0;
3234514f5e3Sopenharmony_ci}
3244514f5e3Sopenharmony_ci
3254514f5e3Sopenharmony_ciuint32_t JSValueRef::GetValueUint32(bool &isNumber)
3264514f5e3Sopenharmony_ci{
3274514f5e3Sopenharmony_ci    return static_cast<uint32_t>(GetValueInt32(isNumber));
3284514f5e3Sopenharmony_ci}
3294514f5e3Sopenharmony_ci
3304514f5e3Sopenharmony_ciint64_t JSValueRef::GetValueInt64(bool &isNumber)
3314514f5e3Sopenharmony_ci{
3324514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
3334514f5e3Sopenharmony_ci    if (value.IsInt()) {
3344514f5e3Sopenharmony_ci        isNumber = true;
3354514f5e3Sopenharmony_ci        return static_cast<int64_t>(value.GetInt());
3364514f5e3Sopenharmony_ci    }
3374514f5e3Sopenharmony_ci    if (value.IsDouble()) {
3384514f5e3Sopenharmony_ci        isNumber = true;
3394514f5e3Sopenharmony_ci        double getVale = value.GetDouble();
3404514f5e3Sopenharmony_ci        if (!std::isfinite(getVale) || std::isnan(getVale)) {
3414514f5e3Sopenharmony_ci            return 0;
3424514f5e3Sopenharmony_ci        }
3434514f5e3Sopenharmony_ci        return NumberHelper::DoubleToInt64(getVale);
3444514f5e3Sopenharmony_ci    }
3454514f5e3Sopenharmony_ci    isNumber = false;
3464514f5e3Sopenharmony_ci    return 0;
3474514f5e3Sopenharmony_ci}
3484514f5e3Sopenharmony_ci
3494514f5e3Sopenharmony_cibool JSValueRef::GetValueBool(bool &isBool)
3504514f5e3Sopenharmony_ci{
3514514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
3524514f5e3Sopenharmony_ci    if (value.IsTrue()) {
3534514f5e3Sopenharmony_ci        isBool = true;
3544514f5e3Sopenharmony_ci        return true;
3554514f5e3Sopenharmony_ci    }
3564514f5e3Sopenharmony_ci    if (value.IsFalse()) {
3574514f5e3Sopenharmony_ci        isBool = true;
3584514f5e3Sopenharmony_ci        return false;
3594514f5e3Sopenharmony_ci    }
3604514f5e3Sopenharmony_ci    isBool = false;
3614514f5e3Sopenharmony_ci    return false;
3624514f5e3Sopenharmony_ci}
3634514f5e3Sopenharmony_ci
3644514f5e3Sopenharmony_ciLocal<BooleanRef> JSValueRef::ToBoolean(const EcmaVM *vm)
3654514f5e3Sopenharmony_ci{
3664514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
3674514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
3684514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
3694514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
3704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> booleanObj(thread, JSTaggedValue(obj->ToBoolean()));
3714514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BooleanRef>(booleanObj);
3724514f5e3Sopenharmony_ci}
3734514f5e3Sopenharmony_ci
3744514f5e3Sopenharmony_ciLocal<BigIntRef> JSValueRef::ToBigInt(const EcmaVM *vm)
3754514f5e3Sopenharmony_ci{
3764514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
3774514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
3784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
3794514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
3804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigIntObj(thread, JSTaggedValue::ToBigInt(thread, obj));
3814514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
3824514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BigIntRef>(bigIntObj);
3834514f5e3Sopenharmony_ci}
3844514f5e3Sopenharmony_ci
3854514f5e3Sopenharmony_ciLocal<NumberRef> JSValueRef::ToNumber(const EcmaVM *vm)
3864514f5e3Sopenharmony_ci{
3874514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
3884514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
3894514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
3904514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
3914514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> number(thread, JSTaggedValue::ToNumber(thread, obj));
3924514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
3934514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NumberRef>(number);
3944514f5e3Sopenharmony_ci}
3954514f5e3Sopenharmony_ci
3964514f5e3Sopenharmony_cibool JSValueRef::IsStrictEquals(const EcmaVM *vm, Local<JSValueRef> value)
3974514f5e3Sopenharmony_ci{
3984514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
3994514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4004514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> xValue = JSNApiHelper::ToJSHandle(this);
4014514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(xValue, ERROR);
4024514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> yValue = JSNApiHelper::ToJSHandle(value);
4034514f5e3Sopenharmony_ci    return JSTaggedValue::StrictEqual(thread, xValue, yValue);
4044514f5e3Sopenharmony_ci}
4054514f5e3Sopenharmony_ci
4064514f5e3Sopenharmony_ciLocal<StringRef> JSValueRef::Typeof(const EcmaVM *vm)
4074514f5e3Sopenharmony_ci{
4084514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
4094514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4104514f5e3Sopenharmony_ci    JSTaggedValue value = FastRuntimeStub::FastTypeOf(thread, JSNApiHelper::ToJSTaggedValue(this));
4114514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(JSHandle<JSTaggedValue>(thread, value));
4124514f5e3Sopenharmony_ci}
4134514f5e3Sopenharmony_ci
4144514f5e3Sopenharmony_cibool JSValueRef::InstanceOf(const EcmaVM *vm, Local<JSValueRef> value)
4154514f5e3Sopenharmony_ci{
4164514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
4174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4184514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> origin = JSNApiHelper::ToJSHandle(this);
4194514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(origin, ERROR);
4204514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> target = JSNApiHelper::ToJSHandle(value);
4214514f5e3Sopenharmony_ci    return JSObject::InstanceOf(thread, origin, target);
4224514f5e3Sopenharmony_ci}
4234514f5e3Sopenharmony_ci
4244514f5e3Sopenharmony_ci// Omit exception check for JSValueRef::IsXxx because ark calls here may not
4254514f5e3Sopenharmony_ci// cause side effect even pending exception exists.
4264514f5e3Sopenharmony_cibool JSValueRef::IsUndefined()
4274514f5e3Sopenharmony_ci{
4284514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsUndefined();
4294514f5e3Sopenharmony_ci}
4304514f5e3Sopenharmony_ci
4314514f5e3Sopenharmony_cibool JSValueRef::IsNull()
4324514f5e3Sopenharmony_ci{
4334514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsNull();
4344514f5e3Sopenharmony_ci}
4354514f5e3Sopenharmony_ci
4364514f5e3Sopenharmony_cibool JSValueRef::IsHole()
4374514f5e3Sopenharmony_ci{
4384514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsHole();
4394514f5e3Sopenharmony_ci}
4404514f5e3Sopenharmony_ci
4414514f5e3Sopenharmony_cibool JSValueRef::IsTrue()
4424514f5e3Sopenharmony_ci{
4434514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsTrue();
4444514f5e3Sopenharmony_ci}
4454514f5e3Sopenharmony_ci
4464514f5e3Sopenharmony_cibool JSValueRef::IsFalse()
4474514f5e3Sopenharmony_ci{
4484514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsFalse();
4494514f5e3Sopenharmony_ci}
4504514f5e3Sopenharmony_ci
4514514f5e3Sopenharmony_cibool JSValueRef::IsNumber()
4524514f5e3Sopenharmony_ci{
4534514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsNumber();
4544514f5e3Sopenharmony_ci}
4554514f5e3Sopenharmony_ci
4564514f5e3Sopenharmony_cibool JSValueRef::IsBigInt(const EcmaVM *vm)
4574514f5e3Sopenharmony_ci{
4584514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4594514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsBigInt();
4604514f5e3Sopenharmony_ci}
4614514f5e3Sopenharmony_ci
4624514f5e3Sopenharmony_cibool JSValueRef::IsInt()
4634514f5e3Sopenharmony_ci{
4644514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsInt();
4654514f5e3Sopenharmony_ci}
4664514f5e3Sopenharmony_ci
4674514f5e3Sopenharmony_cibool JSValueRef::WithinInt32()
4684514f5e3Sopenharmony_ci{
4694514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).WithinInt32();
4704514f5e3Sopenharmony_ci}
4714514f5e3Sopenharmony_ci
4724514f5e3Sopenharmony_cibool JSValueRef::IsBoolean()
4734514f5e3Sopenharmony_ci{
4744514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsBoolean();
4754514f5e3Sopenharmony_ci}
4764514f5e3Sopenharmony_ci
4774514f5e3Sopenharmony_cibool JSValueRef::IsString(const EcmaVM *vm)
4784514f5e3Sopenharmony_ci{
4794514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4804514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsString();
4814514f5e3Sopenharmony_ci}
4824514f5e3Sopenharmony_ci
4834514f5e3Sopenharmony_cibool JSValueRef::IsSymbol(const EcmaVM *vm)
4844514f5e3Sopenharmony_ci{
4854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4864514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsSymbol();
4874514f5e3Sopenharmony_ci}
4884514f5e3Sopenharmony_ci
4894514f5e3Sopenharmony_cibool JSValueRef::IsObject(const EcmaVM *vm)
4904514f5e3Sopenharmony_ci{
4914514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4924514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsECMAObject();
4934514f5e3Sopenharmony_ci}
4944514f5e3Sopenharmony_ci
4954514f5e3Sopenharmony_cibool JSValueRef::IsArray(const EcmaVM *vm)
4964514f5e3Sopenharmony_ci{
4974514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
4984514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
4994514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsArray(thread);
5004514f5e3Sopenharmony_ci}
5014514f5e3Sopenharmony_ci
5024514f5e3Sopenharmony_cibool JSValueRef::IsJSArray(const EcmaVM *vm)
5034514f5e3Sopenharmony_ci{
5044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5054514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSArray();
5064514f5e3Sopenharmony_ci}
5074514f5e3Sopenharmony_ci
5084514f5e3Sopenharmony_cibool JSValueRef::IsConstructor(const EcmaVM *vm)
5094514f5e3Sopenharmony_ci{
5104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5114514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
5124514f5e3Sopenharmony_ci    return value.IsHeapObject() && value.IsConstructor();
5134514f5e3Sopenharmony_ci}
5144514f5e3Sopenharmony_ci
5154514f5e3Sopenharmony_cibool JSValueRef::IsFunction(const EcmaVM *vm)
5164514f5e3Sopenharmony_ci{
5174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5184514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
5194514f5e3Sopenharmony_ci    return value.IsCallable();
5204514f5e3Sopenharmony_ci}
5214514f5e3Sopenharmony_ci
5224514f5e3Sopenharmony_cibool JSValueRef::IsJSFunction(const EcmaVM *vm)
5234514f5e3Sopenharmony_ci{
5244514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5254514f5e3Sopenharmony_ci    JSTaggedValue value = JSNApiHelper::ToJSTaggedValue(this);
5264514f5e3Sopenharmony_ci    return value.IsJSFunction();
5274514f5e3Sopenharmony_ci}
5284514f5e3Sopenharmony_ci
5294514f5e3Sopenharmony_cibool JSValueRef::IsProxy(const EcmaVM *vm)
5304514f5e3Sopenharmony_ci{
5314514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5324514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSProxy();
5334514f5e3Sopenharmony_ci}
5344514f5e3Sopenharmony_ci
5354514f5e3Sopenharmony_cibool JSValueRef::IsPromise(const EcmaVM *vm)
5364514f5e3Sopenharmony_ci{
5374514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5384514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSPromise();
5394514f5e3Sopenharmony_ci}
5404514f5e3Sopenharmony_ci
5414514f5e3Sopenharmony_cibool JSValueRef::IsDataView(const EcmaVM *vm)
5424514f5e3Sopenharmony_ci{
5434514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5444514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsDataView();
5454514f5e3Sopenharmony_ci}
5464514f5e3Sopenharmony_ci
5474514f5e3Sopenharmony_cibool JSValueRef::IsTypedArray(const EcmaVM *vm)
5484514f5e3Sopenharmony_ci{
5494514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5504514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsTypedArray();
5514514f5e3Sopenharmony_ci}
5524514f5e3Sopenharmony_ci
5534514f5e3Sopenharmony_cibool JSValueRef::IsNativePointer(const EcmaVM *vm)
5544514f5e3Sopenharmony_ci{
5554514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5564514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSNativePointer();
5574514f5e3Sopenharmony_ci}
5584514f5e3Sopenharmony_ci
5594514f5e3Sopenharmony_cibool JSValueRef::IsDate(const EcmaVM *vm)
5604514f5e3Sopenharmony_ci{
5614514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5624514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsDate();
5634514f5e3Sopenharmony_ci}
5644514f5e3Sopenharmony_ci
5654514f5e3Sopenharmony_cibool JSValueRef::IsError(const EcmaVM *vm)
5664514f5e3Sopenharmony_ci{
5674514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5684514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSError();
5694514f5e3Sopenharmony_ci}
5704514f5e3Sopenharmony_ci
5714514f5e3Sopenharmony_cibool JSValueRef::IsMap(const EcmaVM *vm)
5724514f5e3Sopenharmony_ci{
5734514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5744514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSMap();
5754514f5e3Sopenharmony_ci}
5764514f5e3Sopenharmony_ci
5774514f5e3Sopenharmony_cibool JSValueRef::IsSet(const EcmaVM *vm)
5784514f5e3Sopenharmony_ci{
5794514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5804514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSet();
5814514f5e3Sopenharmony_ci}
5824514f5e3Sopenharmony_ci
5834514f5e3Sopenharmony_cibool JSValueRef::IsWeakRef(const EcmaVM *vm)
5844514f5e3Sopenharmony_ci{
5854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5864514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSWeakRef();
5874514f5e3Sopenharmony_ci}
5884514f5e3Sopenharmony_ci
5894514f5e3Sopenharmony_cibool JSValueRef::IsWeakMap(const EcmaVM *vm)
5904514f5e3Sopenharmony_ci{
5914514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5924514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSWeakMap();
5934514f5e3Sopenharmony_ci}
5944514f5e3Sopenharmony_ci
5954514f5e3Sopenharmony_cibool JSValueRef::IsWeakSet(const EcmaVM *vm)
5964514f5e3Sopenharmony_ci{
5974514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
5984514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSWeakSet();
5994514f5e3Sopenharmony_ci}
6004514f5e3Sopenharmony_ci
6014514f5e3Sopenharmony_cibool JSValueRef::IsRegExp(const EcmaVM *vm)
6024514f5e3Sopenharmony_ci{
6034514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6044514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSRegExp();
6054514f5e3Sopenharmony_ci}
6064514f5e3Sopenharmony_ci
6074514f5e3Sopenharmony_cibool JSValueRef::IsArrayIterator(const EcmaVM *vm)
6084514f5e3Sopenharmony_ci{
6094514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6104514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSArrayIterator();
6114514f5e3Sopenharmony_ci}
6124514f5e3Sopenharmony_ci
6134514f5e3Sopenharmony_cibool JSValueRef::IsStringIterator(const EcmaVM *vm)
6144514f5e3Sopenharmony_ci{
6154514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6164514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsStringIterator();
6174514f5e3Sopenharmony_ci}
6184514f5e3Sopenharmony_ci
6194514f5e3Sopenharmony_cibool JSValueRef::IsSetIterator(const EcmaVM *vm)
6204514f5e3Sopenharmony_ci{
6214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6224514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSetIterator();
6234514f5e3Sopenharmony_ci}
6244514f5e3Sopenharmony_ci
6254514f5e3Sopenharmony_cibool JSValueRef::IsMapIterator(const EcmaVM *vm)
6264514f5e3Sopenharmony_ci{
6274514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6284514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSMapIterator();
6294514f5e3Sopenharmony_ci}
6304514f5e3Sopenharmony_ci
6314514f5e3Sopenharmony_cibool JSValueRef::IsArrayBuffer(const EcmaVM *vm)
6324514f5e3Sopenharmony_ci{
6334514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6344514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsArrayBuffer();
6354514f5e3Sopenharmony_ci}
6364514f5e3Sopenharmony_ci
6374514f5e3Sopenharmony_cibool JSValueRef::IsBuffer(const EcmaVM *vm)
6384514f5e3Sopenharmony_ci{
6394514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6404514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsArrayBuffer();
6414514f5e3Sopenharmony_ci}
6424514f5e3Sopenharmony_ci
6434514f5e3Sopenharmony_cibool JSValueRef::IsUint8Array(const EcmaVM *vm)
6444514f5e3Sopenharmony_ci{
6454514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6464514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSUint8Array();
6474514f5e3Sopenharmony_ci}
6484514f5e3Sopenharmony_ci
6494514f5e3Sopenharmony_cibool JSValueRef::IsInt8Array(const EcmaVM *vm)
6504514f5e3Sopenharmony_ci{
6514514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6524514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSInt8Array();
6534514f5e3Sopenharmony_ci}
6544514f5e3Sopenharmony_ci
6554514f5e3Sopenharmony_cibool JSValueRef::IsUint8ClampedArray(const EcmaVM *vm)
6564514f5e3Sopenharmony_ci{
6574514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6584514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSUint8ClampedArray();
6594514f5e3Sopenharmony_ci}
6604514f5e3Sopenharmony_ci
6614514f5e3Sopenharmony_cibool JSValueRef::IsInt16Array(const EcmaVM *vm)
6624514f5e3Sopenharmony_ci{
6634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6644514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSInt16Array();
6654514f5e3Sopenharmony_ci}
6664514f5e3Sopenharmony_ci
6674514f5e3Sopenharmony_cibool JSValueRef::IsUint16Array(const EcmaVM *vm)
6684514f5e3Sopenharmony_ci{
6694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6704514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSUint16Array();
6714514f5e3Sopenharmony_ci}
6724514f5e3Sopenharmony_ci
6734514f5e3Sopenharmony_cibool JSValueRef::IsInt32Array(const EcmaVM *vm)
6744514f5e3Sopenharmony_ci{
6754514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6764514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSInt32Array();
6774514f5e3Sopenharmony_ci}
6784514f5e3Sopenharmony_ci
6794514f5e3Sopenharmony_cibool JSValueRef::IsUint32Array(const EcmaVM *vm)
6804514f5e3Sopenharmony_ci{
6814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6824514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSUint32Array();
6834514f5e3Sopenharmony_ci}
6844514f5e3Sopenharmony_ci
6854514f5e3Sopenharmony_cibool JSValueRef::IsFloat32Array(const EcmaVM *vm)
6864514f5e3Sopenharmony_ci{
6874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6884514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSFloat32Array();
6894514f5e3Sopenharmony_ci}
6904514f5e3Sopenharmony_ci
6914514f5e3Sopenharmony_cibool JSValueRef::IsFloat64Array(const EcmaVM *vm)
6924514f5e3Sopenharmony_ci{
6934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
6944514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSFloat64Array();
6954514f5e3Sopenharmony_ci}
6964514f5e3Sopenharmony_ci
6974514f5e3Sopenharmony_cibool JSValueRef::IsBigInt64Array(const EcmaVM *vm)
6984514f5e3Sopenharmony_ci{
6994514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7004514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSBigInt64Array();
7014514f5e3Sopenharmony_ci}
7024514f5e3Sopenharmony_ci
7034514f5e3Sopenharmony_cibool JSValueRef::IsBigUint64Array(const EcmaVM *vm)
7044514f5e3Sopenharmony_ci{
7054514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7064514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSBigUint64Array();
7074514f5e3Sopenharmony_ci}
7084514f5e3Sopenharmony_ci
7094514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedInt8Array(const EcmaVM *vm)
7104514f5e3Sopenharmony_ci{
7114514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7124514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedInt8Array();
7134514f5e3Sopenharmony_ci}
7144514f5e3Sopenharmony_ci
7154514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedUint8Array([[maybe_unused]]const EcmaVM *vm)
7164514f5e3Sopenharmony_ci{
7174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7184514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedUint8Array();
7194514f5e3Sopenharmony_ci}
7204514f5e3Sopenharmony_ci
7214514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedUint8ClampedArray([[maybe_unused]]const EcmaVM *vm)
7224514f5e3Sopenharmony_ci{
7234514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7244514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedUint8ClampedArray();
7254514f5e3Sopenharmony_ci}
7264514f5e3Sopenharmony_ci
7274514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedInt16Array(const EcmaVM *vm)
7284514f5e3Sopenharmony_ci{
7294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7304514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedInt16Array();
7314514f5e3Sopenharmony_ci}
7324514f5e3Sopenharmony_ci
7334514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedUint16Array(const EcmaVM *vm)
7344514f5e3Sopenharmony_ci{
7354514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7364514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedUint16Array();
7374514f5e3Sopenharmony_ci}
7384514f5e3Sopenharmony_ci
7394514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedInt32Array(const EcmaVM *vm)
7404514f5e3Sopenharmony_ci{
7414514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7424514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedInt32Array();
7434514f5e3Sopenharmony_ci}
7444514f5e3Sopenharmony_ci
7454514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedFloat32Array(const EcmaVM *vm)
7464514f5e3Sopenharmony_ci{
7474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7484514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedFloat32Array();
7494514f5e3Sopenharmony_ci}
7504514f5e3Sopenharmony_ci
7514514f5e3Sopenharmony_cibool JSValueRef::IsJSSharedUint32Array(const EcmaVM *vm)
7524514f5e3Sopenharmony_ci{
7534514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7544514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedUint32Array();
7554514f5e3Sopenharmony_ci}
7564514f5e3Sopenharmony_ci
7574514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveRef(const EcmaVM *vm)
7584514f5e3Sopenharmony_ci{
7594514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7604514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSPrimitiveRef();
7614514f5e3Sopenharmony_ci}
7624514f5e3Sopenharmony_ci
7634514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveNumber(const EcmaVM *vm)
7644514f5e3Sopenharmony_ci{
7654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
7674514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, FATAL);
7684514f5e3Sopenharmony_ci    return IsJSPrimitiveRef(vm) ? JSPrimitiveRef::Cast(obj->GetTaggedObject())->IsNumber() : false;
7694514f5e3Sopenharmony_ci}
7704514f5e3Sopenharmony_ci
7714514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveInt(const EcmaVM *vm)
7724514f5e3Sopenharmony_ci{
7734514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7744514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
7754514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, FATAL);
7764514f5e3Sopenharmony_ci    return IsJSPrimitiveRef(vm) ? JSPrimitiveRef::Cast(obj->GetTaggedObject())->IsInt() : false;
7774514f5e3Sopenharmony_ci}
7784514f5e3Sopenharmony_ci
7794514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveBoolean(const EcmaVM *vm)
7804514f5e3Sopenharmony_ci{
7814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7824514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
7834514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, FATAL);
7844514f5e3Sopenharmony_ci    return IsJSPrimitiveRef(vm) ? JSPrimitiveRef::Cast(obj->GetTaggedObject())->IsBoolean() : false;
7854514f5e3Sopenharmony_ci}
7864514f5e3Sopenharmony_ci
7874514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveString(const EcmaVM *vm)
7884514f5e3Sopenharmony_ci{
7894514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7904514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
7914514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, FATAL);
7924514f5e3Sopenharmony_ci    return IsJSPrimitiveRef(vm) ? JSPrimitiveRef::Cast(obj->GetTaggedObject())->IsString() : false;
7934514f5e3Sopenharmony_ci}
7944514f5e3Sopenharmony_ci
7954514f5e3Sopenharmony_cibool JSValueRef::IsJSPrimitiveSymbol(const EcmaVM *vm)
7964514f5e3Sopenharmony_ci{
7974514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
7984514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
7994514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, FATAL);
8004514f5e3Sopenharmony_ci    return IsJSPrimitiveRef(vm) ? JSPrimitiveRef::Cast(obj->GetTaggedObject())->IsSymbol() : false;
8014514f5e3Sopenharmony_ci}
8024514f5e3Sopenharmony_ci
8034514f5e3Sopenharmony_cibool JSValueRef::IsGeneratorObject(const EcmaVM *vm)
8044514f5e3Sopenharmony_ci{
8054514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8064514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsGeneratorObject();
8074514f5e3Sopenharmony_ci}
8084514f5e3Sopenharmony_ci
8094514f5e3Sopenharmony_cibool JSValueRef::IsModuleNamespaceObject(const EcmaVM *vm)
8104514f5e3Sopenharmony_ci{
8114514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8124514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsModuleNamespace();
8134514f5e3Sopenharmony_ci}
8144514f5e3Sopenharmony_ci
8154514f5e3Sopenharmony_cibool JSValueRef::IsNativeModuleFailureInfoObject(const EcmaVM *vm)
8164514f5e3Sopenharmony_ci{
8174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8184514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsNativeModuleFailureInfo();
8194514f5e3Sopenharmony_ci}
8204514f5e3Sopenharmony_ci
8214514f5e3Sopenharmony_cibool JSValueRef::IsSharedArrayBuffer(const EcmaVM *vm)
8224514f5e3Sopenharmony_ci{
8234514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8244514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsSharedArrayBuffer();
8254514f5e3Sopenharmony_ci}
8264514f5e3Sopenharmony_ci
8274514f5e3Sopenharmony_cibool JSValueRef::IsSendableArrayBuffer(const EcmaVM *vm)
8284514f5e3Sopenharmony_ci{
8294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8304514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsSendableArrayBuffer();
8314514f5e3Sopenharmony_ci}
8324514f5e3Sopenharmony_ci
8334514f5e3Sopenharmony_cibool JSValueRef::IsJSLocale(const EcmaVM *vm)
8344514f5e3Sopenharmony_ci{
8354514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8364514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSLocale();
8374514f5e3Sopenharmony_ci}
8384514f5e3Sopenharmony_ci
8394514f5e3Sopenharmony_cibool JSValueRef::IsJSDateTimeFormat(const EcmaVM *vm)
8404514f5e3Sopenharmony_ci{
8414514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8424514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSDateTimeFormat();
8434514f5e3Sopenharmony_ci}
8444514f5e3Sopenharmony_ci
8454514f5e3Sopenharmony_cibool JSValueRef::IsJSRelativeTimeFormat(const EcmaVM *vm)
8464514f5e3Sopenharmony_ci{
8474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8484514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSRelativeTimeFormat();
8494514f5e3Sopenharmony_ci}
8504514f5e3Sopenharmony_ci
8514514f5e3Sopenharmony_cibool JSValueRef::IsJSIntl(const EcmaVM *vm)
8524514f5e3Sopenharmony_ci{
8534514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8544514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSIntl();
8554514f5e3Sopenharmony_ci}
8564514f5e3Sopenharmony_ci
8574514f5e3Sopenharmony_cibool JSValueRef::IsJSNumberFormat(const EcmaVM *vm)
8584514f5e3Sopenharmony_ci{
8594514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8604514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSNumberFormat();
8614514f5e3Sopenharmony_ci}
8624514f5e3Sopenharmony_ci
8634514f5e3Sopenharmony_cibool JSValueRef::IsJSCollator(const EcmaVM *vm)
8644514f5e3Sopenharmony_ci{
8654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8664514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSCollator();
8674514f5e3Sopenharmony_ci}
8684514f5e3Sopenharmony_ci
8694514f5e3Sopenharmony_cibool JSValueRef::IsJSPluralRules(const EcmaVM *vm)
8704514f5e3Sopenharmony_ci{
8714514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8724514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSPluralRules();
8734514f5e3Sopenharmony_ci}
8744514f5e3Sopenharmony_ci
8754514f5e3Sopenharmony_cibool JSValueRef::IsJSListFormat(const EcmaVM *vm)
8764514f5e3Sopenharmony_ci{
8774514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8784514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSListFormat();
8794514f5e3Sopenharmony_ci}
8804514f5e3Sopenharmony_ci
8814514f5e3Sopenharmony_cibool JSValueRef::IsAsyncGeneratorObject(const EcmaVM *vm)
8824514f5e3Sopenharmony_ci{
8834514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8844514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsAsyncGeneratorObject();
8854514f5e3Sopenharmony_ci}
8864514f5e3Sopenharmony_ci
8874514f5e3Sopenharmony_cibool JSValueRef::IsAsyncFunction(const EcmaVM *vm)
8884514f5e3Sopenharmony_ci{
8894514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8904514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAsyncFunction();
8914514f5e3Sopenharmony_ci}
8924514f5e3Sopenharmony_ci
8934514f5e3Sopenharmony_cibool JSValueRef::IsConcurrentFunction(const EcmaVM *vm)
8944514f5e3Sopenharmony_ci{
8954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
8964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> funcVal = JSNApiHelper::ToJSHandle(this);
8974514f5e3Sopenharmony_ci    JSHandle<JSFunction> transFunc = JSHandle<JSFunction>::Cast(funcVal);
8984514f5e3Sopenharmony_ci    return transFunc->GetFunctionKind() == ecmascript::FunctionKind::CONCURRENT_FUNCTION;
8994514f5e3Sopenharmony_ci}
9004514f5e3Sopenharmony_ci
9014514f5e3Sopenharmony_cibool JSValueRef::IsArgumentsObject(const EcmaVM *vm)
9024514f5e3Sopenharmony_ci{
9034514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9044514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsArguments();
9054514f5e3Sopenharmony_ci}
9064514f5e3Sopenharmony_ci
9074514f5e3Sopenharmony_cibool JSValueRef::IsGeneratorFunction(const EcmaVM *vm)
9084514f5e3Sopenharmony_ci{
9094514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9104514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsGeneratorFunction();
9114514f5e3Sopenharmony_ci}
9124514f5e3Sopenharmony_ci
9134514f5e3Sopenharmony_cibool JSValueRef::IsAsyncGeneratorFunction(const EcmaVM *vm)
9144514f5e3Sopenharmony_ci{
9154514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9164514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsAsyncGeneratorFunction();
9174514f5e3Sopenharmony_ci}
9184514f5e3Sopenharmony_ci
9194514f5e3Sopenharmony_cibool JSValueRef::IsArrayList(const EcmaVM *vm)
9204514f5e3Sopenharmony_ci{
9214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9224514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIArrayList();
9234514f5e3Sopenharmony_ci}
9244514f5e3Sopenharmony_ci
9254514f5e3Sopenharmony_cibool JSValueRef::IsDeque(const EcmaVM *vm)
9264514f5e3Sopenharmony_ci{
9274514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9284514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIDeque();
9294514f5e3Sopenharmony_ci}
9304514f5e3Sopenharmony_ci
9314514f5e3Sopenharmony_cibool JSValueRef::IsHashMap(const EcmaVM *vm)
9324514f5e3Sopenharmony_ci{
9334514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9344514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIHashMap();
9354514f5e3Sopenharmony_ci}
9364514f5e3Sopenharmony_ci
9374514f5e3Sopenharmony_cibool JSValueRef::IsHashSet(const EcmaVM *vm)
9384514f5e3Sopenharmony_ci{
9394514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9404514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIHashSet();
9414514f5e3Sopenharmony_ci}
9424514f5e3Sopenharmony_ci
9434514f5e3Sopenharmony_cibool JSValueRef::IsLightWeightMap(const EcmaVM *vm)
9444514f5e3Sopenharmony_ci{
9454514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9464514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPILightWeightMap();
9474514f5e3Sopenharmony_ci}
9484514f5e3Sopenharmony_ci
9494514f5e3Sopenharmony_cibool JSValueRef::IsLightWeightSet(const EcmaVM *vm)
9504514f5e3Sopenharmony_ci{
9514514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9524514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPILightWeightSet();
9534514f5e3Sopenharmony_ci}
9544514f5e3Sopenharmony_ci
9554514f5e3Sopenharmony_cibool JSValueRef::IsLinkedList(const EcmaVM *vm)
9564514f5e3Sopenharmony_ci{
9574514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9584514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPILinkedList();
9594514f5e3Sopenharmony_ci}
9604514f5e3Sopenharmony_ci
9614514f5e3Sopenharmony_cibool JSValueRef::IsLinkedListIterator(const EcmaVM *vm)
9624514f5e3Sopenharmony_ci{
9634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9644514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPILinkedListIterator();
9654514f5e3Sopenharmony_ci}
9664514f5e3Sopenharmony_ci
9674514f5e3Sopenharmony_cibool JSValueRef::IsList(const EcmaVM *vm)
9684514f5e3Sopenharmony_ci{
9694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9704514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIList();
9714514f5e3Sopenharmony_ci}
9724514f5e3Sopenharmony_ci
9734514f5e3Sopenharmony_cibool JSValueRef::IsPlainArray(const EcmaVM *vm)
9744514f5e3Sopenharmony_ci{
9754514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9764514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIPlainArray();
9774514f5e3Sopenharmony_ci}
9784514f5e3Sopenharmony_ci
9794514f5e3Sopenharmony_cibool JSValueRef::IsQueue(const EcmaVM *vm)
9804514f5e3Sopenharmony_ci{
9814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9824514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIQueue();
9834514f5e3Sopenharmony_ci}
9844514f5e3Sopenharmony_ci
9854514f5e3Sopenharmony_cibool JSValueRef::IsStack(const EcmaVM *vm)
9864514f5e3Sopenharmony_ci{
9874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9884514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIStack();
9894514f5e3Sopenharmony_ci}
9904514f5e3Sopenharmony_ci
9914514f5e3Sopenharmony_cibool JSValueRef::IsTreeMap(const EcmaVM *vm)
9924514f5e3Sopenharmony_ci{
9934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
9944514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPITreeMap();
9954514f5e3Sopenharmony_ci}
9964514f5e3Sopenharmony_ci
9974514f5e3Sopenharmony_cibool JSValueRef::IsTreeSet(const EcmaVM *vm)
9984514f5e3Sopenharmony_ci{
9994514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10004514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPITreeSet();
10014514f5e3Sopenharmony_ci}
10024514f5e3Sopenharmony_ci
10034514f5e3Sopenharmony_cibool JSValueRef::IsVector(const EcmaVM *vm)
10044514f5e3Sopenharmony_ci{
10054514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10064514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSAPIVector();
10074514f5e3Sopenharmony_ci}
10084514f5e3Sopenharmony_ci
10094514f5e3Sopenharmony_cibool JSValueRef::IsSendableObject(const EcmaVM *vm)
10104514f5e3Sopenharmony_ci{
10114514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10124514f5e3Sopenharmony_ci    return IsJSShared(vm) && IsObject(vm);
10134514f5e3Sopenharmony_ci}
10144514f5e3Sopenharmony_ci
10154514f5e3Sopenharmony_cibool JSValueRef::IsJSShared(const EcmaVM *vm)
10164514f5e3Sopenharmony_ci{
10174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10184514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSShared();
10194514f5e3Sopenharmony_ci}
10204514f5e3Sopenharmony_ci
10214514f5e3Sopenharmony_cibool JSValueRef::IsSharedArray(const EcmaVM *vm)
10224514f5e3Sopenharmony_ci{
10234514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10244514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedArray();
10254514f5e3Sopenharmony_ci}
10264514f5e3Sopenharmony_ci
10274514f5e3Sopenharmony_cibool JSValueRef::IsSharedTypedArray(const EcmaVM *vm)
10284514f5e3Sopenharmony_ci{
10294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10304514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsSharedTypedArray();
10314514f5e3Sopenharmony_ci}
10324514f5e3Sopenharmony_ci
10334514f5e3Sopenharmony_cibool JSValueRef::IsSharedSet(const EcmaVM *vm)
10344514f5e3Sopenharmony_ci{
10354514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10364514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedSet();
10374514f5e3Sopenharmony_ci}
10384514f5e3Sopenharmony_ci
10394514f5e3Sopenharmony_cibool JSValueRef::IsSharedMap(const EcmaVM *vm)
10404514f5e3Sopenharmony_ci{
10414514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10424514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedMap();
10434514f5e3Sopenharmony_ci}
10444514f5e3Sopenharmony_ci
10454514f5e3Sopenharmony_cibool JSValueRef::IsSharedMapIterator(const EcmaVM *vm)
10464514f5e3Sopenharmony_ci{
10474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10484514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsJSSharedMapIterator();
10494514f5e3Sopenharmony_ci}
10504514f5e3Sopenharmony_ci
10514514f5e3Sopenharmony_cibool JSValueRef::IsHeapObject()
10524514f5e3Sopenharmony_ci{
10534514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsHeapObject();
10544514f5e3Sopenharmony_ci}
10554514f5e3Sopenharmony_ci
10564514f5e3Sopenharmony_civoid *JSValueRef::GetNativePointerValue(const EcmaVM* vm, bool &isNativePointer)
10574514f5e3Sopenharmony_ci{
10584514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10594514f5e3Sopenharmony_ci    if (IsJSShared(vm)) {
10604514f5e3Sopenharmony_ci        return GetNativePointerValueImpl(vm, isNativePointer);
10614514f5e3Sopenharmony_ci    } else {
10624514f5e3Sopenharmony_ci        return GetNativePointerValueImpl(vm, isNativePointer);
10634514f5e3Sopenharmony_ci    }
10644514f5e3Sopenharmony_ci}
10654514f5e3Sopenharmony_ci
10664514f5e3Sopenharmony_ci// private
10674514f5e3Sopenharmony_civoid *JSValueRef::GetNativePointerValueImpl(const EcmaVM* vm, bool &isNativePointer)
10684514f5e3Sopenharmony_ci{
10694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10704514f5e3Sopenharmony_ci    if (!IsNativePointer(vm)) {
10714514f5e3Sopenharmony_ci        isNativePointer = false;
10724514f5e3Sopenharmony_ci        return nullptr;
10734514f5e3Sopenharmony_ci    }
10744514f5e3Sopenharmony_ci    isNativePointer = true;
10754514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
10764514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> nativePointer = JSNApiHelper::ToJSHandle(this);
10774514f5e3Sopenharmony_ci    return JSHandle<JSNativePointer>(nativePointer)->GetExternalPointer();
10784514f5e3Sopenharmony_ci}
10794514f5e3Sopenharmony_ci
10804514f5e3Sopenharmony_cibool JSValueRef::IsDetachedArraybuffer(const EcmaVM *vm, bool &isArrayBuffer)
10814514f5e3Sopenharmony_ci{
10824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10834514f5e3Sopenharmony_ci    // arraybuffer is not shared. Do not need to switch state
10844514f5e3Sopenharmony_ci    if (!IsArrayBuffer(vm)) {
10854514f5e3Sopenharmony_ci        isArrayBuffer = false;
10864514f5e3Sopenharmony_ci        return false;
10874514f5e3Sopenharmony_ci    }
10884514f5e3Sopenharmony_ci    isArrayBuffer = true;
10894514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
10904514f5e3Sopenharmony_ci    return arrayBuffer->IsDetach();
10914514f5e3Sopenharmony_ci}
10924514f5e3Sopenharmony_ci
10934514f5e3Sopenharmony_civoid JSValueRef::DetachedArraybuffer(const EcmaVM *vm, bool &isArrayBuffer)
10944514f5e3Sopenharmony_ci{
10954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
10964514f5e3Sopenharmony_ci    if (IsArrayBuffer(vm)) {
10974514f5e3Sopenharmony_ci        JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
10984514f5e3Sopenharmony_ci        if (arrayBuffer->IsDetach()) {
10994514f5e3Sopenharmony_ci            return;
11004514f5e3Sopenharmony_ci        }
11014514f5e3Sopenharmony_ci        arrayBuffer->Detach(vm->GetJSThread());
11024514f5e3Sopenharmony_ci        isArrayBuffer = true;
11034514f5e3Sopenharmony_ci    } else if (IsSendableArrayBuffer(vm)) {
11044514f5e3Sopenharmony_ci        JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
11054514f5e3Sopenharmony_ci        if (arrayBuffer->IsDetach()) {
11064514f5e3Sopenharmony_ci            return;
11074514f5e3Sopenharmony_ci        }
11084514f5e3Sopenharmony_ci        arrayBuffer->Detach(vm->GetJSThread());
11094514f5e3Sopenharmony_ci        isArrayBuffer = true;
11104514f5e3Sopenharmony_ci    } else {
11114514f5e3Sopenharmony_ci        isArrayBuffer = false;
11124514f5e3Sopenharmony_ci    }
11134514f5e3Sopenharmony_ci}
11144514f5e3Sopenharmony_ci
11154514f5e3Sopenharmony_civoid JSValueRef::GetDataViewInfo(const EcmaVM *vm,
11164514f5e3Sopenharmony_ci                                 bool &isDataView,
11174514f5e3Sopenharmony_ci                                 size_t *byteLength,
11184514f5e3Sopenharmony_ci                                 void **data,
11194514f5e3Sopenharmony_ci                                 JSValueRef **arrayBuffer,
11204514f5e3Sopenharmony_ci                                 size_t *byteOffset)
11214514f5e3Sopenharmony_ci{
11224514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
11234514f5e3Sopenharmony_ci    if (!IsDataView(vm)) {
11244514f5e3Sopenharmony_ci        isDataView = false;
11254514f5e3Sopenharmony_ci        return;
11264514f5e3Sopenharmony_ci    }
11274514f5e3Sopenharmony_ci    isDataView = true;
11284514f5e3Sopenharmony_ci    JSHandle<JSDataView> dataView(JSNApiHelper::ToJSHandle(this));
11294514f5e3Sopenharmony_ci
11304514f5e3Sopenharmony_ci    if (byteLength) {
11314514f5e3Sopenharmony_ci        *byteLength = dataView->GetByteLength();
11324514f5e3Sopenharmony_ci    }
11334514f5e3Sopenharmony_ci    if (data || arrayBuffer) {
11344514f5e3Sopenharmony_ci        JSThread* thread = vm->GetJSThread();
11354514f5e3Sopenharmony_ci        JSHandle<JSArrayBuffer> retArrayBuffer(thread, dataView->GetViewedArrayBuffer());
11364514f5e3Sopenharmony_ci        if (data) {
11374514f5e3Sopenharmony_ci            JSTaggedValue bufferData = retArrayBuffer->GetArrayBufferData();
11384514f5e3Sopenharmony_ci            if (!bufferData.IsJSNativePointer()) {
11394514f5e3Sopenharmony_ci                *data = nullptr;
11404514f5e3Sopenharmony_ci            }
11414514f5e3Sopenharmony_ci            *data = JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer();
11424514f5e3Sopenharmony_ci        }
11434514f5e3Sopenharmony_ci        if (arrayBuffer) {
11444514f5e3Sopenharmony_ci            *arrayBuffer = reinterpret_cast<JSValueRef*>(retArrayBuffer.GetAddress());
11454514f5e3Sopenharmony_ci        }
11464514f5e3Sopenharmony_ci    }
11474514f5e3Sopenharmony_ci    if (byteOffset) {
11484514f5e3Sopenharmony_ci        *byteOffset = dataView->GetByteOffset();
11494514f5e3Sopenharmony_ci    }
11504514f5e3Sopenharmony_ci}
11514514f5e3Sopenharmony_ci
11524514f5e3Sopenharmony_civoid JSValueRef::TryGetArrayLength(const EcmaVM *vm, bool *isArrayOrSharedArray, uint32_t *arrayLength)
11534514f5e3Sopenharmony_ci{
11544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
11554514f5e3Sopenharmony_ci    JSTaggedValue thisValue = JSNApiHelper::ToJSTaggedValue(this);
11564514f5e3Sopenharmony_ci    if (thisValue.IsJSArray()) {
11574514f5e3Sopenharmony_ci        *isArrayOrSharedArray = true;
11584514f5e3Sopenharmony_ci        *arrayLength = JSArray::Cast(thisValue.GetTaggedObject())->GetArrayLength();
11594514f5e3Sopenharmony_ci    } else if (thisValue.IsJSSharedArray()) {
11604514f5e3Sopenharmony_ci        *isArrayOrSharedArray = true;
11614514f5e3Sopenharmony_ci        *arrayLength = ecmascript::JSSharedArray::Cast(thisValue.GetTaggedObject())->GetArrayLength();
11624514f5e3Sopenharmony_ci    } else {
11634514f5e3Sopenharmony_ci        *isArrayOrSharedArray = false;
11644514f5e3Sopenharmony_ci    }
11654514f5e3Sopenharmony_ci}
11664514f5e3Sopenharmony_ci
11674514f5e3Sopenharmony_ci// ---------------------------------- DataView -----------------------------------
11684514f5e3Sopenharmony_ciLocal<DataViewRef> DataViewRef::New(
11694514f5e3Sopenharmony_ci    const EcmaVM *vm, Local<ArrayBufferRef> arrayBuffer, uint32_t byteOffset, uint32_t byteLength)
11704514f5e3Sopenharmony_ci{
11714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
11724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
11734514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
11744514f5e3Sopenharmony_ci
11754514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> buffer(JSNApiHelper::ToJSHandle(arrayBuffer));
11764514f5e3Sopenharmony_ci    JSHandle<JSDataView> dataView = factory->NewJSDataView(buffer, byteOffset, byteLength);
11774514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
11784514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<DataViewRef>(JSHandle<JSTaggedValue>(dataView));
11794514f5e3Sopenharmony_ci}
11804514f5e3Sopenharmony_ci
11814514f5e3Sopenharmony_ciuint32_t DataViewRef::ByteLength()
11824514f5e3Sopenharmony_ci{
11834514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
11844514f5e3Sopenharmony_ci    JSHandle<JSDataView> dataView(JSNApiHelper::ToJSHandle(this));
11854514f5e3Sopenharmony_ci    return dataView->GetByteLength();
11864514f5e3Sopenharmony_ci}
11874514f5e3Sopenharmony_ci
11884514f5e3Sopenharmony_ciuint32_t DataViewRef::ByteOffset()
11894514f5e3Sopenharmony_ci{
11904514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
11914514f5e3Sopenharmony_ci    JSHandle<JSDataView> dataView(JSNApiHelper::ToJSHandle(this));
11924514f5e3Sopenharmony_ci    return dataView->GetByteOffset();
11934514f5e3Sopenharmony_ci}
11944514f5e3Sopenharmony_ci
11954514f5e3Sopenharmony_ciLocal<ArrayBufferRef> DataViewRef::GetArrayBuffer(const EcmaVM *vm)
11964514f5e3Sopenharmony_ci{
11974514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
11984514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
11994514f5e3Sopenharmony_ci    JSHandle<JSDataView> dataView(JSNApiHelper::ToJSHandle(this));
12004514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(dataView, FATAL);
12014514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arrayBuffer(thread, dataView->GetViewedArrayBuffer());
12024514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayBufferRef>(arrayBuffer);
12034514f5e3Sopenharmony_ci}
12044514f5e3Sopenharmony_ci// ---------------------------------- DataView -----------------------------------
12054514f5e3Sopenharmony_ci
12064514f5e3Sopenharmony_ci// ----------------------------------- PritimitiveRef ---------------------------------------
12074514f5e3Sopenharmony_ciLocal<JSValueRef> PrimitiveRef::GetValue(const EcmaVM *vm)
12084514f5e3Sopenharmony_ci{
12094514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
12104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
12114514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
12124514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
12134514f5e3Sopenharmony_ci    if (obj->IsJSPrimitiveRef()) {
12144514f5e3Sopenharmony_ci        JSTaggedValue primitiveValue = JSPrimitiveRef::Cast(obj->GetTaggedObject())->GetValue();
12154514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> value(thread, primitiveValue);
12164514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<JSValueRef>(value);
12174514f5e3Sopenharmony_ci    }
12184514f5e3Sopenharmony_ci    return Local<JSValueRef>();
12194514f5e3Sopenharmony_ci}
12204514f5e3Sopenharmony_ci
12214514f5e3Sopenharmony_ci// ----------------------------------- NumberRef ---------------------------------------
12224514f5e3Sopenharmony_ciLocal<NumberRef> NumberRef::New(const EcmaVM *vm, double input)
12234514f5e3Sopenharmony_ci{
12244514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
12254514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
12264514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
12274514f5e3Sopenharmony_ci    if (std::isnan(input)) {
12284514f5e3Sopenharmony_ci        input = ecmascript::base::NAN_VALUE;
12294514f5e3Sopenharmony_ci    }
12304514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> number(thread, JSTaggedValue(input), true);
12314514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NumberRef>(number);
12324514f5e3Sopenharmony_ci}
12334514f5e3Sopenharmony_ci
12344514f5e3Sopenharmony_ciLocal<NumberRef> NumberRef::New(const EcmaVM *vm, int32_t input)
12354514f5e3Sopenharmony_ci{
12364514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
12374514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
12384514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
12394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> number(thread, JSTaggedValue(input), true);
12404514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NumberRef>(number);
12414514f5e3Sopenharmony_ci}
12424514f5e3Sopenharmony_ci
12434514f5e3Sopenharmony_ciLocal<NumberRef> NumberRef::New(const EcmaVM *vm, uint32_t input)
12444514f5e3Sopenharmony_ci{
12454514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
12464514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
12474514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
12484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> number(thread, JSTaggedValue(input), true);
12494514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NumberRef>(number);
12504514f5e3Sopenharmony_ci}
12514514f5e3Sopenharmony_ci
12524514f5e3Sopenharmony_ciLocal<NumberRef> NumberRef::New(const EcmaVM *vm, int64_t input)
12534514f5e3Sopenharmony_ci{
12544514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
12554514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
12564514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
12574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> number(thread, JSTaggedValue(input), true);
12584514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NumberRef>(number);
12594514f5e3Sopenharmony_ci}
12604514f5e3Sopenharmony_ci
12614514f5e3Sopenharmony_cidouble NumberRef::Value()
12624514f5e3Sopenharmony_ci{
12634514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
12644514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
12654514f5e3Sopenharmony_ci    return JSTaggedNumber(JSNApiHelper::ToJSTaggedValue(this)).GetNumber();
12664514f5e3Sopenharmony_ci}
12674514f5e3Sopenharmony_ci
12684514f5e3Sopenharmony_ci// ----------------------------------- MapRef ---------------------------------------
12694514f5e3Sopenharmony_ciLocal<JSValueRef> MapRef::Get(const EcmaVM *vm, Local<JSValueRef> key)
12704514f5e3Sopenharmony_ci{
12714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
12724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
12734514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
12744514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread,
12754514f5e3Sopenharmony_ci                map->Get(thread, JSNApiHelper::ToJSTaggedValue(*key))));
12764514f5e3Sopenharmony_ci}
12774514f5e3Sopenharmony_ci
12784514f5e3Sopenharmony_ciLocal<JSValueRef> MapRef::Get(const EcmaVM *vm, const char *utf8)
12794514f5e3Sopenharmony_ci{
12804514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
12814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
12824514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
12834514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
12844514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
12854514f5e3Sopenharmony_ci    auto result = JSHandle<JSTaggedValue>(thread, map->Get(thread, key.GetTaggedValue()));
12864514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(result);
12874514f5e3Sopenharmony_ci}
12884514f5e3Sopenharmony_ci
12894514f5e3Sopenharmony_civoid MapRef::Set(const EcmaVM *vm, Local<JSValueRef> key, Local<JSValueRef> value)
12904514f5e3Sopenharmony_ci{
12914514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
12924514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
12934514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
12944514f5e3Sopenharmony_ci    JSMap::Set(thread, map, JSNApiHelper::ToJSHandle(key), JSNApiHelper::ToJSHandle(value));
12954514f5e3Sopenharmony_ci}
12964514f5e3Sopenharmony_ci
12974514f5e3Sopenharmony_civoid MapRef::Set(const EcmaVM *vm, const char *utf8, Local<JSValueRef> value)
12984514f5e3Sopenharmony_ci{
12994514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
13004514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13014514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13024514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
13034514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
13044514f5e3Sopenharmony_ci    JSMap::Set(thread, map, key, JSNApiHelper::ToJSHandle(value));
13054514f5e3Sopenharmony_ci}
13064514f5e3Sopenharmony_ci
13074514f5e3Sopenharmony_cibool MapRef::Has(const EcmaVM *vm, Local<JSValueRef> key)
13084514f5e3Sopenharmony_ci{
13094514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
13104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13114514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13124514f5e3Sopenharmony_ci    bool result = map->Has(thread, JSNApiHelper::ToJSTaggedValue(*key));
13134514f5e3Sopenharmony_ci    return result;
13144514f5e3Sopenharmony_ci}
13154514f5e3Sopenharmony_ci
13164514f5e3Sopenharmony_cibool MapRef::Has(const EcmaVM *vm, const char *utf8)
13174514f5e3Sopenharmony_ci{
13184514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
13194514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13204514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13214514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
13224514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
13234514f5e3Sopenharmony_ci    bool result = map->Has(thread, key.GetTaggedValue());
13244514f5e3Sopenharmony_ci    return result;
13254514f5e3Sopenharmony_ci}
13264514f5e3Sopenharmony_ci
13274514f5e3Sopenharmony_civoid MapRef::Delete(const EcmaVM *vm, Local<JSValueRef> key)
13284514f5e3Sopenharmony_ci{
13294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
13304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13314514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13324514f5e3Sopenharmony_ci    JSMap::Delete(thread, map, JSNApiHelper::ToJSHandle(key));
13334514f5e3Sopenharmony_ci}
13344514f5e3Sopenharmony_ci
13354514f5e3Sopenharmony_civoid MapRef::Clear(const EcmaVM *vm)
13364514f5e3Sopenharmony_ci{
13374514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
13384514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13394514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13404514f5e3Sopenharmony_ci    JSMap::Clear(thread, map);
13414514f5e3Sopenharmony_ci}
13424514f5e3Sopenharmony_ci
13434514f5e3Sopenharmony_ciLocal<MapRef> MapRef::New(const EcmaVM *vm)
13444514f5e3Sopenharmony_ci{
13454514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
13464514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13474514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
13484514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = thread->GetEcmaVM()->GetGlobalEnv();
13494514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetBuiltinsMapFunction();
13504514f5e3Sopenharmony_ci    JSHandle<JSMap> map =
13514514f5e3Sopenharmony_ci        JSHandle<JSMap>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
13524514f5e3Sopenharmony_ci    JSHandle<LinkedHashMap> hashMap = LinkedHashMap::Create(thread);
13534514f5e3Sopenharmony_ci    map->SetLinkedMap(thread, hashMap);
13544514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapTag = JSHandle<JSTaggedValue>::Cast(map);
13554514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<MapRef>(mapTag);
13564514f5e3Sopenharmony_ci}
13574514f5e3Sopenharmony_ci
13584514f5e3Sopenharmony_ciint32_t MapRef::GetSize(const EcmaVM *vm)
13594514f5e3Sopenharmony_ci{
13604514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
13614514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13624514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13634514f5e3Sopenharmony_ci    return map->GetSize();
13644514f5e3Sopenharmony_ci}
13654514f5e3Sopenharmony_ci
13664514f5e3Sopenharmony_ciint32_t MapRef::GetTotalElements(const EcmaVM *vm)
13674514f5e3Sopenharmony_ci{
13684514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
13694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13704514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13714514f5e3Sopenharmony_ci    return static_cast<int>((map->GetSize())) +
13724514f5e3Sopenharmony_ci        LinkedHashMap::Cast(map->GetLinkedMap().GetTaggedObject())->NumberOfDeletedElements();
13734514f5e3Sopenharmony_ci}
13744514f5e3Sopenharmony_ci
13754514f5e3Sopenharmony_ciLocal<JSValueRef> MapRef::GetKey(const EcmaVM *vm, int entry)
13764514f5e3Sopenharmony_ci{
13774514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
13784514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13794514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13804514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(map, FATAL);
13814514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, map->GetKey(entry)));
13824514f5e3Sopenharmony_ci}
13834514f5e3Sopenharmony_ci
13844514f5e3Sopenharmony_ciLocal<JSValueRef> MapRef::GetValue(const EcmaVM *vm, int entry)
13854514f5e3Sopenharmony_ci{
13864514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
13874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13884514f5e3Sopenharmony_ci    JSHandle<JSMap> map(JSNApiHelper::ToJSHandle(this));
13894514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(map, FATAL);
13904514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, map->GetValue(entry)));
13914514f5e3Sopenharmony_ci}
13924514f5e3Sopenharmony_ci
13934514f5e3Sopenharmony_ciLocal<MapIteratorRef> MapRef::GetEntries(const EcmaVM *vm)
13944514f5e3Sopenharmony_ci{
13954514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
13964514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
13974514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
13984514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
13994514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapIter =
14004514f5e3Sopenharmony_ci        ecmascript::JSMapIterator::CreateMapIterator(thread, map, IterationKind::KEY_AND_VALUE);
14014514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<MapIteratorRef>(mapIter);
14024514f5e3Sopenharmony_ci}
14034514f5e3Sopenharmony_ci
14044514f5e3Sopenharmony_ciLocal<MapIteratorRef> MapRef::GetKeys(const EcmaVM *vm)
14054514f5e3Sopenharmony_ci{
14064514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
14074514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
14084514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
14094514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
14104514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapIter = ecmascript::JSMapIterator::CreateMapIterator(thread, map, IterationKind::KEY);
14114514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<MapIteratorRef>(mapIter);
14124514f5e3Sopenharmony_ci}
14134514f5e3Sopenharmony_ci
14144514f5e3Sopenharmony_ciLocal<MapIteratorRef> MapRef::GetValues(const EcmaVM *vm)
14154514f5e3Sopenharmony_ci{
14164514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
14174514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
14184514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
14194514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
14204514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapIter = ecmascript::JSMapIterator::CreateMapIterator(thread, map, IterationKind::VALUE);
14214514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<MapIteratorRef>(mapIter);
14224514f5e3Sopenharmony_ci}
14234514f5e3Sopenharmony_ci
14244514f5e3Sopenharmony_ci// SendableMapRef
14254514f5e3Sopenharmony_ciLocal<SendableMapRef> SendableMapRef::New(const EcmaVM *vm)
14264514f5e3Sopenharmony_ci{
14274514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
14284514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14294514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
14304514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
14314514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetSBuiltininMapFunction();
14324514f5e3Sopenharmony_ci    ASSERT(constructor->IsJSSharedFunction() && constructor.GetTaggedValue().IsInSharedHeap());
14334514f5e3Sopenharmony_ci    JSHandle<JSObject> obj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor);
14344514f5e3Sopenharmony_ci    ASSERT(obj.GetTaggedValue().IsInSharedHeap());
14354514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> sharedMap = JSHandle<ecmascript::JSSharedMap>::Cast(obj);
14364514f5e3Sopenharmony_ci    JSHandle<LinkedHashMap> linkedMap =
14374514f5e3Sopenharmony_ci        LinkedHashMap::Create(thread, LinkedHashMap::MIN_CAPACITY, ecmascript::MemSpaceKind::SHARED);
14384514f5e3Sopenharmony_ci    sharedMap->SetLinkedMap(thread, linkedMap);
14394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedMapTag = JSHandle<JSTaggedValue>::Cast(sharedMap);
14404514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableMapRef>(sharedMapTag);
14414514f5e3Sopenharmony_ci}
14424514f5e3Sopenharmony_ci
14434514f5e3Sopenharmony_ciLocal<JSValueRef> SendableMapRef::Get(const EcmaVM *vm, Local<JSValueRef> key)
14444514f5e3Sopenharmony_ci{
14454514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
14464514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14474514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14484514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread,
14494514f5e3Sopenharmony_ci        ecmascript::JSSharedMap::Get(thread, map, JSNApiHelper::ToJSTaggedValue(*key))));
14504514f5e3Sopenharmony_ci}
14514514f5e3Sopenharmony_ci
14524514f5e3Sopenharmony_ciLocal<JSValueRef> SendableMapRef::Get(const EcmaVM *vm, const char *utf8)
14534514f5e3Sopenharmony_ci{
14544514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
14554514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14564514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14574514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
14584514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
14594514f5e3Sopenharmony_ci    auto result = JSHandle<JSTaggedValue>(thread, ecmascript::JSSharedMap::Get(thread, map, key.GetTaggedValue()));
14604514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(result);
14614514f5e3Sopenharmony_ci}
14624514f5e3Sopenharmony_ci
14634514f5e3Sopenharmony_civoid SendableMapRef::Set(const EcmaVM *vm, Local<JSValueRef> key, Local<JSValueRef> value)
14644514f5e3Sopenharmony_ci{
14654514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
14664514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14674514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14684514f5e3Sopenharmony_ci    ecmascript::JSSharedMap::Set(thread, map, JSNApiHelper::ToJSHandle(key), JSNApiHelper::ToJSHandle(value));
14694514f5e3Sopenharmony_ci}
14704514f5e3Sopenharmony_ci
14714514f5e3Sopenharmony_civoid SendableMapRef::Set(const EcmaVM *vm, const char *utf8, Local<JSValueRef> value)
14724514f5e3Sopenharmony_ci{
14734514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
14744514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14754514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14764514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
14774514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
14784514f5e3Sopenharmony_ci    ecmascript::JSSharedMap::Set(thread, map, key, JSNApiHelper::ToJSHandle(value));
14794514f5e3Sopenharmony_ci}
14804514f5e3Sopenharmony_ci
14814514f5e3Sopenharmony_cibool SendableMapRef::Has(const EcmaVM *vm, Local<JSValueRef> key)
14824514f5e3Sopenharmony_ci{
14834514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
14844514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14854514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14864514f5e3Sopenharmony_ci    bool result = ecmascript::JSSharedMap::Has(thread, map, JSNApiHelper::ToJSTaggedValue(*key));
14874514f5e3Sopenharmony_ci    return result;
14884514f5e3Sopenharmony_ci}
14894514f5e3Sopenharmony_ci
14904514f5e3Sopenharmony_cibool SendableMapRef::Has(const EcmaVM *vm, const char *utf8)
14914514f5e3Sopenharmony_ci{
14924514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
14934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
14944514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
14954514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
14964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> key(factory->NewFromUtf8(utf8));
14974514f5e3Sopenharmony_ci    bool result = ecmascript::JSSharedMap::Has(thread, map, key.GetTaggedValue());
14984514f5e3Sopenharmony_ci    return result;
14994514f5e3Sopenharmony_ci}
15004514f5e3Sopenharmony_ci
15014514f5e3Sopenharmony_civoid SendableMapRef::Delete(const EcmaVM *vm, Local<JSValueRef> key)
15024514f5e3Sopenharmony_ci{
15034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
15044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
15054514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15064514f5e3Sopenharmony_ci    ecmascript::JSSharedMap::Delete(thread, map, JSNApiHelper::ToJSHandle(key));
15074514f5e3Sopenharmony_ci}
15084514f5e3Sopenharmony_ci
15094514f5e3Sopenharmony_civoid SendableMapRef::Clear(const EcmaVM *vm)
15104514f5e3Sopenharmony_ci{
15114514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
15124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
15134514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15144514f5e3Sopenharmony_ci    ecmascript::JSSharedMap::Clear(thread, map);
15154514f5e3Sopenharmony_ci}
15164514f5e3Sopenharmony_ci
15174514f5e3Sopenharmony_ciuint32_t SendableMapRef::GetSize(const EcmaVM *vm)
15184514f5e3Sopenharmony_ci{
15194514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
15204514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
15214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15224514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15234514f5e3Sopenharmony_ci    return ecmascript::JSSharedMap::GetSize(thread, map);
15244514f5e3Sopenharmony_ci}
15254514f5e3Sopenharmony_ci
15264514f5e3Sopenharmony_ciuint32_t SendableMapRef::GetTotalElements(const EcmaVM *vm)
15274514f5e3Sopenharmony_ci{
15284514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
15294514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
15304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15314514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15324514f5e3Sopenharmony_ci    return static_cast<int>(ecmascript::JSSharedMap::GetSize(thread, map)) +
15334514f5e3Sopenharmony_ci           LinkedHashMap::Cast(map->GetLinkedMap().GetTaggedObject())->NumberOfDeletedElements();
15344514f5e3Sopenharmony_ci}
15354514f5e3Sopenharmony_ci
15364514f5e3Sopenharmony_ciLocal<JSValueRef> SendableMapRef::GetKey(const EcmaVM *vm, int entry)
15374514f5e3Sopenharmony_ci{
15384514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15394514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15404514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15414514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(map, FATAL);
15424514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread,
15434514f5e3Sopenharmony_ci        ecmascript::JSSharedMap::GetKey(thread, map, entry)));
15444514f5e3Sopenharmony_ci}
15454514f5e3Sopenharmony_ci
15464514f5e3Sopenharmony_ciLocal<JSValueRef> SendableMapRef::GetValue(const EcmaVM *vm, int entry)
15474514f5e3Sopenharmony_ci{
15484514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15494514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15504514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedMap> map(JSNApiHelper::ToJSHandle(this));
15514514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(map, FATAL);
15524514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread,
15534514f5e3Sopenharmony_ci        ecmascript::JSSharedMap::GetValue(thread, map, entry)));
15544514f5e3Sopenharmony_ci}
15554514f5e3Sopenharmony_ci
15564514f5e3Sopenharmony_ciLocal<SendableMapIteratorRef> SendableMapRef::GetEntries(const EcmaVM *vm)
15574514f5e3Sopenharmony_ci{
15584514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15594514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
15604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15614514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
15624514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedMapIter =
15634514f5e3Sopenharmony_ci        ecmascript::JSSharedMapIterator::CreateMapIterator(thread, map, IterationKind::KEY_AND_VALUE);
15644514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableMapIteratorRef>(sharedMapIter);
15654514f5e3Sopenharmony_ci}
15664514f5e3Sopenharmony_ci
15674514f5e3Sopenharmony_ciLocal<SendableMapIteratorRef> SendableMapRef::GetKeys(const EcmaVM *vm)
15684514f5e3Sopenharmony_ci{
15694514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15704514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
15714514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15724514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
15734514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedMapIter =
15744514f5e3Sopenharmony_ci        ecmascript::JSSharedMapIterator::CreateMapIterator(thread, map, IterationKind::KEY);
15754514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableMapIteratorRef>(sharedMapIter);
15764514f5e3Sopenharmony_ci}
15774514f5e3Sopenharmony_ci
15784514f5e3Sopenharmony_ciLocal<SendableMapIteratorRef> SendableMapRef::GetValues(const EcmaVM *vm)
15794514f5e3Sopenharmony_ci{
15804514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15814514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, JSValueRef::Undefined(vm));
15824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
15834514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSTaggedValue> map(JSNApiHelper::ToJSHandle(this));
15844514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedMapIter =
15854514f5e3Sopenharmony_ci        ecmascript::JSSharedMapIterator::CreateMapIterator(thread, map, IterationKind::VALUE);
15864514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableMapIteratorRef>(sharedMapIter);
15874514f5e3Sopenharmony_ci}
15884514f5e3Sopenharmony_ci
15894514f5e3Sopenharmony_ci// SendableSetRef
15904514f5e3Sopenharmony_ciLocal<SendableSetRef> SendableSetRef::New(const EcmaVM *vm)
15914514f5e3Sopenharmony_ci{
15924514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
15934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
15944514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
15954514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
15964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetSBuiltininSetFunction();
15974514f5e3Sopenharmony_ci    ASSERT(constructor->IsJSSharedFunction() && constructor.GetTaggedValue().IsInSharedHeap());
15984514f5e3Sopenharmony_ci    JSHandle<JSObject> obj = factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor);
15994514f5e3Sopenharmony_ci    ASSERT(obj.GetTaggedValue().IsInSharedHeap());
16004514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedSet> set = JSHandle<ecmascript::JSSharedSet>::Cast(obj);
16014514f5e3Sopenharmony_ci    JSHandle<LinkedHashSet> linkedSet =
16024514f5e3Sopenharmony_ci        LinkedHashSet::Create(thread, LinkedHashSet::MIN_CAPACITY, ecmascript::MemSpaceKind::SHARED);
16034514f5e3Sopenharmony_ci    set->SetLinkedSet(thread, linkedSet);
16044514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedSetTag = JSHandle<JSTaggedValue>::Cast(set);
16054514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableSetRef>(sharedSetTag);
16064514f5e3Sopenharmony_ci}
16074514f5e3Sopenharmony_ci
16084514f5e3Sopenharmony_ciuint32_t SendableSetRef::GetSize(const EcmaVM *vm)
16094514f5e3Sopenharmony_ci{
16104514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
16114514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
16124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
16134514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedSet> set(JSNApiHelper::ToJSHandle(this));
16144514f5e3Sopenharmony_ci    return ecmascript::JSSharedSet::GetSize(thread, set);
16154514f5e3Sopenharmony_ci}
16164514f5e3Sopenharmony_ci
16174514f5e3Sopenharmony_ciuint32_t SendableSetRef::GetTotalElements(const EcmaVM *vm)
16184514f5e3Sopenharmony_ci{
16194514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
16204514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
16214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
16224514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedSet> set(JSNApiHelper::ToJSHandle(this));
16234514f5e3Sopenharmony_ci    return static_cast<int>(ecmascript::JSSharedSet::GetSize(thread, set)) +
16244514f5e3Sopenharmony_ci           LinkedHashSet::Cast(set->GetLinkedSet().GetTaggedObject())->NumberOfDeletedElements();
16254514f5e3Sopenharmony_ci}
16264514f5e3Sopenharmony_ci
16274514f5e3Sopenharmony_ciLocal<JSValueRef> SendableSetRef::GetValue(const EcmaVM *vm, int entry)
16284514f5e3Sopenharmony_ci{
16294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
16304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
16314514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedSet> set(JSNApiHelper::ToJSHandle(this));
16324514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(set, FATAL);
16334514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(
16344514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(thread, ecmascript::JSSharedSet::GetValue(thread, set, entry)));
16354514f5e3Sopenharmony_ci}
16364514f5e3Sopenharmony_ci
16374514f5e3Sopenharmony_civoid SendableSetRef::Add(const EcmaVM *vm, Local<JSValueRef> value)
16384514f5e3Sopenharmony_ci{
16394514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
16404514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
16414514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedSet> set(JSNApiHelper::ToJSHandle(this));
16424514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(set, FATAL);
16434514f5e3Sopenharmony_ci    ecmascript::JSSharedSet::Add(thread, set, JSNApiHelper::ToJSHandle(value));
16444514f5e3Sopenharmony_ci}
16454514f5e3Sopenharmony_ci
16464514f5e3Sopenharmony_ci// ----------------------------------- MapIteratorRef ---------------------------------------
16474514f5e3Sopenharmony_ciint32_t MapIteratorRef::GetIndex()
16484514f5e3Sopenharmony_ci{
16494514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, -1);
16504514f5e3Sopenharmony_ci    JSHandle<JSMapIterator> jsMapIter(JSNApiHelper::ToJSHandle(this));
16514514f5e3Sopenharmony_ci    return jsMapIter->GetNextIndex();
16524514f5e3Sopenharmony_ci}
16534514f5e3Sopenharmony_ci
16544514f5e3Sopenharmony_ciLocal<JSValueRef> MapIteratorRef::GetKind(const EcmaVM *vm)
16554514f5e3Sopenharmony_ci{
16564514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
16574514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
16584514f5e3Sopenharmony_ci    JSHandle<JSMapIterator> jsMapIter(JSNApiHelper::ToJSHandle(this));
16594514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(jsMapIter, FATAL);
16604514f5e3Sopenharmony_ci    IterationKind iterKind = jsMapIter->GetIterationKind();
16614514f5e3Sopenharmony_ci    Local<JSValueRef> result;
16624514f5e3Sopenharmony_ci    const GlobalEnvConstants *globalConst = thread->GlobalConstants();
16634514f5e3Sopenharmony_ci    switch (iterKind) {
16644514f5e3Sopenharmony_ci        case IterationKind::KEY:
16654514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledKeysString());
16664514f5e3Sopenharmony_ci            break;
16674514f5e3Sopenharmony_ci        case IterationKind::VALUE:
16684514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledValuesString());
16694514f5e3Sopenharmony_ci            break;
16704514f5e3Sopenharmony_ci        case IterationKind::KEY_AND_VALUE:
16714514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledEntriesString());
16724514f5e3Sopenharmony_ci            break;
16734514f5e3Sopenharmony_ci        default:
16744514f5e3Sopenharmony_ci            break;
16754514f5e3Sopenharmony_ci    }
16764514f5e3Sopenharmony_ci    return result;
16774514f5e3Sopenharmony_ci}
16784514f5e3Sopenharmony_ci
16794514f5e3Sopenharmony_ciLocal<MapIteratorRef> MapIteratorRef::New(const EcmaVM *vm, Local<MapRef> map)
16804514f5e3Sopenharmony_ci{
16814514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
16824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
16834514f5e3Sopenharmony_ci    JSHandle<JSMap> jsMap(JSNApiHelper::ToJSHandle(map));
16844514f5e3Sopenharmony_ci    IterationKind iterKind = IterationKind::KEY_AND_VALUE;
16854514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapIteratorKeyAndValue =
16864514f5e3Sopenharmony_ci        JSMapIterator::CreateMapIterator(vm->GetJSThread(), JSHandle<JSTaggedValue>::Cast(jsMap), iterKind);
16874514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
16884514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(mapIteratorKeyAndValue);
16894514f5e3Sopenharmony_ci}
16904514f5e3Sopenharmony_ci
16914514f5e3Sopenharmony_ciecmascript::EcmaRuntimeCallInfo *MapIteratorRef::GetEcmaRuntimeCallInfo(const EcmaVM *vm)
16924514f5e3Sopenharmony_ci{
16934514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
16944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
16954514f5e3Sopenharmony_ci    JSHandle<JSMapIterator> jsMapIter(JSNApiHelper::ToJSHandle(this));
16964514f5e3Sopenharmony_ci    JSHandle<LinkedHashMap> linkedHashMap(vm->GetJSThread(), jsMapIter->GetIteratedMap());
16974514f5e3Sopenharmony_ci    uint32_t size = linkedHashMap->GetLength();
16984514f5e3Sopenharmony_ci    return ecmascript::EcmaInterpreter::NewRuntimeCallInfo(vm->GetJSThread(),
16994514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), JSTaggedValue::Undefined()),
17004514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), jsMapIter.GetTaggedValue()),
17014514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), JSTaggedValue::Undefined()), size);
17024514f5e3Sopenharmony_ci}
17034514f5e3Sopenharmony_ci
17044514f5e3Sopenharmony_ciLocal<ArrayRef> MapIteratorRef::Next(const EcmaVM *vm, ecmascript::EcmaRuntimeCallInfo *ecmaRuntimeCallInfo)
17054514f5e3Sopenharmony_ci{
17064514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
17084514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> nextTagValResult(vm->GetJSThread(), JSMapIterator::Next(ecmaRuntimeCallInfo));
17094514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
17104514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> iteratorVal(vm->GetJSThread(),
17114514f5e3Sopenharmony_ci        JSIterator::IteratorValue(vm->GetJSThread(), nextTagValResult).GetTaggedValue());
17124514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(iteratorVal);
17134514f5e3Sopenharmony_ci}
17144514f5e3Sopenharmony_ci
17154514f5e3Sopenharmony_ciLocal<JSValueRef> MapIteratorRef::Next(const EcmaVM *vm)
17164514f5e3Sopenharmony_ci{
17174514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17184514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
17194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> mapIter(JSNApiHelper::ToJSHandle(this));
17204514f5e3Sopenharmony_ci    auto result = JSMapIterator::NextInternal(thread, mapIter);
17214514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, result));
17224514f5e3Sopenharmony_ci}
17234514f5e3Sopenharmony_ci
17244514f5e3Sopenharmony_ci// SendableMapIteratorRef
17254514f5e3Sopenharmony_ciLocal<JSValueRef> SendableMapIteratorRef::Next(const EcmaVM *vm)
17264514f5e3Sopenharmony_ci{
17274514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17284514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
17294514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> sharedMapIter(JSNApiHelper::ToJSHandle(this));
17304514f5e3Sopenharmony_ci    auto result = ecmascript::JSSharedMapIterator::NextInternal(thread, sharedMapIter);
17314514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, result));
17324514f5e3Sopenharmony_ci}
17334514f5e3Sopenharmony_ci
17344514f5e3Sopenharmony_ci// ----------------------------------- SetIteratorRef ---------------------------------------
17354514f5e3Sopenharmony_ciint32_t SetIteratorRef::GetIndex()
17364514f5e3Sopenharmony_ci{
17374514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, -1);
17384514f5e3Sopenharmony_ci    JSHandle<JSSetIterator> jsSetIter(JSNApiHelper::ToJSHandle(this));
17394514f5e3Sopenharmony_ci    return jsSetIter->GetNextIndex();
17404514f5e3Sopenharmony_ci}
17414514f5e3Sopenharmony_ci
17424514f5e3Sopenharmony_ciLocal<JSValueRef> SetIteratorRef::GetKind(const EcmaVM *vm)
17434514f5e3Sopenharmony_ci{
17444514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17454514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
17464514f5e3Sopenharmony_ci    JSHandle<JSSetIterator> jsSetIter(JSNApiHelper::ToJSHandle(this));
17474514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(jsSetIter, FATAL);
17484514f5e3Sopenharmony_ci    IterationKind iterKind = jsSetIter->GetIterationKind();
17494514f5e3Sopenharmony_ci    Local<JSValueRef> result;
17504514f5e3Sopenharmony_ci    const GlobalEnvConstants *globalConst = thread->GlobalConstants();
17514514f5e3Sopenharmony_ci    switch (iterKind) {
17524514f5e3Sopenharmony_ci        case IterationKind::KEY:
17534514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledKeysString());
17544514f5e3Sopenharmony_ci            break;
17554514f5e3Sopenharmony_ci        case IterationKind::VALUE:
17564514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledValuesString());
17574514f5e3Sopenharmony_ci            break;
17584514f5e3Sopenharmony_ci        case IterationKind::KEY_AND_VALUE:
17594514f5e3Sopenharmony_ci            result = JSNApiHelper::ToLocal<JSValueRef>(globalConst->GetHandledEntriesString());
17604514f5e3Sopenharmony_ci            break;
17614514f5e3Sopenharmony_ci        default:
17624514f5e3Sopenharmony_ci            break;
17634514f5e3Sopenharmony_ci    }
17644514f5e3Sopenharmony_ci    return result;
17654514f5e3Sopenharmony_ci}
17664514f5e3Sopenharmony_ci
17674514f5e3Sopenharmony_ciLocal<SetIteratorRef> SetIteratorRef::New(const EcmaVM *vm, Local<SetRef> set)
17684514f5e3Sopenharmony_ci{
17694514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17704514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
17714514f5e3Sopenharmony_ci    JSHandle<JSSet> jsSet(JSNApiHelper::ToJSHandle(set));
17724514f5e3Sopenharmony_ci    IterationKind iterKind = IterationKind::KEY_AND_VALUE;
17734514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setIteratorKeyAndValue =
17744514f5e3Sopenharmony_ci        JSSetIterator::CreateSetIterator(vm->GetJSThread(), JSHandle<JSTaggedValue>::Cast(jsSet), iterKind);
17754514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
17764514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(setIteratorKeyAndValue);
17774514f5e3Sopenharmony_ci}
17784514f5e3Sopenharmony_ci
17794514f5e3Sopenharmony_ciecmascript::EcmaRuntimeCallInfo *SetIteratorRef::GetEcmaRuntimeCallInfo(const EcmaVM *vm)
17804514f5e3Sopenharmony_ci{
17814514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
17824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
17834514f5e3Sopenharmony_ci    JSHandle<JSSetIterator> jsSetIter(JSNApiHelper::ToJSHandle(this));
17844514f5e3Sopenharmony_ci    JSHandle<LinkedHashSet> linkedHashSet(vm->GetJSThread(), jsSetIter->GetIteratedSet());
17854514f5e3Sopenharmony_ci    uint32_t size = linkedHashSet->GetLength();
17864514f5e3Sopenharmony_ci    return ecmascript::EcmaInterpreter::NewRuntimeCallInfo(vm->GetJSThread(),
17874514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), JSTaggedValue::Undefined()),
17884514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), jsSetIter.GetTaggedValue()),
17894514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue>(vm->GetJSThread(), JSTaggedValue::Undefined()), size);
17904514f5e3Sopenharmony_ci}
17914514f5e3Sopenharmony_ci
17924514f5e3Sopenharmony_ciLocal<ArrayRef> SetIteratorRef::Next(const EcmaVM *vm, ecmascript::EcmaRuntimeCallInfo *ecmaRuntimeCallInfo)
17934514f5e3Sopenharmony_ci{
17944514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
17954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
17964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> nextTagValResult(vm->GetJSThread(), JSSetIterator::Next(ecmaRuntimeCallInfo));
17974514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
17984514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> iteratorVal(vm->GetJSThread(),
17994514f5e3Sopenharmony_ci        JSIterator::IteratorValue(vm->GetJSThread(), nextTagValResult).GetTaggedValue());
18004514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(iteratorVal);
18014514f5e3Sopenharmony_ci}
18024514f5e3Sopenharmony_ci
18034514f5e3Sopenharmony_ci// ---------------------------------- Buffer -----------------------------------
18044514f5e3Sopenharmony_ciLocal<BufferRef> BufferRef::New(const EcmaVM *vm, int32_t length)
18054514f5e3Sopenharmony_ci{
18064514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
18074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
18084514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
18094514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer = JSHandle<JSArrayBuffer>::Cast(factory->NewJSArrayBuffer(length));
18104514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
18114514f5e3Sopenharmony_ci    JSHandle<JSFunction> current =
18124514f5e3Sopenharmony_ci        factory->NewJSFunction(env, reinterpret_cast<void *>(BufferRef::BufferToStringCallback));
18134514f5e3Sopenharmony_ci    Local<StringRef> key = StringRef::NewFromUtf8(vm, "toString");
18144514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
18154514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> currentTaggedValue(current);
18164514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(arrayBuffer);
18174514f5e3Sopenharmony_ci    bool result = JSTaggedValue::SetProperty(thread, obj, keyValue, currentTaggedValue);
18184514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
18194514f5e3Sopenharmony_ci    if (!result) {
18204514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "SetProperty failed ! ! !";
18214514f5e3Sopenharmony_ci    }
18224514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BufferRef>(obj);
18234514f5e3Sopenharmony_ci}
18244514f5e3Sopenharmony_ci
18254514f5e3Sopenharmony_ciLocal<BufferRef> BufferRef::New(
18264514f5e3Sopenharmony_ci    const EcmaVM *vm, void *buffer, int32_t length, const NativePointerCallback &deleter, void *data)
18274514f5e3Sopenharmony_ci{
18284514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
18294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
18304514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
18314514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer = factory->NewJSArrayBuffer(buffer, length, deleter, data);
18324514f5e3Sopenharmony_ci
18334514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
18344514f5e3Sopenharmony_ci    JSHandle<JSFunction> current =
18354514f5e3Sopenharmony_ci        factory->NewJSFunction(env, reinterpret_cast<void *>(BufferRef::BufferToStringCallback));
18364514f5e3Sopenharmony_ci    Local<StringRef> key = StringRef::NewFromUtf8(vm, "toString");
18374514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
18384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> currentTaggedValue(current);
18394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(arrayBuffer);
18404514f5e3Sopenharmony_ci    bool result = JSTaggedValue::SetProperty(thread, obj, keyValue, currentTaggedValue);
18414514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
18424514f5e3Sopenharmony_ci    if (!result) {
18434514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "SetProperty failed ! ! !";
18444514f5e3Sopenharmony_ci    }
18454514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayBufferRef>(JSHandle<JSTaggedValue>(arrayBuffer));
18464514f5e3Sopenharmony_ci}
18474514f5e3Sopenharmony_ci
18484514f5e3Sopenharmony_ciint32_t BufferRef::ByteLength(const EcmaVM *vm)
18494514f5e3Sopenharmony_ci{
18504514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
18514514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
18524514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
18534514f5e3Sopenharmony_ci    return arrayBuffer->GetArrayBufferByteLength();
18544514f5e3Sopenharmony_ci}
18554514f5e3Sopenharmony_ci
18564514f5e3Sopenharmony_civoid *BufferRef::GetBuffer(const EcmaVM *vm)
18574514f5e3Sopenharmony_ci{
18584514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, nullptr);
18594514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
18604514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
18614514f5e3Sopenharmony_ci    JSTaggedValue bufferData = arrayBuffer->GetArrayBufferData();
18624514f5e3Sopenharmony_ci    if (!bufferData.IsJSNativePointer()) {
18634514f5e3Sopenharmony_ci        return nullptr;
18644514f5e3Sopenharmony_ci    }
18654514f5e3Sopenharmony_ci    return JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer();
18664514f5e3Sopenharmony_ci}
18674514f5e3Sopenharmony_ci
18684514f5e3Sopenharmony_ciJSTaggedValue BufferRef::BufferToStringCallback(ecmascript::EcmaRuntimeCallInfo *ecmaRuntimeCallInfo)
18694514f5e3Sopenharmony_ci{
18704514f5e3Sopenharmony_ci    JSThread *thread = ecmaRuntimeCallInfo->GetThread();
18714514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
18724514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(thread->GetEcmaVM());
18734514f5e3Sopenharmony_ci    ObjectFactory *factory = thread->GetEcmaVM()->GetFactory();
18744514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arrayBuff = ecmaRuntimeCallInfo->GetThis();
18754514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(arrayBuff);
18764514f5e3Sopenharmony_ci
18774514f5e3Sopenharmony_ci    uint32_t length = arrayBuffer->GetArrayBufferByteLength();
18784514f5e3Sopenharmony_ci    JSTaggedValue data = arrayBuffer->GetArrayBufferData();
18794514f5e3Sopenharmony_ci
18804514f5e3Sopenharmony_ci    ecmascript::CVector<uint16_t> valueTable;
18814514f5e3Sopenharmony_ci    valueTable.reserve(length);
18824514f5e3Sopenharmony_ci    for (uint32_t i = 0; i < length; i++) {
18834514f5e3Sopenharmony_ci        void* rawData = reinterpret_cast<void *>(
18844514f5e3Sopenharmony_ci            ToUintPtr(JSNativePointer::Cast(data.GetTaggedObject())->GetExternalPointer()) + i);
18854514f5e3Sopenharmony_ci        uint8_t *block = reinterpret_cast<uint8_t *>(rawData);
18864514f5e3Sopenharmony_ci        uint16_t nextCv = static_cast<uint16_t>(*block);
18874514f5e3Sopenharmony_ci        valueTable.emplace_back(nextCv);
18884514f5e3Sopenharmony_ci    }
18894514f5e3Sopenharmony_ci
18904514f5e3Sopenharmony_ci    auto *char16tData0 = reinterpret_cast<const char16_t *>(valueTable.data());
18914514f5e3Sopenharmony_ci    std::u16string u16str(char16tData0, length);
18924514f5e3Sopenharmony_ci
18934514f5e3Sopenharmony_ci    const char16_t *constChar16tData = u16str.data();
18944514f5e3Sopenharmony_ci    auto *char16tData = const_cast<char16_t *>(constChar16tData);
18954514f5e3Sopenharmony_ci    auto *uint16tData = reinterpret_cast<uint16_t *>(char16tData);
18964514f5e3Sopenharmony_ci    uint32_t u16strSize = u16str.size();
18974514f5e3Sopenharmony_ci    JSTaggedValue rString = factory->NewFromUtf16Literal(uint16tData, u16strSize).GetTaggedValue();
18984514f5e3Sopenharmony_ci    JSHandle<EcmaString> StringHandle = JSTaggedValue::ToString(thread, rString);
18994514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSTaggedValue::Undefined());
19004514f5e3Sopenharmony_ci    return StringHandle.GetTaggedValue();
19014514f5e3Sopenharmony_ci}
19024514f5e3Sopenharmony_ci
19034514f5e3Sopenharmony_ci// ---------------------------------- Promise --------------------------------------
19044514f5e3Sopenharmony_ciLocal<PromiseCapabilityRef> PromiseCapabilityRef::New(const EcmaVM *vm)
19054514f5e3Sopenharmony_ci{
19064514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
19074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
19084514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
19094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor(globalEnv->GetPromiseFunction());
19104514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> capability(JSPromise::NewPromiseCapability(thread, constructor));
19114514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
19124514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseCapabilityRef>(capability);
19134514f5e3Sopenharmony_ci}
19144514f5e3Sopenharmony_ci
19154514f5e3Sopenharmony_ciLocal<PromiseRef> PromiseCapabilityRef::GetPromise(const EcmaVM *vm)
19164514f5e3Sopenharmony_ci{
19174514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
19184514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
19194514f5e3Sopenharmony_ci    JSHandle<PromiseCapability> capacity(JSNApiHelper::ToJSHandle(this));
19204514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(capacity, FATAL);
19214514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseRef>(JSHandle<JSTaggedValue>(thread, capacity->GetPromise()));
19224514f5e3Sopenharmony_ci}
19234514f5e3Sopenharmony_ci
19244514f5e3Sopenharmony_cibool PromiseCapabilityRef::Resolve(const EcmaVM *vm, uintptr_t value)
19254514f5e3Sopenharmony_ci{
19264514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
19274514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
19284514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
19294514f5e3Sopenharmony_ci
19304514f5e3Sopenharmony_ci    JSTaggedValue arg = *reinterpret_cast<JSTaggedValue *>(value);
19314514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
19324514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(arg.GetRawData());
19334514f5e3Sopenharmony_ci#endif
19344514f5e3Sopenharmony_ci    JSHandle<PromiseCapability> capacity(JSNApiHelper::ToJSHandle(this));
19354514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(capacity, FATAL);
19364514f5e3Sopenharmony_ci    JSTaggedValue resolve = capacity->GetResolve();
19374514f5e3Sopenharmony_ci    JSTaggedValue undefined = constants->GetUndefined();
19384514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
19394514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, resolve, undefined, undefined, 1);
19404514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19414514f5e3Sopenharmony_ci    info->SetCallArg(arg);
19424514f5e3Sopenharmony_ci    JSFunction::Call(info);
19434514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19444514f5e3Sopenharmony_ci
19454514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ExecutePromisePendingJob();
19464514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19474514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ClearKeptObjects();
19484514f5e3Sopenharmony_ci    return true;
19494514f5e3Sopenharmony_ci}
19504514f5e3Sopenharmony_ci
19514514f5e3Sopenharmony_cibool PromiseCapabilityRef::Resolve(const EcmaVM *vm, Local<JSValueRef> value)
19524514f5e3Sopenharmony_ci{
19534514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
19544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
19554514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
19564514f5e3Sopenharmony_ci
19574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg = JSNApiHelper::ToJSHandle(value);
19584514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
19594514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(arg.GetTaggedValue().GetRawData());
19604514f5e3Sopenharmony_ci#endif
19614514f5e3Sopenharmony_ci    JSHandle<PromiseCapability> capacity(JSNApiHelper::ToJSHandle(this));
19624514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(capacity, FATAL);
19634514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resolve(thread, capacity->GetResolve());
19644514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined(constants->GetHandledUndefined());
19654514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
19664514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, resolve, undefined, undefined, 1);
19674514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19684514f5e3Sopenharmony_ci    info->SetCallArg(arg.GetTaggedValue());
19694514f5e3Sopenharmony_ci    JSFunction::Call(info);
19704514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19714514f5e3Sopenharmony_ci
19724514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ExecutePromisePendingJob();
19734514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19744514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ClearKeptObjects();
19754514f5e3Sopenharmony_ci    return true;
19764514f5e3Sopenharmony_ci}
19774514f5e3Sopenharmony_ci
19784514f5e3Sopenharmony_cibool PromiseCapabilityRef::Reject(const EcmaVM *vm, uintptr_t reason)
19794514f5e3Sopenharmony_ci{
19804514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
19814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
19824514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
19834514f5e3Sopenharmony_ci
19844514f5e3Sopenharmony_ci    JSTaggedValue arg = *reinterpret_cast<JSTaggedValue *>(reason);
19854514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
19864514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(arg.GetRawData());
19874514f5e3Sopenharmony_ci#endif
19884514f5e3Sopenharmony_ci    JSHandle<PromiseCapability> capacity(JSNApiHelper::ToJSHandle(this));
19894514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(capacity, FATAL);
19904514f5e3Sopenharmony_ci    JSTaggedValue reject = capacity->GetReject();
19914514f5e3Sopenharmony_ci    JSTaggedValue undefined = constants->GetUndefined();
19924514f5e3Sopenharmony_ci
19934514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
19944514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, reject, undefined, undefined, 1);
19954514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19964514f5e3Sopenharmony_ci    info->SetCallArg(arg);
19974514f5e3Sopenharmony_ci    JSFunction::Call(info);
19984514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
19994514f5e3Sopenharmony_ci
20004514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ExecutePromisePendingJob();
20014514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
20024514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ClearKeptObjects();
20034514f5e3Sopenharmony_ci    return true;
20044514f5e3Sopenharmony_ci}
20054514f5e3Sopenharmony_ci
20064514f5e3Sopenharmony_cibool PromiseCapabilityRef::Reject(const EcmaVM *vm, Local<JSValueRef> reason)
20074514f5e3Sopenharmony_ci{
20084514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
20094514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
20104514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
20114514f5e3Sopenharmony_ci
20124514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arg = JSNApiHelper::ToJSHandle(reason);
20134514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
20144514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(arg.GetTaggedValue().GetRawData());
20154514f5e3Sopenharmony_ci#endif
20164514f5e3Sopenharmony_ci    JSHandle<PromiseCapability> capacity(JSNApiHelper::ToJSHandle(this));
20174514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(capacity, FATAL);
20184514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> reject(thread, capacity->GetReject());
20194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined(constants->GetHandledUndefined());
20204514f5e3Sopenharmony_ci
20214514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
20224514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, reject, undefined, undefined, 1);
20234514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
20244514f5e3Sopenharmony_ci    info->SetCallArg(arg.GetTaggedValue());
20254514f5e3Sopenharmony_ci    JSFunction::Call(info);
20264514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
20274514f5e3Sopenharmony_ci
20284514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ExecutePromisePendingJob();
20294514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, false);
20304514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ClearKeptObjects();
20314514f5e3Sopenharmony_ci    return true;
20324514f5e3Sopenharmony_ci}
20334514f5e3Sopenharmony_ci
20344514f5e3Sopenharmony_ci// ----------------------------------- SymbolRef -----------------------------------------
20354514f5e3Sopenharmony_ciLocal<SymbolRef> SymbolRef::New(const EcmaVM *vm, Local<StringRef> description)
20364514f5e3Sopenharmony_ci{
20374514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
20384514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
20394514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
20404514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
20414514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
20424514f5e3Sopenharmony_ci    JSHandle<JSSymbol> symbol = factory->NewJSSymbol();
20434514f5e3Sopenharmony_ci    if (!description.IsEmpty()) {
20444514f5e3Sopenharmony_ci        JSTaggedValue desc = JSNApiHelper::ToJSTaggedValue(*description);
20454514f5e3Sopenharmony_ci        symbol->SetDescription(thread, desc);
20464514f5e3Sopenharmony_ci    }
20474514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SymbolRef>(JSHandle<JSTaggedValue>(symbol));
20484514f5e3Sopenharmony_ci}
20494514f5e3Sopenharmony_ci
20504514f5e3Sopenharmony_ciLocal<StringRef> SymbolRef::GetDescription(const EcmaVM *vm)
20514514f5e3Sopenharmony_ci{
20524514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
20534514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
20544514f5e3Sopenharmony_ci    JSTaggedValue description = JSSymbol::Cast(
20554514f5e3Sopenharmony_ci        JSNApiHelper::ToJSTaggedValue(this).GetTaggedObject())->GetDescription();
20564514f5e3Sopenharmony_ci    if (!description.IsString()) {
20574514f5e3Sopenharmony_ci        auto constants = thread->GlobalConstants();
20584514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(constants->GetHandledEmptyString());
20594514f5e3Sopenharmony_ci    }
20604514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> descriptionHandle(thread, description);
20614514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(descriptionHandle);
20624514f5e3Sopenharmony_ci}
20634514f5e3Sopenharmony_ci
20644514f5e3Sopenharmony_ci// ----------------------------------- BooleanRef ---------------------------------------
20654514f5e3Sopenharmony_ciLocal<BooleanRef> BooleanRef::New(const EcmaVM *vm, bool value)
20664514f5e3Sopenharmony_ci{
20674514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
20684514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
20694514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
20704514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
20714514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> boolean(thread, JSTaggedValue(value));
20724514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BooleanRef>(boolean);
20734514f5e3Sopenharmony_ci}
20744514f5e3Sopenharmony_ci
20754514f5e3Sopenharmony_cibool BooleanRef::Value()
20764514f5e3Sopenharmony_ci{
20774514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
20784514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
20794514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).IsTrue();
20804514f5e3Sopenharmony_ci}
20814514f5e3Sopenharmony_ci
20824514f5e3Sopenharmony_ci// ----------------------------------- StringRef ----------------------------------------
20834514f5e3Sopenharmony_ciLocal<StringRef> StringRef::NewFromUtf8(const EcmaVM *vm, const char *utf8, int length)
20844514f5e3Sopenharmony_ci{
20854514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
20864514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
20874514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
20884514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
20894514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
20904514f5e3Sopenharmony_ci    if (length < 0) {
20914514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> current(factory->NewFromUtf8(utf8));
20924514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(current);
20934514f5e3Sopenharmony_ci    }
20944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> current(factory->NewFromUtf8(reinterpret_cast<const uint8_t *>(utf8), length));
20954514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(current);
20964514f5e3Sopenharmony_ci}
20974514f5e3Sopenharmony_ci
20984514f5e3Sopenharmony_ciLocal<StringRef> StringRef::NewFromUtf8WithoutStringTable(const EcmaVM *vm, const char *utf8, int length)
20994514f5e3Sopenharmony_ci{
21004514f5e3Sopenharmony_ci    // This only supports for napi_create_string_utf8
21014514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
21024514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21034514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
21044514f5e3Sopenharmony_ci    if (length < 0) {
21054514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> current(factory->NewFromUtf8WithoutStringTable(utf8));
21064514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(current);
21074514f5e3Sopenharmony_ci    }
21084514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> current(factory->NewFromUtf8WithoutStringTable(reinterpret_cast<const uint8_t *>(utf8),
21094514f5e3Sopenharmony_ci                                                                           length));
21104514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(current);
21114514f5e3Sopenharmony_ci}
21124514f5e3Sopenharmony_ci
21134514f5e3Sopenharmony_ciLocal<StringRef> StringRef::NewFromUtf16WithoutStringTable(const EcmaVM *vm, const char16_t *utf16, int length)
21144514f5e3Sopenharmony_ci{
21154514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
21164514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
21174514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
21184514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21194514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
21204514f5e3Sopenharmony_ci    if (length < 0) {
21214514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> current(factory->NewFromUtf16WithoutStringTable(utf16));
21224514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(current);
21234514f5e3Sopenharmony_ci    }
21244514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> current(factory->NewFromUtf16WithoutStringTable(reinterpret_cast<const uint16_t *>(utf16),
21254514f5e3Sopenharmony_ci                                                                            length));
21264514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(current);
21274514f5e3Sopenharmony_ci}
21284514f5e3Sopenharmony_ci
21294514f5e3Sopenharmony_ciLocal<StringRef> StringRef::NewFromUtf16(const EcmaVM *vm, const char16_t *utf16, int length)
21304514f5e3Sopenharmony_ci{
21314514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
21324514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
21334514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
21344514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21354514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
21364514f5e3Sopenharmony_ci    if (length < 0) {
21374514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> current(factory->NewFromUtf16(utf16));
21384514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(current);
21394514f5e3Sopenharmony_ci    }
21404514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> current(factory->NewFromUtf16(reinterpret_cast<const uint16_t *>(utf16), length));
21414514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(current);
21424514f5e3Sopenharmony_ci}
21434514f5e3Sopenharmony_ci
21444514f5e3Sopenharmony_cistd::string StringRef::ToString(const EcmaVM *vm)
21454514f5e3Sopenharmony_ci{
21464514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, "");
21474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21484514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this)).ToStdString();
21494514f5e3Sopenharmony_ci}
21504514f5e3Sopenharmony_ci
21514514f5e3Sopenharmony_cistd::string StringRef::DebuggerToString(const EcmaVM *vm)
21524514f5e3Sopenharmony_ci{
21534514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, "");
21544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21554514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this)).DebuggerToStdString();
21564514f5e3Sopenharmony_ci}
21574514f5e3Sopenharmony_ci
21584514f5e3Sopenharmony_ciuint32_t StringRef::Length(const EcmaVM *vm)
21594514f5e3Sopenharmony_ci{
21604514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
21614514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21624514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this)).GetLength();
21634514f5e3Sopenharmony_ci}
21644514f5e3Sopenharmony_ci
21654514f5e3Sopenharmony_cisize_t StringRef::Utf8Length(const EcmaVM *vm, bool isGetBufferSize)
21664514f5e3Sopenharmony_ci{
21674514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
21684514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21694514f5e3Sopenharmony_ci    JSHandle<EcmaString> strHandle(vm->GetJSThread(), EcmaString::Cast(JSNApiHelper::ToJSTaggedValue(this)));
21704514f5e3Sopenharmony_ci    return EcmaStringAccessor(EcmaStringAccessor::Flatten(vm, strHandle)).GetUtf8Length(isGetBufferSize);
21714514f5e3Sopenharmony_ci}
21724514f5e3Sopenharmony_ci
21734514f5e3Sopenharmony_ciuint32_t StringRef::WriteUtf8(const EcmaVM *vm, char *buffer, uint32_t length, bool isWriteBuffer)
21744514f5e3Sopenharmony_ci{
21754514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
21764514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21774514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this))
21784514f5e3Sopenharmony_ci        .WriteToFlatUtf8(reinterpret_cast<uint8_t *>(buffer), length, isWriteBuffer);
21794514f5e3Sopenharmony_ci}
21804514f5e3Sopenharmony_ci
21814514f5e3Sopenharmony_ciuint32_t StringRef::WriteUtf16(const EcmaVM *vm, char16_t *buffer, uint32_t length)
21824514f5e3Sopenharmony_ci{
21834514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
21844514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21854514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this))
21864514f5e3Sopenharmony_ci        .WriteToUtf16(reinterpret_cast<uint16_t *>(buffer), length);
21874514f5e3Sopenharmony_ci}
21884514f5e3Sopenharmony_ci
21894514f5e3Sopenharmony_ciuint32_t StringRef::WriteLatin1(const EcmaVM *vm, char *buffer, uint32_t length)
21904514f5e3Sopenharmony_ci{
21914514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
21924514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
21934514f5e3Sopenharmony_ci    return EcmaStringAccessor(JSNApiHelper::ToJSTaggedValue(this))
21944514f5e3Sopenharmony_ci        .WriteToOneByte(reinterpret_cast<uint8_t *>(buffer), length);
21954514f5e3Sopenharmony_ci}
21964514f5e3Sopenharmony_ci
21974514f5e3Sopenharmony_ciLocal<StringRef> StringRef::GetNapiWrapperString(const EcmaVM *vm)
21984514f5e3Sopenharmony_ci{
21994514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
22004514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
22014514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22024514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22034514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> napiWapperString = thread->GlobalConstants()->GetHandledNapiWrapperString();
22044514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(napiWapperString);
22054514f5e3Sopenharmony_ci}
22064514f5e3Sopenharmony_ci
22074514f5e3Sopenharmony_ciLocal<TypedArrayRef> StringRef::EncodeIntoUint8Array(const EcmaVM *vm)
22084514f5e3Sopenharmony_ci{
22094514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22114514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> string = JSNApiHelper::ToJSHandle(this);
22124514f5e3Sopenharmony_ci    uint32_t length = this->Utf8Length(vm, true);
22134514f5e3Sopenharmony_ci    // 1 because Utf8Length adds 1 for the return value
22144514f5e3Sopenharmony_ci    if (length <= 1) {
22154514f5e3Sopenharmony_ci        return Undefined(vm);
22164514f5e3Sopenharmony_ci    }
22174514f5e3Sopenharmony_ci
22184514f5e3Sopenharmony_ci    JSHandle<JSObject> obj =
22194514f5e3Sopenharmony_ci        TypedArrayHelper::FastCreateTypedArray(thread, thread->GlobalConstants()->GetHandledUint8ArrayString(),
22204514f5e3Sopenharmony_ci                                               length - 1, DataViewType::UINT8);
22214514f5e3Sopenharmony_ci    JSHandle<JSObject> arrayBuffer(thread, JSTypedArray::Cast(*obj)->GetViewedArrayBufferOrByteArray());
22224514f5e3Sopenharmony_ci    JSTaggedValue bufferData = JSHandle<JSArrayBuffer>::Cast(arrayBuffer)->GetArrayBufferData();
22234514f5e3Sopenharmony_ci    void *buffer = JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer();
22244514f5e3Sopenharmony_ci
22254514f5e3Sopenharmony_ci    JSHandle<EcmaString> stringHandle = JSHandle<EcmaString>::Cast(string);
22264514f5e3Sopenharmony_ci    EcmaStringAccessor(stringHandle).WriteToFlatUtf8(reinterpret_cast<uint8_t*>(buffer), length - 1, true);
22274514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> typedArrayTag = JSHandle<JSTaggedValue>::Cast(obj);
22284514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<TypedArrayRef>(typedArrayTag);
22294514f5e3Sopenharmony_ci}
22304514f5e3Sopenharmony_ci
22314514f5e3Sopenharmony_ci// ---------------------------------- PromiseRejectInfo ---------------------------------
22324514f5e3Sopenharmony_ciPromiseRejectInfo::PromiseRejectInfo(Local<JSValueRef> promise, Local<JSValueRef> reason,
22334514f5e3Sopenharmony_ci                                     PromiseRejectInfo::PROMISE_REJECTION_EVENT operation, void* data)
22344514f5e3Sopenharmony_ci    : promise_(promise), reason_(reason), operation_(operation), data_(data) {}
22354514f5e3Sopenharmony_ci
22364514f5e3Sopenharmony_ciLocal<JSValueRef> PromiseRejectInfo::GetPromise() const
22374514f5e3Sopenharmony_ci{
22384514f5e3Sopenharmony_ci    return promise_;
22394514f5e3Sopenharmony_ci}
22404514f5e3Sopenharmony_ci
22414514f5e3Sopenharmony_ciLocal<JSValueRef> PromiseRejectInfo::GetReason() const
22424514f5e3Sopenharmony_ci{
22434514f5e3Sopenharmony_ci    return reason_;
22444514f5e3Sopenharmony_ci}
22454514f5e3Sopenharmony_ci
22464514f5e3Sopenharmony_ciPromiseRejectInfo::PROMISE_REJECTION_EVENT PromiseRejectInfo::GetOperation() const
22474514f5e3Sopenharmony_ci{
22484514f5e3Sopenharmony_ci    return operation_;
22494514f5e3Sopenharmony_ci}
22504514f5e3Sopenharmony_ci
22514514f5e3Sopenharmony_civoid* PromiseRejectInfo::GetData() const
22524514f5e3Sopenharmony_ci{
22534514f5e3Sopenharmony_ci    return data_;
22544514f5e3Sopenharmony_ci}
22554514f5e3Sopenharmony_ci
22564514f5e3Sopenharmony_ci// ----------------------------------- BigIntRef ---------------------------------------
22574514f5e3Sopenharmony_ciLocal<BigIntRef> BigIntRef::New(const EcmaVM *vm, uint64_t input)
22584514f5e3Sopenharmony_ci{
22594514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
22604514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
22614514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22624514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22634514f5e3Sopenharmony_ci    JSHandle<BigInt> big = BigInt::Uint64ToBigInt(thread, input);
22644514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigint = JSHandle<JSTaggedValue>::Cast(big);
22654514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BigIntRef>(bigint);
22664514f5e3Sopenharmony_ci}
22674514f5e3Sopenharmony_ci
22684514f5e3Sopenharmony_ciLocal<BigIntRef> BigIntRef::New(const EcmaVM *vm, int64_t input)
22694514f5e3Sopenharmony_ci{
22704514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
22714514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
22724514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22734514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22744514f5e3Sopenharmony_ci    JSHandle<BigInt> big = BigInt::Int64ToBigInt(thread, input);
22754514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigint = JSHandle<JSTaggedValue>::Cast(big);
22764514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<BigIntRef>(bigint);
22774514f5e3Sopenharmony_ci}
22784514f5e3Sopenharmony_ci
22794514f5e3Sopenharmony_ciLocal<JSValueRef> BigIntRef::CreateBigWords(const EcmaVM *vm, bool sign, uint32_t size, const uint64_t* words)
22804514f5e3Sopenharmony_ci{
22814514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
22824514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
22834514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22844514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22854514f5e3Sopenharmony_ci    JSHandle<BigInt> big = BigInt::CreateBigWords(thread, sign, size, words);
22864514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigint = JSHandle<JSTaggedValue>::Cast(big);
22874514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(bigint);
22884514f5e3Sopenharmony_ci}
22894514f5e3Sopenharmony_ci
22904514f5e3Sopenharmony_civoid BigIntRef::BigIntToInt64(const EcmaVM *vm, int64_t *value, bool *lossless)
22914514f5e3Sopenharmony_ci{
22924514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
22934514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
22944514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
22954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
22964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigintVal(JSNApiHelper::ToJSHandle(this));
22974514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(bigintVal, ERROR);
22984514f5e3Sopenharmony_ci    BigInt::BigIntToInt64(thread, bigintVal, value, lossless);
22994514f5e3Sopenharmony_ci}
23004514f5e3Sopenharmony_ci
23014514f5e3Sopenharmony_civoid BigIntRef::BigIntToUint64(const EcmaVM *vm, uint64_t *value, bool *lossless)
23024514f5e3Sopenharmony_ci{
23034514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
23044514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
23054514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
23064514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
23074514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> bigintVal(JSNApiHelper::ToJSHandle(this));
23084514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(bigintVal, ERROR);
23094514f5e3Sopenharmony_ci    BigInt::BigIntToUint64(thread, bigintVal, value, lossless);
23104514f5e3Sopenharmony_ci}
23114514f5e3Sopenharmony_ci
23124514f5e3Sopenharmony_civoid BigIntRef::GetWordsArray(const EcmaVM *vm, bool* signBit, size_t wordCount, uint64_t* words)
23134514f5e3Sopenharmony_ci{
23144514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE(this);
23154514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
23164514f5e3Sopenharmony_ci    JSHandle<BigInt> bigintVal(JSNApiHelper::ToJSHandle(this));
23174514f5e3Sopenharmony_ci    uint32_t len = bigintVal->GetLength();
23184514f5e3Sopenharmony_ci    uint32_t count = 0;
23194514f5e3Sopenharmony_ci    uint32_t index = 0;
23204514f5e3Sopenharmony_ci    ASSERT(wordCount > 0);
23214514f5e3Sopenharmony_ci    for (; index < wordCount - 1; ++index) {
23224514f5e3Sopenharmony_ci        words[index] = static_cast<uint64_t>(bigintVal->GetDigit(count++));
23234514f5e3Sopenharmony_ci        words[index] |= static_cast<uint64_t>(bigintVal->GetDigit(count++)) << 32; // 32 : int32_t bits
23244514f5e3Sopenharmony_ci    }
23254514f5e3Sopenharmony_ci    if (len % 2 == 0) { // 2 : len is odd or even
23264514f5e3Sopenharmony_ci        words[index] = static_cast<uint64_t>(bigintVal->GetDigit(count++));
23274514f5e3Sopenharmony_ci        words[index] |= static_cast<uint64_t>(bigintVal->GetDigit(count++)) << 32; // 32 : int32_t bits
23284514f5e3Sopenharmony_ci    } else {
23294514f5e3Sopenharmony_ci        words[index] = static_cast<uint64_t>(bigintVal->GetDigit(count++));
23304514f5e3Sopenharmony_ci    }
23314514f5e3Sopenharmony_ci    *signBit = bigintVal->GetSign();
23324514f5e3Sopenharmony_ci}
23334514f5e3Sopenharmony_ci
23344514f5e3Sopenharmony_ciuint32_t BigIntRef::GetWordsArraySize(const EcmaVM *vm)
23354514f5e3Sopenharmony_ci{
23364514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
23374514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
23384514f5e3Sopenharmony_ci    JSHandle<BigInt> bigintVal(JSNApiHelper::ToJSHandle(this));
23394514f5e3Sopenharmony_ci    uint32_t len = bigintVal->GetLength();
23404514f5e3Sopenharmony_ci    return len % 2 != 0 ? len / 2 + 1 : len / 2; // 2 : len is odd or even
23414514f5e3Sopenharmony_ci}
23424514f5e3Sopenharmony_ci
23434514f5e3Sopenharmony_ci// ----------------------------------- HandleScope -------------------------------------
23444514f5e3Sopenharmony_ciLocalScope::LocalScope(const EcmaVM *vm) : thread_(vm->GetJSThread())
23454514f5e3Sopenharmony_ci{
23464514f5e3Sopenharmony_ci    // Only get handle ptr here. Do not need to swtich state.
23474514f5e3Sopenharmony_ci    auto context = reinterpret_cast<JSThread *>(thread_)->GetCurrentEcmaContext();
23484514f5e3Sopenharmony_ci    prevNext_ = context->GetHandleScopeStorageNext();
23494514f5e3Sopenharmony_ci    prevEnd_ = context->GetHandleScopeStorageEnd();
23504514f5e3Sopenharmony_ci    prevHandleStorageIndex_ = context->GetCurrentHandleStorageIndex();
23514514f5e3Sopenharmony_ci
23524514f5e3Sopenharmony_ci    prevPrimitiveNext_ = context->GetPrimitiveScopeStorageNext();
23534514f5e3Sopenharmony_ci    prevPrimitiveEnd_ = context->GetPrimitiveScopeStorageEnd();
23544514f5e3Sopenharmony_ci    prevPrimitiveStorageIndex_ = context->GetCurrentPrimitiveStorageIndex();
23554514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_HANDLE_LEAK_CHECK
23564514f5e3Sopenharmony_ci    context->HandleScopeCountAdd();
23574514f5e3Sopenharmony_ci    context->PrimitiveScopeCountAdd();
23584514f5e3Sopenharmony_ci#endif
23594514f5e3Sopenharmony_ci}
23604514f5e3Sopenharmony_ci
23614514f5e3Sopenharmony_ciLocalScope::LocalScope(const EcmaVM *vm, JSTaggedType value) : thread_(vm->GetJSThread())
23624514f5e3Sopenharmony_ci{
23634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(reinterpret_cast<JSThread *>(thread_));
23644514f5e3Sopenharmony_ci    // Simply reserve a slot on the handlescope. The escaped handle will still be retained in this slot.
23654514f5e3Sopenharmony_ci    ecmascript::EcmaHandleScope::NewHandle(reinterpret_cast<JSThread *>(thread_), value);
23664514f5e3Sopenharmony_ci    auto context = reinterpret_cast<JSThread *>(thread_)->GetCurrentEcmaContext();
23674514f5e3Sopenharmony_ci    prevNext_ = context->GetHandleScopeStorageNext();
23684514f5e3Sopenharmony_ci    prevEnd_ = context->GetHandleScopeStorageEnd();
23694514f5e3Sopenharmony_ci    prevHandleStorageIndex_ = context->GetCurrentHandleStorageIndex();
23704514f5e3Sopenharmony_ci
23714514f5e3Sopenharmony_ci    prevPrimitiveNext_ = context->GetPrimitiveScopeStorageNext();
23724514f5e3Sopenharmony_ci    prevPrimitiveEnd_ = context->GetPrimitiveScopeStorageEnd();
23734514f5e3Sopenharmony_ci    prevPrimitiveStorageIndex_ = context->GetCurrentPrimitiveStorageIndex();
23744514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_HANDLE_LEAK_CHECK
23754514f5e3Sopenharmony_ci    context->HandleScopeCountAdd();
23764514f5e3Sopenharmony_ci    context->PrimitiveScopeCountAdd();
23774514f5e3Sopenharmony_ci#endif
23784514f5e3Sopenharmony_ci}
23794514f5e3Sopenharmony_ci
23804514f5e3Sopenharmony_ciLocalScope::~LocalScope()
23814514f5e3Sopenharmony_ci{
23824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(reinterpret_cast<JSThread *>(thread_));
23834514f5e3Sopenharmony_ci    auto context = reinterpret_cast<JSThread *>(thread_)->GetCurrentEcmaContext();
23844514f5e3Sopenharmony_ci#ifdef ECMASCRIPT_ENABLE_HANDLE_LEAK_CHECK
23854514f5e3Sopenharmony_ci    context->HandleScopeCountDec();
23864514f5e3Sopenharmony_ci    context->PrimitiveScopeCountDec();
23874514f5e3Sopenharmony_ci#endif
23884514f5e3Sopenharmony_ci    context->SetHandleScopeStorageNext(static_cast<JSTaggedType *>(prevNext_));
23894514f5e3Sopenharmony_ci    context->SetPrimitiveScopeStorageNext(static_cast<JSTaggedType *>(prevPrimitiveNext_));
23904514f5e3Sopenharmony_ci
23914514f5e3Sopenharmony_ci    if (context->GetHandleScopeStorageEnd() != prevEnd_) {
23924514f5e3Sopenharmony_ci        context->SetHandleScopeStorageEnd(static_cast<JSTaggedType *>(prevEnd_));
23934514f5e3Sopenharmony_ci        context->ShrinkHandleStorage(prevHandleStorageIndex_);
23944514f5e3Sopenharmony_ci    }
23954514f5e3Sopenharmony_ci
23964514f5e3Sopenharmony_ci    if (context->GetPrimitiveScopeStorageEnd() != prevPrimitiveEnd_) {
23974514f5e3Sopenharmony_ci        context->SetPrimitiveScopeStorageEnd(static_cast<JSTaggedType *>(prevPrimitiveEnd_));
23984514f5e3Sopenharmony_ci        context->ShrinkPrimitiveStorage(prevPrimitiveStorageIndex_);
23994514f5e3Sopenharmony_ci    }
24004514f5e3Sopenharmony_ci}
24014514f5e3Sopenharmony_ci
24024514f5e3Sopenharmony_ci// ----------------------------------- EscapeLocalScope ------------------------------
24034514f5e3Sopenharmony_ciEscapeLocalScope::EscapeLocalScope(const EcmaVM *vm) : LocalScope(vm, JSTaggedValue::Undefined().GetRawData())
24044514f5e3Sopenharmony_ci{
24054514f5e3Sopenharmony_ci    auto thread = vm->GetJSThread();
24064514f5e3Sopenharmony_ci    // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
24074514f5e3Sopenharmony_ci    escapeHandle_ = ToUintPtr(thread->GetCurrentEcmaContext()->GetHandleScopeStorageNext() - 1);
24084514f5e3Sopenharmony_ci}
24094514f5e3Sopenharmony_ci
24104514f5e3Sopenharmony_ci// ----------------------------------- IntegerRef ---------------------------------------
24114514f5e3Sopenharmony_ciLocal<IntegerRef> IntegerRef::New(const EcmaVM *vm, int input)
24124514f5e3Sopenharmony_ci{
24134514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
24144514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
24154514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
24164514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
24174514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> integer(thread, JSTaggedValue(input));
24184514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<IntegerRef>(integer);
24194514f5e3Sopenharmony_ci}
24204514f5e3Sopenharmony_ci
24214514f5e3Sopenharmony_ciLocal<IntegerRef> IntegerRef::NewFromUnsigned(const EcmaVM *vm, unsigned int input)
24224514f5e3Sopenharmony_ci{
24234514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
24244514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
24254514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
24264514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
24274514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> integer(thread, JSTaggedValue(input));
24284514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<IntegerRef>(integer);
24294514f5e3Sopenharmony_ci}
24304514f5e3Sopenharmony_ci
24314514f5e3Sopenharmony_ciint IntegerRef::Value()
24324514f5e3Sopenharmony_ci{
24334514f5e3Sopenharmony_ci    // Omit exception check because ark calls here may not
24344514f5e3Sopenharmony_ci    // cause side effect even pending exception exists.
24354514f5e3Sopenharmony_ci    return JSNApiHelper::ToJSTaggedValue(this).GetInt();
24364514f5e3Sopenharmony_ci}
24374514f5e3Sopenharmony_ci
24384514f5e3Sopenharmony_ci// ----------------------------------- ObjectRef ----------------------------------------
24394514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::New(const EcmaVM *vm)
24404514f5e3Sopenharmony_ci{
24414514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
24424514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
24434514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
24444514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
24454514f5e3Sopenharmony_ci    JSHandle<JSFunction> constructor(globalEnv->GetObjectFunction());
24464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(constructor));
24474514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(object);
24484514f5e3Sopenharmony_ci}
24494514f5e3Sopenharmony_ci
24504514f5e3Sopenharmony_ciuintptr_t ObjectRef::NewObject(const EcmaVM *vm)
24514514f5e3Sopenharmony_ci{
24524514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm,
24534514f5e3Sopenharmony_ci        (vm->GetJSThread()->GlobalConstants()->GetHandledUndefined()).GetAddress());
24544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
24554514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
24564514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
24574514f5e3Sopenharmony_ci    JSHandle<JSFunction> constructor(globalEnv->GetObjectFunction());
24584514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(constructor));
24594514f5e3Sopenharmony_ci    return object.GetAddress();
24604514f5e3Sopenharmony_ci}
24614514f5e3Sopenharmony_ci
24624514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::NewS(const EcmaVM *vm)
24634514f5e3Sopenharmony_ci{
24644514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
24654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
24664514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
24674514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
24684514f5e3Sopenharmony_ci    JSHandle<JSFunction> constructor(globalEnv->GetSObjectFunction());
24694514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(factory->NewJSObjectByConstructor(constructor));
24704514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(object);
24714514f5e3Sopenharmony_ci}
24724514f5e3Sopenharmony_ci
24734514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::NewWithProperties(const EcmaVM *vm, size_t propertyCount,
24744514f5e3Sopenharmony_ci                                              const Local<JSValueRef> *keys,
24754514f5e3Sopenharmony_ci                                              const PropertyAttribute *attributes)
24764514f5e3Sopenharmony_ci{
24774514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
24784514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
24794514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
24804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj;
24814514f5e3Sopenharmony_ci    auto CreateObjImpl = [vm, propertyCount, keys, attributes] (uintptr_t head) -> JSHandle<JSTaggedValue> {
24824514f5e3Sopenharmony_ci        JSThread *thread = vm->GetJSThread();
24834514f5e3Sopenharmony_ci        const PropertyDescriptor *desc = reinterpret_cast<const PropertyDescriptor *>(head);
24844514f5e3Sopenharmony_ci        for (size_t i = 0; i < propertyCount; ++i) {
24854514f5e3Sopenharmony_ci            const PropertyAttribute &attr = attributes[i];
24864514f5e3Sopenharmony_ci            new (reinterpret_cast<void *>(head)) PropertyDescriptor(thread,
24874514f5e3Sopenharmony_ci                                                                    JSNApiHelper::ToJSHandle(attr.GetValue(vm)),
24884514f5e3Sopenharmony_ci                                                                    attr.IsWritable(), attr.IsEnumerable(),
24894514f5e3Sopenharmony_ci                                                                    attr.IsConfigurable());
24904514f5e3Sopenharmony_ci            head += sizeof(PropertyDescriptor);
24914514f5e3Sopenharmony_ci        }
24924514f5e3Sopenharmony_ci        ObjectFactory *factory = vm->GetFactory();
24934514f5e3Sopenharmony_ci        return factory->CreateJSObjectWithProperties(propertyCount, keys, desc);
24944514f5e3Sopenharmony_ci    };
24954514f5e3Sopenharmony_ci    if (propertyCount <= MAX_PROPERTIES_ON_STACK) {
24964514f5e3Sopenharmony_ci        char desc[sizeof(PropertyDescriptor) * MAX_PROPERTIES_ON_STACK];
24974514f5e3Sopenharmony_ci        obj = CreateObjImpl(reinterpret_cast<uintptr_t>(desc));
24984514f5e3Sopenharmony_ci    } else {
24994514f5e3Sopenharmony_ci        void *desc = malloc(sizeof(PropertyDescriptor) * propertyCount);
25004514f5e3Sopenharmony_ci        obj = CreateObjImpl(reinterpret_cast<uintptr_t>(desc));
25014514f5e3Sopenharmony_ci        free(desc);
25024514f5e3Sopenharmony_ci    }
25034514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
25044514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<ObjectRef>(obj));
25054514f5e3Sopenharmony_ci}
25064514f5e3Sopenharmony_ci
25074514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::NewSWithProperties(const EcmaVM *vm, SendablePropertiesInfo &info)
25084514f5e3Sopenharmony_ci{
25094514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
25104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25114514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
25124514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
25134514f5e3Sopenharmony_ci    std::vector<PropertyDescriptor> descs;
25144514f5e3Sopenharmony_ci    JSNapiSendable::InitWithPropertiesInfo(thread, info, descs);
25154514f5e3Sopenharmony_ci    auto obj = factory->CreateSObjectWithProperties(descs);
25164514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
25174514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<ObjectRef>(obj));
25184514f5e3Sopenharmony_ci}
25194514f5e3Sopenharmony_ci
25204514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::NewWithNamedProperties(const EcmaVM *vm, size_t propertyCount,
25214514f5e3Sopenharmony_ci                                                   const char **keys, const Local<JSValueRef> *values)
25224514f5e3Sopenharmony_ci{
25234514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
25244514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25254514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
25264514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
25274514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = factory->CreateJSObjectWithNamedProperties(propertyCount, keys, values);
25284514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
25294514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<ObjectRef>(obj));
25304514f5e3Sopenharmony_ci}
25314514f5e3Sopenharmony_ci
25324514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::CreateNativeModuleFailureInfo(const EcmaVM *vm, const std::string &failureInfo)
25334514f5e3Sopenharmony_ci{
25344514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
25354514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25364514f5e3Sopenharmony_ci    if (EcmaVM::GetErrorInfoEnhance()) {
25374514f5e3Sopenharmony_ci        JSHandle<NativeModuleFailureInfo> nativeModuleErrorFailureInfo =
25384514f5e3Sopenharmony_ci            NativeModuleFailureInfo::CreateNativeModuleFailureInfo(vm, failureInfo);
25394514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<ObjectRef>(JSHandle<JSTaggedValue>::Cast(nativeModuleErrorFailureInfo));
25404514f5e3Sopenharmony_ci    }
25414514f5e3Sopenharmony_ci    return JSValueRef::Undefined(vm);
25424514f5e3Sopenharmony_ci}
25434514f5e3Sopenharmony_ci
25444514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::CreateAccessorData(const EcmaVM *vm,
25454514f5e3Sopenharmony_ci                                               Local<FunctionRef> getter, Local<FunctionRef> setter)
25464514f5e3Sopenharmony_ci{
25474514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
25484514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25494514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> getterValue = JSNApiHelper::ToJSHandle(getter);
25504514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setterValue = JSNApiHelper::ToJSHandle(setter);
25514514f5e3Sopenharmony_ci    JSHandle<AccessorData> accessor = thread->GetEcmaVM()->GetFactory()->NewAccessorData();
25524514f5e3Sopenharmony_ci    accessor->SetGetter(thread, getterValue);
25534514f5e3Sopenharmony_ci    accessor->SetSetter(thread, setterValue);
25544514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(JSHandle<JSTaggedValue>::Cast(accessor));
25554514f5e3Sopenharmony_ci}
25564514f5e3Sopenharmony_ci
25574514f5e3Sopenharmony_ciLocal<ObjectRef> ObjectRef::CreateSendableAccessorData(const EcmaVM *vm,
25584514f5e3Sopenharmony_ci                                                       Local<FunctionRef> getter,
25594514f5e3Sopenharmony_ci                                                       Local<FunctionRef> setter)
25604514f5e3Sopenharmony_ci{
25614514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
25624514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
25634514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> getterValue = JSNApiHelper::ToJSHandle(getter);
25644514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setterValue = JSNApiHelper::ToJSHandle(setter);
25654514f5e3Sopenharmony_ci    JSHandle<AccessorData> accessor = thread->GetEcmaVM()->GetFactory()->NewSAccessorData();
25664514f5e3Sopenharmony_ci    accessor->SetGetter(thread, getterValue);
25674514f5e3Sopenharmony_ci    accessor->SetSetter(thread, setterValue);
25684514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(JSHandle<JSTaggedValue>::Cast(accessor));
25694514f5e3Sopenharmony_ci}
25704514f5e3Sopenharmony_ci
25714514f5e3Sopenharmony_cibool ObjectRef::ConvertToNativeBindingObject(const EcmaVM *vm, Local<NativePointerRef> value)
25724514f5e3Sopenharmony_ci{
25734514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
25744514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25754514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
25764514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object = JSNApiHelper::ToJSHandle(this);
25774514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
25784514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
25794514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = env->GetNativeBindingSymbol();
25804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> valueValue = JSNApiHelper::ToJSHandle(value);
25814514f5e3Sopenharmony_ci    bool result = JSTaggedValue::SetProperty(vm->GetJSThread(), object, keyValue, valueValue);
25824514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, false);
25834514f5e3Sopenharmony_ci    object->GetTaggedObject()->GetClass()->SetIsNativeBindingObject(true);
25844514f5e3Sopenharmony_ci    return result;
25854514f5e3Sopenharmony_ci}
25864514f5e3Sopenharmony_ci
25874514f5e3Sopenharmony_cibool ObjectRef::Set(const EcmaVM *vm, Local<JSValueRef> key, Local<JSValueRef> value)
25884514f5e3Sopenharmony_ci{
25894514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
25904514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
25914514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
25924514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
25934514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
25944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
25954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> valueValue = JSNApiHelper::ToJSHandle(value);
25964514f5e3Sopenharmony_ci    if (!obj->IsHeapObject()) {
25974514f5e3Sopenharmony_ci        return JSTaggedValue::SetProperty(thread, obj, keyValue, valueValue);
25984514f5e3Sopenharmony_ci    }
25994514f5e3Sopenharmony_ci    return ObjectFastOperator::FastSetPropertyByValue(thread, obj.GetTaggedValue(),
26004514f5e3Sopenharmony_ci                                                      keyValue.GetTaggedValue(),
26014514f5e3Sopenharmony_ci                                                      valueValue.GetTaggedValue());
26024514f5e3Sopenharmony_ci}
26034514f5e3Sopenharmony_ci
26044514f5e3Sopenharmony_cibool ObjectRef::Set(const EcmaVM *vm, const char *utf8, Local<JSValueRef> value)
26054514f5e3Sopenharmony_ci{
26064514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
26074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
26084514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
26094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
26104514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
26114514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
26124514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(factory->NewFromUtf8(utf8));
26134514f5e3Sopenharmony_ci    JSTaggedValue valueValue = JSNApiHelper::ToJSTaggedValue(*value);
26144514f5e3Sopenharmony_ci    if (!obj->IsHeapObject()) {
26154514f5e3Sopenharmony_ci        return JSTaggedValue::SetProperty(thread, obj, keyValue, JSHandle<JSTaggedValue>(thread, valueValue));
26164514f5e3Sopenharmony_ci    }
26174514f5e3Sopenharmony_ci    JSTaggedValue res = ObjectFastOperator::TrySetPropertyByNameThroughCacheAtLocal(thread, obj.GetTaggedValue(),
26184514f5e3Sopenharmony_ci                                                                                    keyValue.GetTaggedValue(),
26194514f5e3Sopenharmony_ci                                                                                    valueValue);
26204514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, false);
26214514f5e3Sopenharmony_ci    if (!res.IsHole()) {
26224514f5e3Sopenharmony_ci        return !res.IsException();
26234514f5e3Sopenharmony_ci    }
26244514f5e3Sopenharmony_ci    if (!JSNApi::KeyIsNumber(utf8)) {
26254514f5e3Sopenharmony_ci        res = ObjectFastOperator::SetPropertyByName(thread, obj.GetTaggedValue(), keyValue.GetTaggedValue(),
26264514f5e3Sopenharmony_ci                                                    valueValue);
26274514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, false);
26284514f5e3Sopenharmony_ci        if (!res.IsHole()) {
26294514f5e3Sopenharmony_ci            return !res.IsException();
26304514f5e3Sopenharmony_ci        }
26314514f5e3Sopenharmony_ci        return JSTaggedValue::SetProperty(thread, JSHandle<JSTaggedValue>(thread, obj.GetTaggedValue()), keyValue,
26324514f5e3Sopenharmony_ci                                          JSHandle<JSTaggedValue>(thread, valueValue), true);
26334514f5e3Sopenharmony_ci    }
26344514f5e3Sopenharmony_ci    return ObjectFastOperator::FastSetPropertyByValue(thread, obj.GetTaggedValue(),
26354514f5e3Sopenharmony_ci                                                      keyValue.GetTaggedValue(),
26364514f5e3Sopenharmony_ci                                                      valueValue);
26374514f5e3Sopenharmony_ci}
26384514f5e3Sopenharmony_ci
26394514f5e3Sopenharmony_cibool ObjectRef::Set(const EcmaVM *vm, uint32_t key, Local<JSValueRef> value)
26404514f5e3Sopenharmony_ci{
26414514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
26424514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
26434514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
26444514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
26454514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
26464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> valueValue = JSNApiHelper::ToJSHandle(value);
26474514f5e3Sopenharmony_ci    if (!obj->IsHeapObject()) {
26484514f5e3Sopenharmony_ci        return JSTaggedValue::SetProperty(thread, obj, key, valueValue);
26494514f5e3Sopenharmony_ci    }
26504514f5e3Sopenharmony_ci    return ObjectFastOperator::FastSetPropertyByIndex(thread, obj.GetTaggedValue(),
26514514f5e3Sopenharmony_ci                                                      key, valueValue.GetTaggedValue());
26524514f5e3Sopenharmony_ci}
26534514f5e3Sopenharmony_ci
26544514f5e3Sopenharmony_cibool ObjectRef::SetAccessorProperty(const EcmaVM *vm, Local<JSValueRef> key, Local<FunctionRef> getter,
26554514f5e3Sopenharmony_ci    Local<FunctionRef> setter, PropertyAttribute attribute)
26564514f5e3Sopenharmony_ci{
26574514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
26584514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
26594514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
26604514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> getterValue = JSNApiHelper::ToJSHandle(getter);
26614514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setterValue = JSNApiHelper::ToJSHandle(setter);
26624514f5e3Sopenharmony_ci    PropertyDescriptor desc(thread, attribute.IsWritable(), attribute.IsEnumerable(), attribute.IsConfigurable());
26634514f5e3Sopenharmony_ci    desc.SetValue(JSNApiHelper::ToJSHandle(attribute.GetValue(vm)));
26644514f5e3Sopenharmony_ci    desc.SetSetter(setterValue);
26654514f5e3Sopenharmony_ci    desc.SetGetter(getterValue);
26664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
26674514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
26684514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
26694514f5e3Sopenharmony_ci    return JSTaggedValue::DefineOwnProperty(thread, obj, keyValue, desc);
26704514f5e3Sopenharmony_ci}
26714514f5e3Sopenharmony_ci
26724514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::Get(const EcmaVM *vm, Local<JSValueRef> key)
26734514f5e3Sopenharmony_ci{
26744514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
26754514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
26764514f5e3Sopenharmony_ci    JSTaggedValue result;
26774514f5e3Sopenharmony_ci    {
26784514f5e3Sopenharmony_ci        LocalScope scope(vm);
26794514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
26804514f5e3Sopenharmony_ci        LOG_IF_SPECIAL(obj, ERROR);
26814514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
26824514f5e3Sopenharmony_ci        if (UNLIKELY(!obj->IsHeapObject())) {
26834514f5e3Sopenharmony_ci            OperationResult ret = JSTaggedValue::GetProperty(thread, obj, keyValue);
26844514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
26854514f5e3Sopenharmony_ci            result = ret.GetValue().GetTaggedValue();
26864514f5e3Sopenharmony_ci        } else {
26874514f5e3Sopenharmony_ci            result = ObjectFastOperator::FastGetPropertyByValue(thread, obj.GetTaggedValue(),
26884514f5e3Sopenharmony_ci                                                                keyValue.GetTaggedValue());
26894514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
26904514f5e3Sopenharmony_ci        }
26914514f5e3Sopenharmony_ci    }
26924514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
26934514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(resultValue);
26944514f5e3Sopenharmony_ci}
26954514f5e3Sopenharmony_ci
26964514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::Get(const EcmaVM *vm, const char *utf8)
26974514f5e3Sopenharmony_ci{
26984514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
26994514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
27004514f5e3Sopenharmony_ci    JSTaggedValue result;
27014514f5e3Sopenharmony_ci    {
27024514f5e3Sopenharmony_ci        LocalScope scope(vm);
27034514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
27044514f5e3Sopenharmony_ci        LOG_IF_SPECIAL(obj, ERROR);
27054514f5e3Sopenharmony_ci        ObjectFactory *factory = vm->GetFactory();
27064514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> keyValue(factory->NewFromUtf8(utf8));
27074514f5e3Sopenharmony_ci        if (UNLIKELY(!obj->IsHeapObject())) {
27084514f5e3Sopenharmony_ci            OperationResult ret = JSTaggedValue::GetProperty(thread, obj, keyValue);
27094514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27104514f5e3Sopenharmony_ci            result = ret.GetValue().GetTaggedValue();
27114514f5e3Sopenharmony_ci        } else {
27124514f5e3Sopenharmony_ci            result = ObjectFastOperator::FastGetPropertyByValue(thread, obj.GetTaggedValue(),
27134514f5e3Sopenharmony_ci                                                                keyValue.GetTaggedValue());
27144514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27154514f5e3Sopenharmony_ci        }
27164514f5e3Sopenharmony_ci    }
27174514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
27184514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(resultValue);
27194514f5e3Sopenharmony_ci}
27204514f5e3Sopenharmony_ci
27214514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::Get(const EcmaVM *vm, int32_t key)
27224514f5e3Sopenharmony_ci{
27234514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
27244514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
27254514f5e3Sopenharmony_ci    JSTaggedValue result;
27264514f5e3Sopenharmony_ci    {
27274514f5e3Sopenharmony_ci        LocalScope scope(vm);
27284514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
27294514f5e3Sopenharmony_ci        LOG_IF_SPECIAL(obj, ERROR);
27304514f5e3Sopenharmony_ci        if (!obj->IsHeapObject()) {
27314514f5e3Sopenharmony_ci            OperationResult ret = JSTaggedValue::GetProperty(thread, obj, key);
27324514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27334514f5e3Sopenharmony_ci            result = ret.GetValue().GetTaggedValue();
27344514f5e3Sopenharmony_ci        } else {
27354514f5e3Sopenharmony_ci            result = ObjectFastOperator::FastGetPropertyByIndex(thread, obj.GetTaggedValue(), key);
27364514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27374514f5e3Sopenharmony_ci        }
27384514f5e3Sopenharmony_ci    }
27394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
27404514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(resultValue);
27414514f5e3Sopenharmony_ci}
27424514f5e3Sopenharmony_ci
27434514f5e3Sopenharmony_cibool ObjectRef::GetOwnProperty(const EcmaVM *vm, Local<JSValueRef> key, PropertyAttribute &property)
27444514f5e3Sopenharmony_ci{
27454514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
27464514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
27474514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj = JSNApiHelper::ToJSHandle(this);
27484514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
27494514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue = JSNApiHelper::ToJSHandle(key);
27504514f5e3Sopenharmony_ci    PropertyDescriptor desc(thread);
27514514f5e3Sopenharmony_ci    bool ret = JSObject::GetOwnProperty(thread, JSHandle<JSObject>(obj), keyValue, desc);
27524514f5e3Sopenharmony_ci    if (!ret) {
27534514f5e3Sopenharmony_ci        return false;
27544514f5e3Sopenharmony_ci    }
27554514f5e3Sopenharmony_ci    property.SetValue(JSNApiHelper::ToLocal<JSValueRef>(desc.GetValue()));
27564514f5e3Sopenharmony_ci    if (desc.HasGetter()) {
27574514f5e3Sopenharmony_ci        property.SetGetter(JSNApiHelper::ToLocal<JSValueRef>(desc.GetGetter()));
27584514f5e3Sopenharmony_ci    }
27594514f5e3Sopenharmony_ci    if (desc.HasSetter()) {
27604514f5e3Sopenharmony_ci        property.SetSetter(JSNApiHelper::ToLocal<JSValueRef>(desc.GetSetter()));
27614514f5e3Sopenharmony_ci    }
27624514f5e3Sopenharmony_ci    if (desc.HasWritable()) {
27634514f5e3Sopenharmony_ci        property.SetWritable(desc.IsWritable());
27644514f5e3Sopenharmony_ci    }
27654514f5e3Sopenharmony_ci    if (desc.HasEnumerable()) {
27664514f5e3Sopenharmony_ci        property.SetEnumerable(desc.IsEnumerable());
27674514f5e3Sopenharmony_ci    }
27684514f5e3Sopenharmony_ci    if (desc.HasConfigurable()) {
27694514f5e3Sopenharmony_ci        property.SetConfigurable(desc.IsConfigurable());
27704514f5e3Sopenharmony_ci    }
27714514f5e3Sopenharmony_ci
27724514f5e3Sopenharmony_ci    return true;
27734514f5e3Sopenharmony_ci}
27744514f5e3Sopenharmony_ci
27754514f5e3Sopenharmony_ciLocal<ArrayRef> ObjectRef::GetOwnPropertyNames(const EcmaVM *vm)
27764514f5e3Sopenharmony_ci{
27774514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
27784514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
27794514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(JSNApiHelper::ToJSHandle(this));
27804514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
27814514f5e3Sopenharmony_ci    JSHandle<TaggedArray> array(JSTaggedValue::GetOwnPropertyKeys(thread, obj));
27824514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27834514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> jsArray(JSArray::CreateArrayFromList(thread, array));
27844514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(jsArray);
27854514f5e3Sopenharmony_ci}
27864514f5e3Sopenharmony_ci
27874514f5e3Sopenharmony_ciLocal<ArrayRef> ObjectRef::GetAllPropertyNames(const EcmaVM *vm, uint32_t filter)
27884514f5e3Sopenharmony_ci{
27894514f5e3Sopenharmony_ci    // This interface is only used by napi.
27904514f5e3Sopenharmony_ci    // This interface currently only supports normal objects.
27914514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
27924514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
27934514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(JSNApiHelper::ToJSHandle(this));
27944514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
27954514f5e3Sopenharmony_ci    JSHandle<TaggedArray> array(JSTaggedValue::GetAllPropertyKeys(thread, obj, filter));
27964514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
27974514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> jsArray(JSArray::CreateArrayFromList(thread, array));
27984514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(jsArray);
27994514f5e3Sopenharmony_ci}
28004514f5e3Sopenharmony_ci
28014514f5e3Sopenharmony_ciLocal<ArrayRef> ObjectRef::GetOwnEnumerablePropertyNames(const EcmaVM *vm)
28024514f5e3Sopenharmony_ci{
28034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
28044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28054514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(JSNApiHelper::ToJSHandle(this));
28064514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
28074514f5e3Sopenharmony_ci    JSHandle<TaggedArray> array(JSObject::EnumerableOwnNames(thread, obj));
28084514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
28094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> jsArray(JSArray::CreateArrayFromList(thread, array));
28104514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(jsArray);
28114514f5e3Sopenharmony_ci}
28124514f5e3Sopenharmony_ci
28134514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::GetPrototype(const EcmaVM *vm)
28144514f5e3Sopenharmony_ci{
28154514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
28164514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28174514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
28184514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> prototype(thread, JSTaggedValue::GetPrototype(thread, JSHandle<JSTaggedValue>(object)));
28204514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
28214514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(prototype);
28224514f5e3Sopenharmony_ci}
28234514f5e3Sopenharmony_ci
28244514f5e3Sopenharmony_cibool ObjectRef::SetPrototype(const EcmaVM *vm, Local<ObjectRef> prototype)
28254514f5e3Sopenharmony_ci{
28264514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28274514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28284514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
28294514f5e3Sopenharmony_ci    JSHandle<JSObject> proto(JSNApiHelper::ToJSHandle(prototype));
28304514f5e3Sopenharmony_ci    return JSTaggedValue::SetPrototype(thread, JSHandle<JSTaggedValue>(object), JSHandle<JSTaggedValue>(proto));
28314514f5e3Sopenharmony_ci}
28324514f5e3Sopenharmony_ci
28334514f5e3Sopenharmony_cibool ObjectRef::DefineProperty(const EcmaVM *vm, Local<JSValueRef> key, PropertyAttribute attribute)
28344514f5e3Sopenharmony_ci{
28354514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28364514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28374514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28384514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(JSNApiHelper::ToJSHandle(key));
28404514f5e3Sopenharmony_ci    PropertyDescriptor desc(thread, attribute.IsWritable(), attribute.IsEnumerable(), attribute.IsConfigurable());
28414514f5e3Sopenharmony_ci    desc.SetValue(JSNApiHelper::ToJSHandle(attribute.GetValue(vm)));
28424514f5e3Sopenharmony_ci    return JSTaggedValue::DefinePropertyOrThrow(thread, object, keyValue, desc);
28434514f5e3Sopenharmony_ci}
28444514f5e3Sopenharmony_ci
28454514f5e3Sopenharmony_cibool ObjectRef::Has(const EcmaVM *vm, Local<JSValueRef> key)
28464514f5e3Sopenharmony_ci{
28474514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28484514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28494514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28504514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28514514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(JSNApiHelper::ToJSHandle(key));
28524514f5e3Sopenharmony_ci    return JSTaggedValue::HasProperty(thread, object, keyValue);
28534514f5e3Sopenharmony_ci}
28544514f5e3Sopenharmony_ci
28554514f5e3Sopenharmony_cibool ObjectRef::Has(const EcmaVM *vm, uint32_t key)
28564514f5e3Sopenharmony_ci{
28574514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28584514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28594514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28604514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28614514f5e3Sopenharmony_ci    return JSTaggedValue::HasProperty(thread, object, key);
28624514f5e3Sopenharmony_ci}
28634514f5e3Sopenharmony_ci
28644514f5e3Sopenharmony_cibool ObjectRef::HasOwnProperty(const EcmaVM *vm, Local<JSValueRef> key)
28654514f5e3Sopenharmony_ci{
28664514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28674514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28684514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28694514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28704514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(JSNApiHelper::ToJSHandle(key));
28714514f5e3Sopenharmony_ci    return JSTaggedValue::HasOwnProperty(thread, object, keyValue);
28724514f5e3Sopenharmony_ci}
28734514f5e3Sopenharmony_ci
28744514f5e3Sopenharmony_cibool ObjectRef::Delete(const EcmaVM *vm, Local<JSValueRef> key)
28754514f5e3Sopenharmony_ci{
28764514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28774514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28794514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(JSNApiHelper::ToJSHandle(key));
28814514f5e3Sopenharmony_ci    return JSTaggedValue::DeleteProperty(thread, object, keyValue);
28824514f5e3Sopenharmony_ci}
28834514f5e3Sopenharmony_ci
28844514f5e3Sopenharmony_cibool ObjectRef::Delete(const EcmaVM *vm, uint32_t key)
28854514f5e3Sopenharmony_ci{
28864514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
28874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28884514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object(JSNApiHelper::ToJSHandle(this));
28894514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
28904514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyHandle(thread, JSTaggedValue(key));
28914514f5e3Sopenharmony_ci    return JSTaggedValue::DeleteProperty(thread, object, keyHandle);
28924514f5e3Sopenharmony_ci}
28934514f5e3Sopenharmony_ci
28944514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::Freeze(const EcmaVM *vm)
28954514f5e3Sopenharmony_ci{
28964514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
28974514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
28984514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
28994514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object = JSNApiHelper::ToJSHandle(this);
29004514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
29014514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(object);
29024514f5e3Sopenharmony_ci    bool status = JSObject::SetIntegrityLevel(thread, obj, ecmascript::IntegrityLevel::FROZEN);
29034514f5e3Sopenharmony_ci    if (JSNApi::HasPendingException(vm)) {
29044514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exception(thread, JSTaggedValue::Exception());
29054514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(exception));
29064514f5e3Sopenharmony_ci    }
29074514f5e3Sopenharmony_ci    if (!status) {
29084514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Freeze: freeze failed";
29094514f5e3Sopenharmony_ci        Local<StringRef> message = StringRef::NewFromUtf8(vm, "Freeze: freeze failed");
29104514f5e3Sopenharmony_ci        Local<JSValueRef> error = Exception::Error(vm, message);
29114514f5e3Sopenharmony_ci        JSNApi::ThrowException(vm, error);
29124514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exception(thread, JSTaggedValue::Exception());
29134514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(exception));
29144514f5e3Sopenharmony_ci    }
29154514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(obj);
29164514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(resultValue));
29174514f5e3Sopenharmony_ci}
29184514f5e3Sopenharmony_ci
29194514f5e3Sopenharmony_ciLocal<JSValueRef> ObjectRef::Seal(const EcmaVM *vm)
29204514f5e3Sopenharmony_ci{
29214514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
29224514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29234514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
29244514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object = JSNApiHelper::ToJSHandle(this);
29254514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(object, ERROR);
29264514f5e3Sopenharmony_ci    JSHandle<JSObject> obj(object);
29274514f5e3Sopenharmony_ci    bool status = JSObject::SetIntegrityLevel(thread, obj, ecmascript::IntegrityLevel::SEALED);
29284514f5e3Sopenharmony_ci    if (JSNApi::HasPendingException(vm)) {
29294514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exception(thread, JSTaggedValue::Exception());
29304514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(exception));
29314514f5e3Sopenharmony_ci    }
29324514f5e3Sopenharmony_ci    if (!status) {
29334514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Seal: seal failed";
29344514f5e3Sopenharmony_ci        Local<StringRef> message = StringRef::NewFromUtf8(vm, "Freeze: freeze failed");
29354514f5e3Sopenharmony_ci        Local<JSValueRef> error = Exception::Error(vm, message);
29364514f5e3Sopenharmony_ci        JSNApi::ThrowException(vm, error);
29374514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exception(thread, JSTaggedValue::Exception());
29384514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(exception));
29394514f5e3Sopenharmony_ci    }
29404514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(obj);
29414514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(resultValue));
29424514f5e3Sopenharmony_ci}
29434514f5e3Sopenharmony_ci
29444514f5e3Sopenharmony_civoid ObjectRef::SetNativePointerFieldCount(const EcmaVM *vm, int32_t count)
29454514f5e3Sopenharmony_ci{
29464514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
29474514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29484514f5e3Sopenharmony_ci    // ObjectRef::New may return special value if exception occurs.
29494514f5e3Sopenharmony_ci    // So we need do special value check before use it.
29504514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE(this);
29514514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
29524514f5e3Sopenharmony_ci    object->SetNativePointerFieldCount(thread, count);
29534514f5e3Sopenharmony_ci}
29544514f5e3Sopenharmony_ci
29554514f5e3Sopenharmony_ciint32_t ObjectRef::GetNativePointerFieldCount(const EcmaVM *vm)
29564514f5e3Sopenharmony_ci{
29574514f5e3Sopenharmony_ci    // ObjectRef::New may return special value if exception occurs.
29584514f5e3Sopenharmony_ci    // So we need do special value check before use it.
29594514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
29604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29614514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
29624514f5e3Sopenharmony_ci    return object->GetNativePointerFieldCount();
29634514f5e3Sopenharmony_ci}
29644514f5e3Sopenharmony_ci
29654514f5e3Sopenharmony_civoid *ObjectRef::GetNativePointerField(const EcmaVM *vm, int32_t index)
29664514f5e3Sopenharmony_ci{
29674514f5e3Sopenharmony_ci    // ObjectRef::New may return special value if exception occurs.
29684514f5e3Sopenharmony_ci    // So we need do special value check before use it.
29694514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, nullptr);
29704514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29714514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
29724514f5e3Sopenharmony_ci    return object->GetNativePointerField(index);
29734514f5e3Sopenharmony_ci}
29744514f5e3Sopenharmony_ci
29754514f5e3Sopenharmony_civoid ObjectRef::SetNativePointerField(const EcmaVM *vm, int32_t index, void *nativePointer,
29764514f5e3Sopenharmony_ci    NativePointerCallback callBack, void *data, size_t nativeBindingsize)
29774514f5e3Sopenharmony_ci{
29784514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
29794514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29804514f5e3Sopenharmony_ci    // ObjectRef::New may return special value if exception occurs.
29814514f5e3Sopenharmony_ci    // So we need do special value check before use it.
29824514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE(this);
29834514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
29844514f5e3Sopenharmony_ci    object->SetNativePointerField(thread, index, nativePointer, callBack, data, nativeBindingsize);
29854514f5e3Sopenharmony_ci}
29864514f5e3Sopenharmony_ci
29874514f5e3Sopenharmony_civoid ObjectRef::SetConcurrentNativePointerField(const EcmaVM *vm, int32_t index, void *nativePointer,
29884514f5e3Sopenharmony_ci    NativePointerCallback callBack, void *data, size_t nativeBindingsize)
29894514f5e3Sopenharmony_ci{
29904514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
29914514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
29924514f5e3Sopenharmony_ci    // ObjectRef::New may return special value if exception occurs.
29934514f5e3Sopenharmony_ci    // So we need do special value check before use it.
29944514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE(this);
29954514f5e3Sopenharmony_ci    JSHandle<JSObject> object(JSNApiHelper::ToJSHandle(this));
29964514f5e3Sopenharmony_ci    object->SetNativePointerField(thread, index, nativePointer, callBack, data, nativeBindingsize, Concurrent::YES);
29974514f5e3Sopenharmony_ci}
29984514f5e3Sopenharmony_ci
29994514f5e3Sopenharmony_ci// -------------------------------- NativePointerRef ------------------------------------
30004514f5e3Sopenharmony_ciLocal<NativePointerRef> NativePointerRef::New(const EcmaVM *vm, void *nativePointer, size_t nativeBindingsize)
30014514f5e3Sopenharmony_ci{
30024514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30034514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30044514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30054514f5e3Sopenharmony_ci    JSHandle<JSNativePointer> obj = factory->NewJSNativePointer(nativePointer, nullptr, nullptr,
30064514f5e3Sopenharmony_ci        false, nativeBindingsize);
30074514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NativePointerRef>(JSHandle<JSTaggedValue>(obj));
30084514f5e3Sopenharmony_ci}
30094514f5e3Sopenharmony_ci
30104514f5e3Sopenharmony_ciLocal<NativePointerRef> NativePointerRef::New(
30114514f5e3Sopenharmony_ci    const EcmaVM *vm, void *nativePointer, NativePointerCallback callBack, void *data, size_t nativeBindingsize)
30124514f5e3Sopenharmony_ci{
30134514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30144514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30154514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30164514f5e3Sopenharmony_ci    JSHandle<JSNativePointer> obj = factory->NewJSNativePointer(nativePointer, callBack, data,
30174514f5e3Sopenharmony_ci        false, nativeBindingsize);
30184514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NativePointerRef>(JSHandle<JSTaggedValue>(obj));
30194514f5e3Sopenharmony_ci}
30204514f5e3Sopenharmony_ci
30214514f5e3Sopenharmony_ciLocal<NativePointerRef> NativePointerRef::NewConcurrent(
30224514f5e3Sopenharmony_ci    const EcmaVM *vm, void *nativePointer, NativePointerCallback callBack, void *data, size_t nativeBindingsize)
30234514f5e3Sopenharmony_ci{
30244514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30254514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
30264514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30274514f5e3Sopenharmony_ci    JSHandle<JSNativePointer> obj =
30284514f5e3Sopenharmony_ci        factory->NewJSNativePointer(nativePointer, callBack, data, false, nativeBindingsize, Concurrent::YES);
30294514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NativePointerRef>(JSHandle<JSTaggedValue>(obj));
30304514f5e3Sopenharmony_ci}
30314514f5e3Sopenharmony_ci
30324514f5e3Sopenharmony_ciLocal<NativePointerRef> NativePointerRef::NewSendable(
30334514f5e3Sopenharmony_ci    const EcmaVM *vm, void *nativePointer, NativePointerCallback callBack, void *data, size_t nativeBindingsize)
30344514f5e3Sopenharmony_ci{
30354514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30364514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30374514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30384514f5e3Sopenharmony_ci    JSHandle<JSNativePointer> obj =
30394514f5e3Sopenharmony_ci        factory->NewSJSNativePointer(nativePointer, callBack, data, false, nativeBindingsize);
30404514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<NativePointerRef>(JSHandle<JSTaggedValue>(obj));
30414514f5e3Sopenharmony_ci}
30424514f5e3Sopenharmony_ci
30434514f5e3Sopenharmony_civoid *NativePointerRef::Value()
30444514f5e3Sopenharmony_ci{
30454514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, nullptr);
30464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> nativePointer = JSNApiHelper::ToJSHandle(this);
30474514f5e3Sopenharmony_ci    return JSHandle<JSNativePointer>(nativePointer)->GetExternalPointer();
30484514f5e3Sopenharmony_ci}
30494514f5e3Sopenharmony_ci
30504514f5e3Sopenharmony_ci// ---------------------------------- Buffer -----------------------------------
30514514f5e3Sopenharmony_ciLocal<ArrayBufferRef> ArrayBufferRef::New(const EcmaVM *vm, int32_t length)
30524514f5e3Sopenharmony_ci{
30534514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30554514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30564514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer = factory->NewJSArrayBuffer(length);
30574514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayBufferRef>(JSHandle<JSTaggedValue>(arrayBuffer));
30584514f5e3Sopenharmony_ci}
30594514f5e3Sopenharmony_ci
30604514f5e3Sopenharmony_ciLocal<ArrayBufferRef> ArrayBufferRef::New(
30614514f5e3Sopenharmony_ci    const EcmaVM *vm, void *buffer, int32_t length, const NativePointerCallback &deleter, void *data)
30624514f5e3Sopenharmony_ci{
30634514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
30644514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30654514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
30664514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer = factory->NewJSArrayBuffer(buffer, length, deleter, data);
30674514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayBufferRef>(JSHandle<JSTaggedValue>(arrayBuffer));
30684514f5e3Sopenharmony_ci}
30694514f5e3Sopenharmony_ci
30704514f5e3Sopenharmony_ciint32_t ArrayBufferRef::ByteLength(const EcmaVM *vm)
30714514f5e3Sopenharmony_ci{
30724514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
30734514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30744514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
30754514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(arrayBuffer, FATAL);
30764514f5e3Sopenharmony_ci    return arrayBuffer->GetArrayBufferByteLength();
30774514f5e3Sopenharmony_ci}
30784514f5e3Sopenharmony_ci
30794514f5e3Sopenharmony_civoid *ArrayBufferRef::GetBuffer(const EcmaVM *vm)
30804514f5e3Sopenharmony_ci{
30814514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, nullptr);
30824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30834514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
30844514f5e3Sopenharmony_ci    JSTaggedValue bufferData = arrayBuffer->GetArrayBufferData();
30854514f5e3Sopenharmony_ci    if (!bufferData.IsJSNativePointer()) {
30864514f5e3Sopenharmony_ci        return nullptr;
30874514f5e3Sopenharmony_ci    }
30884514f5e3Sopenharmony_ci    return JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer();
30894514f5e3Sopenharmony_ci}
30904514f5e3Sopenharmony_ci
30914514f5e3Sopenharmony_civoid ArrayBufferRef::Detach(const EcmaVM *vm)
30924514f5e3Sopenharmony_ci{
30934514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
30944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
30954514f5e3Sopenharmony_ci    // arraybuffer is not shared. Do not need to switch state
30964514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
30974514f5e3Sopenharmony_ci    arrayBuffer->Detach(thread);
30984514f5e3Sopenharmony_ci}
30994514f5e3Sopenharmony_ci
31004514f5e3Sopenharmony_cibool ArrayBufferRef::IsDetach(const EcmaVM *vm)
31014514f5e3Sopenharmony_ci{
31024514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, false);
31034514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31044514f5e3Sopenharmony_ci    JSHandle<JSArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
31054514f5e3Sopenharmony_ci    return arrayBuffer->IsDetach();
31064514f5e3Sopenharmony_ci}
31074514f5e3Sopenharmony_ci
31084514f5e3Sopenharmony_ciLocal<SendableArrayBufferRef> SendableArrayBufferRef::New(const EcmaVM *vm, int32_t length)
31094514f5e3Sopenharmony_ci{
31104514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
31114514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31124514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
31134514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer = factory->NewJSSendableArrayBuffer(length);
31144514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableArrayBufferRef>(JSHandle<JSTaggedValue>(arrayBuffer));
31154514f5e3Sopenharmony_ci}
31164514f5e3Sopenharmony_ci
31174514f5e3Sopenharmony_ciLocal<SendableArrayBufferRef> SendableArrayBufferRef::New(
31184514f5e3Sopenharmony_ci    const EcmaVM *vm, void *buffer, int32_t length, const NativePointerCallback &deleter, void *data)
31194514f5e3Sopenharmony_ci{
31204514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
31214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31224514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
31234514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer =
31244514f5e3Sopenharmony_ci        factory->NewJSSendableArrayBuffer(buffer, length, deleter, data);
31254514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableArrayBufferRef>(JSHandle<JSTaggedValue>(arrayBuffer));
31264514f5e3Sopenharmony_ci}
31274514f5e3Sopenharmony_ci
31284514f5e3Sopenharmony_ciint32_t SendableArrayBufferRef::ByteLength(const EcmaVM *vm)
31294514f5e3Sopenharmony_ci{
31304514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
31314514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31324514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
31334514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(arrayBuffer, FATAL);
31344514f5e3Sopenharmony_ci    return arrayBuffer->GetArrayBufferByteLength();
31354514f5e3Sopenharmony_ci}
31364514f5e3Sopenharmony_ci
31374514f5e3Sopenharmony_civoid SendableArrayBufferRef::Detach(const EcmaVM *vm)
31384514f5e3Sopenharmony_ci{
31394514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
31404514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31414514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
31424514f5e3Sopenharmony_ci    arrayBuffer->Detach(thread);
31434514f5e3Sopenharmony_ci}
31444514f5e3Sopenharmony_ci
31454514f5e3Sopenharmony_cibool SendableArrayBufferRef::IsDetach(const EcmaVM *vm)
31464514f5e3Sopenharmony_ci{
31474514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, false);
31484514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31494514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
31504514f5e3Sopenharmony_ci    return arrayBuffer->IsDetach();
31514514f5e3Sopenharmony_ci}
31524514f5e3Sopenharmony_ci
31534514f5e3Sopenharmony_civoid *SendableArrayBufferRef::GetBuffer(const EcmaVM *vm)
31544514f5e3Sopenharmony_ci{
31554514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, nullptr);
31564514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31574514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSendableArrayBuffer> arrayBuffer(JSNApiHelper::ToJSHandle(this));
31584514f5e3Sopenharmony_ci    JSTaggedValue bufferData = arrayBuffer->GetArrayBufferData();
31594514f5e3Sopenharmony_ci    if (!bufferData.IsJSNativePointer()) {
31604514f5e3Sopenharmony_ci        return nullptr;
31614514f5e3Sopenharmony_ci    }
31624514f5e3Sopenharmony_ci    return JSNativePointer::Cast(bufferData.GetTaggedObject())->GetExternalPointer();
31634514f5e3Sopenharmony_ci}
31644514f5e3Sopenharmony_ci
31654514f5e3Sopenharmony_ci// ---------------------------------- DateRef -----------------------------------
31664514f5e3Sopenharmony_ciLocal<DateRef> DateRef::New(const EcmaVM *vm, double time)
31674514f5e3Sopenharmony_ci{
31684514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
31694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31704514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
31714514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
31724514f5e3Sopenharmony_ci    JSHandle<JSFunction> dateFunction(globalEnv->GetDateFunction());
31734514f5e3Sopenharmony_ci    JSHandle<JSDate> dateObject(factory->NewJSObjectByConstructor(dateFunction));
31744514f5e3Sopenharmony_ci    dateObject->SetTimeValue(thread, JSTaggedValue(time));
31754514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<DateRef>(JSHandle<JSTaggedValue>(dateObject));
31764514f5e3Sopenharmony_ci}
31774514f5e3Sopenharmony_ci
31784514f5e3Sopenharmony_ciLocal<StringRef> DateRef::ToString(const EcmaVM *vm)
31794514f5e3Sopenharmony_ci{
31804514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
31814514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31824514f5e3Sopenharmony_ci    JSHandle<JSDate> date(JSNApiHelper::ToJSHandle(this));
31834514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(date, ERROR);
31844514f5e3Sopenharmony_ci    JSTaggedValue dateStr = date->ToString(thread);
31854514f5e3Sopenharmony_ci    if (!dateStr.IsString()) {
31864514f5e3Sopenharmony_ci        auto constants = thread->GlobalConstants();
31874514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<StringRef>(constants->GetHandledEmptyString());
31884514f5e3Sopenharmony_ci    }
31894514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> dateStrHandle(thread, dateStr);
31904514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(dateStrHandle);
31914514f5e3Sopenharmony_ci}
31924514f5e3Sopenharmony_ci
31934514f5e3Sopenharmony_cidouble DateRef::GetTime(const EcmaVM *vm)
31944514f5e3Sopenharmony_ci{
31954514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0.0);
31964514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
31974514f5e3Sopenharmony_ci    JSHandle<JSDate> date(JSNApiHelper::ToJSHandle(this));
31984514f5e3Sopenharmony_ci    if (!date->IsDate()) {
31994514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Not a Date Object";
32004514f5e3Sopenharmony_ci    }
32014514f5e3Sopenharmony_ci    return date->GetTime().GetDouble();
32024514f5e3Sopenharmony_ci}
32034514f5e3Sopenharmony_ci
32044514f5e3Sopenharmony_ci// ---------------------------------- TypedArray -----------------------------------
32054514f5e3Sopenharmony_ciuint32_t TypedArrayRef::ByteLength(const EcmaVM *vm)
32064514f5e3Sopenharmony_ci{
32074514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32084514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32094514f5e3Sopenharmony_ci    JSHandle<JSTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32104514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32114514f5e3Sopenharmony_ci    return typedArray->GetByteLength();
32124514f5e3Sopenharmony_ci}
32134514f5e3Sopenharmony_ci
32144514f5e3Sopenharmony_ciuint32_t TypedArrayRef::ByteOffset(const EcmaVM *vm)
32154514f5e3Sopenharmony_ci{
32164514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32174514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32184514f5e3Sopenharmony_ci    JSHandle<JSTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32194514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32204514f5e3Sopenharmony_ci    return typedArray->GetByteOffset();
32214514f5e3Sopenharmony_ci}
32224514f5e3Sopenharmony_ci
32234514f5e3Sopenharmony_ciuint32_t TypedArrayRef::ArrayLength(const EcmaVM *vm)
32244514f5e3Sopenharmony_ci{
32254514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32264514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32274514f5e3Sopenharmony_ci    JSHandle<JSTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32284514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32294514f5e3Sopenharmony_ci    return typedArray->GetArrayLength();
32304514f5e3Sopenharmony_ci}
32314514f5e3Sopenharmony_ci
32324514f5e3Sopenharmony_ciLocal<ArrayBufferRef> TypedArrayRef::GetArrayBuffer(const EcmaVM *vm)
32334514f5e3Sopenharmony_ci{
32344514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
32354514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
32364514f5e3Sopenharmony_ci    JSHandle<JSTypedArray> typeArray(JSNApiHelper::ToJSHandle(this));
32374514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typeArray, ERROR);
32384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arrayBuffer(thread, JSTypedArray::GetOffHeapBuffer(thread, typeArray));
32394514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayBufferRef>(arrayBuffer);
32404514f5e3Sopenharmony_ci}
32414514f5e3Sopenharmony_ci
32424514f5e3Sopenharmony_ciuint32_t SendableTypedArrayRef::ByteLength(const EcmaVM *vm)
32434514f5e3Sopenharmony_ci{
32444514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32454514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32464514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32474514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32484514f5e3Sopenharmony_ci    return typedArray->GetByteLength();
32494514f5e3Sopenharmony_ci}
32504514f5e3Sopenharmony_ci
32514514f5e3Sopenharmony_ciuint32_t SendableTypedArrayRef::ByteOffset(const EcmaVM *vm)
32524514f5e3Sopenharmony_ci{
32534514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32554514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32564514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32574514f5e3Sopenharmony_ci    return typedArray->GetByteOffset();
32584514f5e3Sopenharmony_ci}
32594514f5e3Sopenharmony_ci
32604514f5e3Sopenharmony_ciuint32_t SendableTypedArrayRef::ArrayLength(const EcmaVM *vm)
32614514f5e3Sopenharmony_ci{
32624514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
32634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32644514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedTypedArray> typedArray(JSNApiHelper::ToJSHandle(this));
32654514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typedArray, FATAL);
32664514f5e3Sopenharmony_ci    return typedArray->GetArrayLength();
32674514f5e3Sopenharmony_ci}
32684514f5e3Sopenharmony_ci
32694514f5e3Sopenharmony_ciLocal<SendableArrayBufferRef> SendableTypedArrayRef::GetArrayBuffer(const EcmaVM *vm)
32704514f5e3Sopenharmony_ci{
32714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
32724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
32734514f5e3Sopenharmony_ci    JSHandle<ecmascript::JSSharedTypedArray> typeArray(JSNApiHelper::ToJSHandle(this));
32744514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(typeArray, ERROR);
32754514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arrayBuffer(thread,
32764514f5e3Sopenharmony_ci        ecmascript::JSSharedTypedArray::GetSharedOffHeapBuffer(thread, typeArray));
32774514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableArrayBufferRef>(arrayBuffer);
32784514f5e3Sopenharmony_ci}
32794514f5e3Sopenharmony_ci
32804514f5e3Sopenharmony_ci// ----------------------------------- FunctionRef --------------------------------------
32814514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::New(EcmaVM *vm, FunctionCallback nativeFunc,
32824514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
32834514f5e3Sopenharmony_ci{
32844514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
32854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
32864514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
32874514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
32884514f5e3Sopenharmony_ci    JSHandle<JSFunction> current(factory->NewJSFunction(env, reinterpret_cast<void *>(Callback::RegisterCallback)));
32894514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, reinterpret_cast<void *>(nativeFunc), deleter, data, nativeBindingsize);
32904514f5e3Sopenharmony_ci    current->SetCallNapi(callNapi);
32914514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
32924514f5e3Sopenharmony_ci}
32934514f5e3Sopenharmony_ci
32944514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewConcurrent(EcmaVM *vm, FunctionCallback nativeFunc,
32954514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
32964514f5e3Sopenharmony_ci{
32974514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
32984514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
32994514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33004514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33014514f5e3Sopenharmony_ci    JSHandle<JSFunction> current(factory->NewJSFunction(env, reinterpret_cast<void *>(Callback::RegisterCallback)));
33024514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, reinterpret_cast<void *>(nativeFunc), deleter,
33034514f5e3Sopenharmony_ci                                  data, nativeBindingsize, Concurrent::YES);
33044514f5e3Sopenharmony_ci    current->SetCallNapi(callNapi);
33054514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
33064514f5e3Sopenharmony_ci}
33074514f5e3Sopenharmony_ci
33084514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::New(EcmaVM *vm, InternalFunctionCallback nativeFunc,
33094514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
33104514f5e3Sopenharmony_ci{
33114514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
33124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
33134514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33144514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33154514f5e3Sopenharmony_ci    JSHandle<JSFunction> current(factory->NewJSFunction(env, reinterpret_cast<void *>(nativeFunc)));
33164514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize);
33174514f5e3Sopenharmony_ci    current->SetCallNapi(callNapi);
33184514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
33194514f5e3Sopenharmony_ci}
33204514f5e3Sopenharmony_ci
33214514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewSendable(EcmaVM *vm,
33224514f5e3Sopenharmony_ci                                            InternalFunctionCallback nativeFunc,
33234514f5e3Sopenharmony_ci                                            NativePointerCallback deleter,
33244514f5e3Sopenharmony_ci                                            void *data,
33254514f5e3Sopenharmony_ci                                            bool callNapi,
33264514f5e3Sopenharmony_ci                                            size_t nativeBindingsize)
33274514f5e3Sopenharmony_ci{
33284514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
33294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
33304514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33314514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33324514f5e3Sopenharmony_ci    JSHandle<JSFunction> current(factory->NewSFunction(env, reinterpret_cast<void *>(nativeFunc)));
33334514f5e3Sopenharmony_ci    current->SetSFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize);
33344514f5e3Sopenharmony_ci    current->SetCallNapi(callNapi);
33354514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
33364514f5e3Sopenharmony_ci}
33374514f5e3Sopenharmony_ci
33384514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewConcurrent(EcmaVM *vm, InternalFunctionCallback nativeFunc,
33394514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
33404514f5e3Sopenharmony_ci{
33414514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
33424514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
33434514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33444514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33454514f5e3Sopenharmony_ci    JSHandle<JSFunction> current(factory->NewJSFunction(env, reinterpret_cast<void *>(nativeFunc)));
33464514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize, Concurrent::YES);
33474514f5e3Sopenharmony_ci    current->SetCallNapi(callNapi);
33484514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
33494514f5e3Sopenharmony_ci}
33504514f5e3Sopenharmony_ci
33514514f5e3Sopenharmony_cistatic void InitClassFunction(EcmaVM *vm, JSHandle<JSFunction> &func, bool callNapi)
33524514f5e3Sopenharmony_ci{
33534514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
33544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
33554514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33564514f5e3Sopenharmony_ci    auto globalConst = thread->GlobalConstants();
33574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> accessor = globalConst->GetHandledFunctionPrototypeAccessor();
33584514f5e3Sopenharmony_ci    func->SetPropertyInlinedProps(thread, JSFunction::CLASS_PROTOTYPE_INLINE_PROPERTY_INDEX,
33594514f5e3Sopenharmony_ci                                  accessor.GetTaggedValue());
33604514f5e3Sopenharmony_ci    accessor = globalConst->GetHandledFunctionLengthAccessor();
33614514f5e3Sopenharmony_ci    func->SetPropertyInlinedProps(thread, JSFunction::LENGTH_INLINE_PROPERTY_INDEX,
33624514f5e3Sopenharmony_ci                                  accessor.GetTaggedValue());
33634514f5e3Sopenharmony_ci    JSHandle<JSObject> clsPrototype = JSFunction::NewJSFunctionPrototype(thread, func);
33644514f5e3Sopenharmony_ci    clsPrototype->GetClass()->SetClassPrototype(true);
33654514f5e3Sopenharmony_ci    func->SetClassConstructor(true);
33664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> parent = env->GetFunctionPrototype();
33674514f5e3Sopenharmony_ci    JSObject::SetPrototype(thread, JSHandle<JSObject>::Cast(func), parent);
33684514f5e3Sopenharmony_ci    func->SetHomeObject(thread, clsPrototype);
33694514f5e3Sopenharmony_ci    func->SetCallNapi(callNapi);
33704514f5e3Sopenharmony_ci}
33714514f5e3Sopenharmony_ci
33724514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewClassFunction(EcmaVM *vm, FunctionCallback nativeFunc,
33734514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
33744514f5e3Sopenharmony_ci{
33754514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
33764514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
33774514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
33784514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33794514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33804514f5e3Sopenharmony_ci    JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithoutName());
33814514f5e3Sopenharmony_ci    JSHandle<JSFunction> current =
33824514f5e3Sopenharmony_ci        factory->NewJSFunctionByHClass(reinterpret_cast<void *>(Callback::RegisterCallback),
33834514f5e3Sopenharmony_ci        hclass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR);
33844514f5e3Sopenharmony_ci    InitClassFunction(vm, current, callNapi);
33854514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, reinterpret_cast<void *>(nativeFunc), deleter, data, nativeBindingsize);
33864514f5e3Sopenharmony_ci    Local<FunctionRef> result = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
33874514f5e3Sopenharmony_ci    return scope.Escape(result);
33884514f5e3Sopenharmony_ci}
33894514f5e3Sopenharmony_ci
33904514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewConcurrentClassFunction(EcmaVM *vm, InternalFunctionCallback nativeFunc,
33914514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
33924514f5e3Sopenharmony_ci{
33934514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
33944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
33954514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
33964514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
33974514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
33984514f5e3Sopenharmony_ci    JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithoutName());
33994514f5e3Sopenharmony_ci    JSHandle<JSFunction> current =
34004514f5e3Sopenharmony_ci        factory->NewJSFunctionByHClass(reinterpret_cast<void *>(nativeFunc),
34014514f5e3Sopenharmony_ci        hclass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR);
34024514f5e3Sopenharmony_ci    InitClassFunction(vm, current, callNapi);
34034514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize, Concurrent::YES);
34044514f5e3Sopenharmony_ci    Local<FunctionRef> result = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
34054514f5e3Sopenharmony_ci    return scope.Escape(result);
34064514f5e3Sopenharmony_ci}
34074514f5e3Sopenharmony_ci
34084514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewClassFunction(EcmaVM *vm, InternalFunctionCallback nativeFunc,
34094514f5e3Sopenharmony_ci    NativePointerCallback deleter, void *data, bool callNapi, size_t nativeBindingsize)
34104514f5e3Sopenharmony_ci{
34114514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
34124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
34134514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
34144514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
34154514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
34164514f5e3Sopenharmony_ci    JSHandle<JSHClass> hclass = JSHandle<JSHClass>::Cast(env->GetFunctionClassWithoutName());
34174514f5e3Sopenharmony_ci    JSHandle<JSFunction> current =
34184514f5e3Sopenharmony_ci        factory->NewJSFunctionByHClass(reinterpret_cast<void *>(nativeFunc),
34194514f5e3Sopenharmony_ci        hclass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR);
34204514f5e3Sopenharmony_ci    InitClassFunction(vm, current, callNapi);
34214514f5e3Sopenharmony_ci    current->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize);
34224514f5e3Sopenharmony_ci    Local<FunctionRef> result = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
34234514f5e3Sopenharmony_ci    return scope.Escape(result);
34244514f5e3Sopenharmony_ci}
34254514f5e3Sopenharmony_ci
34264514f5e3Sopenharmony_ciLocal<FunctionRef> FunctionRef::NewSendableClassFunction(const EcmaVM *vm,
34274514f5e3Sopenharmony_ci                                                         InternalFunctionCallback nativeFunc,
34284514f5e3Sopenharmony_ci                                                         NativePointerCallback deleter,
34294514f5e3Sopenharmony_ci                                                         void *data,
34304514f5e3Sopenharmony_ci                                                         Local<StringRef> name,
34314514f5e3Sopenharmony_ci                                                         SendablePropertiesInfos &infos,
34324514f5e3Sopenharmony_ci                                                         Local<FunctionRef> parent,
34334514f5e3Sopenharmony_ci                                                         bool callNapi,
34344514f5e3Sopenharmony_ci                                                         size_t nativeBindingSize)
34354514f5e3Sopenharmony_ci{
34364514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
34374514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
34384514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
34394514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
34404514f5e3Sopenharmony_ci
34414514f5e3Sopenharmony_ci    bool hasParent = !parent->IsNull();
34424514f5e3Sopenharmony_ci    JSNapiSendable sendable(thread, infos, name);
34434514f5e3Sopenharmony_ci    JSHandle<JSHClass> prototypeHClass = JSHClass::CreateSPrototypeHClass(thread, sendable.GetNonStaticDescs());
34444514f5e3Sopenharmony_ci    JSHandle<JSObject> prototype = factory->NewSharedOldSpaceJSObject(prototypeHClass);
34454514f5e3Sopenharmony_ci    JSHandle<JSHClass> constructorHClass = JSHClass::CreateSConstructorHClass(thread, sendable.GetStaticDescs());
34464514f5e3Sopenharmony_ci    JSHandle<JSFunction> constructor = factory->NewSFunctionByHClass(
34474514f5e3Sopenharmony_ci        reinterpret_cast<void *>(nativeFunc), constructorHClass, ecmascript::FunctionKind::CLASS_CONSTRUCTOR);
34484514f5e3Sopenharmony_ci
34494514f5e3Sopenharmony_ci    sendable.SetSConstructor(constructor);
34504514f5e3Sopenharmony_ci    JSObject::SetSProperties(thread, prototype, sendable.GetNonStaticDescs());
34514514f5e3Sopenharmony_ci    JSObject::SetSProperties(thread, JSHandle<JSObject>::Cast(constructor), sendable.GetStaticDescs());
34524514f5e3Sopenharmony_ci
34534514f5e3Sopenharmony_ci    if (hasParent) {
34544514f5e3Sopenharmony_ci        auto parentPrototype = parent->GetFunctionPrototype(vm);
34554514f5e3Sopenharmony_ci        prototypeHClass->SetPrototype(thread, JSNApiHelper::ToJSHandle(parentPrototype));
34564514f5e3Sopenharmony_ci        constructorHClass->SetPrototype(thread, JSNApiHelper::ToJSHandle(parent));
34574514f5e3Sopenharmony_ci    }
34584514f5e3Sopenharmony_ci    prototypeHClass->SetExtensible(false);
34594514f5e3Sopenharmony_ci    constructor->SetHomeObject(thread, prototype);
34604514f5e3Sopenharmony_ci    constructor->SetProtoOrHClass(thread, prototype);
34614514f5e3Sopenharmony_ci    constructor->SetLexicalEnv(thread, constructor);
34624514f5e3Sopenharmony_ci    constructor->SetCallNapi(callNapi);
34634514f5e3Sopenharmony_ci    constructor->SetSFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingSize);
34644514f5e3Sopenharmony_ci
34654514f5e3Sopenharmony_ci    JSHClass *parentIHClass{nullptr};
34664514f5e3Sopenharmony_ci    if (hasParent) {
34674514f5e3Sopenharmony_ci        JSHandle<JSFunction> parentHandle(JSNApiHelper::ToJSHandle(parent));
34684514f5e3Sopenharmony_ci        parentIHClass = reinterpret_cast<JSHClass *>(parentHandle->GetProtoOrHClass().GetTaggedObject());
34694514f5e3Sopenharmony_ci    }
34704514f5e3Sopenharmony_ci    JSHandle<JSHClass> iHClass = JSHClass::CreateSHClass(thread, sendable.GetInstanceDescs(), parentIHClass);
34714514f5e3Sopenharmony_ci    iHClass->SetPrototype(thread, JSHandle<JSTaggedValue>(prototype));
34724514f5e3Sopenharmony_ci    iHClass->SetExtensible(false);
34734514f5e3Sopenharmony_ci    constructor->SetProtoOrHClass(thread, iHClass);
34744514f5e3Sopenharmony_ci    constructorHClass->SetExtensible(false);
34754514f5e3Sopenharmony_ci
34764514f5e3Sopenharmony_ci    Local<FunctionRef> result = JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(constructor));
34774514f5e3Sopenharmony_ci    return scope.Escape(result);
34784514f5e3Sopenharmony_ci}
34794514f5e3Sopenharmony_ci
34804514f5e3Sopenharmony_ciLocal<JSValueRef> FunctionRef::Call(const EcmaVM *vm, Local<JSValueRef> thisObj,
34814514f5e3Sopenharmony_ci    const Local<JSValueRef> argv[],  // NOLINTNEXTLINE(modernize-avoid-c-arrays)
34824514f5e3Sopenharmony_ci    int32_t length)
34834514f5e3Sopenharmony_ci{
34844514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
34854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
34864514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
34874514f5e3Sopenharmony_ci    FunctionCallScope callScope(EcmaVM::ConstCast(vm));
34884514f5e3Sopenharmony_ci    if (!IsFunction(vm)) {
34894514f5e3Sopenharmony_ci        return JSValueRef::Undefined(vm);
34904514f5e3Sopenharmony_ci    }
34914514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->ClearSingleStepper();
34924514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> func = JSNApiHelper::ToJSHandle(this);
34934514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(func, ERROR);
34944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> thisValue = JSNApiHelper::ToJSHandle(thisObj);
34954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined = thread->GlobalConstants()->GetHandledUndefined();
34964514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
34974514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, func, thisValue, undefined, length);
34984514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
34994514f5e3Sopenharmony_ci    for (int32_t i = 0; i < length; i++) {
35004514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> arg = JSNApiHelper::ToJSHandle(argv[i]);
35014514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
35024514f5e3Sopenharmony_ci        thread->CheckJSTaggedType(arg.GetTaggedValue().GetRawData());
35034514f5e3Sopenharmony_ci#endif
35044514f5e3Sopenharmony_ci        info->SetCallArg(i, arg.GetTaggedValue());
35054514f5e3Sopenharmony_ci    }
35064514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Call(info);
35074514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
35084514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
35094514f5e3Sopenharmony_ci#endif
35104514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
35114514f5e3Sopenharmony_ci        ecmascript::JsStackInfo::BuildCrashInfo(thread);
35124514f5e3Sopenharmony_ci    }
35134514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
35144514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
35154514f5e3Sopenharmony_ci
35164514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->ClearKeptObjects();
35174514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->NotifyReturnNative();
35184514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(resultValue));
35194514f5e3Sopenharmony_ci}
35204514f5e3Sopenharmony_ci
35214514f5e3Sopenharmony_ciJSValueRef* FunctionRef::CallForNapi(const EcmaVM *vm, JSValueRef *thisObj,
35224514f5e3Sopenharmony_ci    JSValueRef *const argv[],  // NOLINTNEXTLINE(modernize-avoid-c-arrays)
35234514f5e3Sopenharmony_ci    int32_t length)
35244514f5e3Sopenharmony_ci{
35254514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, *JSValueRef::Hole(vm));
35264514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
35274514f5e3Sopenharmony_ci    JSTaggedValue result;
35284514f5e3Sopenharmony_ci    FunctionCallScope callScope(EcmaVM::ConstCast(vm));
35294514f5e3Sopenharmony_ci    ASSERT(IsFunction(vm)); // IsFunction check has been done in napi.
35304514f5e3Sopenharmony_ci    {
35314514f5e3Sopenharmony_ci        LocalScope scope(vm);
35324514f5e3Sopenharmony_ci        ecmascript::tooling::JsDebuggerManager *dm = vm->GetJsDebuggerManager();
35334514f5e3Sopenharmony_ci        bool isDebugApp = dm->IsDebugApp();
35344514f5e3Sopenharmony_ci        if (isDebugApp) {
35354514f5e3Sopenharmony_ci            dm->ClearSingleStepper();
35364514f5e3Sopenharmony_ci        }
35374514f5e3Sopenharmony_ci        JSTaggedValue func = *reinterpret_cast<JSTaggedValue *>(this);
35384514f5e3Sopenharmony_ci        JSTaggedValue undefined = thread->GlobalConstants()->GetUndefined();
35394514f5e3Sopenharmony_ci        JSTaggedValue thisValue = undefined;
35404514f5e3Sopenharmony_ci        if (thisObj != nullptr) {
35414514f5e3Sopenharmony_ci            thisValue = *reinterpret_cast<JSTaggedValue *>(thisObj);
35424514f5e3Sopenharmony_ci        }
35434514f5e3Sopenharmony_ci        EcmaRuntimeCallInfo *info =
35444514f5e3Sopenharmony_ci            ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, func, thisValue, undefined, length);
35454514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, *JSValueRef::Hole(vm));
35464514f5e3Sopenharmony_ci        for (int32_t i = 0; i < length; i++) {
35474514f5e3Sopenharmony_ci            if (argv[i]) {
35484514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
35494514f5e3Sopenharmony_ci                thread->CheckJSTaggedType(JSNApiHelper::ToJSTaggedValue(argv[i]).GetRawData());
35504514f5e3Sopenharmony_ci#endif
35514514f5e3Sopenharmony_ci                // NewRuntimeCallInfo has set Undefined defaultly in Argv's slot.
35524514f5e3Sopenharmony_ci                info->SetCallArg(i, JSNApiHelper::ToJSTaggedValue(argv[i]));
35534514f5e3Sopenharmony_ci            }
35544514f5e3Sopenharmony_ci        }
35554514f5e3Sopenharmony_ci        if (LIKELY(thread->IsAsmInterpreter())) {
35564514f5e3Sopenharmony_ci            STACK_LIMIT_CHECK(thread, reinterpret_cast<JSValueRef *>(*JSValueRef::Hole(vm)));
35574514f5e3Sopenharmony_ci            auto *hclass = func.GetTaggedObject()->GetClass();
35584514f5e3Sopenharmony_ci            if (hclass->IsClassConstructor()) {
35594514f5e3Sopenharmony_ci                RETURN_STACK_BEFORE_THROW_IF_ASM(thread);
35604514f5e3Sopenharmony_ci                THROW_TYPE_ERROR_AND_RETURN(thread, "class constructor cannot call",
35614514f5e3Sopenharmony_ci                    reinterpret_cast<JSValueRef *>(*JSValueRef::Hole(vm)));
35624514f5e3Sopenharmony_ci            }
35634514f5e3Sopenharmony_ci            result = ecmascript::InterpreterAssembly::Execute(info);
35644514f5e3Sopenharmony_ci        } else {
35654514f5e3Sopenharmony_ci            result = JSFunction::Call(info);
35664514f5e3Sopenharmony_ci        }
35674514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
35684514f5e3Sopenharmony_ci        thread->CheckJSTaggedType(result.GetRawData());
35694514f5e3Sopenharmony_ci#endif
35704514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, *JSValueRef::Hole(vm));
35714514f5e3Sopenharmony_ci        if (thread->GetCurrentEcmaContext()->HasKeptObjects()) {
35724514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->ClearKeptObjects();
35734514f5e3Sopenharmony_ci        }
35744514f5e3Sopenharmony_ci        if (isDebugApp && dm->IsMixedDebugEnabled()) {
35754514f5e3Sopenharmony_ci            dm->NotifyReturnNative();
35764514f5e3Sopenharmony_ci        }
35774514f5e3Sopenharmony_ci    }
35784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
35794514f5e3Sopenharmony_ci    return reinterpret_cast<JSValueRef *>(resultValue.GetAddress());
35804514f5e3Sopenharmony_ci}
35814514f5e3Sopenharmony_ci
35824514f5e3Sopenharmony_ciLocal<JSValueRef> FunctionRef::Constructor(const EcmaVM *vm,
35834514f5e3Sopenharmony_ci    const Local<JSValueRef> argv[],  // NOLINTNEXTLINE(modernize-avoid-c-arrays)
35844514f5e3Sopenharmony_ci    int32_t length)
35854514f5e3Sopenharmony_ci{
35864514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
35874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
35884514f5e3Sopenharmony_ci    FunctionCallScope callScope(EcmaVM::ConstCast(vm));
35894514f5e3Sopenharmony_ci    if (!IsFunction(vm)) {
35904514f5e3Sopenharmony_ci        return JSValueRef::Undefined(vm);
35914514f5e3Sopenharmony_ci    }
35924514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> func = JSNApiHelper::ToJSHandle(this);
35934514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(func, ERROR);
35944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> newTarget = func;
35954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined = thread->GlobalConstants()->GetHandledUndefined();
35964514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
35974514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, func, undefined, newTarget, length);
35984514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
35994514f5e3Sopenharmony_ci    for (int32_t i = 0; i < length; i++) {
36004514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> arg = JSNApiHelper::ToJSHandle(argv[i]);
36014514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
36024514f5e3Sopenharmony_ci        thread->CheckJSTaggedType(arg.GetTaggedValue().GetRawData());
36034514f5e3Sopenharmony_ci#endif
36044514f5e3Sopenharmony_ci        info->SetCallArg(i, arg.GetTaggedValue());
36054514f5e3Sopenharmony_ci    }
36064514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Construct(info);
36074514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
36084514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
36094514f5e3Sopenharmony_ci#endif
36104514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
36114514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
36124514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(resultValue);
36134514f5e3Sopenharmony_ci}
36144514f5e3Sopenharmony_ci
36154514f5e3Sopenharmony_ciJSValueRef* FunctionRef::ConstructorOptimize(const EcmaVM *vm,
36164514f5e3Sopenharmony_ci    JSValueRef* argv[],  // NOLINTNEXTLINE(modernize-avoid-c-arrays)
36174514f5e3Sopenharmony_ci    int32_t length)
36184514f5e3Sopenharmony_ci{
36194514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, *JSValueRef::Undefined(vm));
36204514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
36214514f5e3Sopenharmony_ci    JSTaggedValue result;
36224514f5e3Sopenharmony_ci    FunctionCallScope callScope(EcmaVM::ConstCast(vm));
36234514f5e3Sopenharmony_ci    ASSERT(IsFunction(vm)); // IsFunction check has been done in napi.
36244514f5e3Sopenharmony_ci    {
36254514f5e3Sopenharmony_ci        LocalScope scope(vm);
36264514f5e3Sopenharmony_ci        JSTaggedValue func = *reinterpret_cast<JSTaggedValue*>(this);
36274514f5e3Sopenharmony_ci        JSTaggedValue newTarget = func;
36284514f5e3Sopenharmony_ci        JSTaggedValue undefined = thread->GlobalConstants()->GetUndefined();
36294514f5e3Sopenharmony_ci        EcmaRuntimeCallInfo *info =
36304514f5e3Sopenharmony_ci            ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, func, undefined, newTarget, length);
36314514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, *JSValueRef::Undefined(vm));
36324514f5e3Sopenharmony_ci        for (int32_t i = 0; i < length; ++i) {
36334514f5e3Sopenharmony_ci            JSTaggedValue arg =
36344514f5e3Sopenharmony_ci                argv[i] == nullptr ? JSTaggedValue::Undefined() : JSNApiHelper::ToJSTaggedValue(argv[i]);
36354514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
36364514f5e3Sopenharmony_ci                thread->CheckJSTaggedType(arg.GetRawData());
36374514f5e3Sopenharmony_ci#endif
36384514f5e3Sopenharmony_ci            info->SetCallArg(i, arg);
36394514f5e3Sopenharmony_ci        }
36404514f5e3Sopenharmony_ci        result = JSFunction::ConstructInternal(info);
36414514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, *JSValueRef::Undefined(vm));
36424514f5e3Sopenharmony_ci    }
36434514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
36444514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
36454514f5e3Sopenharmony_ci#endif
36464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resultValue(thread, result);
36474514f5e3Sopenharmony_ci    return reinterpret_cast<JSValueRef*>(resultValue.GetAddress());
36484514f5e3Sopenharmony_ci}
36494514f5e3Sopenharmony_ci
36504514f5e3Sopenharmony_ciLocal<JSValueRef> FunctionRef::GetFunctionPrototype(const EcmaVM *vm)
36514514f5e3Sopenharmony_ci{
36524514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
36534514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
36544514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> func = JSNApiHelper::ToJSHandle(this);
36554514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(func, FATAL);
36564514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> prototype(thread, JSHandle<JSFunction>(func)->GetFunctionPrototype());
36574514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(prototype);
36584514f5e3Sopenharmony_ci}
36594514f5e3Sopenharmony_ci
36604514f5e3Sopenharmony_cibool FunctionRef::Inherit(const EcmaVM *vm, Local<FunctionRef> parent)
36614514f5e3Sopenharmony_ci{
36624514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
36634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
36644514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
36654514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> parentValue = JSNApiHelper::ToJSHandle(parent);
36664514f5e3Sopenharmony_ci    JSHandle<JSObject> parentHandle = JSHandle<JSObject>::Cast(parentValue);
36674514f5e3Sopenharmony_ci    JSHandle<JSObject> thisHandle = JSHandle<JSObject>::Cast(JSNApiHelper::ToJSHandle(this));
36684514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(thisHandle, ERROR);
36694514f5e3Sopenharmony_ci    // Set this.__proto__ to parent
36704514f5e3Sopenharmony_ci    bool res = JSObject::SetPrototype(thread, thisHandle, parentValue);
36714514f5e3Sopenharmony_ci    if (!res) {
36724514f5e3Sopenharmony_ci        return false;
36734514f5e3Sopenharmony_ci    }
36744514f5e3Sopenharmony_ci    // Set this.Prototype.__proto__ to parent.Prototype
36754514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> parentProtoType(thread, JSFunction::PrototypeGetter(thread, parentHandle));
36764514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> thisProtoType(thread, JSFunction::PrototypeGetter(thread, thisHandle));
36774514f5e3Sopenharmony_ci    return JSObject::SetPrototype(thread, JSHandle<JSObject>::Cast(thisProtoType), parentProtoType);
36784514f5e3Sopenharmony_ci}
36794514f5e3Sopenharmony_ci
36804514f5e3Sopenharmony_civoid FunctionRef::SetName(const EcmaVM *vm, Local<StringRef> name)
36814514f5e3Sopenharmony_ci{
36824514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
36834514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
36844514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
36854514f5e3Sopenharmony_ci    JSFunction *func = JSFunction::Cast(JSNApiHelper::ToJSTaggedValue(this).GetTaggedObject());
36864514f5e3Sopenharmony_ci    JSTaggedValue key = JSNApiHelper::ToJSTaggedValue(*name);
36874514f5e3Sopenharmony_ci    JSFunction::SetFunctionNameNoPrefix(thread, func, key);
36884514f5e3Sopenharmony_ci}
36894514f5e3Sopenharmony_ci
36904514f5e3Sopenharmony_ciLocal<StringRef> FunctionRef::GetName(const EcmaVM *vm)
36914514f5e3Sopenharmony_ci{
36924514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
36934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
36944514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
36954514f5e3Sopenharmony_ci    JSHandle<JSFunctionBase> func(thread, JSNApiHelper::ToJSTaggedValue(this));
36964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> name = JSFunctionBase::GetFunctionName(thread, func);
36974514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
36984514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<StringRef>(name));
36994514f5e3Sopenharmony_ci}
37004514f5e3Sopenharmony_ci
37014514f5e3Sopenharmony_ciLocal<StringRef> FunctionRef::GetSourceCode(const EcmaVM *vm, int lineNumber)
37024514f5e3Sopenharmony_ci{
37034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
37044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37054514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
37064514f5e3Sopenharmony_ci    JSHandle<JSFunctionBase> func(thread, JSNApiHelper::ToJSTaggedValue(this));
37074514f5e3Sopenharmony_ci    JSHandle<Method> method(thread, func->GetMethod());
37084514f5e3Sopenharmony_ci    const JSPandaFile *jsPandaFile = method->GetJSPandaFile();
37094514f5e3Sopenharmony_ci    DebugInfoExtractor *debugExtractor = JSPandaFileManager::GetInstance()->GetJSPtExtractor(jsPandaFile);
37104514f5e3Sopenharmony_ci    ecmascript::CString entry = JSPandaFile::ENTRY_FUNCTION_NAME;
37114514f5e3Sopenharmony_ci    if (!jsPandaFile->IsBundlePack()) {
37124514f5e3Sopenharmony_ci        JSFunction *function = JSFunction::Cast(func.GetTaggedValue().GetTaggedObject());
37134514f5e3Sopenharmony_ci        ecmascript::CString recordName = function->GetRecordName();
37144514f5e3Sopenharmony_ci        ASSERT(!recordName.empty());
37154514f5e3Sopenharmony_ci        entry = recordName;
37164514f5e3Sopenharmony_ci    }
37174514f5e3Sopenharmony_ci
37184514f5e3Sopenharmony_ci    uint32_t mainMethodIndex = jsPandaFile->GetMainMethodIndex(entry);
37194514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> sourceCodeHandle(thread, BuiltinsBase::GetTaggedString(thread, ""));
37204514f5e3Sopenharmony_ci    if (mainMethodIndex == 0) {
37214514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<StringRef>(sourceCodeHandle));
37224514f5e3Sopenharmony_ci    }
37234514f5e3Sopenharmony_ci
37244514f5e3Sopenharmony_ci    const std::string &allSourceCode = debugExtractor->GetSourceCode(panda_file::File::EntityId(mainMethodIndex));
37254514f5e3Sopenharmony_ci    std::string sourceCode = StringHelper::GetSpecifiedLine(allSourceCode, lineNumber);
37264514f5e3Sopenharmony_ci    uint32_t codeLen = sourceCode.length();
37274514f5e3Sopenharmony_ci    if (codeLen == 0) {
37284514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<StringRef>(sourceCodeHandle));
37294514f5e3Sopenharmony_ci    }
37304514f5e3Sopenharmony_ci
37314514f5e3Sopenharmony_ci    if (sourceCode[codeLen - 1] == '\r') {
37324514f5e3Sopenharmony_ci        sourceCode = sourceCode.substr(0, codeLen - 1);
37334514f5e3Sopenharmony_ci    }
37344514f5e3Sopenharmony_ci    sourceCodeHandle.Update(BuiltinsBase::GetTaggedString(thread, sourceCode.c_str()));
37354514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<StringRef>(sourceCodeHandle));
37364514f5e3Sopenharmony_ci}
37374514f5e3Sopenharmony_ci
37384514f5e3Sopenharmony_cibool FunctionRef::IsNative(const EcmaVM *vm)
37394514f5e3Sopenharmony_ci{
37404514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
37414514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37424514f5e3Sopenharmony_ci    JSHandle<JSFunctionBase> func(thread, JSNApiHelper::ToJSTaggedValue(this));
37434514f5e3Sopenharmony_ci    JSHandle<Method> method(thread, func->GetMethod());
37444514f5e3Sopenharmony_ci    return method->IsNativeWithCallField();
37454514f5e3Sopenharmony_ci}
37464514f5e3Sopenharmony_ci
37474514f5e3Sopenharmony_civoid FunctionRef::SetData(const EcmaVM *vm, void *data, NativePointerCallback deleter, [[maybe_unused]] bool callNapi)
37484514f5e3Sopenharmony_ci{
37494514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
37504514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37514514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> funcValue = JSNApiHelper::ToJSHandle(this);
37524514f5e3Sopenharmony_ci    JSHandle<JSFunction> function(funcValue);
37534514f5e3Sopenharmony_ci    if (function->IsJSShared()) {
37544514f5e3Sopenharmony_ci        function->SetSFunctionExtraInfo(thread, nullptr, deleter, data, 0);
37554514f5e3Sopenharmony_ci    } else {
37564514f5e3Sopenharmony_ci        function->SetFunctionExtraInfo(thread, nullptr, deleter, data, 0);
37574514f5e3Sopenharmony_ci    }
37584514f5e3Sopenharmony_ci}
37594514f5e3Sopenharmony_ci
37604514f5e3Sopenharmony_civoid* FunctionRef::GetData(const EcmaVM *vm)
37614514f5e3Sopenharmony_ci{
37624514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
37634514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37644514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> funcValue = JSNApiHelper::ToJSHandle(this);
37654514f5e3Sopenharmony_ci    JSHandle<JSFunctionBase> function(funcValue);
37664514f5e3Sopenharmony_ci    JSTaggedValue extraInfoValue = function->GetFunctionExtraInfo();
37674514f5e3Sopenharmony_ci    if (!extraInfoValue.IsNativePointer()) {
37684514f5e3Sopenharmony_ci        return nullptr;
37694514f5e3Sopenharmony_ci    }
37704514f5e3Sopenharmony_ci    auto extraInfo = JSNativePointer::Cast(extraInfoValue.GetTaggedObject());
37714514f5e3Sopenharmony_ci    return extraInfo->GetData();
37724514f5e3Sopenharmony_ci}
37734514f5e3Sopenharmony_ci
37744514f5e3Sopenharmony_ci// ----------------------------------- ArrayRef ----------------------------------------
37754514f5e3Sopenharmony_ciLocal<ArrayRef> ArrayRef::New(const EcmaVM *vm, uint32_t length)
37764514f5e3Sopenharmony_ci{
37774514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
37784514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37794514f5e3Sopenharmony_ci    JSTaggedNumber arrayLen(length);
37804514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> array = JSArray::ArrayCreate(thread, arrayLen);
37814514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
37824514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ArrayRef>(array);
37834514f5e3Sopenharmony_ci}
37844514f5e3Sopenharmony_ci
37854514f5e3Sopenharmony_ciuint32_t ArrayRef::Length(const EcmaVM *vm)
37864514f5e3Sopenharmony_ci{
37874514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
37884514f5e3Sopenharmony_ci    return JSArray::Cast(JSNApiHelper::ToJSTaggedValue(this).GetTaggedObject())->GetArrayLength();
37894514f5e3Sopenharmony_ci}
37904514f5e3Sopenharmony_ci
37914514f5e3Sopenharmony_ciLocal<JSValueRef> ArrayRef::GetValueAt(const EcmaVM *vm, Local<JSValueRef> obj, uint32_t index)
37924514f5e3Sopenharmony_ci{
37934514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
37944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
37954514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object = JSNApiHelper::ToJSHandle(obj);
37964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> result = JSArray::FastGetPropertyByValue(thread, object, index);
37974514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(result);
37984514f5e3Sopenharmony_ci}
37994514f5e3Sopenharmony_ci
38004514f5e3Sopenharmony_cibool ArrayRef::SetValueAt(const EcmaVM *vm, Local<JSValueRef> obj, uint32_t index, Local<JSValueRef> value)
38014514f5e3Sopenharmony_ci{
38024514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
38034514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
38044514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> objectHandle = JSNApiHelper::ToJSHandle(obj);
38054514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> valueHandle = JSNApiHelper::ToJSHandle(value);
38064514f5e3Sopenharmony_ci    return JSArray::FastSetPropertyByValue(thread, objectHandle, index, valueHandle);
38074514f5e3Sopenharmony_ci}
38084514f5e3Sopenharmony_ci
38094514f5e3Sopenharmony_ci// ----------------------------------- SendableArrayRef ----------------------------------------
38104514f5e3Sopenharmony_ciLocal<SendableArrayRef> SendableArrayRef::New(const EcmaVM *vm, uint32_t length)
38114514f5e3Sopenharmony_ci{
38124514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
38134514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
38144514f5e3Sopenharmony_ci    JSTaggedNumber arrayLen(length);
38154514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> array = ecmascript::JSSharedArray::ArrayCreate(thread, arrayLen);
38164514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> initialValue(thread, JSTaggedValue::Undefined());
38174514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> key(thread, JSTaggedValue::Undefined());
38184514f5e3Sopenharmony_ci    for (uint32_t i = 0; i < length; i++) {
38194514f5e3Sopenharmony_ci        key.Update(JSTaggedValue(i));
38204514f5e3Sopenharmony_ci        JSObject::CreateDataPropertyOrThrow(
38214514f5e3Sopenharmony_ci            thread, JSHandle<JSObject>(array), key, initialValue, ecmascript::JSShared::SCheckMode::SKIP);
38224514f5e3Sopenharmony_ci    }
38234514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
38244514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SendableArrayRef>(array);
38254514f5e3Sopenharmony_ci}
38264514f5e3Sopenharmony_ci
38274514f5e3Sopenharmony_ciuint32_t SendableArrayRef::Length(const EcmaVM *vm)
38284514f5e3Sopenharmony_ci{
38294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, 0);
38304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
38314514f5e3Sopenharmony_ci    return ecmascript::JSSharedArray::Cast(JSNApiHelper::ToJSTaggedValue(this).GetTaggedObject())->GetArrayLength();
38324514f5e3Sopenharmony_ci}
38334514f5e3Sopenharmony_ci
38344514f5e3Sopenharmony_ciLocal<JSValueRef> SendableArrayRef::GetValueAt(const EcmaVM *vm, Local<JSValueRef> obj, uint32_t index)
38354514f5e3Sopenharmony_ci{
38364514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
38374514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
38384514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> object = JSNApiHelper::ToJSHandle(obj);
38394514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> result = ecmascript::JSSharedArray::FastGetPropertyByValue(thread, object, index);
38404514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(result);
38414514f5e3Sopenharmony_ci}
38424514f5e3Sopenharmony_ci
38434514f5e3Sopenharmony_cibool SendableArrayRef::SetProperty(const EcmaVM *vm, Local<JSValueRef> obj, uint32_t index, Local<JSValueRef> value)
38444514f5e3Sopenharmony_ci{
38454514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
38464514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
38474514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> objectHandle = JSNApiHelper::ToJSHandle(obj);
38484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> valueHandle = JSNApiHelper::ToJSHandle(value);
38494514f5e3Sopenharmony_ci    return ecmascript::JSSharedArray::SetProperty(
38504514f5e3Sopenharmony_ci        thread, objectHandle, index, valueHandle, true, ecmascript::SCheckMode::CHECK);
38514514f5e3Sopenharmony_ci}
38524514f5e3Sopenharmony_ci
38534514f5e3Sopenharmony_ci// ---------------------------------- Error ---------------------------------------
38544514f5e3Sopenharmony_ci// NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
38554514f5e3Sopenharmony_ci#define EXCEPTION_ERROR_NEW(name, type)                                                                 \
38564514f5e3Sopenharmony_ci    Local<JSValueRef> Exception::name(const EcmaVM *vm, Local<StringRef> message)                       \
38574514f5e3Sopenharmony_ci    {                                                                                                   \
38584514f5e3Sopenharmony_ci        CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));                    \
38594514f5e3Sopenharmony_ci        ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());                                 \
38604514f5e3Sopenharmony_ci        ObjectFactory *factory = vm->GetFactory();                                                      \
38614514f5e3Sopenharmony_ci                                                                                                        \
38624514f5e3Sopenharmony_ci        JSHandle<EcmaString> messageValue(JSNApiHelper::ToJSHandle(message));                           \
38634514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> result(factory->NewJSError(ErrorType::type,                             \
38644514f5e3Sopenharmony_ci                                                           messageValue, ecmascript::StackCheck::NO));  \
38654514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<JSValueRef>(result);                                               \
38664514f5e3Sopenharmony_ci    }
38674514f5e3Sopenharmony_ci
38684514f5e3Sopenharmony_ciEXCEPTION_ERROR_ALL(EXCEPTION_ERROR_NEW)
38694514f5e3Sopenharmony_ci
38704514f5e3Sopenharmony_ci#undef EXCEPTION_ERROR_NEW
38714514f5e3Sopenharmony_ci// ---------------------------------- Error ---------------------------------------
38724514f5e3Sopenharmony_ci
38734514f5e3Sopenharmony_ci// ---------------------------------- FunctionCallScope ---------------------------------------
38744514f5e3Sopenharmony_ciFunctionCallScope::FunctionCallScope(EcmaVM *vm) : vm_(vm)
38754514f5e3Sopenharmony_ci{
38764514f5e3Sopenharmony_ci    vm_->IncreaseCallDepth();
38774514f5e3Sopenharmony_ci}
38784514f5e3Sopenharmony_ci
38794514f5e3Sopenharmony_ciFunctionCallScope::~FunctionCallScope()
38804514f5e3Sopenharmony_ci{
38814514f5e3Sopenharmony_ci    vm_->DecreaseCallDepth();
38824514f5e3Sopenharmony_ci    if (vm_->IsTopLevelCallDepth()) {
38834514f5e3Sopenharmony_ci        JSThread *thread = vm_->GetJSThread();
38844514f5e3Sopenharmony_ci        ecmascript::ThreadManagedScope managedScope(vm_->GetJSThread());
38854514f5e3Sopenharmony_ci        thread->GetCurrentEcmaContext()->ExecutePromisePendingJob();
38864514f5e3Sopenharmony_ci    }
38874514f5e3Sopenharmony_ci}
38884514f5e3Sopenharmony_ci
38894514f5e3Sopenharmony_ci// -------------------------------------  JSExecutionScope ------------------------------
38904514f5e3Sopenharmony_ciJSExecutionScope::JSExecutionScope([[maybe_unused]] const EcmaVM *vm)
38914514f5e3Sopenharmony_ci{
38924514f5e3Sopenharmony_ci}
38934514f5e3Sopenharmony_ci
38944514f5e3Sopenharmony_ciJSExecutionScope::~JSExecutionScope()
38954514f5e3Sopenharmony_ci{
38964514f5e3Sopenharmony_ci    lastCurrentThread_ = nullptr;
38974514f5e3Sopenharmony_ci    isRevert_ = false;
38984514f5e3Sopenharmony_ci}
38994514f5e3Sopenharmony_ci
39004514f5e3Sopenharmony_ci// ------------------------------------ JsiNativeScope -----------------------------------------------
39014514f5e3Sopenharmony_ci
39024514f5e3Sopenharmony_ciJsiNativeScope::JsiNativeScope(const EcmaVM *vm)
39034514f5e3Sopenharmony_ci{
39044514f5e3Sopenharmony_ci    thread_ = vm->GetAssociatedJSThread();
39054514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_SCOPE_LOCK_STAT
39064514f5e3Sopenharmony_ci    if (vm->IsCollectingScopeLockStats()) {
39074514f5e3Sopenharmony_ci        const_cast<EcmaVM*>(vm)->IncreaseEnterJsiNativeScopeCount();
39084514f5e3Sopenharmony_ci        const_cast<EcmaVM*>(vm)->IncreaseUpdateThreadStateTransCount();
39094514f5e3Sopenharmony_ci    }
39104514f5e3Sopenharmony_ci#endif
39114514f5e3Sopenharmony_ci    oldThreadState_ = static_cast<uint16_t>(thread_->GetState());
39124514f5e3Sopenharmony_ci    thread_->UpdateState(ecmascript::ThreadState::NATIVE);
39134514f5e3Sopenharmony_ci}
39144514f5e3Sopenharmony_ci
39154514f5e3Sopenharmony_ciJsiNativeScope::~JsiNativeScope()
39164514f5e3Sopenharmony_ci{
39174514f5e3Sopenharmony_ci    thread_->UpdateState(static_cast<ecmascript::ThreadState>(oldThreadState_));
39184514f5e3Sopenharmony_ci}
39194514f5e3Sopenharmony_ci
39204514f5e3Sopenharmony_ci// ------------------------------------ JsiFastNativeScope -----------------------------------------------
39214514f5e3Sopenharmony_ci
39224514f5e3Sopenharmony_ciJsiFastNativeScope::JsiFastNativeScope(const EcmaVM *vm)
39234514f5e3Sopenharmony_ci{
39244514f5e3Sopenharmony_ci    thread_ = vm->GetAssociatedJSThread();
39254514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_SCOPE_LOCK_STAT
39264514f5e3Sopenharmony_ci    if (vm->IsCollectingScopeLockStats()) {
39274514f5e3Sopenharmony_ci        const_cast<EcmaVM*>(vm)->IncreaseEnterFastNativeScopeCount();
39284514f5e3Sopenharmony_ci        const_cast<EcmaVM*>(vm)->IncreaseUpdateThreadStateTransCount();
39294514f5e3Sopenharmony_ci    }
39304514f5e3Sopenharmony_ci#endif
39314514f5e3Sopenharmony_ci    ecmascript::ThreadState oldState = thread_->GetState();
39324514f5e3Sopenharmony_ci    if (oldState == ecmascript::ThreadState::RUNNING) {
39334514f5e3Sopenharmony_ci        return;
39344514f5e3Sopenharmony_ci    }
39354514f5e3Sopenharmony_ci    oldThreadState_ = static_cast<uint16_t>(oldState);
39364514f5e3Sopenharmony_ci    hasSwitchState_ = true;
39374514f5e3Sopenharmony_ci    thread_->UpdateState(ecmascript::ThreadState::RUNNING);
39384514f5e3Sopenharmony_ci}
39394514f5e3Sopenharmony_ci
39404514f5e3Sopenharmony_ciJsiFastNativeScope::~JsiFastNativeScope()
39414514f5e3Sopenharmony_ci{
39424514f5e3Sopenharmony_ci    if (hasSwitchState_) {
39434514f5e3Sopenharmony_ci        thread_->UpdateState(static_cast<ecmascript::ThreadState>(oldThreadState_));
39444514f5e3Sopenharmony_ci    }
39454514f5e3Sopenharmony_ci}
39464514f5e3Sopenharmony_ci
39474514f5e3Sopenharmony_ci// ------------------------------------ JsiRuntimeCallInfo -----------------------------------------------
39484514f5e3Sopenharmony_civoid *JsiRuntimeCallInfo::GetData()
39494514f5e3Sopenharmony_ci{
39504514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread_);
39514514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = BuiltinsBase::GetConstructor(reinterpret_cast<EcmaRuntimeCallInfo *>(this));
39524514f5e3Sopenharmony_ci    if (!constructor->IsJSFunction()) {
39534514f5e3Sopenharmony_ci        return nullptr;
39544514f5e3Sopenharmony_ci    }
39554514f5e3Sopenharmony_ci    JSHandle<JSFunctionBase> function(constructor);
39564514f5e3Sopenharmony_ci    JSTaggedValue extraInfoValue = function->GetFunctionExtraInfo();
39574514f5e3Sopenharmony_ci    if (!extraInfoValue.IsJSNativePointer()) {
39584514f5e3Sopenharmony_ci        return nullptr;
39594514f5e3Sopenharmony_ci    }
39604514f5e3Sopenharmony_ci    return JSNativePointer::Cast(extraInfoValue.GetTaggedObject())->GetData();
39614514f5e3Sopenharmony_ci}
39624514f5e3Sopenharmony_ci
39634514f5e3Sopenharmony_ciEcmaVM *JsiRuntimeCallInfo::GetVM() const
39644514f5e3Sopenharmony_ci{
39654514f5e3Sopenharmony_ci    return thread_->GetEcmaVM();
39664514f5e3Sopenharmony_ci}
39674514f5e3Sopenharmony_ci
39684514f5e3Sopenharmony_ci// ---------------------------------------JSNApi-------------------------------------------
39694514f5e3Sopenharmony_ciPatchErrorCode JSNApi::LoadPatch(EcmaVM *vm, const std::string &patchFileName, const std::string &baseFileName)
39704514f5e3Sopenharmony_ci{
39714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, PatchErrorCode::INTERNAL_ERROR);
39724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
39734514f5e3Sopenharmony_ci    ecmascript::QuickFixManager *quickFixManager = vm->GetQuickFixManager();
39744514f5e3Sopenharmony_ci    return quickFixManager->LoadPatch(thread, patchFileName, baseFileName);
39754514f5e3Sopenharmony_ci}
39764514f5e3Sopenharmony_ci
39774514f5e3Sopenharmony_ciPatchErrorCode JSNApi::LoadPatch(EcmaVM *vm,
39784514f5e3Sopenharmony_ci                                 const std::string &patchFileName, uint8_t *patchBuffer, size_t patchSize,
39794514f5e3Sopenharmony_ci                                 const std::string &baseFileName, uint8_t *baseBuffer, size_t baseSize)
39804514f5e3Sopenharmony_ci{
39814514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, PatchErrorCode::INTERNAL_ERROR);
39824514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
39834514f5e3Sopenharmony_ci    ecmascript::QuickFixManager *quickFixManager = vm->GetQuickFixManager();
39844514f5e3Sopenharmony_ci    return quickFixManager->LoadPatch(
39854514f5e3Sopenharmony_ci        thread, patchFileName, patchBuffer, patchSize, baseFileName, baseBuffer, baseSize);
39864514f5e3Sopenharmony_ci}
39874514f5e3Sopenharmony_ci
39884514f5e3Sopenharmony_ciPatchErrorCode JSNApi::UnloadPatch(EcmaVM *vm, const std::string &patchFileName)
39894514f5e3Sopenharmony_ci{
39904514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, PatchErrorCode::INTERNAL_ERROR);
39914514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
39924514f5e3Sopenharmony_ci    ecmascript::QuickFixManager *quickFixManager = vm->GetQuickFixManager();
39934514f5e3Sopenharmony_ci    return quickFixManager->UnloadPatch(thread, patchFileName);
39944514f5e3Sopenharmony_ci}
39954514f5e3Sopenharmony_ci
39964514f5e3Sopenharmony_ci/*
39974514f5e3Sopenharmony_ci * check whether the exception is caused by quickfix methods.
39984514f5e3Sopenharmony_ci */
39994514f5e3Sopenharmony_cibool JSNApi::IsQuickFixCausedException(EcmaVM *vm, Local<ObjectRef> exception, const std::string &patchFileName)
40004514f5e3Sopenharmony_ci{
40014514f5e3Sopenharmony_ci    if (exception.IsEmpty()) {
40024514f5e3Sopenharmony_ci        return false;
40034514f5e3Sopenharmony_ci    }
40044514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
40054514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
40064514f5e3Sopenharmony_ci    ecmascript::QuickFixManager *quickFixManager = vm->GetQuickFixManager();
40074514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exceptionInfo = JSNApiHelper::ToJSHandle(exception);
40084514f5e3Sopenharmony_ci    return quickFixManager->IsQuickFixCausedException(thread, exceptionInfo, patchFileName);
40094514f5e3Sopenharmony_ci}
40104514f5e3Sopenharmony_ci
40114514f5e3Sopenharmony_ci/*
40124514f5e3Sopenharmony_ci * register quickfix query function.
40134514f5e3Sopenharmony_ci */
40144514f5e3Sopenharmony_civoid JSNApi::RegisterQuickFixQueryFunc(EcmaVM *vm, std::function<bool(std::string baseFileName,
40154514f5e3Sopenharmony_ci                        std::string &patchFileName,
40164514f5e3Sopenharmony_ci                        uint8_t **patchBuffer,
40174514f5e3Sopenharmony_ci                        size_t &patchSize)> callBack)
40184514f5e3Sopenharmony_ci{
40194514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
40204514f5e3Sopenharmony_ci    ecmascript::QuickFixManager *quickFixManager = vm->GetQuickFixManager();
40214514f5e3Sopenharmony_ci    quickFixManager->RegisterQuickFixQueryFunc(callBack);
40224514f5e3Sopenharmony_ci}
40234514f5e3Sopenharmony_ci
40244514f5e3Sopenharmony_cibool JSNApi::IsBundle(EcmaVM *vm)
40254514f5e3Sopenharmony_ci{
40264514f5e3Sopenharmony_ci    return vm->IsBundlePack();
40274514f5e3Sopenharmony_ci}
40284514f5e3Sopenharmony_ci
40294514f5e3Sopenharmony_civoid JSNApi::SetBundle(EcmaVM *vm, bool value)
40304514f5e3Sopenharmony_ci{
40314514f5e3Sopenharmony_ci    vm->SetIsBundlePack(value);
40324514f5e3Sopenharmony_ci}
40334514f5e3Sopenharmony_ci
40344514f5e3Sopenharmony_cibool JSNApi::IsNormalizedOhmUrlPack(EcmaVM *vm)
40354514f5e3Sopenharmony_ci{
40364514f5e3Sopenharmony_ci    return vm->IsNormalizedOhmUrlPack();
40374514f5e3Sopenharmony_ci}
40384514f5e3Sopenharmony_ci
40394514f5e3Sopenharmony_cibool JSNApi::IsOhmUrl(const std::string &srcName)
40404514f5e3Sopenharmony_ci{
40414514f5e3Sopenharmony_ci    return ModulePathHelper::IsOhmUrl(srcName.c_str());
40424514f5e3Sopenharmony_ci}
40434514f5e3Sopenharmony_ci
40444514f5e3Sopenharmony_civoid JSNApi::SetModuleInfo(EcmaVM *vm, const std::string &assetPath, const std::string &entryPoint)
40454514f5e3Sopenharmony_ci{
40464514f5e3Sopenharmony_ci    SetAssetPath(vm, assetPath);
40474514f5e3Sopenharmony_ci    size_t pos = entryPoint.find_first_of("/");
40484514f5e3Sopenharmony_ci    if (pos != std::string::npos) {
40494514f5e3Sopenharmony_ci        SetBundleName(vm, entryPoint.substr(0, pos));
40504514f5e3Sopenharmony_ci        ecmascript::CString moduleName = ModulePathHelper::GetModuleName(entryPoint.c_str());
40514514f5e3Sopenharmony_ci        if (!moduleName.empty()) {
40524514f5e3Sopenharmony_ci            SetModuleName(vm, moduleName.c_str());
40534514f5e3Sopenharmony_ci            return;
40544514f5e3Sopenharmony_ci        }
40554514f5e3Sopenharmony_ci    }
40564514f5e3Sopenharmony_ci    std::string errmsg = "SetModuleInfo: entryPoint:" + entryPoint + "is invalid.";
40574514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << errmsg;
40584514f5e3Sopenharmony_ci    Local<StringRef> message = StringRef::NewFromUtf8(vm, errmsg.c_str());
40594514f5e3Sopenharmony_ci    Local<JSValueRef> error = Exception::Error(vm, message);
40604514f5e3Sopenharmony_ci    JSNApi::ThrowException(vm, error);
40614514f5e3Sopenharmony_ci}
40624514f5e3Sopenharmony_ci
40634514f5e3Sopenharmony_ci// note: The function SetAssetPath is a generic interface for previewing and physical machines.
40644514f5e3Sopenharmony_civoid JSNApi::SetAssetPath(EcmaVM *vm, const std::string &assetPath)
40654514f5e3Sopenharmony_ci{
40664514f5e3Sopenharmony_ci    ecmascript::CString path = assetPath.c_str();
40674514f5e3Sopenharmony_ci    // check input assetPath
40684514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_WINDOWS) && !defined(PANDA_TARGET_MACOS)
40694514f5e3Sopenharmony_ci    if (!ModulePathHelper::ValidateAbcPath(path, ecmascript::ValidateFilePath::ABC)) {
40704514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "Invalid input assetPath: " << assetPath.c_str();
40714514f5e3Sopenharmony_ci    }
40724514f5e3Sopenharmony_ci#endif
40734514f5e3Sopenharmony_ci    vm->SetAssetPath(path);
40744514f5e3Sopenharmony_ci}
40754514f5e3Sopenharmony_ci
40764514f5e3Sopenharmony_civoid JSNApi::SetLoop(EcmaVM *vm, void *loop)
40774514f5e3Sopenharmony_ci{
40784514f5e3Sopenharmony_ci    vm->SetLoop(loop);
40794514f5e3Sopenharmony_ci}
40804514f5e3Sopenharmony_ci
40814514f5e3Sopenharmony_civoid JSNApi::SetWeakFinalizeTaskCallback(EcmaVM *vm, const WeakFinalizeTaskCallback &callback)
40824514f5e3Sopenharmony_ci{
40834514f5e3Sopenharmony_ci    vm->GetAssociatedJSThread()->SetWeakFinalizeTaskCallback(callback);
40844514f5e3Sopenharmony_ci}
40854514f5e3Sopenharmony_ci
40864514f5e3Sopenharmony_civoid JSNApi::SetAsyncCleanTaskCallback(EcmaVM *vm, const NativePointerTaskCallback &callback)
40874514f5e3Sopenharmony_ci{
40884514f5e3Sopenharmony_ci    vm->GetAssociatedJSThread()->SetAsyncCleanTaskCallback(callback);
40894514f5e3Sopenharmony_ci}
40904514f5e3Sopenharmony_ci
40914514f5e3Sopenharmony_civoid JSNApi::SetTriggerGCTaskCallback(EcmaVM *vm, const TriggerGCTaskCallback& callback)
40924514f5e3Sopenharmony_ci{
40934514f5e3Sopenharmony_ci    vm->GetHeap()->GetIdleGCTrigger()->SetTriggerGCTaskCallback(callback);
40944514f5e3Sopenharmony_ci}
40954514f5e3Sopenharmony_ci
40964514f5e3Sopenharmony_cistd::string JSNApi::GetAssetPath(EcmaVM *vm)
40974514f5e3Sopenharmony_ci{
40984514f5e3Sopenharmony_ci    return vm->GetAssetPath().c_str();
40994514f5e3Sopenharmony_ci}
41004514f5e3Sopenharmony_ci
41014514f5e3Sopenharmony_civoid JSNApi::SetMockModuleList(EcmaVM *vm, const std::map<std::string, std::string> &list)
41024514f5e3Sopenharmony_ci{
41034514f5e3Sopenharmony_ci    vm->SetMockModuleList(list);
41044514f5e3Sopenharmony_ci}
41054514f5e3Sopenharmony_ci
41064514f5e3Sopenharmony_civoid JSNApi::SetHmsModuleList(EcmaVM *vm, const std::vector<panda::HmsMap> &list)
41074514f5e3Sopenharmony_ci{
41084514f5e3Sopenharmony_ci    vm->SetHmsModuleList(list);
41094514f5e3Sopenharmony_ci}
41104514f5e3Sopenharmony_ci
41114514f5e3Sopenharmony_civoid JSNApi::SetPkgAliasList(EcmaVM *vm, const std::map<std::string, std::string> &list)
41124514f5e3Sopenharmony_ci{
41134514f5e3Sopenharmony_ci    ecmascript::CMap<ecmascript::CString, ecmascript::CString> pkgAliasList;
41144514f5e3Sopenharmony_ci    for (auto it = list.begin(); it != list.end(); ++it) {
41154514f5e3Sopenharmony_ci        pkgAliasList.emplace(it->first.c_str(), it->second.c_str());
41164514f5e3Sopenharmony_ci    }
41174514f5e3Sopenharmony_ci    vm->SetPkgAliasList(pkgAliasList);
41184514f5e3Sopenharmony_ci}
41194514f5e3Sopenharmony_ci
41204514f5e3Sopenharmony_civoid JSNApi::SetPkgNameList(EcmaVM *vm, const std::map<std::string, std::string> &list)
41214514f5e3Sopenharmony_ci{
41224514f5e3Sopenharmony_ci    ecmascript::CMap<ecmascript::CString, ecmascript::CString> pkgNameList;
41234514f5e3Sopenharmony_ci    for (auto it = list.begin(); it != list.end(); ++it) {
41244514f5e3Sopenharmony_ci        pkgNameList.emplace(it->first.c_str(), it->second.c_str());
41254514f5e3Sopenharmony_ci    }
41264514f5e3Sopenharmony_ci    vm->SetPkgNameList(pkgNameList);
41274514f5e3Sopenharmony_ci}
41284514f5e3Sopenharmony_cistd::string JSNApi::GetPkgName(EcmaVM *vm, const std::string &moduleName)
41294514f5e3Sopenharmony_ci{
41304514f5e3Sopenharmony_ci    return vm->GetPkgName(moduleName.c_str()).c_str();
41314514f5e3Sopenharmony_ci}
41324514f5e3Sopenharmony_ci
41334514f5e3Sopenharmony_civoid JSNApi::SetpkgContextInfoList(EcmaVM *vm, const std::map<std::string,
41344514f5e3Sopenharmony_ci    std::vector<std::vector<std::string>>> &list)
41354514f5e3Sopenharmony_ci{
41364514f5e3Sopenharmony_ci    ecmascript::CMap<ecmascript::CString, ecmascript::CMap<ecmascript::CString,
41374514f5e3Sopenharmony_ci        ecmascript::CVector<ecmascript::CString>>> pkgContextInfoList;
41384514f5e3Sopenharmony_ci    for (auto it = list.begin(); it != list.end(); it++) {
41394514f5e3Sopenharmony_ci        const std::vector<std::vector<std::string>> vec = it->second;
41404514f5e3Sopenharmony_ci        ecmascript::CMap<ecmascript::CString, ecmascript::CVector<ecmascript::CString>> map;
41414514f5e3Sopenharmony_ci        for (size_t i = 0; i < vec.size(); i++) {
41424514f5e3Sopenharmony_ci            ecmascript::CString pkgName = vec[i][0].c_str();
41434514f5e3Sopenharmony_ci            ecmascript::CVector<ecmascript::CString> pkgContextInfo;
41444514f5e3Sopenharmony_ci            for (size_t j = 1; j < vec[i].size(); j++) {
41454514f5e3Sopenharmony_ci                pkgContextInfo.emplace_back(vec[i][j].c_str());
41464514f5e3Sopenharmony_ci            }
41474514f5e3Sopenharmony_ci            map.emplace(pkgName, pkgContextInfo);
41484514f5e3Sopenharmony_ci        }
41494514f5e3Sopenharmony_ci        pkgContextInfoList.emplace(it->first.c_str(), map);
41504514f5e3Sopenharmony_ci    }
41514514f5e3Sopenharmony_ci    vm->SetpkgContextInfoList(pkgContextInfoList);
41524514f5e3Sopenharmony_ci}
41534514f5e3Sopenharmony_ci
41544514f5e3Sopenharmony_ci// Only used for env created by napi to set module execution mode
41554514f5e3Sopenharmony_civoid JSNApi::SetExecuteBufferMode(const EcmaVM *vm)
41564514f5e3Sopenharmony_ci{
41574514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager =
41584514f5e3Sopenharmony_ci        vm->GetAssociatedJSThread()->GetCurrentEcmaContext()->GetModuleManager();
41594514f5e3Sopenharmony_ci    moduleManager->SetExecuteMode(ecmascript::ModuleExecuteMode::ExecuteBufferMode);
41604514f5e3Sopenharmony_ci}
41614514f5e3Sopenharmony_ci
41624514f5e3Sopenharmony_cibool JSNApi::InitForConcurrentThread(EcmaVM *vm, ConcurrentCallback cb, void *data)
41634514f5e3Sopenharmony_ci{
41644514f5e3Sopenharmony_ci    vm->SetConcurrentCallback(cb, data);
41654514f5e3Sopenharmony_ci
41664514f5e3Sopenharmony_ci    return true;
41674514f5e3Sopenharmony_ci}
41684514f5e3Sopenharmony_ci
41694514f5e3Sopenharmony_cibool JSNApi::InitForConcurrentFunction(EcmaVM *vm, Local<JSValueRef> function, void *taskInfo)
41704514f5e3Sopenharmony_ci{
41714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
41724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
41734514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
41744514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> funcVal = JSNApiHelper::ToJSHandle(function);
41754514f5e3Sopenharmony_ci    JSHandle<JSFunction> transFunc = JSHandle<JSFunction>::Cast(funcVal);
41764514f5e3Sopenharmony_ci    if (transFunc->GetFunctionKind() != ecmascript::FunctionKind::CONCURRENT_FUNCTION) {
41774514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Function is not concurrent";
41784514f5e3Sopenharmony_ci        return false;
41794514f5e3Sopenharmony_ci    }
41804514f5e3Sopenharmony_ci    transFunc->SetTaskConcurrentFuncFlag(1); // 1 : concurrent function flag
41814514f5e3Sopenharmony_ci    thread->SetTaskInfo(reinterpret_cast<uintptr_t>(taskInfo));
41824514f5e3Sopenharmony_ci    thread->SetIsInConcurrentScope(true);
41834514f5e3Sopenharmony_ci    return true;
41844514f5e3Sopenharmony_ci}
41854514f5e3Sopenharmony_ci
41864514f5e3Sopenharmony_civoid* JSNApi::GetCurrentTaskInfo(const EcmaVM *vm)
41874514f5e3Sopenharmony_ci{
41884514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
41894514f5e3Sopenharmony_ci    return reinterpret_cast<void*>(thread->GetTaskInfo());
41904514f5e3Sopenharmony_ci}
41914514f5e3Sopenharmony_ci
41924514f5e3Sopenharmony_civoid JSNApi::ClearCurrentTaskInfo(const EcmaVM *vm)
41934514f5e3Sopenharmony_ci{
41944514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
41954514f5e3Sopenharmony_ci    thread->SetTaskInfo(reinterpret_cast<uintptr_t>(nullptr));
41964514f5e3Sopenharmony_ci    thread->SetIsInConcurrentScope(false);
41974514f5e3Sopenharmony_ci}
41984514f5e3Sopenharmony_ci
41994514f5e3Sopenharmony_civoid JSNApi::SetBundleName(EcmaVM *vm, const std::string &bundleName)
42004514f5e3Sopenharmony_ci{
42014514f5e3Sopenharmony_ci    ecmascript::CString name = bundleName.c_str();
42024514f5e3Sopenharmony_ci    vm->SetBundleName(name);
42034514f5e3Sopenharmony_ci}
42044514f5e3Sopenharmony_ci
42054514f5e3Sopenharmony_cistd::string JSNApi::GetBundleName(EcmaVM *vm)
42064514f5e3Sopenharmony_ci{
42074514f5e3Sopenharmony_ci    return vm->GetBundleName().c_str();
42084514f5e3Sopenharmony_ci}
42094514f5e3Sopenharmony_ci
42104514f5e3Sopenharmony_civoid JSNApi::SetModuleName(EcmaVM *vm, const std::string &moduleName)
42114514f5e3Sopenharmony_ci{
42124514f5e3Sopenharmony_ci    ecmascript::CString name = moduleName.c_str();
42134514f5e3Sopenharmony_ci    ecmascript::pgo::PGOProfilerManager::GetInstance()->SetModuleName(moduleName);
42144514f5e3Sopenharmony_ci    vm->SetModuleName(name);
42154514f5e3Sopenharmony_ci}
42164514f5e3Sopenharmony_ci
42174514f5e3Sopenharmony_cistd::string JSNApi::GetModuleName(EcmaVM *vm)
42184514f5e3Sopenharmony_ci{
42194514f5e3Sopenharmony_ci    return vm->GetModuleName().c_str();
42204514f5e3Sopenharmony_ci}
42214514f5e3Sopenharmony_ci
42224514f5e3Sopenharmony_cistd::pair<std::string, std::string> JSNApi::GetCurrentModuleInfo(EcmaVM *vm, bool needRecordName)
42234514f5e3Sopenharmony_ci{
42244514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
42254514f5e3Sopenharmony_ci    return vm->GetCurrentModuleInfo(needRecordName);
42264514f5e3Sopenharmony_ci}
42274514f5e3Sopenharmony_ci
42284514f5e3Sopenharmony_cistd::string JSNApi::NormalizePath(const std::string &string)
42294514f5e3Sopenharmony_ci{
42304514f5e3Sopenharmony_ci    return PathHelper::NormalizePath(string.c_str()).c_str();
42314514f5e3Sopenharmony_ci}
42324514f5e3Sopenharmony_ci
42334514f5e3Sopenharmony_ci// Enable cross thread execution.
42344514f5e3Sopenharmony_civoid JSNApi::AllowCrossThreadExecution(EcmaVM *vm)
42354514f5e3Sopenharmony_ci{
42364514f5e3Sopenharmony_ci    LOG_ECMA(WARN) << "enable cross thread execution";
42374514f5e3Sopenharmony_ci    vm->GetAssociatedJSThread()->EnableCrossThreadExecution();
42384514f5e3Sopenharmony_ci}
42394514f5e3Sopenharmony_ci
42404514f5e3Sopenharmony_civoid* JSNApi::GetEnv(EcmaVM *vm)
42414514f5e3Sopenharmony_ci{
42424514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
42434514f5e3Sopenharmony_ci    return thread->GetEnv();
42444514f5e3Sopenharmony_ci}
42454514f5e3Sopenharmony_ci
42464514f5e3Sopenharmony_civoid JSNApi::SetEnv(EcmaVM *vm, void *env)
42474514f5e3Sopenharmony_ci{
42484514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
42494514f5e3Sopenharmony_ci    thread->SetEnv(env);
42504514f5e3Sopenharmony_ci}
42514514f5e3Sopenharmony_ci
42524514f5e3Sopenharmony_civoid JSNApi::SynchronizVMInfo(EcmaVM *vm, const EcmaVM *hostVM)
42534514f5e3Sopenharmony_ci{
42544514f5e3Sopenharmony_ci    std::atomic_thread_fence(std::memory_order_seq_cst);
42554514f5e3Sopenharmony_ci    vm->SetBundleName(hostVM->GetBundleName());
42564514f5e3Sopenharmony_ci    vm->SetModuleName(hostVM->GetModuleName());
42574514f5e3Sopenharmony_ci    vm->SetAssetPath(hostVM->GetAssetPath());
42584514f5e3Sopenharmony_ci    vm->SetIsBundlePack(hostVM->IsBundlePack());
42594514f5e3Sopenharmony_ci    vm->SetPkgNameList(hostVM->GetPkgNameList());
42604514f5e3Sopenharmony_ci    vm->SetPkgAliasList(hostVM->GetPkgAliasList());
42614514f5e3Sopenharmony_ci    vm->SetpkgContextInfoList(hostVM->GetPkgContextInfoLit());
42624514f5e3Sopenharmony_ci
42634514f5e3Sopenharmony_ci    ecmascript::ModuleManager *vmModuleManager =
42644514f5e3Sopenharmony_ci        vm->GetAssociatedJSThread()->GetCurrentEcmaContext()->GetModuleManager();
42654514f5e3Sopenharmony_ci    ecmascript::ModuleManager *hostVMModuleManager =
42664514f5e3Sopenharmony_ci        hostVM->GetAssociatedJSThread()->GetCurrentEcmaContext()->GetModuleManager();
42674514f5e3Sopenharmony_ci    vmModuleManager->SetExecuteMode(hostVMModuleManager->GetExecuteMode());
42684514f5e3Sopenharmony_ci    vm->SetResolveBufferCallback(hostVM->GetResolveBufferCallback());
42694514f5e3Sopenharmony_ci}
42704514f5e3Sopenharmony_ci
42714514f5e3Sopenharmony_cibool JSNApi::IsProfiling(EcmaVM *vm)
42724514f5e3Sopenharmony_ci{
42734514f5e3Sopenharmony_ci    return vm->GetProfilerState();
42744514f5e3Sopenharmony_ci}
42754514f5e3Sopenharmony_ci
42764514f5e3Sopenharmony_civoid JSNApi::SetProfilerState(const EcmaVM *vm, bool value)
42774514f5e3Sopenharmony_ci{
42784514f5e3Sopenharmony_ci    const_cast<EcmaVM*>(vm)->SetProfilerState(value);
42794514f5e3Sopenharmony_ci}
42804514f5e3Sopenharmony_ci
42814514f5e3Sopenharmony_civoid JSNApi::SetSourceMapTranslateCallback(EcmaVM *vm, SourceMapTranslateCallback callback)
42824514f5e3Sopenharmony_ci{
42834514f5e3Sopenharmony_ci    vm->SetSourceMapTranslateCallback(callback);
42844514f5e3Sopenharmony_ci}
42854514f5e3Sopenharmony_ci
42864514f5e3Sopenharmony_civoid JSNApi::SetSourceMapCallback(EcmaVM *vm, SourceMapCallback callback)
42874514f5e3Sopenharmony_ci{
42884514f5e3Sopenharmony_ci    vm->SetSourceMapCallback(callback);
42894514f5e3Sopenharmony_ci}
42904514f5e3Sopenharmony_ci
42914514f5e3Sopenharmony_civoid JSNApi::GetStackBeforeCallNapiSuccess([[maybe_unused]] EcmaVM *vm,
42924514f5e3Sopenharmony_ci                                           [[maybe_unused]] bool &getStackBeforeCallNapiSuccess)
42934514f5e3Sopenharmony_ci{
42944514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
42954514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
42964514f5e3Sopenharmony_ci    if (thread->GetIsProfiling()) {
42974514f5e3Sopenharmony_ci        ecmascript::ThreadManagedScope managedScope(thread);
42984514f5e3Sopenharmony_ci        getStackBeforeCallNapiSuccess = vm->GetProfiler()->GetStackBeforeCallNapi(thread);
42994514f5e3Sopenharmony_ci    }
43004514f5e3Sopenharmony_ci#endif
43014514f5e3Sopenharmony_ci}
43024514f5e3Sopenharmony_ci
43034514f5e3Sopenharmony_civoid JSNApi::GetStackAfterCallNapi([[maybe_unused]] EcmaVM *vm)
43044514f5e3Sopenharmony_ci{
43054514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_CPUPROFILER)
43064514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
43074514f5e3Sopenharmony_ci    if (thread->GetIsProfiling()) {
43084514f5e3Sopenharmony_ci        ecmascript::ThreadManagedScope managedScope(thread);
43094514f5e3Sopenharmony_ci        vm->GetProfiler()->GetStackAfterCallNapi(thread);
43104514f5e3Sopenharmony_ci    }
43114514f5e3Sopenharmony_ci#endif
43124514f5e3Sopenharmony_ci}
43134514f5e3Sopenharmony_ci
43144514f5e3Sopenharmony_ciEcmaVM *JSNApi::CreateJSVM(const RuntimeOption &option)
43154514f5e3Sopenharmony_ci{
43164514f5e3Sopenharmony_ci    JSRuntimeOptions runtimeOptions;
43174514f5e3Sopenharmony_ci    runtimeOptions.SetArkProperties(option.GetArkProperties());
43184514f5e3Sopenharmony_ci    runtimeOptions.SetMemConfigProperty(option.GetMemConfigProperty());
43194514f5e3Sopenharmony_ci    runtimeOptions.SetArkBundleName(option.GetArkBundleName());
43204514f5e3Sopenharmony_ci    runtimeOptions.SetLongPauseTime(option.GetLongPauseTime());
43214514f5e3Sopenharmony_ci    runtimeOptions.SetGcThreadNum(option.GetGcThreadNum());
43224514f5e3Sopenharmony_ci    runtimeOptions.SetIsWorker(option.GetIsWorker());
43234514f5e3Sopenharmony_ci    runtimeOptions.SetIsRestrictedWorker(option.GetIsRestrictedWorker());
43244514f5e3Sopenharmony_ci    // Mem
43254514f5e3Sopenharmony_ci    runtimeOptions.SetHeapSizeLimit(option.GetGcPoolSize());
43264514f5e3Sopenharmony_ci// Disable the asm-interpreter of ark-engine for ios-platform temporarily.
43274514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_IOS)
43284514f5e3Sopenharmony_ci    // asmInterpreter
43294514f5e3Sopenharmony_ci    runtimeOptions.SetEnableAsmInterpreter(option.GetEnableAsmInterpreter());
43304514f5e3Sopenharmony_ci#else
43314514f5e3Sopenharmony_ci    runtimeOptions.SetEnableAsmInterpreter(false);
43324514f5e3Sopenharmony_ci#endif
43334514f5e3Sopenharmony_ci    runtimeOptions.SetEnableBuiltinsLazy(option.GetEnableBuiltinsLazy());
43344514f5e3Sopenharmony_ci    runtimeOptions.SetAsmOpcodeDisableRange(option.GetAsmOpcodeDisableRange());
43354514f5e3Sopenharmony_ci    // aot
43364514f5e3Sopenharmony_ci    runtimeOptions.SetEnableAOT(option.GetEnableAOT());
43374514f5e3Sopenharmony_ci    runtimeOptions.SetEnablePGOProfiler(option.GetEnableProfile());
43384514f5e3Sopenharmony_ci    runtimeOptions.SetPGOProfilerPath(option.GetProfileDir());
43394514f5e3Sopenharmony_ci    // Dfx
43404514f5e3Sopenharmony_ci    runtimeOptions.SetLogLevel(Log::LevelToString(Log::ConvertFromRuntime(option.GetLogLevel())));
43414514f5e3Sopenharmony_ci    runtimeOptions.SetEnableArkTools(option.GetEnableArkTools());
43424514f5e3Sopenharmony_ci    return CreateEcmaVM(runtimeOptions);
43434514f5e3Sopenharmony_ci}
43444514f5e3Sopenharmony_ci
43454514f5e3Sopenharmony_ciEcmaContext *JSNApi::CreateJSContext(EcmaVM *vm)
43464514f5e3Sopenharmony_ci{
43474514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
43484514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
43494514f5e3Sopenharmony_ci    return EcmaContext::CreateAndInitialize(thread);
43504514f5e3Sopenharmony_ci}
43514514f5e3Sopenharmony_ci
43524514f5e3Sopenharmony_civoid JSNApi::SwitchCurrentContext(EcmaVM *vm, EcmaContext *context)
43534514f5e3Sopenharmony_ci{
43544514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
43554514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
43564514f5e3Sopenharmony_ci    thread->SwitchCurrentContext(context);
43574514f5e3Sopenharmony_ci}
43584514f5e3Sopenharmony_ci
43594514f5e3Sopenharmony_civoid JSNApi::DestroyJSContext(EcmaVM *vm, EcmaContext *context)
43604514f5e3Sopenharmony_ci{
43614514f5e3Sopenharmony_ci    JSThread *thread = vm->GetJSThread();
43624514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
43634514f5e3Sopenharmony_ci    EcmaContext::CheckAndDestroy(thread, context);
43644514f5e3Sopenharmony_ci}
43654514f5e3Sopenharmony_ci
43664514f5e3Sopenharmony_ciEcmaVM *JSNApi::CreateEcmaVM(const JSRuntimeOptions &options)
43674514f5e3Sopenharmony_ci{
43684514f5e3Sopenharmony_ci    return EcmaVM::Create(options);
43694514f5e3Sopenharmony_ci}
43704514f5e3Sopenharmony_ci
43714514f5e3Sopenharmony_civoid JSNApi::DestroyJSVM(EcmaVM *ecmaVm)
43724514f5e3Sopenharmony_ci{
43734514f5e3Sopenharmony_ci    if (UNLIKELY(ecmaVm == nullptr)) {
43744514f5e3Sopenharmony_ci        return;
43754514f5e3Sopenharmony_ci    }
43764514f5e3Sopenharmony_ci    ecmaVm->GetJSThread()->ManagedCodeBegin();
43774514f5e3Sopenharmony_ci    EcmaVM::Destroy(ecmaVm);
43784514f5e3Sopenharmony_ci}
43794514f5e3Sopenharmony_ci
43804514f5e3Sopenharmony_civoid JSNApi::RegisterUncatchableErrorHandler(EcmaVM *ecmaVm, const UncatchableErrorHandler &handler)
43814514f5e3Sopenharmony_ci{
43824514f5e3Sopenharmony_ci    ecmaVm->RegisterUncatchableErrorHandler(handler);
43834514f5e3Sopenharmony_ci}
43844514f5e3Sopenharmony_ci
43854514f5e3Sopenharmony_civoid JSNApi::TriggerGC(const EcmaVM *vm, TRIGGER_GC_TYPE gcType)
43864514f5e3Sopenharmony_ci{
43874514f5e3Sopenharmony_ci    TriggerGC(vm, ecmascript::GCReason::EXTERNAL_TRIGGER, gcType);
43884514f5e3Sopenharmony_ci}
43894514f5e3Sopenharmony_ci
43904514f5e3Sopenharmony_civoid JSNApi::TriggerGC(const EcmaVM *vm, ecmascript::GCReason reason, TRIGGER_GC_TYPE gcType)
43914514f5e3Sopenharmony_ci{
43924514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
43934514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
43944514f5e3Sopenharmony_ci    if (thread != nullptr && vm->IsInitialized()) {
43954514f5e3Sopenharmony_ci#if defined(ENABLE_EXCEPTION_BACKTRACE)
43964514f5e3Sopenharmony_ci    if (thread->IsMainThreadFast()) {
43974514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "JSNApi::TriggerGC gcType: " << static_cast<int>(gcType);
43984514f5e3Sopenharmony_ci        std::ostringstream stack;
43994514f5e3Sopenharmony_ci        ecmascript::Backtrace(stack, true);
44004514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << stack.str();
44014514f5e3Sopenharmony_ci    }
44024514f5e3Sopenharmony_ci#endif
44034514f5e3Sopenharmony_ci        auto sHeap = ecmascript::SharedHeap::GetInstance();
44044514f5e3Sopenharmony_ci        switch (gcType) {
44054514f5e3Sopenharmony_ci            case TRIGGER_GC_TYPE::SEMI_GC:
44064514f5e3Sopenharmony_ci                vm->CollectGarbage(vm->GetHeap()->SelectGCType(), reason);
44074514f5e3Sopenharmony_ci                break;
44084514f5e3Sopenharmony_ci            case TRIGGER_GC_TYPE::OLD_GC:
44094514f5e3Sopenharmony_ci                vm->CollectGarbage(ecmascript::TriggerGCType::OLD_GC, reason);
44104514f5e3Sopenharmony_ci                break;
44114514f5e3Sopenharmony_ci            case TRIGGER_GC_TYPE::FULL_GC:
44124514f5e3Sopenharmony_ci                vm->CollectGarbage(ecmascript::TriggerGCType::FULL_GC, reason);
44134514f5e3Sopenharmony_ci                break;
44144514f5e3Sopenharmony_ci            case TRIGGER_GC_TYPE::SHARED_GC:
44154514f5e3Sopenharmony_ci                sHeap->CollectGarbage<ecmascript::TriggerGCType::SHARED_GC,
44164514f5e3Sopenharmony_ci                    ecmascript::GCReason::EXTERNAL_TRIGGER>(thread);
44174514f5e3Sopenharmony_ci                break;
44184514f5e3Sopenharmony_ci            case TRIGGER_GC_TYPE::SHARED_FULL_GC:
44194514f5e3Sopenharmony_ci                sHeap->CollectGarbage<ecmascript::TriggerGCType::SHARED_FULL_GC,
44204514f5e3Sopenharmony_ci                    ecmascript::GCReason::EXTERNAL_TRIGGER>(thread);
44214514f5e3Sopenharmony_ci                break;
44224514f5e3Sopenharmony_ci            default:
44234514f5e3Sopenharmony_ci                break;
44244514f5e3Sopenharmony_ci        }
44254514f5e3Sopenharmony_ci    }
44264514f5e3Sopenharmony_ci}
44274514f5e3Sopenharmony_ci
44284514f5e3Sopenharmony_civoid JSNApi::HintGC(const EcmaVM *vm, MemoryReduceDegree degree, ecmascript::GCReason reason)
44294514f5e3Sopenharmony_ci{
44304514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
44314514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
44324514f5e3Sopenharmony_ci    if (thread != nullptr && vm->IsInitialized()) {
44334514f5e3Sopenharmony_ci        const_cast<ecmascript::Heap *>(vm->GetHeap())->CheckAndTriggerHintGC(degree, reason);
44344514f5e3Sopenharmony_ci    }
44354514f5e3Sopenharmony_ci}
44364514f5e3Sopenharmony_ci
44374514f5e3Sopenharmony_civoid JSNApi::TriggerIdleGC(const EcmaVM *vm, TRIGGER_IDLE_GC_TYPE gcType)
44384514f5e3Sopenharmony_ci{
44394514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
44404514f5e3Sopenharmony_ci    if (thread != nullptr && vm->IsInitialized()) {
44414514f5e3Sopenharmony_ci        ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
44424514f5e3Sopenharmony_ci        vm->GetHeap()->GetIdleGCTrigger()->TryTriggerIdleGC(gcType);
44434514f5e3Sopenharmony_ci    }
44444514f5e3Sopenharmony_ci}
44454514f5e3Sopenharmony_ci
44464514f5e3Sopenharmony_civoid JSNApi::SetStartIdleMonitorCallback(const StartIdleMonitorCallback& callback)
44474514f5e3Sopenharmony_ci{
44484514f5e3Sopenharmony_ci    startIdleMonitorCallback_ = callback;
44494514f5e3Sopenharmony_ci}
44504514f5e3Sopenharmony_ci
44514514f5e3Sopenharmony_ciStartIdleMonitorCallback JSNApi::GetStartIdleMonitorCallback()
44524514f5e3Sopenharmony_ci{
44534514f5e3Sopenharmony_ci    return startIdleMonitorCallback_;
44544514f5e3Sopenharmony_ci}
44554514f5e3Sopenharmony_ci
44564514f5e3Sopenharmony_civoid JSNApi::ThrowException(const EcmaVM *vm, Local<JSValueRef> error)
44574514f5e3Sopenharmony_ci{
44584514f5e3Sopenharmony_ci    auto thread = vm->GetJSThread();
44594514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
44604514f5e3Sopenharmony_ci    if (thread->HasPendingException()) {
44614514f5e3Sopenharmony_ci        LOG_ECMA(DEBUG) << "An exception has already occurred before, keep old exception here.";
44624514f5e3Sopenharmony_ci        return;
44634514f5e3Sopenharmony_ci    }
44644514f5e3Sopenharmony_ci    thread->SetException(JSNApiHelper::ToJSTaggedValue(*error));
44654514f5e3Sopenharmony_ci}
44664514f5e3Sopenharmony_ci
44674514f5e3Sopenharmony_civoid JSNApi::PrintExceptionInfo(const EcmaVM *vm)
44684514f5e3Sopenharmony_ci{
44694514f5e3Sopenharmony_ci    JSThread* thread = vm->GetJSThread();
44704514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
44714514f5e3Sopenharmony_ci    [[maybe_unused]] ecmascript::EcmaHandleScope handleScope(thread);
44724514f5e3Sopenharmony_ci
44734514f5e3Sopenharmony_ci    if (!HasPendingException(vm)) {
44744514f5e3Sopenharmony_ci        return;
44754514f5e3Sopenharmony_ci    }
44764514f5e3Sopenharmony_ci    Local<ObjectRef> exception = GetAndClearUncaughtException(vm);
44774514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exceptionHandle = JSNApiHelper::ToJSHandle(exception);
44784514f5e3Sopenharmony_ci    if (exceptionHandle->IsJSError()) {
44794514f5e3Sopenharmony_ci        vm->PrintJSErrorInfo(exceptionHandle);
44804514f5e3Sopenharmony_ci        ThrowException(vm, exception);
44814514f5e3Sopenharmony_ci        return;
44824514f5e3Sopenharmony_ci    }
44834514f5e3Sopenharmony_ci    JSHandle<EcmaString> result = JSTaggedValue::ToString(thread, exceptionHandle);
44844514f5e3Sopenharmony_ci    ecmascript::CString string = ConvertToString(*result);
44854514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << string;
44864514f5e3Sopenharmony_ci    ThrowException(vm, exception);
44874514f5e3Sopenharmony_ci}
44884514f5e3Sopenharmony_ci
44894514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER) && !defined(PANDA_TARGET_IOS)
44904514f5e3Sopenharmony_cibool JSNApi::StartDebuggerCheckParameters(EcmaVM *vm, const DebugOption &option, int32_t instanceId,
44914514f5e3Sopenharmony_ci                                          const DebuggerPostTask &debuggerPostTask)
44924514f5e3Sopenharmony_ci{
44934514f5e3Sopenharmony_ci    if (vm == nullptr) {
44944514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] vm is nullptr";
44954514f5e3Sopenharmony_ci        return false;
44964514f5e3Sopenharmony_ci    }
44974514f5e3Sopenharmony_ci
44984514f5e3Sopenharmony_ci    if (option.port < 0) {
44994514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] option.port is -1" ;
45004514f5e3Sopenharmony_ci        return false;
45014514f5e3Sopenharmony_ci    }
45024514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
45034514f5e3Sopenharmony_ci    const auto &handler = vm->GetJsDebuggerManager()->GetDebugLibraryHandle();
45044514f5e3Sopenharmony_ci    if (handler.IsValid()) {
45054514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] handler has already loaded";
45064514f5e3Sopenharmony_ci        return false;
45074514f5e3Sopenharmony_ci    }
45084514f5e3Sopenharmony_ci    if (option.libraryPath == nullptr) {
45094514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] option.libraryPath is nullptr";
45104514f5e3Sopenharmony_ci        return false;
45114514f5e3Sopenharmony_ci    }
45124514f5e3Sopenharmony_ci    auto handle = panda::os::library_loader::Load(std::string(option.libraryPath));
45134514f5e3Sopenharmony_ci    if (!handle) {
45144514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] Load library fail: " << option.libraryPath << " " << errno;
45154514f5e3Sopenharmony_ci        return false;
45164514f5e3Sopenharmony_ci    }
45174514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handle.Value(), "StartDebug");
45184514f5e3Sopenharmony_ci    if (!sym) {
45194514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebugger] Resolve symbol fail: " << sym.Error().ToString();
45204514f5e3Sopenharmony_ci        return false;
45214514f5e3Sopenharmony_ci    }
45224514f5e3Sopenharmony_ci    using StartDebugger = bool (*)(
45234514f5e3Sopenharmony_ci        const std::string &, EcmaVM *, bool, int32_t, const DebuggerPostTask &, int);
45244514f5e3Sopenharmony_ci
45254514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugMode(option.isDebugMode);
45264514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetIsDebugApp(true);
45274514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugLibraryHandle(std::move(handle.Value()));
45284514f5e3Sopenharmony_ci    bool ret = reinterpret_cast<StartDebugger>(sym.Value())(
45294514f5e3Sopenharmony_ci        "PandaDebugger", vm, option.isDebugMode, instanceId, debuggerPostTask, option.port);
45304514f5e3Sopenharmony_ci    if (!ret) {
45314514f5e3Sopenharmony_ci        // Reset the config
45324514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugMode(false);
45334514f5e3Sopenharmony_ci        panda::os::library_loader::LibraryHandle libraryHandle(nullptr);
45344514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugLibraryHandle(std::move(libraryHandle));
45354514f5e3Sopenharmony_ci    }
45364514f5e3Sopenharmony_ci    return ret;
45374514f5e3Sopenharmony_ci}
45384514f5e3Sopenharmony_ci#endif
45394514f5e3Sopenharmony_ci
45404514f5e3Sopenharmony_ci// for previewer, cross platform and testcase debugger
45414514f5e3Sopenharmony_cibool JSNApi::StartDebugger([[maybe_unused]] EcmaVM *vm, [[maybe_unused]] const DebugOption &option,
45424514f5e3Sopenharmony_ci                           [[maybe_unused]] int32_t instanceId,
45434514f5e3Sopenharmony_ci                           [[maybe_unused]] const DebuggerPostTask &debuggerPostTask)
45444514f5e3Sopenharmony_ci{
45454514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
45464514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_IOS)
45474514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "JSNApi::StartDebugger, isDebugMode = " << option.isDebugMode
45484514f5e3Sopenharmony_ci        << ", port = " << option.port << ", instanceId = " << instanceId;
45494514f5e3Sopenharmony_ci    return StartDebuggerCheckParameters(vm, option, instanceId, debuggerPostTask);
45504514f5e3Sopenharmony_ci#else
45514514f5e3Sopenharmony_ci    if (vm == nullptr) {
45524514f5e3Sopenharmony_ci        return false;
45534514f5e3Sopenharmony_ci    }
45544514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
45554514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugMode(option.isDebugMode);
45564514f5e3Sopenharmony_ci    bool ret = OHOS::ArkCompiler::Toolchain::StartDebug(
45574514f5e3Sopenharmony_ci        DEBUGGER_NAME, vm, option.isDebugMode, instanceId, debuggerPostTask, option.port);
45584514f5e3Sopenharmony_ci    if (!ret) {
45594514f5e3Sopenharmony_ci        // Reset the config
45604514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugMode(false);
45614514f5e3Sopenharmony_ci    }
45624514f5e3Sopenharmony_ci    return ret;
45634514f5e3Sopenharmony_ci#endif // PANDA_TARGET_IOS
45644514f5e3Sopenharmony_ci#else
45654514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
45664514f5e3Sopenharmony_ci    return false;
45674514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
45684514f5e3Sopenharmony_ci}
45694514f5e3Sopenharmony_ci
45704514f5e3Sopenharmony_ci// rk
45714514f5e3Sopenharmony_ci// FA or Stage
45724514f5e3Sopenharmony_cibool JSNApi::StartDebuggerForOldProcess([[maybe_unused]] EcmaVM *vm, [[maybe_unused]] const DebugOption &option,
45734514f5e3Sopenharmony_ci                                        [[maybe_unused]] int32_t instanceId,
45744514f5e3Sopenharmony_ci                                        [[maybe_unused]] const DebuggerPostTask &debuggerPostTask)
45754514f5e3Sopenharmony_ci{
45764514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
45774514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_IOS)
45784514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "JSNApi::StartDebuggerForOldProcess, isDebugMode = " << option.isDebugMode
45794514f5e3Sopenharmony_ci        << ", instanceId = " << instanceId;
45804514f5e3Sopenharmony_ci    if (vm == nullptr) {
45814514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForOldProcess] vm is nullptr";
45824514f5e3Sopenharmony_ci        return false;
45834514f5e3Sopenharmony_ci    }
45844514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
45854514f5e3Sopenharmony_ci    const auto &handle = vm->GetJsDebuggerManager()->GetDebugLibraryHandle();
45864514f5e3Sopenharmony_ci    if (!handle.IsValid()) {
45874514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForOldProcess] Get library handle fail: " << option.libraryPath;
45884514f5e3Sopenharmony_ci        return false;
45894514f5e3Sopenharmony_ci    }
45904514f5e3Sopenharmony_ci
45914514f5e3Sopenharmony_ci    using StartDebug = bool (*)(
45924514f5e3Sopenharmony_ci        const std::string &, EcmaVM *, bool, int32_t, const DebuggerPostTask &, int);
45934514f5e3Sopenharmony_ci
45944514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handle, "StartDebug");
45954514f5e3Sopenharmony_ci    if (!sym) {
45964514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForOldProcess] Resolve symbol fail: " << sym.Error().ToString();
45974514f5e3Sopenharmony_ci        return false;
45984514f5e3Sopenharmony_ci    }
45994514f5e3Sopenharmony_ci
46004514f5e3Sopenharmony_ci    bool ret = reinterpret_cast<StartDebug>(sym.Value())(
46014514f5e3Sopenharmony_ci        "PandaDebugger", vm, option.isDebugMode, instanceId, debuggerPostTask, option.port);
46024514f5e3Sopenharmony_ci    if (!ret) {
46034514f5e3Sopenharmony_ci        // Reset the config
46044514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugMode(false);
46054514f5e3Sopenharmony_ci        panda::os::library_loader::LibraryHandle libraryHandle(nullptr);
46064514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugLibraryHandle(std::move(libraryHandle));
46074514f5e3Sopenharmony_ci    }
46084514f5e3Sopenharmony_ci    return ret;
46094514f5e3Sopenharmony_ci#else
46104514f5e3Sopenharmony_ci    if (vm == nullptr) {
46114514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForOldProcess] vm is nullptr";
46124514f5e3Sopenharmony_ci        return false;
46134514f5e3Sopenharmony_ci    }
46144514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
46154514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugMode(option.isDebugMode);
46164514f5e3Sopenharmony_ci    bool ret = OHOS::ArkCompiler::Toolchain::StartDebug(
46174514f5e3Sopenharmony_ci        DEBUGGER_NAME, vm, option.isDebugMode, instanceId, debuggerPostTask, option.port);
46184514f5e3Sopenharmony_ci    if (!ret) {
46194514f5e3Sopenharmony_ci        // Reset the config
46204514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugMode(false);
46214514f5e3Sopenharmony_ci    }
46224514f5e3Sopenharmony_ci    return ret;
46234514f5e3Sopenharmony_ci#endif // PANDA_TARGET_IOS
46244514f5e3Sopenharmony_ci#else
46254514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
46264514f5e3Sopenharmony_ci    return false;
46274514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
46284514f5e3Sopenharmony_ci}
46294514f5e3Sopenharmony_ci
46304514f5e3Sopenharmony_ci// ohos or emulator
46314514f5e3Sopenharmony_ci// FA or Stage
46324514f5e3Sopenharmony_cibool JSNApi::StartDebuggerForSocketPair([[maybe_unused]] int tid, [[maybe_unused]] int socketfd)
46334514f5e3Sopenharmony_ci{
46344514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
46354514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "JSNApi::StartDebuggerForSocketPair, tid = " << tid << ", socketfd = " << socketfd;
46364514f5e3Sopenharmony_ci    JsDebuggerManager *jsDebuggerManager = JsDebuggerManager::GetJsDebuggerManager(tid);
46374514f5e3Sopenharmony_ci    if (jsDebuggerManager == nullptr) {
46384514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForSocketPair] jsDebuggerManager is nullptr";
46394514f5e3Sopenharmony_ci        return false;
46404514f5e3Sopenharmony_ci    }
46414514f5e3Sopenharmony_ci    const auto &handle = jsDebuggerManager->GetDebugLibraryHandle();
46424514f5e3Sopenharmony_ci    if (!handle.IsValid()) {
46434514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForSocketPair] Get library handle fail";
46444514f5e3Sopenharmony_ci        return false;
46454514f5e3Sopenharmony_ci    }
46464514f5e3Sopenharmony_ci
46474514f5e3Sopenharmony_ci    using StartDebugForSocketpair = bool (*)(int, int);
46484514f5e3Sopenharmony_ci
46494514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handle, "StartDebugForSocketpair");
46504514f5e3Sopenharmony_ci    if (!sym) {
46514514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StartDebuggerForSocketPair] Resolve symbol fail: " << sym.Error().ToString();
46524514f5e3Sopenharmony_ci        return false;
46534514f5e3Sopenharmony_ci    }
46544514f5e3Sopenharmony_ci
46554514f5e3Sopenharmony_ci    bool ret = reinterpret_cast<StartDebugForSocketpair>(sym.Value())(tid, socketfd);
46564514f5e3Sopenharmony_ci    if (!ret) {
46574514f5e3Sopenharmony_ci        // Reset the config
46584514f5e3Sopenharmony_ci        jsDebuggerManager->SetDebugMode(false);
46594514f5e3Sopenharmony_ci        panda::os::library_loader::LibraryHandle libraryHandle(nullptr);
46604514f5e3Sopenharmony_ci        jsDebuggerManager->SetDebugLibraryHandle(std::move(libraryHandle));
46614514f5e3Sopenharmony_ci    }
46624514f5e3Sopenharmony_ci    return ret;
46634514f5e3Sopenharmony_ci#else
46644514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
46654514f5e3Sopenharmony_ci    return false;
46664514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
46674514f5e3Sopenharmony_ci}
46684514f5e3Sopenharmony_ci
46694514f5e3Sopenharmony_ci// ohos or emulator
46704514f5e3Sopenharmony_ci// FA or Stage
46714514f5e3Sopenharmony_ci// release or debug hap : aa start
46724514f5e3Sopenharmony_ci//                        aa start -D
46734514f5e3Sopenharmony_ci//                        aa start -p
46744514f5e3Sopenharmony_ci//                        new worker
46754514f5e3Sopenharmony_cibool JSNApi::NotifyDebugMode([[maybe_unused]] int tid,
46764514f5e3Sopenharmony_ci                             [[maybe_unused]] EcmaVM *vm,
46774514f5e3Sopenharmony_ci                             [[maybe_unused]] const DebugOption &option,
46784514f5e3Sopenharmony_ci                             [[maybe_unused]] int32_t instanceId,
46794514f5e3Sopenharmony_ci                             [[maybe_unused]] const DebuggerPostTask &debuggerPostTask,
46804514f5e3Sopenharmony_ci                             [[maybe_unused]] bool debugApp)
46814514f5e3Sopenharmony_ci{
46824514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
46834514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "JSNApi::NotifyDebugMode, tid = " << tid << ", debugApp = " << debugApp
46844514f5e3Sopenharmony_ci        << ", isDebugMode = " << option.isDebugMode << ", instanceId = " << instanceId;
46854514f5e3Sopenharmony_ci    if (vm == nullptr) {
46864514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] vm is nullptr";
46874514f5e3Sopenharmony_ci        return false;
46884514f5e3Sopenharmony_ci    }
46894514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
46904514f5e3Sopenharmony_ci
46914514f5e3Sopenharmony_ci    bool ret = false;
46924514f5e3Sopenharmony_ci    if (!debugApp) {
46934514f5e3Sopenharmony_ci        return true;
46944514f5e3Sopenharmony_ci    }
46954514f5e3Sopenharmony_ci
46964514f5e3Sopenharmony_ci    if (option.libraryPath == nullptr) {
46974514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] option.libraryPath is nullptr";
46984514f5e3Sopenharmony_ci        return false;
46994514f5e3Sopenharmony_ci    }
47004514f5e3Sopenharmony_ci    JsDebuggerManager *jsDebuggerManager = vm->GetJsDebuggerManager();
47014514f5e3Sopenharmony_ci    auto handle = panda::os::library_loader::Load(std::string(option.libraryPath));
47024514f5e3Sopenharmony_ci    if (!handle) {
47034514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] Load library fail: " << option.libraryPath << " " << errno;
47044514f5e3Sopenharmony_ci        return false;
47054514f5e3Sopenharmony_ci    }
47064514f5e3Sopenharmony_ci    JsDebuggerManager::AddJsDebuggerManager(tid, jsDebuggerManager);
47074514f5e3Sopenharmony_ci    jsDebuggerManager->SetDebugLibraryHandle(std::move(handle.Value()));
47084514f5e3Sopenharmony_ci    jsDebuggerManager->SetDebugMode(option.isDebugMode && debugApp);
47094514f5e3Sopenharmony_ci    jsDebuggerManager->SetIsDebugApp(debugApp);
47104514f5e3Sopenharmony_ci#ifdef PANDA_TARGET_ARM32
47114514f5e3Sopenharmony_ci    ret = StartDebuggerForOldProcess(vm, option, instanceId, debuggerPostTask);
47124514f5e3Sopenharmony_ci#else
47134514f5e3Sopenharmony_ci    ret = true;
47144514f5e3Sopenharmony_ci#endif
47154514f5e3Sopenharmony_ci
47164514f5e3Sopenharmony_ci    // store debugger postTask in inspector.
47174514f5e3Sopenharmony_ci    using StoreDebuggerInfo = void (*)(int, EcmaVM *, const DebuggerPostTask &);
47184514f5e3Sopenharmony_ci    auto symOfStoreDebuggerInfo = panda::os::library_loader::ResolveSymbol(
47194514f5e3Sopenharmony_ci        jsDebuggerManager->GetDebugLibraryHandle(), "StoreDebuggerInfo");
47204514f5e3Sopenharmony_ci    if (!symOfStoreDebuggerInfo) {
47214514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] Resolve StoreDebuggerInfo symbol fail: " <<
47224514f5e3Sopenharmony_ci            symOfStoreDebuggerInfo.Error().ToString();
47234514f5e3Sopenharmony_ci        return false;
47244514f5e3Sopenharmony_ci    }
47254514f5e3Sopenharmony_ci    reinterpret_cast<StoreDebuggerInfo>(symOfStoreDebuggerInfo.Value())(tid, vm, debuggerPostTask);
47264514f5e3Sopenharmony_ci
47274514f5e3Sopenharmony_ci#ifndef PANDA_TARGET_ARM32
47284514f5e3Sopenharmony_ci    // Initialize debugger
47294514f5e3Sopenharmony_ci    using InitializeDebuggerForSocketpair = bool(*)(void*);
47304514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(
47314514f5e3Sopenharmony_ci        jsDebuggerManager->GetDebugLibraryHandle(), "InitializeDebuggerForSocketpair");
47324514f5e3Sopenharmony_ci    if (!sym) {
47334514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] Resolve InitializeDebuggerForSocketpair symbol fail: "
47344514f5e3Sopenharmony_ci            << sym.Error().ToString();
47354514f5e3Sopenharmony_ci        return false;
47364514f5e3Sopenharmony_ci    }
47374514f5e3Sopenharmony_ci    if (!reinterpret_cast<InitializeDebuggerForSocketpair>(sym.Value())(vm)) {
47384514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[NotifyDebugMode] InitializeDebuggerForSocketpair fail";
47394514f5e3Sopenharmony_ci        return false;
47404514f5e3Sopenharmony_ci    }
47414514f5e3Sopenharmony_ci#endif
47424514f5e3Sopenharmony_ci
47434514f5e3Sopenharmony_ci    if (option.isDebugMode) {
47444514f5e3Sopenharmony_ci        using WaitForDebugger = void (*)(EcmaVM *);
47454514f5e3Sopenharmony_ci        auto symOfWaitForDebugger = panda::os::library_loader::ResolveSymbol(
47464514f5e3Sopenharmony_ci            jsDebuggerManager->GetDebugLibraryHandle(), "WaitForDebugger");
47474514f5e3Sopenharmony_ci        if (!symOfWaitForDebugger) {
47484514f5e3Sopenharmony_ci            LOG_ECMA(ERROR) << "[NotifyDebugMode] Resolve symbol WaitForDebugger fail: " <<
47494514f5e3Sopenharmony_ci                symOfWaitForDebugger.Error().ToString();
47504514f5e3Sopenharmony_ci            return false;
47514514f5e3Sopenharmony_ci        }
47524514f5e3Sopenharmony_ci        reinterpret_cast<WaitForDebugger>(symOfWaitForDebugger.Value())(vm);
47534514f5e3Sopenharmony_ci    }
47544514f5e3Sopenharmony_ci    auto anFileDataMgr = ecmascript::AnFileDataManager::GetInstance();
47554514f5e3Sopenharmony_ci    if (anFileDataMgr != nullptr && anFileDataMgr->SafeGetStubFileInfo()) {
47564514f5e3Sopenharmony_ci        anFileDataMgr->SafeGetStubFileInfo()->RegisterToDebugger();
47574514f5e3Sopenharmony_ci    }
47584514f5e3Sopenharmony_ci    return ret;
47594514f5e3Sopenharmony_ci
47604514f5e3Sopenharmony_ci#else
47614514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
47624514f5e3Sopenharmony_ci    return false;
47634514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
47644514f5e3Sopenharmony_ci}
47654514f5e3Sopenharmony_ci
47664514f5e3Sopenharmony_cibool JSNApi::StoreDebugInfo([[maybe_unused]] int tid,
47674514f5e3Sopenharmony_ci                            [[maybe_unused]] EcmaVM *vm,
47684514f5e3Sopenharmony_ci                            [[maybe_unused]] const DebugOption &option,
47694514f5e3Sopenharmony_ci                            [[maybe_unused]] const DebuggerPostTask &debuggerPostTask,
47704514f5e3Sopenharmony_ci                            [[maybe_unused]] bool debugApp)
47714514f5e3Sopenharmony_ci{
47724514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
47734514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "JSNApi::StoreDebugInfo, tid = " << tid;
47744514f5e3Sopenharmony_ci    if (vm == nullptr) {
47754514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StoreDebugInfo] vm is nullptr";
47764514f5e3Sopenharmony_ci        return false;
47774514f5e3Sopenharmony_ci    }
47784514f5e3Sopenharmony_ci
47794514f5e3Sopenharmony_ci    JsDebuggerManager *jsDebuggerManager = vm->GetJsDebuggerManager();
47804514f5e3Sopenharmony_ci    const auto &handler = jsDebuggerManager->GetDebugLibraryHandle();
47814514f5e3Sopenharmony_ci    if (handler.IsValid()) {
47824514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "[StoreDebugInfo] handler has already loaded";
47834514f5e3Sopenharmony_ci        return false;
47844514f5e3Sopenharmony_ci    }
47854514f5e3Sopenharmony_ci
47864514f5e3Sopenharmony_ci    if (option.libraryPath == nullptr) {
47874514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StoreDebugInfo] option.libraryPath is nullptr";
47884514f5e3Sopenharmony_ci        return false;
47894514f5e3Sopenharmony_ci    }
47904514f5e3Sopenharmony_ci    auto handle = panda::os::library_loader::Load(std::string(option.libraryPath));
47914514f5e3Sopenharmony_ci    if (!handle) {
47924514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StoreDebugInfo] Load library fail: " << option.libraryPath << " " << errno;
47934514f5e3Sopenharmony_ci        return false;
47944514f5e3Sopenharmony_ci    }
47954514f5e3Sopenharmony_ci    JsDebuggerManager::AddJsDebuggerManager(tid, jsDebuggerManager);
47964514f5e3Sopenharmony_ci    jsDebuggerManager->SetDebugLibraryHandle(std::move(handle.Value()));
47974514f5e3Sopenharmony_ci    jsDebuggerManager->SetDebugMode(option.isDebugMode && debugApp);
47984514f5e3Sopenharmony_ci    jsDebuggerManager->SetIsDebugApp(debugApp);
47994514f5e3Sopenharmony_ci    // store debugger postTask in inspector.
48004514f5e3Sopenharmony_ci    using StoreDebuggerInfo = void (*)(int, EcmaVM *, const DebuggerPostTask &);
48014514f5e3Sopenharmony_ci    auto symOfStoreDebuggerInfo = panda::os::library_loader::ResolveSymbol(
48024514f5e3Sopenharmony_ci        jsDebuggerManager->GetDebugLibraryHandle(), "StoreDebuggerInfo");
48034514f5e3Sopenharmony_ci    if (!symOfStoreDebuggerInfo) {
48044514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StoreDebugInfo] Resolve StoreDebuggerInfo symbol fail: " <<
48054514f5e3Sopenharmony_ci            symOfStoreDebuggerInfo.Error().ToString();
48064514f5e3Sopenharmony_ci        return false;
48074514f5e3Sopenharmony_ci    }
48084514f5e3Sopenharmony_ci    reinterpret_cast<StoreDebuggerInfo>(symOfStoreDebuggerInfo.Value())(tid, vm, debuggerPostTask);
48094514f5e3Sopenharmony_ci    bool ret = false;
48104514f5e3Sopenharmony_ci    using InitializeDebuggerForSocketpair = bool(*)(void*);
48114514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handler, "InitializeDebuggerForSocketpair");
48124514f5e3Sopenharmony_ci    if (!sym) {
48134514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[InitializeDebuggerForSocketpair] Resolve symbol fail: " << sym.Error().ToString();
48144514f5e3Sopenharmony_ci        return false;
48154514f5e3Sopenharmony_ci    }
48164514f5e3Sopenharmony_ci    ret = reinterpret_cast<InitializeDebuggerForSocketpair>(sym.Value())(vm);
48174514f5e3Sopenharmony_ci    if (!ret) {
48184514f5e3Sopenharmony_ci    // Reset the config
48194514f5e3Sopenharmony_ci        vm->GetJsDebuggerManager()->SetDebugMode(false);
48204514f5e3Sopenharmony_ci        return false;
48214514f5e3Sopenharmony_ci    }
48224514f5e3Sopenharmony_ci    return ret;
48234514f5e3Sopenharmony_ci#else
48244514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
48254514f5e3Sopenharmony_ci    return false;
48264514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
48274514f5e3Sopenharmony_ci}
48284514f5e3Sopenharmony_ci
48294514f5e3Sopenharmony_cibool JSNApi::StopDebugger([[maybe_unused]] EcmaVM *vm)
48304514f5e3Sopenharmony_ci{
48314514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
48324514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_IOS)
48334514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSNApi::StopDebugger";
48344514f5e3Sopenharmony_ci    if (vm == nullptr) {
48354514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StopDebugger] vm is nullptr";
48364514f5e3Sopenharmony_ci        return false;
48374514f5e3Sopenharmony_ci    }
48384514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
48394514f5e3Sopenharmony_ci
48404514f5e3Sopenharmony_ci    const auto &handle = vm->GetJsDebuggerManager()->GetDebugLibraryHandle();
48414514f5e3Sopenharmony_ci
48424514f5e3Sopenharmony_ci    using StopDebug = void (*)(void *);
48434514f5e3Sopenharmony_ci
48444514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handle, "StopDebug");
48454514f5e3Sopenharmony_ci    if (!sym) {
48464514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << sym.Error().ToString();
48474514f5e3Sopenharmony_ci        return false;
48484514f5e3Sopenharmony_ci    }
48494514f5e3Sopenharmony_ci
48504514f5e3Sopenharmony_ci    reinterpret_cast<StopDebug>(sym.Value())(vm);
48514514f5e3Sopenharmony_ci
48524514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugMode(false);
48534514f5e3Sopenharmony_ci    uint32_t tid = vm->GetTid();
48544514f5e3Sopenharmony_ci    JsDebuggerManager::DeleteJsDebuggerManager(tid);
48554514f5e3Sopenharmony_ci    return true;
48564514f5e3Sopenharmony_ci#else
48574514f5e3Sopenharmony_ci    if (vm == nullptr) {
48584514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StopDebugger] vm is nullptr";
48594514f5e3Sopenharmony_ci        return false;
48604514f5e3Sopenharmony_ci    }
48614514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
48624514f5e3Sopenharmony_ci
48634514f5e3Sopenharmony_ci    OHOS::ArkCompiler::Toolchain::StopDebug(vm);
48644514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->SetDebugMode(false);
48654514f5e3Sopenharmony_ci    return true;
48664514f5e3Sopenharmony_ci#endif // PANDA_TARGET_IOS
48674514f5e3Sopenharmony_ci#else
48684514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
48694514f5e3Sopenharmony_ci    return false;
48704514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
48714514f5e3Sopenharmony_ci}
48724514f5e3Sopenharmony_ci
48734514f5e3Sopenharmony_cibool JSNApi::StopDebugger([[maybe_unused]] int tid)
48744514f5e3Sopenharmony_ci{
48754514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
48764514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSNApi::StopDebugger, tid = " << tid;
48774514f5e3Sopenharmony_ci    JsDebuggerManager *jsDebuggerManager = JsDebuggerManager::GetJsDebuggerManager(tid);
48784514f5e3Sopenharmony_ci    if (jsDebuggerManager == nullptr) {
48794514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "[StopDebugger] jsDebuggerManager is nullptr";
48804514f5e3Sopenharmony_ci        return false;
48814514f5e3Sopenharmony_ci    }
48824514f5e3Sopenharmony_ci
48834514f5e3Sopenharmony_ci    const auto &handle = jsDebuggerManager->GetDebugLibraryHandle();
48844514f5e3Sopenharmony_ci
48854514f5e3Sopenharmony_ci    using StopOldDebug = void (*)(int, const std::string &);
48864514f5e3Sopenharmony_ci
48874514f5e3Sopenharmony_ci    auto sym = panda::os::library_loader::ResolveSymbol(handle, "StopOldDebug");
48884514f5e3Sopenharmony_ci    if (!sym) {
48894514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << sym.Error().ToString();
48904514f5e3Sopenharmony_ci        return false;
48914514f5e3Sopenharmony_ci    }
48924514f5e3Sopenharmony_ci
48934514f5e3Sopenharmony_ci    reinterpret_cast<StopOldDebug>(sym.Value())(tid, "PandaDebugger");
48944514f5e3Sopenharmony_ci
48954514f5e3Sopenharmony_ci    return true;
48964514f5e3Sopenharmony_ci#else
48974514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
48984514f5e3Sopenharmony_ci    return false;
48994514f5e3Sopenharmony_ci#endif // ECMASCRIPT_SUPPORT_DEBUGGER
49004514f5e3Sopenharmony_ci}
49014514f5e3Sopenharmony_ci
49024514f5e3Sopenharmony_cibool JSNApi::IsMixedDebugEnabled([[maybe_unused]] const EcmaVM *vm)
49034514f5e3Sopenharmony_ci{
49044514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
49054514f5e3Sopenharmony_ci    return vm->GetJsDebuggerManager()->IsMixedDebugEnabled();
49064514f5e3Sopenharmony_ci#else
49074514f5e3Sopenharmony_ci    return false;
49084514f5e3Sopenharmony_ci#endif
49094514f5e3Sopenharmony_ci}
49104514f5e3Sopenharmony_ci
49114514f5e3Sopenharmony_cibool JSNApi::IsDebugModeEnabled([[maybe_unused]] const EcmaVM *vm)
49124514f5e3Sopenharmony_ci{
49134514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
49144514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
49154514f5e3Sopenharmony_ci    if (vm != nullptr && vm->GetJsDebuggerManager() != nullptr) {
49164514f5e3Sopenharmony_ci        return vm->GetJsDebuggerManager()->IsDebugMode();
49174514f5e3Sopenharmony_ci    }
49184514f5e3Sopenharmony_ci    return false;
49194514f5e3Sopenharmony_ci#else
49204514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
49214514f5e3Sopenharmony_ci    return false;
49224514f5e3Sopenharmony_ci#endif
49234514f5e3Sopenharmony_ci}
49244514f5e3Sopenharmony_ci
49254514f5e3Sopenharmony_civoid JSNApi::NotifyNativeCalling([[maybe_unused]] const EcmaVM *vm, [[maybe_unused]] const void *nativeAddress)
49264514f5e3Sopenharmony_ci{
49274514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
49284514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
49294514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->GetNotificationManager()->NativeCallingEvent(nativeAddress);
49304514f5e3Sopenharmony_ci#else
49314514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
49324514f5e3Sopenharmony_ci#endif
49334514f5e3Sopenharmony_ci}
49344514f5e3Sopenharmony_ci
49354514f5e3Sopenharmony_civoid JSNApi::NotifyNativeReturn([[maybe_unused]] const EcmaVM *vm,  [[maybe_unused]] const void *nativeAddress)
49364514f5e3Sopenharmony_ci{
49374514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
49384514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
49394514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->GetNotificationManager()->NativeReturnEvent(nativeAddress);
49404514f5e3Sopenharmony_ci#else
49414514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
49424514f5e3Sopenharmony_ci#endif
49434514f5e3Sopenharmony_ci}
49444514f5e3Sopenharmony_ci
49454514f5e3Sopenharmony_civoid JSNApi::NotifyLoadModule([[maybe_unused]] const EcmaVM *vm)
49464514f5e3Sopenharmony_ci{
49474514f5e3Sopenharmony_ci#if defined(ECMASCRIPT_SUPPORT_DEBUGGER)
49484514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
49494514f5e3Sopenharmony_ci    // if load module, it needs to check whether clear singlestepper_
49504514f5e3Sopenharmony_ci    vm->GetJsDebuggerManager()->ClearSingleStepper();
49514514f5e3Sopenharmony_ci#else
49524514f5e3Sopenharmony_ci    LOG_ECMA(ERROR) << "Not support arkcompiler debugger";
49534514f5e3Sopenharmony_ci#endif
49544514f5e3Sopenharmony_ci}
49554514f5e3Sopenharmony_ci
49564514f5e3Sopenharmony_civoid JSNApi::NotifyUIIdle(const EcmaVM *vm, [[maybe_unused]] int idleTime)
49574514f5e3Sopenharmony_ci{
49584514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
49594514f5e3Sopenharmony_ci    vm->GetHeap()->GetIdleGCTrigger()->NotifyVsyncIdleStart();
49604514f5e3Sopenharmony_ci}
49614514f5e3Sopenharmony_ci
49624514f5e3Sopenharmony_civoid JSNApi::NotifyLooperIdleStart(const EcmaVM *vm, int64_t timestamp, int idleTime)
49634514f5e3Sopenharmony_ci{
49644514f5e3Sopenharmony_ci    if (vm->IsPostForked()) {
49654514f5e3Sopenharmony_ci        vm->GetHeap()->GetIdleGCTrigger()->NotifyLooperIdleStart(timestamp, idleTime);
49664514f5e3Sopenharmony_ci    }
49674514f5e3Sopenharmony_ci}
49684514f5e3Sopenharmony_ci
49694514f5e3Sopenharmony_civoid JSNApi::NotifyLooperIdleEnd(const EcmaVM *vm, int64_t timestamp)
49704514f5e3Sopenharmony_ci{
49714514f5e3Sopenharmony_ci    if (vm->IsPostForked()) {
49724514f5e3Sopenharmony_ci        vm->GetHeap()->GetIdleGCTrigger()->NotifyLooperIdleEnd(timestamp);
49734514f5e3Sopenharmony_ci    }
49744514f5e3Sopenharmony_ci}
49754514f5e3Sopenharmony_ci
49764514f5e3Sopenharmony_cibool JSNApi::IsJSMainThreadOfEcmaVM(const EcmaVM *vm)
49774514f5e3Sopenharmony_ci{
49784514f5e3Sopenharmony_ci    return vm->GetJSThread()->IsMainThreadFast();
49794514f5e3Sopenharmony_ci}
49804514f5e3Sopenharmony_ci
49814514f5e3Sopenharmony_civoid JSNApi::SetDeviceDisconnectCallback(EcmaVM *vm, DeviceDisconnectCallback cb)
49824514f5e3Sopenharmony_ci{
49834514f5e3Sopenharmony_ci    vm->SetDeviceDisconnectCallback(cb);
49844514f5e3Sopenharmony_ci}
49854514f5e3Sopenharmony_ci
49864514f5e3Sopenharmony_cibool JSNApi::KeyIsNumber(const char* utf8)
49874514f5e3Sopenharmony_ci{
49884514f5e3Sopenharmony_ci    const char *ptr = utf8;
49894514f5e3Sopenharmony_ci    for (char c = *ptr; c; c = *++ptr) {
49904514f5e3Sopenharmony_ci        if (c >= '0' && c <= '9') {
49914514f5e3Sopenharmony_ci            continue;
49924514f5e3Sopenharmony_ci        } else {
49934514f5e3Sopenharmony_ci            return false;
49944514f5e3Sopenharmony_ci        }
49954514f5e3Sopenharmony_ci    }
49964514f5e3Sopenharmony_ci    return true;
49974514f5e3Sopenharmony_ci}
49984514f5e3Sopenharmony_ci
49994514f5e3Sopenharmony_cibool JSNApi::IsSerializationTimeoutCheckEnabled(const EcmaVM *vm)
50004514f5e3Sopenharmony_ci{
50014514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
50024514f5e3Sopenharmony_ci    // Open Control Timeout Consumption
50034514f5e3Sopenharmony_ci    if (const_cast<EcmaVM *>(vm)->GetJSOptions().EnableSerializationTimeoutCheck()) {
50044514f5e3Sopenharmony_ci        return thread->IsMainThread();
50054514f5e3Sopenharmony_ci    }
50064514f5e3Sopenharmony_ci
50074514f5e3Sopenharmony_ci    // Currently only log trace on main thread
50084514f5e3Sopenharmony_ci    auto jsDebuggerManager = vm->GetJsDebuggerManager();
50094514f5e3Sopenharmony_ci    if (jsDebuggerManager != nullptr) {
50104514f5e3Sopenharmony_ci        if (jsDebuggerManager->IsSerializationTimeoutCheckEnabled()) {
50114514f5e3Sopenharmony_ci            return thread->IsMainThread();
50124514f5e3Sopenharmony_ci        }
50134514f5e3Sopenharmony_ci    }
50144514f5e3Sopenharmony_ci    return false;
50154514f5e3Sopenharmony_ci}
50164514f5e3Sopenharmony_ci
50174514f5e3Sopenharmony_civoid JSNApi::GenerateTimeoutTraceIfNeeded(const EcmaVM *vm, std::chrono::system_clock::time_point &start,
50184514f5e3Sopenharmony_ci                                          std::chrono::system_clock::time_point &end, bool isSerialization)
50194514f5e3Sopenharmony_ci{
50204514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
50214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
50224514f5e3Sopenharmony_ci    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
50234514f5e3Sopenharmony_ci    auto threshold = std::chrono::duration_cast<std::chrono::milliseconds>
50244514f5e3Sopenharmony_ci            (std::chrono::milliseconds(vm->GetJsDebuggerManager()->GetSerializationCheckThreshold())).count();
50254514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSNAPI::" << (isSerialization ? "SerializeValue" : "DeserializeValue") << " tid: "
50264514f5e3Sopenharmony_ci        << thread->GetThreadId() << " threshold: " << threshold << " duration: " << duration;
50274514f5e3Sopenharmony_ci    if (duration >= threshold) {
50284514f5e3Sopenharmony_ci        std::stringstream tagMsg;
50294514f5e3Sopenharmony_ci        auto startTimeMS = std::chrono::time_point_cast<std::chrono::nanoseconds>(start);
50304514f5e3Sopenharmony_ci        tagMsg << (isSerialization ? "SerializationTimeout::tid=" : "DeserializationTimeout::tid=");
50314514f5e3Sopenharmony_ci        tagMsg << thread->GetThreadId();
50324514f5e3Sopenharmony_ci        tagMsg << (isSerialization ? ";task=serialization;startTime=" : ";task=deserialization;startTime=");
50334514f5e3Sopenharmony_ci        tagMsg << startTimeMS.time_since_epoch().count() << ";duration=" << duration;
50344514f5e3Sopenharmony_ci        ECMA_BYTRACE_NAME(HITRACE_TAG_ARK, tagMsg.str());
50354514f5e3Sopenharmony_ci    }
50364514f5e3Sopenharmony_ci}
50374514f5e3Sopenharmony_ci
50384514f5e3Sopenharmony_civoid JSNApi::LoadAotFileInternal(EcmaVM *vm, const std::string &moduleName, std::string &aotFileName)
50394514f5e3Sopenharmony_ci{
50404514f5e3Sopenharmony_ci    if (vm->GetJSOptions().WasAOTOutputFileSet()) {
50414514f5e3Sopenharmony_ci        aotFileName = vm->GetJSOptions().GetAOTOutputFile();
50424514f5e3Sopenharmony_ci    }
50434514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM)
50444514f5e3Sopenharmony_ci    else if (vm->GetJSOptions().GetEnableAOT())
50454514f5e3Sopenharmony_ci#else
50464514f5e3Sopenharmony_ci    else if (ecmascript::AnFileDataManager::GetInstance()->IsEnable())
50474514f5e3Sopenharmony_ci#endif
50484514f5e3Sopenharmony_ci    {
50494514f5e3Sopenharmony_ci        aotFileName = ecmascript::AnFileDataManager::GetInstance()->GetDir() + moduleName;
50504514f5e3Sopenharmony_ci    } else {
50514514f5e3Sopenharmony_ci        std::string hapPath = "";
50524514f5e3Sopenharmony_ci        ecmascript::SearchHapPathCallBack callback = vm->GetSearchHapPathCallBack();
50534514f5e3Sopenharmony_ci        if (callback) {
50544514f5e3Sopenharmony_ci            callback(moduleName, hapPath);
50554514f5e3Sopenharmony_ci        }
50564514f5e3Sopenharmony_ci        aotFileName = ecmascript::OhosPreloadAppInfo::GetPreloadAOTFileName(hapPath, moduleName);
50574514f5e3Sopenharmony_ci    }
50584514f5e3Sopenharmony_ci    if (aotFileName.empty()) {
50594514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "can not find aot file";
50604514f5e3Sopenharmony_ci        return;
50614514f5e3Sopenharmony_ci    }
50624514f5e3Sopenharmony_ci    if (ecmascript::pgo::PGOProfilerManager::GetInstance()->IsDisableAot()) {
50634514f5e3Sopenharmony_ci        LOG_ECMA(INFO) << "can't load disable aot file: " << aotFileName;
50644514f5e3Sopenharmony_ci        return;
50654514f5e3Sopenharmony_ci    }
50664514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "start to load aot file: " << aotFileName;
50674514f5e3Sopenharmony_ci}
50684514f5e3Sopenharmony_ci
50694514f5e3Sopenharmony_civoid JSNApi::LoadAotFile(EcmaVM *vm, const std::string &moduleName)
50704514f5e3Sopenharmony_ci{
50714514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
50724514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
50734514f5e3Sopenharmony_ci
50744514f5e3Sopenharmony_ci    std::string aotFileName;
50754514f5e3Sopenharmony_ci    LoadAotFileInternal(vm, moduleName, aotFileName);
50764514f5e3Sopenharmony_ci    // Disable PGO for applications when an/ai file exists
50774514f5e3Sopenharmony_ci    if (isForked_) {
50784514f5e3Sopenharmony_ci        vm->DisablePGOProfilerWithAOTFile(aotFileName);
50794514f5e3Sopenharmony_ci    }
50804514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->LoadAOTFiles(aotFileName);
50814514f5e3Sopenharmony_ci}
50824514f5e3Sopenharmony_ci
50834514f5e3Sopenharmony_ci#if defined(CROSS_PLATFORM) && defined(ANDROID_PLATFORM)
50844514f5e3Sopenharmony_civoid JSNApi::LoadAotFile(EcmaVM *vm, [[maybe_unused]] const std::string &bundleName, const std::string &moduleName,
50854514f5e3Sopenharmony_ci                         std::function<bool(std::string fileName, uint8_t **buff, size_t *buffSize)> cb)
50864514f5e3Sopenharmony_ci{
50874514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
50884514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
50894514f5e3Sopenharmony_ci
50904514f5e3Sopenharmony_ci    std::string aotFileName;
50914514f5e3Sopenharmony_ci    LoadAotFileInternal(vm, moduleName, aotFileName);
50924514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->LoadAOTFiles(aotFileName, cb);
50934514f5e3Sopenharmony_ci}
50944514f5e3Sopenharmony_ci#endif
50954514f5e3Sopenharmony_ci
50964514f5e3Sopenharmony_cibool JSNApi::ExecuteInContext(EcmaVM *vm, const std::string &fileName, const std::string &entry, bool needUpdate)
50974514f5e3Sopenharmony_ci{
50984514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
50994514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "start to execute ark file in context: " << fileName;
51004514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51014514f5e3Sopenharmony_ci    EcmaContext::MountContext(thread);
51024514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromAbcFile(thread, fileName.c_str(), entry, needUpdate)) {
51034514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
51044514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
51054514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
51064514f5e3Sopenharmony_ci        }
51074514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute ark file '" << fileName
51084514f5e3Sopenharmony_ci                        << "' with entry '" << entry << "'" << std::endl;
51094514f5e3Sopenharmony_ci        return false;
51104514f5e3Sopenharmony_ci    }
51114514f5e3Sopenharmony_ci    EcmaContext::UnmountContext(thread);
51124514f5e3Sopenharmony_ci    return true;
51134514f5e3Sopenharmony_ci}
51144514f5e3Sopenharmony_ci
51154514f5e3Sopenharmony_ci// function for bundle abc
51164514f5e3Sopenharmony_cibool JSNApi::ExecuteForAbsolutePath(const EcmaVM *vm, const std::string &fileName, const std::string &entry,
51174514f5e3Sopenharmony_ci                                    bool needUpdate, bool executeFromJob)
51184514f5e3Sopenharmony_ci{
51194514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
51204514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "start to execute absolute path ark file: " << fileName;
51214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51224514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromAbsolutePathAbcFile(
51234514f5e3Sopenharmony_ci        thread, fileName.c_str(), entry, needUpdate, executeFromJob)) {
51244514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
51254514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
51264514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
51274514f5e3Sopenharmony_ci        }
51284514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute absolute path ark file '" << fileName
51294514f5e3Sopenharmony_ci                        << "' with entry '" << entry << "'" << std::endl;
51304514f5e3Sopenharmony_ci        return false;
51314514f5e3Sopenharmony_ci    }
51324514f5e3Sopenharmony_ci    return true;
51334514f5e3Sopenharmony_ci}
51344514f5e3Sopenharmony_ci
51354514f5e3Sopenharmony_cibool JSNApi::Execute(const EcmaVM *vm, const std::string &fileName, const std::string &entry,
51364514f5e3Sopenharmony_ci                     bool needUpdate, bool executeFromJob)
51374514f5e3Sopenharmony_ci{
51384514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
51394514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "start to execute ark file: " << fileName;
51404514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51414514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromAbcFile(
51424514f5e3Sopenharmony_ci        thread, fileName.c_str(), entry, needUpdate, executeFromJob)) {
51434514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
51444514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
51454514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
51464514f5e3Sopenharmony_ci        }
51474514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute ark file '" << fileName
51484514f5e3Sopenharmony_ci                        << "' with entry '" << entry << "'" << std::endl;
51494514f5e3Sopenharmony_ci        return false;
51504514f5e3Sopenharmony_ci    }
51514514f5e3Sopenharmony_ci    return true;
51524514f5e3Sopenharmony_ci}
51534514f5e3Sopenharmony_ci
51544514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly.
51554514f5e3Sopenharmony_cibool JSNApi::Execute(EcmaVM *vm, const uint8_t *data, int32_t size, const std::string &entry,
51564514f5e3Sopenharmony_ci                     const std::string &filename, bool needUpdate)
51574514f5e3Sopenharmony_ci{
51584514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
51594514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "start to execute ark buffer: " << filename;
51604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51614514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromBuffer(thread, data, size, entry, filename.c_str(), needUpdate)) {
51624514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
51634514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
51644514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
51654514f5e3Sopenharmony_ci        }
51664514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute ark buffer file '" << filename
51674514f5e3Sopenharmony_ci                        << "' with entry '" << entry << "'" << std::endl;
51684514f5e3Sopenharmony_ci        return false;
51694514f5e3Sopenharmony_ci    }
51704514f5e3Sopenharmony_ci    return true;
51714514f5e3Sopenharmony_ci}
51724514f5e3Sopenharmony_ci
51734514f5e3Sopenharmony_ciint JSNApi::ExecuteWithSingletonPatternFlag(EcmaVM *vm, const std::string &bundleName,
51744514f5e3Sopenharmony_ci    const std::string &moduleName, const std::string &ohmurl, bool isSingletonPattern)
51754514f5e3Sopenharmony_ci{
51764514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, ecmascript::JSPandaFileExecutor::ROUTE_INTERNAL_ERROR);
51774514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51784514f5e3Sopenharmony_ci    int result = ecmascript::JSPandaFileExecutor::ExecuteAbcFileWithSingletonPatternFlag(thread, bundleName.c_str(),
51794514f5e3Sopenharmony_ci        moduleName.c_str(), ohmurl.c_str(), isSingletonPattern);
51804514f5e3Sopenharmony_ci    if (!result) {
51814514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
51824514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
51834514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
51844514f5e3Sopenharmony_ci        }
51854514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Execute with singleton-pattern flag failed with bundle name is'" << bundleName
51864514f5e3Sopenharmony_ci                        << "' and module name is '" << moduleName << "', entry is'" << ohmurl << "'" << std::endl;
51874514f5e3Sopenharmony_ci    }
51884514f5e3Sopenharmony_ci    return result;
51894514f5e3Sopenharmony_ci}
51904514f5e3Sopenharmony_ci
51914514f5e3Sopenharmony_cibool JSNApi::IsExecuteModuleInAbcFile(EcmaVM *vm, const std::string &bundleName,
51924514f5e3Sopenharmony_ci    const std::string &moduleName, const std::string &ohmurl)
51934514f5e3Sopenharmony_ci{
51944514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
51954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
51964514f5e3Sopenharmony_ci    bool result = ecmascript::JSPandaFileExecutor::IsExecuteModuleInAbcFile(thread, bundleName.c_str(),
51974514f5e3Sopenharmony_ci        moduleName.c_str(), ohmurl.c_str());
51984514f5e3Sopenharmony_ci    return result;
51994514f5e3Sopenharmony_ci}
52004514f5e3Sopenharmony_ci
52014514f5e3Sopenharmony_ci// The security interface needs to be modified accordingly.
52024514f5e3Sopenharmony_cibool JSNApi::ExecuteModuleBuffer(EcmaVM *vm, const uint8_t *data, int32_t size, const std::string &filename,
52034514f5e3Sopenharmony_ci                                 bool needUpdate)
52044514f5e3Sopenharmony_ci{
52054514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
52064514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "start to execute module buffer: " << filename;
52074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
52084514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteModuleBuffer(thread, data, size, filename.c_str(), needUpdate)) {
52094514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
52104514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
52114514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
52124514f5e3Sopenharmony_ci        }
52134514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute module buffer file '" << filename;
52144514f5e3Sopenharmony_ci        return false;
52154514f5e3Sopenharmony_ci    }
52164514f5e3Sopenharmony_ci    return true;
52174514f5e3Sopenharmony_ci}
52184514f5e3Sopenharmony_ci
52194514f5e3Sopenharmony_ci/*
52204514f5e3Sopenharmony_ci * srcFilename: data/storage/el1/bundle/modulename/ets/modules.abc
52214514f5e3Sopenharmony_ci * ohmUrl :     1. @bundle:bundleName/moduleName@namespace/ets/pages/Index
52224514f5e3Sopenharmony_ci *              2. @package:pkg_modules/.ohpm/pkgName/pkg_modules/pkgName/xxx/xxx
52234514f5e3Sopenharmony_ci *              3. @normalized:N&moduleName&bundleName&entryPath&version
52244514f5e3Sopenharmony_ci *              4. @normalized:N&moduleName&bundleName&entryPath&
52254514f5e3Sopenharmony_ci */
52264514f5e3Sopenharmony_cibool JSNApi::ExecuteSecureWithOhmUrl(EcmaVM *vm, uint8_t *data, int32_t size, const std::string &srcFilename,
52274514f5e3Sopenharmony_ci                                     const std::string &ohmUrl)
52284514f5e3Sopenharmony_ci{
52294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
52304514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "start to execute ark buffer with secure memory use file: " << srcFilename <<
52314514f5e3Sopenharmony_ci                      ", entrypoint: " << ohmUrl;
52324514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
52334514f5e3Sopenharmony_ci    ecmascript::CString filename = PathHelper::NormalizePath(srcFilename.c_str());
52344514f5e3Sopenharmony_ci    // check input filePath
52354514f5e3Sopenharmony_ci#if !defined(PANDA_TARGET_WINDOWS) && !defined(PANDA_TARGET_MACOS)
52364514f5e3Sopenharmony_ci    if (!ModulePathHelper::ValidateAbcPath(filename, ecmascript::ValidateFilePath::ETS_MODULES)) {
52374514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "ExecuteSecureWithOhmUrl: Invalid input filePath: " << srcFilename <<
52384514f5e3Sopenharmony_ci                           ", input OhmUrl:" << ohmUrl;
52394514f5e3Sopenharmony_ci    }
52404514f5e3Sopenharmony_ci#endif
52414514f5e3Sopenharmony_ci    ecmascript::CString entryPoint;
52424514f5e3Sopenharmony_ci    // Check and translate OhmUrl to recordName
52434514f5e3Sopenharmony_ci    if (!ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl.c_str(), entryPoint)) {
52444514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "ExecuteSecureWithOhmUrl: Invalid input OhmUrl: " << ohmUrl <<
52454514f5e3Sopenharmony_ci                           ", input filePath:" << filename;
52464514f5e3Sopenharmony_ci    }
52474514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteSecureWithOhmUrl(thread, data, size, filename, entryPoint)) {
52484514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
52494514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
52504514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
52514514f5e3Sopenharmony_ci        }
52524514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute ark buffer file '" << srcFilename
52534514f5e3Sopenharmony_ci                        << "' with entry '" << ohmUrl << "'" << std::endl;
52544514f5e3Sopenharmony_ci        return false;
52554514f5e3Sopenharmony_ci    }
52564514f5e3Sopenharmony_ci    return true;
52574514f5e3Sopenharmony_ci}
52584514f5e3Sopenharmony_ci
52594514f5e3Sopenharmony_cibool JSNApi::ExecuteSecure(EcmaVM *vm, uint8_t *data, int32_t size, const std::string &entry,
52604514f5e3Sopenharmony_ci                           const std::string &filename, bool needUpdate)
52614514f5e3Sopenharmony_ci{
52624514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
52634514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "start to execute ark buffer with secure memory: " << filename;
52644514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
52654514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromBufferSecure(thread, data, size, entry, filename.c_str(),
52664514f5e3Sopenharmony_ci                                                                  needUpdate)) {
52674514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
52684514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
52694514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
52704514f5e3Sopenharmony_ci        }
52714514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute ark buffer file '" << filename
52724514f5e3Sopenharmony_ci                        << "' with entry '" << entry << "'" << std::endl;
52734514f5e3Sopenharmony_ci        return false;
52744514f5e3Sopenharmony_ci    }
52754514f5e3Sopenharmony_ci    return true;
52764514f5e3Sopenharmony_ci}
52774514f5e3Sopenharmony_ci
52784514f5e3Sopenharmony_cibool JSNApi::ExecuteModuleBufferSecure(EcmaVM *vm, uint8_t* data, int32_t size, const std::string &filename,
52794514f5e3Sopenharmony_ci                                       bool needUpdate)
52804514f5e3Sopenharmony_ci{
52814514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
52824514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "start to execute module buffer with secure memory: " << filename;
52834514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(thread);
52844514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteModuleBufferSecure(thread, data, size, filename.c_str(),
52854514f5e3Sopenharmony_ci                                                                    needUpdate)) {
52864514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
52874514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
52884514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
52894514f5e3Sopenharmony_ci        }
52904514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "Cannot execute module buffer file '" << filename;
52914514f5e3Sopenharmony_ci        return false;
52924514f5e3Sopenharmony_ci    }
52934514f5e3Sopenharmony_ci    return true;
52944514f5e3Sopenharmony_ci}
52954514f5e3Sopenharmony_ci
52964514f5e3Sopenharmony_civoid JSNApi::PreFork(EcmaVM *vm)
52974514f5e3Sopenharmony_ci{
52984514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
52994514f5e3Sopenharmony_ci    vm->PreFork();
53004514f5e3Sopenharmony_ci}
53014514f5e3Sopenharmony_ci
53024514f5e3Sopenharmony_civoid JSNApi::UpdateAOTCompileStatus(ecmascript::JSRuntimeOptions &jsOption, const RuntimeOption &option)
53034514f5e3Sopenharmony_ci{
53044514f5e3Sopenharmony_ci    // When AOT compilation failed, disable PGO and JIT
53054514f5e3Sopenharmony_ci    bool aotHasException = false;
53064514f5e3Sopenharmony_ci    for (const auto &value : option.GetAOTCompileStatusMap()) {
53074514f5e3Sopenharmony_ci        auto moduleCompileStatus = static_cast<RuntimeOption::AOTCompileStatus>(value.second);
53084514f5e3Sopenharmony_ci        if (moduleCompileStatus == RuntimeOption::AOTCompileStatus::COMPILE_FAILED ||
53094514f5e3Sopenharmony_ci            moduleCompileStatus == RuntimeOption::AOTCompileStatus::COMPILE_CRASH) {
53104514f5e3Sopenharmony_ci            aotHasException = true;
53114514f5e3Sopenharmony_ci            break;
53124514f5e3Sopenharmony_ci        }
53134514f5e3Sopenharmony_ci    }
53144514f5e3Sopenharmony_ci    jsOption.SetAOTHasException(aotHasException);
53154514f5e3Sopenharmony_ci}
53164514f5e3Sopenharmony_ci
53174514f5e3Sopenharmony_civoid JSNApi::PostFork(EcmaVM *vm, const RuntimeOption &option)
53184514f5e3Sopenharmony_ci{
53194514f5e3Sopenharmony_ci    isForked_ = true;
53204514f5e3Sopenharmony_ci    JSRuntimeOptions &jsOption = vm->GetJSOptions();
53214514f5e3Sopenharmony_ci    jsOption.SetEnablePGOProfiler(option.GetEnableProfile());
53224514f5e3Sopenharmony_ci    jsOption.SetEnableJIT(option.GetEnableJIT());
53234514f5e3Sopenharmony_ci    jsOption.SetEnableBaselineJIT(option.GetEnableBaselineJIT());
53244514f5e3Sopenharmony_ci    jsOption.SetMaxAotMethodSize(JSRuntimeOptions::MAX_APP_COMPILE_METHOD_SIZE);
53254514f5e3Sopenharmony_ci    jsOption.SetEnableForceIC(false);
53264514f5e3Sopenharmony_ci    ecmascript::pgo::PGOProfilerManager::GetInstance()->SetBundleName(option.GetBundleName());
53274514f5e3Sopenharmony_ci    ecmascript::pgo::PGOProfilerManager::GetInstance()->SetMaxAotMethodSize(jsOption.GetMaxAotMethodSize());
53284514f5e3Sopenharmony_ci    ecmascript::pgo::PGOProfilerManager::GetInstance()->SetEnableForceIC(jsOption.IsEnableForceIC());
53294514f5e3Sopenharmony_ci    JSRuntimeOptions runtimeOptions;
53304514f5e3Sopenharmony_ci    runtimeOptions.SetLogLevel(Log::LevelToString(Log::ConvertFromRuntime(option.GetLogLevel())));
53314514f5e3Sopenharmony_ci    Log::Initialize(runtimeOptions);
53324514f5e3Sopenharmony_ci
53334514f5e3Sopenharmony_ci    // 1. system switch 2. an file dir exits 3. whitelist 4. escape mechanism
53344514f5e3Sopenharmony_ci    bool enableAOT = jsOption.GetEnableAOT() &&
53354514f5e3Sopenharmony_ci                     !option.GetAnDir().empty() &&
53364514f5e3Sopenharmony_ci                     EnableAotJitListHelper::GetInstance()->IsEnableAot(option.GetBundleName()) &&
53374514f5e3Sopenharmony_ci                     !ecmascript::AotCrashInfo::IsAotEscaped();
53384514f5e3Sopenharmony_ci    if (enableAOT) {
53394514f5e3Sopenharmony_ci        ecmascript::AnFileDataManager::GetInstance()->SetDir(option.GetAnDir());
53404514f5e3Sopenharmony_ci        ecmascript::AnFileDataManager::GetInstance()->SetEnable(true);
53414514f5e3Sopenharmony_ci    }
53424514f5e3Sopenharmony_ci    UpdateAOTCompileStatus(jsOption, option);
53434514f5e3Sopenharmony_ci
53444514f5e3Sopenharmony_ci    LOG_ECMA(INFO) << "asmint: " << jsOption.GetEnableAsmInterpreter()
53454514f5e3Sopenharmony_ci                    << ", aot: " << enableAOT
53464514f5e3Sopenharmony_ci                    << ", jit: " << option.GetEnableJIT()
53474514f5e3Sopenharmony_ci                    << ", baseline jit: " << option.GetEnableBaselineJIT()
53484514f5e3Sopenharmony_ci                    << ", bundle name: " <<  option.GetBundleName();
53494514f5e3Sopenharmony_ci
53504514f5e3Sopenharmony_ci    vm->PostFork();
53514514f5e3Sopenharmony_ci}
53524514f5e3Sopenharmony_ci
53534514f5e3Sopenharmony_civoid JSNApi::AddWorker(EcmaVM *hostVm, EcmaVM *workerVm)
53544514f5e3Sopenharmony_ci{
53554514f5e3Sopenharmony_ci    if (hostVm != nullptr && workerVm != nullptr) {
53564514f5e3Sopenharmony_ci        hostVm->WorkersetInfo(workerVm);
53574514f5e3Sopenharmony_ci        workerVm->SetBundleName(hostVm->GetBundleName());
53584514f5e3Sopenharmony_ci    }
53594514f5e3Sopenharmony_ci}
53604514f5e3Sopenharmony_ci
53614514f5e3Sopenharmony_cibool JSNApi::DeleteWorker(EcmaVM *hostVm, EcmaVM *workerVm)
53624514f5e3Sopenharmony_ci{
53634514f5e3Sopenharmony_ci    if (hostVm != nullptr && workerVm != nullptr) {
53644514f5e3Sopenharmony_ci        return hostVm->DeleteWorker(workerVm);
53654514f5e3Sopenharmony_ci    }
53664514f5e3Sopenharmony_ci    return false;
53674514f5e3Sopenharmony_ci}
53684514f5e3Sopenharmony_ci
53694514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetUncaughtException(const EcmaVM *vm)
53704514f5e3Sopenharmony_ci{
53714514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
53724514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(vm->GetEcmaUncaughtException());
53734514f5e3Sopenharmony_ci}
53744514f5e3Sopenharmony_ci
53754514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetAndClearUncaughtException(const EcmaVM *vm)
53764514f5e3Sopenharmony_ci{
53774514f5e3Sopenharmony_ci    if (!HasPendingException(vm)) {
53784514f5e3Sopenharmony_ci        return Local<ObjectRef>();
53794514f5e3Sopenharmony_ci    }
53804514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
53814514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(vm->GetAndClearEcmaUncaughtException());
53824514f5e3Sopenharmony_ci}
53834514f5e3Sopenharmony_ci
53844514f5e3Sopenharmony_cibool JSNApi::HasPendingException(const EcmaVM *vm)
53854514f5e3Sopenharmony_ci{
53864514f5e3Sopenharmony_ci    return vm->GetJSThread()->HasPendingException();
53874514f5e3Sopenharmony_ci}
53884514f5e3Sopenharmony_ci
53894514f5e3Sopenharmony_cibool JSNApi::IsExecutingPendingJob(const EcmaVM *vm)
53904514f5e3Sopenharmony_ci{
53914514f5e3Sopenharmony_ci    return vm->GetAssociatedJSThread()->GetCurrentEcmaContext()->IsExecutingPendingJob();
53924514f5e3Sopenharmony_ci}
53934514f5e3Sopenharmony_ci
53944514f5e3Sopenharmony_cibool JSNApi::HasPendingJob(const EcmaVM *vm)
53954514f5e3Sopenharmony_ci{
53964514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
53974514f5e3Sopenharmony_ci    return vm->GetAssociatedJSThread()->GetCurrentEcmaContext()->HasPendingJob();
53984514f5e3Sopenharmony_ci}
53994514f5e3Sopenharmony_ci
54004514f5e3Sopenharmony_civoid JSNApi::EnableUserUncaughtErrorHandler(EcmaVM *vm)
54014514f5e3Sopenharmony_ci{
54024514f5e3Sopenharmony_ci    return vm->GetJSThread()->GetCurrentEcmaContext()->EnableUserUncaughtErrorHandler();
54034514f5e3Sopenharmony_ci}
54044514f5e3Sopenharmony_ci
54054514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetGlobalObject(const EcmaVM *vm)
54064514f5e3Sopenharmony_ci{
54074514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54084514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> globalEnv = vm->GetGlobalEnv();
54094514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> global(vm->GetJSThread(), globalEnv->GetGlobalObject());
54104514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(global);
54114514f5e3Sopenharmony_ci}
54124514f5e3Sopenharmony_ci
54134514f5e3Sopenharmony_civoid JSNApi::ExecutePendingJob(const EcmaVM *vm)
54144514f5e3Sopenharmony_ci{
54154514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
54164514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
54174514f5e3Sopenharmony_ci    EcmaVM::ConstCast(vm)->GetJSThread()->GetCurrentEcmaContext()->ExecutePromisePendingJob();
54184514f5e3Sopenharmony_ci}
54194514f5e3Sopenharmony_ci
54204514f5e3Sopenharmony_ciuintptr_t JSNApi::GetHandleAddr(const EcmaVM *vm, uintptr_t localAddress)
54214514f5e3Sopenharmony_ci{
54224514f5e3Sopenharmony_ci    if (localAddress == 0) {
54234514f5e3Sopenharmony_ci        return 0;
54244514f5e3Sopenharmony_ci    }
54254514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54264514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
54274514f5e3Sopenharmony_ci    JSTaggedType value = *(reinterpret_cast<JSTaggedType *>(localAddress));
54284514f5e3Sopenharmony_ci    return ecmascript::EcmaHandleScope::NewHandle(thread, value);
54294514f5e3Sopenharmony_ci}
54304514f5e3Sopenharmony_ci
54314514f5e3Sopenharmony_ciuintptr_t JSNApi::GetGlobalHandleAddr(const EcmaVM *vm, uintptr_t localAddress)
54324514f5e3Sopenharmony_ci{
54334514f5e3Sopenharmony_ci    if (localAddress == 0) {
54344514f5e3Sopenharmony_ci        return 0;
54354514f5e3Sopenharmony_ci    }
54364514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54374514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
54384514f5e3Sopenharmony_ci    JSTaggedType value = *(reinterpret_cast<JSTaggedType *>(localAddress));
54394514f5e3Sopenharmony_ci    return thread->NewGlobalHandle(value);
54404514f5e3Sopenharmony_ci}
54414514f5e3Sopenharmony_ci
54424514f5e3Sopenharmony_ciint JSNApi::GetStartRealTime(const EcmaVM *vm)
54434514f5e3Sopenharmony_ci{
54444514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54454514f5e3Sopenharmony_ci    return vm->GetProcessStartRealtime();
54464514f5e3Sopenharmony_ci}
54474514f5e3Sopenharmony_ci
54484514f5e3Sopenharmony_civoid JSNApi::NotifyTaskBegin(const EcmaVM *vm)
54494514f5e3Sopenharmony_ci{
54504514f5e3Sopenharmony_ci    const_cast<ecmascript::Heap *>(vm->GetHeap())->NotifyRecordMemorySize();
54514514f5e3Sopenharmony_ci}
54524514f5e3Sopenharmony_ci
54534514f5e3Sopenharmony_civoid JSNApi::NotifyTaskFinished(const EcmaVM *vm)
54544514f5e3Sopenharmony_ci{
54554514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54564514f5e3Sopenharmony_ci    const_cast<ecmascript::Heap *>(vm->GetHeap())->CheckAndTriggerTaskFinishedGC();
54574514f5e3Sopenharmony_ci}
54584514f5e3Sopenharmony_ci
54594514f5e3Sopenharmony_cibool JSNApi::IsMultiThreadCheckEnabled(const EcmaVM *vm)
54604514f5e3Sopenharmony_ci{
54614514f5e3Sopenharmony_ci    return vm->GetThreadCheckStatus();
54624514f5e3Sopenharmony_ci}
54634514f5e3Sopenharmony_ci
54644514f5e3Sopenharmony_ciuint32_t JSNApi::GetCurrentThreadId()
54654514f5e3Sopenharmony_ci{
54664514f5e3Sopenharmony_ci    return JSThread::GetCurrentThreadId();
54674514f5e3Sopenharmony_ci}
54684514f5e3Sopenharmony_ci
54694514f5e3Sopenharmony_ciuintptr_t JSNApi::SetWeak(const EcmaVM *vm, uintptr_t localAddress)
54704514f5e3Sopenharmony_ci{
54714514f5e3Sopenharmony_ci    if (localAddress == 0) {
54724514f5e3Sopenharmony_ci        return 0;
54734514f5e3Sopenharmony_ci    }
54744514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54754514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
54764514f5e3Sopenharmony_ci    return thread->SetWeak(localAddress);
54774514f5e3Sopenharmony_ci}
54784514f5e3Sopenharmony_ci
54794514f5e3Sopenharmony_ciuintptr_t JSNApi::SetWeakCallback(const EcmaVM *vm, uintptr_t localAddress, void *ref,
54804514f5e3Sopenharmony_ci                                  WeakRefClearCallBack freeGlobalCallBack, WeakRefClearCallBack nativeFinalizeCallback)
54814514f5e3Sopenharmony_ci{
54824514f5e3Sopenharmony_ci    if (localAddress == 0) {
54834514f5e3Sopenharmony_ci        return 0;
54844514f5e3Sopenharmony_ci    }
54854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54864514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
54874514f5e3Sopenharmony_ci    return thread->SetWeak(localAddress, ref, freeGlobalCallBack, nativeFinalizeCallback);
54884514f5e3Sopenharmony_ci}
54894514f5e3Sopenharmony_ci
54904514f5e3Sopenharmony_ciuintptr_t JSNApi::ClearWeak(const EcmaVM *vm, uintptr_t localAddress)
54914514f5e3Sopenharmony_ci{
54924514f5e3Sopenharmony_ci    if (localAddress == 0) {
54934514f5e3Sopenharmony_ci        return 0;
54944514f5e3Sopenharmony_ci    }
54954514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
54964514f5e3Sopenharmony_ci    if (JSTaggedValue(reinterpret_cast<ecmascript::Node *>(localAddress)->GetObject())
54974514f5e3Sopenharmony_ci        .IsUndefined()) {
54984514f5e3Sopenharmony_ci        LOG_ECMA(ERROR) << "The object of weak reference has been recycled!";
54994514f5e3Sopenharmony_ci        return 0;
55004514f5e3Sopenharmony_ci    }
55014514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
55024514f5e3Sopenharmony_ci    return thread->ClearWeak(localAddress);
55034514f5e3Sopenharmony_ci}
55044514f5e3Sopenharmony_ci
55054514f5e3Sopenharmony_cibool JSNApi::IsWeak(const EcmaVM *vm, uintptr_t localAddress)
55064514f5e3Sopenharmony_ci{
55074514f5e3Sopenharmony_ci    if (localAddress == 0) {
55084514f5e3Sopenharmony_ci        return false;
55094514f5e3Sopenharmony_ci    }
55104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
55114514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
55124514f5e3Sopenharmony_ci    return thread->IsWeak(localAddress);
55134514f5e3Sopenharmony_ci}
55144514f5e3Sopenharmony_ci
55154514f5e3Sopenharmony_civoid JSNApi::DisposeGlobalHandleAddr(const EcmaVM *vm, uintptr_t addr)
55164514f5e3Sopenharmony_ci{
55174514f5e3Sopenharmony_ci    if (addr == 0 || !reinterpret_cast<ecmascript::Node *>(addr)->IsUsing()) {
55184514f5e3Sopenharmony_ci        return;
55194514f5e3Sopenharmony_ci    }
55204514f5e3Sopenharmony_ci
55214514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
55224514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
55234514f5e3Sopenharmony_ci    thread->DisposeGlobalHandle(addr);
55244514f5e3Sopenharmony_ci}
55254514f5e3Sopenharmony_ci
55264514f5e3Sopenharmony_civoid *JSNApi::SerializeValue(const EcmaVM *vm, Local<JSValueRef> value, Local<JSValueRef> transfer,
55274514f5e3Sopenharmony_ci                             Local<JSValueRef> cloneList, bool defaultTransfer, bool defaultCloneShared)
55284514f5e3Sopenharmony_ci{
55294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, nullptr);
55304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
55314514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arkValue = JSNApiHelper::ToJSHandle(value);
55324514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arkTransfer = JSNApiHelper::ToJSHandle(transfer);
55334514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> arkCloneList = JSNApiHelper::ToJSHandle(cloneList);
55344514f5e3Sopenharmony_ci    bool serializationTimeoutCheckEnabled = IsSerializationTimeoutCheckEnabled(vm);
55354514f5e3Sopenharmony_ci    std::chrono::system_clock::time_point startTime;
55364514f5e3Sopenharmony_ci    std::chrono::system_clock::time_point endTime;
55374514f5e3Sopenharmony_ci    if (serializationTimeoutCheckEnabled) {
55384514f5e3Sopenharmony_ci        startTime = std::chrono::system_clock::now();
55394514f5e3Sopenharmony_ci    }
55404514f5e3Sopenharmony_ci    ecmascript::ValueSerializer serializer(thread, defaultTransfer, defaultCloneShared);
55414514f5e3Sopenharmony_ci    std::unique_ptr<ecmascript::SerializeData> data;
55424514f5e3Sopenharmony_ci    if (serializer.WriteValue(thread, arkValue, arkTransfer, arkCloneList)) {
55434514f5e3Sopenharmony_ci        data = serializer.Release();
55444514f5e3Sopenharmony_ci    }
55454514f5e3Sopenharmony_ci    if (serializationTimeoutCheckEnabled) {
55464514f5e3Sopenharmony_ci        endTime = std::chrono::system_clock::now();
55474514f5e3Sopenharmony_ci        GenerateTimeoutTraceIfNeeded(vm, startTime, endTime, true);
55484514f5e3Sopenharmony_ci    }
55494514f5e3Sopenharmony_ci    if (data == nullptr) {
55504514f5e3Sopenharmony_ci        return nullptr;
55514514f5e3Sopenharmony_ci    } else {
55524514f5e3Sopenharmony_ci        return reinterpret_cast<void *>(data.release());
55534514f5e3Sopenharmony_ci    }
55544514f5e3Sopenharmony_ci}
55554514f5e3Sopenharmony_ci
55564514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::DeserializeValue(const EcmaVM *vm, void *recoder, void *hint)
55574514f5e3Sopenharmony_ci{
55584514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
55594514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
55604514f5e3Sopenharmony_ci    std::unique_ptr<ecmascript::SerializeData> data(reinterpret_cast<ecmascript::SerializeData *>(recoder));
55614514f5e3Sopenharmony_ci    ecmascript::BaseDeserializer deserializer(thread, data.release(), hint);
55624514f5e3Sopenharmony_ci    bool serializationTimeoutCheckEnabled = IsSerializationTimeoutCheckEnabled(vm);
55634514f5e3Sopenharmony_ci    std::chrono::system_clock::time_point startTime;
55644514f5e3Sopenharmony_ci    std::chrono::system_clock::time_point endTime;
55654514f5e3Sopenharmony_ci    if (serializationTimeoutCheckEnabled) {
55664514f5e3Sopenharmony_ci        startTime = std::chrono::system_clock::now();
55674514f5e3Sopenharmony_ci    }
55684514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> result = deserializer.ReadValue();
55694514f5e3Sopenharmony_ci    if (serializationTimeoutCheckEnabled) {
55704514f5e3Sopenharmony_ci        endTime = std::chrono::system_clock::now();
55714514f5e3Sopenharmony_ci        GenerateTimeoutTraceIfNeeded(vm, startTime, endTime, false);
55724514f5e3Sopenharmony_ci    }
55734514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(result);
55744514f5e3Sopenharmony_ci}
55754514f5e3Sopenharmony_ci
55764514f5e3Sopenharmony_civoid JSNApi::DeleteSerializationData(void *data)
55774514f5e3Sopenharmony_ci{
55784514f5e3Sopenharmony_ci    ecmascript::SerializeData *value = reinterpret_cast<ecmascript::SerializeData *>(data);
55794514f5e3Sopenharmony_ci    delete value;
55804514f5e3Sopenharmony_ci    value = nullptr;
55814514f5e3Sopenharmony_ci}
55824514f5e3Sopenharmony_ci
55834514f5e3Sopenharmony_civoid HostPromiseRejectionTracker(const EcmaVM *vm,
55844514f5e3Sopenharmony_ci                                 const JSHandle<JSPromise> promise,
55854514f5e3Sopenharmony_ci                                 const JSHandle<JSTaggedValue> reason,
55864514f5e3Sopenharmony_ci                                 const ecmascript::PromiseRejectionEvent operation,
55874514f5e3Sopenharmony_ci                                 void* data)
55884514f5e3Sopenharmony_ci{
55894514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
55904514f5e3Sopenharmony_ci    ecmascript::PromiseRejectCallback promiseRejectCallback =
55914514f5e3Sopenharmony_ci        thread->GetCurrentEcmaContext()->GetPromiseRejectCallback();
55924514f5e3Sopenharmony_ci    if (promiseRejectCallback != nullptr) {
55934514f5e3Sopenharmony_ci        Local<JSValueRef> promiseVal = JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>::Cast(promise));
55944514f5e3Sopenharmony_ci        PromiseRejectInfo promiseRejectInfo(promiseVal, JSNApiHelper::ToLocal<JSValueRef>(reason),
55954514f5e3Sopenharmony_ci                              static_cast<PromiseRejectInfo::PROMISE_REJECTION_EVENT>(operation), data);
55964514f5e3Sopenharmony_ci        promiseRejectCallback(reinterpret_cast<void*>(&promiseRejectInfo));
55974514f5e3Sopenharmony_ci    }
55984514f5e3Sopenharmony_ci}
55994514f5e3Sopenharmony_ci
56004514f5e3Sopenharmony_civoid JSNApi::SetHostPromiseRejectionTracker(EcmaVM *vm, void *cb, void* data)
56014514f5e3Sopenharmony_ci{
56024514f5e3Sopenharmony_ci    CROSS_THREAD_CHECK(vm);
56034514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->SetHostPromiseRejectionTracker(HostPromiseRejectionTracker);
56044514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->SetPromiseRejectCallback(
56054514f5e3Sopenharmony_ci        reinterpret_cast<ecmascript::PromiseRejectCallback>(cb));
56064514f5e3Sopenharmony_ci    thread->GetCurrentEcmaContext()->SetData(data);
56074514f5e3Sopenharmony_ci}
56084514f5e3Sopenharmony_ci
56094514f5e3Sopenharmony_civoid JSNApi::SetHostResolveBufferTracker(EcmaVM *vm,
56104514f5e3Sopenharmony_ci    std::function<bool(std::string dirPath, uint8_t **buff, size_t *buffSize, std::string &errorMsg)> cb)
56114514f5e3Sopenharmony_ci{
56124514f5e3Sopenharmony_ci    vm->SetResolveBufferCallback(cb);
56134514f5e3Sopenharmony_ci}
56144514f5e3Sopenharmony_ci
56154514f5e3Sopenharmony_civoid JSNApi::SetSearchHapPathTracker(EcmaVM *vm,
56164514f5e3Sopenharmony_ci    std::function<bool(const std::string moduleName, std::string &hapPath)> cb)
56174514f5e3Sopenharmony_ci{
56184514f5e3Sopenharmony_ci    vm->SetSearchHapPathCallBack(cb);
56194514f5e3Sopenharmony_ci}
56204514f5e3Sopenharmony_ci
56214514f5e3Sopenharmony_civoid JSNApi::SetMultiThreadCheck(bool multiThreadCheck)
56224514f5e3Sopenharmony_ci{
56234514f5e3Sopenharmony_ci    EcmaVM::SetMultiThreadCheck(multiThreadCheck);
56244514f5e3Sopenharmony_ci}
56254514f5e3Sopenharmony_ci
56264514f5e3Sopenharmony_civoid JSNApi::SetErrorInfoEnhance(bool errorInfoEnhance)
56274514f5e3Sopenharmony_ci{
56284514f5e3Sopenharmony_ci    EcmaVM::SetErrorInfoEnhance(errorInfoEnhance);
56294514f5e3Sopenharmony_ci}
56304514f5e3Sopenharmony_ci
56314514f5e3Sopenharmony_civoid JSNApi::SetRequestAotCallback([[maybe_unused]] EcmaVM *vm, const std::function<int32_t
56324514f5e3Sopenharmony_ci    (const std::string &bundleName, const std::string &moduleName, int32_t triggerMode)> &cb)
56334514f5e3Sopenharmony_ci{
56344514f5e3Sopenharmony_ci    ecmascript::pgo::PGOProfilerManager::GetInstance()->SetRequestAotCallback(cb);
56354514f5e3Sopenharmony_ci}
56364514f5e3Sopenharmony_ci
56374514f5e3Sopenharmony_civoid JSNApi::SetUnloadNativeModuleCallback(EcmaVM *vm, const std::function<bool(const std::string &moduleKey)> &cb)
56384514f5e3Sopenharmony_ci{
56394514f5e3Sopenharmony_ci    vm->SetUnloadNativeModuleCallback(cb);
56404514f5e3Sopenharmony_ci}
56414514f5e3Sopenharmony_ci
56424514f5e3Sopenharmony_civoid JSNApi::SetNativePtrGetter(EcmaVM *vm, void* cb)
56434514f5e3Sopenharmony_ci{
56444514f5e3Sopenharmony_ci    vm->SetNativePtrGetter(reinterpret_cast<ecmascript::NativePtrGetter>(cb));
56454514f5e3Sopenharmony_ci}
56464514f5e3Sopenharmony_ci
56474514f5e3Sopenharmony_civoid JSNApi::SetHostEnqueueJob(const EcmaVM *vm, Local<JSValueRef> cb, QueueType queueType)
56484514f5e3Sopenharmony_ci{
56494514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
56504514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
56514514f5e3Sopenharmony_ci    JSHandle<JSFunction> fun = JSHandle<JSFunction>::Cast(JSNApiHelper::ToJSHandle(cb));
56524514f5e3Sopenharmony_ci    JSHandle<TaggedArray> array = vm->GetFactory()->EmptyArray();
56534514f5e3Sopenharmony_ci    JSHandle<MicroJobQueue> job = thread->GetCurrentEcmaContext()->GetMicroJobQueue();
56544514f5e3Sopenharmony_ci    MicroJobQueue::EnqueueJob(thread, job, queueType, fun, array);
56554514f5e3Sopenharmony_ci}
56564514f5e3Sopenharmony_ci
56574514f5e3Sopenharmony_cibool JSNApi::ExecuteModuleFromBuffer(EcmaVM *vm, const void *data, int32_t size, const std::string &file)
56584514f5e3Sopenharmony_ci{
56594514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
56604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
56614514f5e3Sopenharmony_ci    if (!ecmascript::JSPandaFileExecutor::ExecuteFromBuffer(thread, data, size, ENTRY_POINTER, file.c_str(), false,
56624514f5e3Sopenharmony_ci        true)) {
56634514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
56644514f5e3Sopenharmony_ci            ecmascript::JsStackInfo::BuildCrashInfo(thread);
56654514f5e3Sopenharmony_ci        }
56664514f5e3Sopenharmony_ci        std::cerr << "Cannot execute panda file from memory" << std::endl;
56674514f5e3Sopenharmony_ci        return false;
56684514f5e3Sopenharmony_ci    }
56694514f5e3Sopenharmony_ci    return true;
56704514f5e3Sopenharmony_ci}
56714514f5e3Sopenharmony_ci
56724514f5e3Sopenharmony_ciLocal<JSValueRef>  JSNApi::NapiHasProperty(const EcmaVM *vm, uintptr_t nativeObj, uintptr_t key)
56734514f5e3Sopenharmony_ci{
56744514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
56754514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
56764514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
56774514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(nativeObj);
56784514f5e3Sopenharmony_ci    if (!(obj->IsECMAObject() || obj->IsCallable())) {
56794514f5e3Sopenharmony_ci        // When input validation is failed, we return JSTaggedValue::Hole to napi native engine.
56804514f5e3Sopenharmony_ci        // Using JSTaggedValue::Hole as the "hand-shaking-protocol" to tell native engine to change error state.
56814514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> holeHandle(thread, JSTaggedValue::Hole());
56824514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(holeHandle));
56834514f5e3Sopenharmony_ci    }
56844514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
56854514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> keyValue(key);
56864514f5e3Sopenharmony_ci    JSTaggedValue res = ObjectFastOperator::TryFastHasProperty(thread, obj.GetTaggedValue(),
56874514f5e3Sopenharmony_ci                                                               keyValue);
56884514f5e3Sopenharmony_ci    if (!res.IsHole()) {
56894514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
56904514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
56914514f5e3Sopenharmony_ci    }
56924514f5e3Sopenharmony_ci    auto ret = JSTaggedValue(JSTaggedValue::HasProperty(thread, obj, keyValue));
56934514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, ret)));
56944514f5e3Sopenharmony_ci}
56954514f5e3Sopenharmony_ci
56964514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::NapiHasOwnProperty(const EcmaVM *vm, uintptr_t nativeObj, uintptr_t key)
56974514f5e3Sopenharmony_ci{
56984514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
56994514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
57004514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
57014514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(nativeObj);
57024514f5e3Sopenharmony_ci    if (!(obj->IsECMAObject() || obj->IsCallable())) {
57034514f5e3Sopenharmony_ci        // When input validation is failed, we return JSTaggedValue::Hole to napi native engine.
57044514f5e3Sopenharmony_ci        // Using JSTaggedValue::Hole as the "hand-shaking-protocol" to tell native engine to change error state.
57054514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> holeHandle(thread, JSTaggedValue::Hole());
57064514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(holeHandle));
57074514f5e3Sopenharmony_ci    }
57084514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
57094514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> keyValue(key);
57104514f5e3Sopenharmony_ci    JSTaggedValue res = ObjectFastOperator::TryFastHasProperty(thread, obj.GetTaggedValue(),
57114514f5e3Sopenharmony_ci                                                               keyValue);
57124514f5e3Sopenharmony_ci    if (!res.IsHole()) {
57134514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
57144514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
57154514f5e3Sopenharmony_ci    }
57164514f5e3Sopenharmony_ci    auto ret = JSTaggedValue(JSTaggedValue::HasProperty(thread, obj, keyValue));
57174514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, ret)));
57184514f5e3Sopenharmony_ci}
57194514f5e3Sopenharmony_ci
57204514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::NapiGetProperty(const EcmaVM *vm, uintptr_t nativeObj, uintptr_t key)
57214514f5e3Sopenharmony_ci{
57224514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
57234514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
57244514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
57254514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(nativeObj);
57264514f5e3Sopenharmony_ci    if (!(obj->IsECMAObject() || obj->IsCallable())) {
57274514f5e3Sopenharmony_ci        // When input validation is failed, we return JSTaggedValue::Hole to napi native engine.
57284514f5e3Sopenharmony_ci        // Using JSTaggedValue::Hole as the "hand-shaking-protocol" to tell native engine to change error state.
57294514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> holeHandle(thread, JSTaggedValue::Hole());
57304514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(holeHandle));
57314514f5e3Sopenharmony_ci    }
57324514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
57334514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> keyValue(key);
57344514f5e3Sopenharmony_ci    if (!obj->IsHeapObject()) {
57354514f5e3Sopenharmony_ci        OperationResult ret = JSTaggedValue::GetProperty(thread, obj, keyValue);
57364514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
57374514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(ret.GetValue()));
57384514f5e3Sopenharmony_ci    }
57394514f5e3Sopenharmony_ci
57404514f5e3Sopenharmony_ci    JSTaggedValue res = ObjectFastOperator::TryFastGetPropertyByValue(thread, obj.GetTaggedValue(),
57414514f5e3Sopenharmony_ci                                                                      keyValue);
57424514f5e3Sopenharmony_ci    if (!res.IsHole()) {
57434514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
57444514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
57454514f5e3Sopenharmony_ci    }
57464514f5e3Sopenharmony_ci
57474514f5e3Sopenharmony_ci    JSTaggedValue ret = ObjectFastOperator::FastGetPropertyByValue(thread, obj.GetTaggedValue(),
57484514f5e3Sopenharmony_ci                                                                   keyValue.GetTaggedValue());
57494514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
57504514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, ret)));
57514514f5e3Sopenharmony_ci}
57524514f5e3Sopenharmony_ci
57534514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::NapiDeleteProperty(const EcmaVM *vm, uintptr_t nativeObj, uintptr_t key)
57544514f5e3Sopenharmony_ci{
57554514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
57564514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
57574514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
57584514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(nativeObj);
57594514f5e3Sopenharmony_ci    if (!(obj->IsECMAObject() || obj->IsCallable())) {
57604514f5e3Sopenharmony_ci        // When input validation is failed, we return JSTaggedValue::Hole to napi native engine.
57614514f5e3Sopenharmony_ci        // Using JSTaggedValue::Hole as the "hand-shaking-protocol" to tell native engine to change error state.
57624514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> holeHandle(thread, JSTaggedValue::Hole());
57634514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(holeHandle));
57644514f5e3Sopenharmony_ci    }
57654514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
57664514f5e3Sopenharmony_ci    JSMutableHandle<JSTaggedValue> keyValue(key);
57674514f5e3Sopenharmony_ci    if (keyValue->IsString() && !EcmaStringAccessor(keyValue.GetTaggedValue()).IsInternString()) {
57684514f5e3Sopenharmony_ci        [[maybe_unused]] ecmascript::EcmaHandleScope handleScope(thread);
57694514f5e3Sopenharmony_ci        auto string = thread->GetEcmaVM()->GetFactory()->InternString(keyValue);
57704514f5e3Sopenharmony_ci        EcmaStringAccessor(string).SetInternString();
57714514f5e3Sopenharmony_ci        keyValue.Update(JSTaggedValue(string));
57724514f5e3Sopenharmony_ci    }
57734514f5e3Sopenharmony_ci    auto ret = JSTaggedValue(JSTaggedValue::DeleteProperty(thread, obj, keyValue));
57744514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, ret)));
57754514f5e3Sopenharmony_ci}
57764514f5e3Sopenharmony_ci
57774514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::NapiGetNamedProperty(const EcmaVM *vm, uintptr_t nativeObj, const char* utf8Key)
57784514f5e3Sopenharmony_ci{
57794514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
57804514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
57814514f5e3Sopenharmony_ci    EscapeLocalScope scope(vm);
57824514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> obj(nativeObj);
57834514f5e3Sopenharmony_ci    if (!(obj->IsECMAObject() || obj->IsCallable())) {
57844514f5e3Sopenharmony_ci        // When input validation is failed, we return JSTaggedValue::Hole to napi native engine.
57854514f5e3Sopenharmony_ci        // Using JSTaggedValue::Hole as the "hand-shaking-protocol" to tell native engine to change error state.
57864514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> holeHandle(thread, JSTaggedValue::Hole());
57874514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(holeHandle));
57884514f5e3Sopenharmony_ci    }
57894514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(obj, ERROR);
57904514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
57914514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> keyValue(factory->NewFromUtf8(utf8Key));
57924514f5e3Sopenharmony_ci    if (!obj->IsHeapObject()) {
57934514f5e3Sopenharmony_ci        OperationResult ret = JSTaggedValue::GetProperty(thread, obj, keyValue);
57944514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
57954514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(ret.GetValue()));
57964514f5e3Sopenharmony_ci    }
57974514f5e3Sopenharmony_ci
57984514f5e3Sopenharmony_ci    // FastPath - Try find key entry in cache directly.
57994514f5e3Sopenharmony_ci    JSTaggedValue res = ObjectFastOperator::TryGetPropertyByNameThroughCacheAtLocal(thread, obj.GetTaggedValue(),
58004514f5e3Sopenharmony_ci                                                                                    keyValue.GetTaggedValue());
58014514f5e3Sopenharmony_ci    if (!res.IsHole()) {
58024514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
58034514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
58044514f5e3Sopenharmony_ci    }
58054514f5e3Sopenharmony_ci    if (!KeyIsNumber(utf8Key)) {
58064514f5e3Sopenharmony_ci        res = ObjectFastOperator::GetPropertyByName(thread, obj.GetTaggedValue(), keyValue.GetTaggedValue());
58074514f5e3Sopenharmony_ci        if (res.IsHole()) {
58084514f5e3Sopenharmony_ci            res = JSTaggedValue::GetProperty(thread, obj, keyValue).GetValue().GetTaggedValue();
58094514f5e3Sopenharmony_ci            RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
58104514f5e3Sopenharmony_ci            return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
58114514f5e3Sopenharmony_ci        }
58124514f5e3Sopenharmony_ci        RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
58134514f5e3Sopenharmony_ci        return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
58144514f5e3Sopenharmony_ci    }
58154514f5e3Sopenharmony_ci    res = ObjectFastOperator::FastGetPropertyByValue(thread, obj.GetTaggedValue(), keyValue.GetTaggedValue());
58164514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
58174514f5e3Sopenharmony_ci    return scope.Escape(JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, res)));
58184514f5e3Sopenharmony_ci}
58194514f5e3Sopenharmony_ci
58204514f5e3Sopenharmony_ciLocal<JSValueRef> JSNApi::CreateLocal(const EcmaVM *vm, panda::JSValueRef src)
58214514f5e3Sopenharmony_ci{
58224514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
58234514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> handle(vm->GetJSThread(), JSNApiHelper::ToJSTaggedValue(&src));
58244514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(handle);
58254514f5e3Sopenharmony_ci}
58264514f5e3Sopenharmony_ci
58274514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetExportObject(EcmaVM *vm, const std::string &file, const std::string &key)
58284514f5e3Sopenharmony_ci{
58294514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
58304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
58314514f5e3Sopenharmony_ci    ecmascript::CString entry = file.c_str();
58324514f5e3Sopenharmony_ci    ecmascript::CString name = vm->GetAssetPath();
58334514f5e3Sopenharmony_ci    if (!vm->IsBundlePack()) {
58344514f5e3Sopenharmony_ci        ModulePathHelper::ParseAbcPathAndOhmUrl(vm, entry, name, entry);
58354514f5e3Sopenharmony_ci        std::shared_ptr<JSPandaFile> jsPandaFile =
58364514f5e3Sopenharmony_ci            JSPandaFileManager::GetInstance()->LoadJSPandaFile(thread, name, entry.c_str(), false);
58374514f5e3Sopenharmony_ci        if (jsPandaFile == nullptr) {
58384514f5e3Sopenharmony_ci            JSHandle<JSTaggedValue> exportObj(thread, JSTaggedValue::Null());
58394514f5e3Sopenharmony_ci            return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58404514f5e3Sopenharmony_ci        }
58414514f5e3Sopenharmony_ci        if (!jsPandaFile->IsRecordWithBundleName()) {
58424514f5e3Sopenharmony_ci            PathHelper::AdaptOldIsaRecord(entry);
58434514f5e3Sopenharmony_ci        }
58444514f5e3Sopenharmony_ci    }
58454514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
58464514f5e3Sopenharmony_ci    JSHandle<ecmascript::SourceTextModule> ecmaModule = moduleManager->GetImportedModule(entry);
58474514f5e3Sopenharmony_ci    if (ecmaModule->GetIsNewBcVersion()) {
58484514f5e3Sopenharmony_ci        int index = ecmascript::ModuleManager::GetExportObjectIndex(vm, ecmaModule, key.c_str());
58494514f5e3Sopenharmony_ci        JSTaggedValue result = ecmaModule->GetModuleValue(thread, index, false);
58504514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exportObj(thread, result);
58514514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58524514f5e3Sopenharmony_ci    }
58534514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
58544514f5e3Sopenharmony_ci    JSHandle<EcmaString> keyHandle = factory->NewFromASCII(key.c_str());
58554514f5e3Sopenharmony_ci
58564514f5e3Sopenharmony_ci    JSTaggedValue result = ecmaModule->GetModuleValue(thread, keyHandle.GetTaggedValue(), false);
58574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exportObj(thread, result);
58584514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58594514f5e3Sopenharmony_ci}
58604514f5e3Sopenharmony_ci
58614514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetExportObjectFromBuffer(EcmaVM *vm, const std::string &file,
58624514f5e3Sopenharmony_ci                                                   const std::string &key)
58634514f5e3Sopenharmony_ci{
58644514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
58654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
58664514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
58674514f5e3Sopenharmony_ci    JSHandle<ecmascript::SourceTextModule> ecmaModule = moduleManager->GetImportedModule(file.c_str());
58684514f5e3Sopenharmony_ci    if (ecmaModule->GetIsNewBcVersion()) {
58694514f5e3Sopenharmony_ci        int index = ecmascript::ModuleManager::GetExportObjectIndex(vm, ecmaModule, key.c_str());
58704514f5e3Sopenharmony_ci        JSTaggedValue result = ecmaModule->GetModuleValue(thread, index, false);
58714514f5e3Sopenharmony_ci        JSHandle<JSTaggedValue> exportObj(thread, result);
58724514f5e3Sopenharmony_ci        return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58734514f5e3Sopenharmony_ci    }
58744514f5e3Sopenharmony_ci
58754514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
58764514f5e3Sopenharmony_ci    JSHandle<EcmaString> keyHandle = factory->NewFromASCII(key.c_str());
58774514f5e3Sopenharmony_ci    JSTaggedValue result = ecmaModule->GetModuleValue(thread, keyHandle.GetTaggedValue(), false);
58784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exportObj(thread, result);
58794514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58804514f5e3Sopenharmony_ci}
58814514f5e3Sopenharmony_ci
58824514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetExportObjectFromOhmUrl(EcmaVM *vm, const std::string &ohmUrl, const std::string &key)
58834514f5e3Sopenharmony_ci{
58844514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
58854514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
58864514f5e3Sopenharmony_ci    ecmascript::CString recordName;
58874514f5e3Sopenharmony_ci    // Check and translate OhmUrl to recordName
58884514f5e3Sopenharmony_ci    if (!ModulePathHelper::CheckAndGetRecordName(thread, ohmUrl.c_str(), recordName)) {
58894514f5e3Sopenharmony_ci        LOG_FULL(FATAL) << "ExecuteSecureWithOhmUrl: Invalid input OhmUrl: " << ohmUrl;
58904514f5e3Sopenharmony_ci        return JSValueRef::Undefined(vm);
58914514f5e3Sopenharmony_ci    }
58924514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
58934514f5e3Sopenharmony_ci    JSHandle<ecmascript::SourceTextModule> ecmaModule = moduleManager->GetImportedModule(recordName.c_str());
58944514f5e3Sopenharmony_ci    int index = ecmascript::ModuleManager::GetExportObjectIndex(vm, ecmaModule, key.c_str());
58954514f5e3Sopenharmony_ci    JSTaggedValue result = ecmaModule->GetModuleValue(thread, index, false);
58964514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exportObj(thread, result);
58974514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
58984514f5e3Sopenharmony_ci}
58994514f5e3Sopenharmony_ci
59004514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::ExecuteNativeModule(EcmaVM *vm, const std::string &key)
59014514f5e3Sopenharmony_ci{
59024514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
59034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
59044514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
59054514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> exportObj = moduleManager->LoadNativeModule(thread, key.c_str());
59064514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(exportObj);
59074514f5e3Sopenharmony_ci}
59084514f5e3Sopenharmony_ci
59094514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetModuleNameSpaceFromFile(EcmaVM *vm, const std::string &file, const std::string &module_path)
59104514f5e3Sopenharmony_ci{
59114514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
59124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
59134514f5e3Sopenharmony_ci    ecmascript::CString recordNameStr;
59144514f5e3Sopenharmony_ci    ecmascript::CString abcFilePath;
59154514f5e3Sopenharmony_ci    if (module_path.size() != 0) {
59164514f5e3Sopenharmony_ci        ecmascript::CString moduleName = ModulePathHelper::GetModuleNameWithPath(module_path.c_str());
59174514f5e3Sopenharmony_ci        abcFilePath = ModulePathHelper::ConcatPandaFilePath(moduleName);
59184514f5e3Sopenharmony_ci        recordNameStr = ModulePathHelper::TranslateNapiFileRequestPath(thread, module_path.c_str(), file.c_str());
59194514f5e3Sopenharmony_ci    } else {
59204514f5e3Sopenharmony_ci        // need get moduleName from stack
59214514f5e3Sopenharmony_ci        std::pair<std::string, std::string> moduleInfo = vm->GetCurrentModuleInfo(false);
59224514f5e3Sopenharmony_ci        if (thread->HasPendingException()) {
59234514f5e3Sopenharmony_ci            thread->GetCurrentEcmaContext()->HandleUncaughtException();
59244514f5e3Sopenharmony_ci            return JSValueRef::Undefined(vm);
59254514f5e3Sopenharmony_ci        }
59264514f5e3Sopenharmony_ci        std::string path = std::string(vm->GetBundleName().c_str()) + PathHelper::SLASH_TAG +
59274514f5e3Sopenharmony_ci            moduleInfo.first;
59284514f5e3Sopenharmony_ci        abcFilePath = moduleInfo.second;
59294514f5e3Sopenharmony_ci        recordNameStr = ModulePathHelper::TranslateNapiFileRequestPath(thread, path.c_str(), file.c_str());
59304514f5e3Sopenharmony_ci    }
59314514f5e3Sopenharmony_ci    LOG_ECMA(DEBUG) << "JSNApi::LoadModuleNameSpaceFromFile: Concated recordName " << recordNameStr;
59324514f5e3Sopenharmony_ci    ecmascript::ModuleManager *moduleManager = thread->GetCurrentEcmaContext()->GetModuleManager();
59334514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> moduleNamespace = moduleManager->
59344514f5e3Sopenharmony_ci        GetModuleNameSpaceFromFile(thread, recordNameStr, abcFilePath);
59354514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(moduleNamespace);
59364514f5e3Sopenharmony_ci}
59374514f5e3Sopenharmony_ci
59384514f5e3Sopenharmony_ciLocal<ObjectRef> JSNApi::GetModuleNameSpaceWithModuleInfo(EcmaVM *vm, const std::string &file,
59394514f5e3Sopenharmony_ci                                                          const std::string &module_path)
59404514f5e3Sopenharmony_ci{
59414514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
59424514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
59434514f5e3Sopenharmony_ci    ecmascript::CString moduleStr = ModulePathHelper::GetModuleNameWithPath(module_path.c_str());
59444514f5e3Sopenharmony_ci    ecmascript::CString srcPrefix = moduleStr + ModulePathHelper::PHYCICAL_FILE_PATH;
59454514f5e3Sopenharmony_ci    std::string prefix = ConvertToStdString(srcPrefix);
59464514f5e3Sopenharmony_ci    if (file.find(srcPrefix) == 0)  {
59474514f5e3Sopenharmony_ci        std::string fileName = file.substr(prefix.size() + 1);
59484514f5e3Sopenharmony_ci        return GetModuleNameSpaceFromFile(vm, fileName, module_path);
59494514f5e3Sopenharmony_ci    }
59504514f5e3Sopenharmony_ci    ecmascript::CString requestPath = file.c_str();
59514514f5e3Sopenharmony_ci    ecmascript::CString modulePath = module_path.c_str();
59524514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> nameSp = ecmascript::NapiModuleLoader::LoadModuleNameSpaceWithModuleInfo(vm,
59534514f5e3Sopenharmony_ci        requestPath, modulePath);
59544514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(nameSp);
59554514f5e3Sopenharmony_ci}
59564514f5e3Sopenharmony_ci
59574514f5e3Sopenharmony_ci// ---------------------------------- Promise -------------------------------------
59584514f5e3Sopenharmony_ciLocal<PromiseRef> PromiseRef::Catch(const EcmaVM *vm, Local<FunctionRef> handler)
59594514f5e3Sopenharmony_ci{
59604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
59614514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
59624514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
59634514f5e3Sopenharmony_ci
59644514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> promise = JSNApiHelper::ToJSHandle(this);
59654514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
59664514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> catchKey(thread, constants->GetPromiseCatchString());
59674514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> reject = JSNApiHelper::ToJSHandle(handler);
59684514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined = constants->GetHandledUndefined();
59694514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
59704514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, undefined, promise, undefined, 1);
59714514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
59724514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
59734514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(reject.GetTaggedValue().GetRawData());
59744514f5e3Sopenharmony_ci#endif
59754514f5e3Sopenharmony_ci    info->SetCallArg(reject.GetTaggedValue());
59764514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Invoke(info, catchKey);
59774514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
59784514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
59794514f5e3Sopenharmony_ci#endif
59804514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
59814514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseRef>(JSHandle<JSTaggedValue>(thread, result));
59824514f5e3Sopenharmony_ci}
59834514f5e3Sopenharmony_ci
59844514f5e3Sopenharmony_ciLocal<PromiseRef> PromiseRef::Finally(const EcmaVM *vm, Local<FunctionRef> handler)
59854514f5e3Sopenharmony_ci{
59864514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
59874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
59884514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
59894514f5e3Sopenharmony_ci
59904514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> promise = JSNApiHelper::ToJSHandle(this);
59914514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
59924514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> finallyKey = constants->GetHandledPromiseFinallyString();
59934514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resolver = JSNApiHelper::ToJSHandle(handler);
59944514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined(constants->GetHandledUndefined());
59954514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
59964514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, undefined, promise, undefined, 2); // 2: two args
59974514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
59984514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
59994514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(resolver.GetTaggedValue().GetRawData());
60004514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(undefined.GetTaggedValue().GetRawData());
60014514f5e3Sopenharmony_ci#endif
60024514f5e3Sopenharmony_ci    info->SetCallArg(resolver.GetTaggedValue(), undefined.GetTaggedValue());
60034514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Invoke(info, finallyKey);
60044514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
60054514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
60064514f5e3Sopenharmony_ci#endif
60074514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
60084514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseRef>(JSHandle<JSTaggedValue>(thread, result));
60094514f5e3Sopenharmony_ci}
60104514f5e3Sopenharmony_ci
60114514f5e3Sopenharmony_ciLocal<PromiseRef> PromiseRef::Then(const EcmaVM *vm, Local<FunctionRef> handler)
60124514f5e3Sopenharmony_ci{
60134514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
60144514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
60154514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
60164514f5e3Sopenharmony_ci
60174514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> promise = JSNApiHelper::ToJSHandle(this);
60184514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
60194514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> thenKey(thread, constants->GetPromiseThenString());
60204514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resolver = JSNApiHelper::ToJSHandle(handler);
60214514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined(constants->GetHandledUndefined());
60224514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
60234514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, undefined, promise, undefined, 2); // 2: two args
60244514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
60254514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
60264514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(resolver.GetTaggedValue().GetRawData());
60274514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(undefined.GetTaggedValue().GetRawData());
60284514f5e3Sopenharmony_ci#endif
60294514f5e3Sopenharmony_ci    info->SetCallArg(resolver.GetTaggedValue(), undefined.GetTaggedValue());
60304514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Invoke(info, thenKey);
60314514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
60324514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
60334514f5e3Sopenharmony_ci#endif
60344514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
60354514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseRef>(JSHandle<JSTaggedValue>(thread, result));
60364514f5e3Sopenharmony_ci}
60374514f5e3Sopenharmony_ci
60384514f5e3Sopenharmony_ciLocal<PromiseRef> PromiseRef::Then(const EcmaVM *vm, Local<FunctionRef> onFulfilled, Local<FunctionRef> onRejected)
60394514f5e3Sopenharmony_ci{
60404514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
60414514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
60424514f5e3Sopenharmony_ci    const GlobalEnvConstants *constants = thread->GlobalConstants();
60434514f5e3Sopenharmony_ci
60444514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> promise = JSNApiHelper::ToJSHandle(this);
60454514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
60464514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> thenKey(thread, constants->GetPromiseThenString());
60474514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> resolver = JSNApiHelper::ToJSHandle(onFulfilled);
60484514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> reject = JSNApiHelper::ToJSHandle(onRejected);
60494514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> undefined(constants->GetHandledUndefined());
60504514f5e3Sopenharmony_ci    EcmaRuntimeCallInfo *info =
60514514f5e3Sopenharmony_ci        ecmascript::EcmaInterpreter::NewRuntimeCallInfo(thread, undefined, promise, undefined, 2); // 2: two args
60524514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
60534514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_ARGV_CHECK
60544514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(resolver.GetTaggedValue().GetRawData());
60554514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(reject.GetTaggedValue().GetRawData());
60564514f5e3Sopenharmony_ci#endif
60574514f5e3Sopenharmony_ci    info->SetCallArg(resolver.GetTaggedValue(), reject.GetTaggedValue());
60584514f5e3Sopenharmony_ci    JSTaggedValue result = JSFunction::Invoke(info, thenKey);
60594514f5e3Sopenharmony_ci#if ECMASCRIPT_ENABLE_STUB_RESULT_CHECK
60604514f5e3Sopenharmony_ci    thread->CheckJSTaggedType(result.GetRawData());
60614514f5e3Sopenharmony_ci#endif
60624514f5e3Sopenharmony_ci    RETURN_VALUE_IF_ABRUPT(thread, JSValueRef::Undefined(vm));
60634514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<PromiseRef>(JSHandle<JSTaggedValue>(thread, result));
60644514f5e3Sopenharmony_ci}
60654514f5e3Sopenharmony_ci
60664514f5e3Sopenharmony_ciLocal<JSValueRef> PromiseRef::GetPromiseState(const EcmaVM *vm)
60674514f5e3Sopenharmony_ci{
60684514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
60694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
60704514f5e3Sopenharmony_ci    JSHandle<JSPromise> promise(JSNApiHelper::ToJSHandle(this));
60714514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
60724514f5e3Sopenharmony_ci
60734514f5e3Sopenharmony_ci    ecmascript::PromiseState state = promise->GetPromiseState();
60744514f5e3Sopenharmony_ci    std::string promiseStateStr;
60754514f5e3Sopenharmony_ci    switch (state) {
60764514f5e3Sopenharmony_ci        case ecmascript::PromiseState::PENDING:
60774514f5e3Sopenharmony_ci            promiseStateStr = "Pending";
60784514f5e3Sopenharmony_ci            break;
60794514f5e3Sopenharmony_ci        case ecmascript::PromiseState::FULFILLED:
60804514f5e3Sopenharmony_ci            promiseStateStr = "Fulfilled";
60814514f5e3Sopenharmony_ci            break;
60824514f5e3Sopenharmony_ci        case ecmascript::PromiseState::REJECTED:
60834514f5e3Sopenharmony_ci            promiseStateStr = "Rejected";
60844514f5e3Sopenharmony_ci            break;
60854514f5e3Sopenharmony_ci    }
60864514f5e3Sopenharmony_ci
60874514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
60884514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(factory->NewFromStdString(promiseStateStr)));
60894514f5e3Sopenharmony_ci}
60904514f5e3Sopenharmony_ci
60914514f5e3Sopenharmony_ciLocal<JSValueRef> PromiseRef::GetPromiseResult(const EcmaVM *vm)
60924514f5e3Sopenharmony_ci{
60934514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
60944514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
60954514f5e3Sopenharmony_ci    JSHandle<JSPromise> promise(JSNApiHelper::ToJSHandle(this));
60964514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(promise, ERROR);
60974514f5e3Sopenharmony_ci
60984514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(vm->GetJSThread(), promise->GetPromiseResult()));
60994514f5e3Sopenharmony_ci}
61004514f5e3Sopenharmony_ci// ---------------------------------- ProxyRef -----------------------------------------
61014514f5e3Sopenharmony_ciLocal<JSValueRef> ProxyRef::GetHandler(const EcmaVM *vm)
61024514f5e3Sopenharmony_ci{
61034514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
61044514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
61054514f5e3Sopenharmony_ci    JSHandle<JSProxy> jsProxy(JSNApiHelper::ToJSHandle(this));
61064514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, jsProxy->GetHandler()));
61074514f5e3Sopenharmony_ci}
61084514f5e3Sopenharmony_ci
61094514f5e3Sopenharmony_ciLocal<JSValueRef> ProxyRef::GetTarget(const EcmaVM *vm)
61104514f5e3Sopenharmony_ci{
61114514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
61124514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope scope(vm->GetJSThread());
61134514f5e3Sopenharmony_ci    JSHandle<JSProxy> jsProxy(JSNApiHelper::ToJSHandle(this));
61144514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, jsProxy->GetTarget()));
61154514f5e3Sopenharmony_ci}
61164514f5e3Sopenharmony_ci
61174514f5e3Sopenharmony_cibool ProxyRef::IsRevoked()
61184514f5e3Sopenharmony_ci{
61194514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, false);
61204514f5e3Sopenharmony_ci    JSHandle<JSProxy> jsProxy(JSNApiHelper::ToJSHandle(this));
61214514f5e3Sopenharmony_ci    return jsProxy->GetIsRevoked();
61224514f5e3Sopenharmony_ci}
61234514f5e3Sopenharmony_ci
61244514f5e3Sopenharmony_ci// ---------------------------------- SetRef --------------------------------------
61254514f5e3Sopenharmony_ciint32_t SetRef::GetSize(const EcmaVM *vm)
61264514f5e3Sopenharmony_ci{
61274514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
61284514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
61294514f5e3Sopenharmony_ci    JSHandle<JSSet> set(JSNApiHelper::ToJSHandle(this));
61304514f5e3Sopenharmony_ci    return set->GetSize();
61314514f5e3Sopenharmony_ci}
61324514f5e3Sopenharmony_ci
61334514f5e3Sopenharmony_ciint32_t SetRef::GetTotalElements(const EcmaVM *vm)
61344514f5e3Sopenharmony_ci{
61354514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
61364514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
61374514f5e3Sopenharmony_ci    JSHandle<JSSet> set(JSNApiHelper::ToJSHandle(this));
61384514f5e3Sopenharmony_ci    return static_cast<int>(set->GetSize()) +
61394514f5e3Sopenharmony_ci        LinkedHashSet::Cast(set->GetLinkedSet().GetTaggedObject())->NumberOfDeletedElements();
61404514f5e3Sopenharmony_ci}
61414514f5e3Sopenharmony_ci
61424514f5e3Sopenharmony_ciLocal<JSValueRef> SetRef::GetValue(const EcmaVM *vm, int entry)
61434514f5e3Sopenharmony_ci{
61444514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
61454514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
61464514f5e3Sopenharmony_ci    JSHandle<JSSet> set(JSNApiHelper::ToJSHandle(this));
61474514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(set, FATAL);
61484514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, set->GetValue(entry)));
61494514f5e3Sopenharmony_ci}
61504514f5e3Sopenharmony_ci
61514514f5e3Sopenharmony_ciLocal<SetRef> SetRef::New(const EcmaVM *vm)
61524514f5e3Sopenharmony_ci{
61534514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
61544514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
61554514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetJSThread()->GetEcmaVM()->GetFactory();
61564514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetJSThread()->GetEcmaVM()->GetGlobalEnv();
61574514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetBuiltinsSetFunction();
61584514f5e3Sopenharmony_ci    JSHandle<JSSet> set =
61594514f5e3Sopenharmony_ci        JSHandle<JSSet>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
61604514f5e3Sopenharmony_ci    JSHandle<LinkedHashSet> hashSet = LinkedHashSet::Create(vm->GetJSThread());
61614514f5e3Sopenharmony_ci    set->SetLinkedSet(vm->GetJSThread(), hashSet);
61624514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setTag = JSHandle<JSTaggedValue>::Cast(set);
61634514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<SetRef>(setTag);
61644514f5e3Sopenharmony_ci}
61654514f5e3Sopenharmony_ci
61664514f5e3Sopenharmony_civoid SetRef::Add(const EcmaVM *vm, Local<JSValueRef> value)
61674514f5e3Sopenharmony_ci{
61684514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
61694514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
61704514f5e3Sopenharmony_ci    JSHandle<JSSet> set(JSNApiHelper::ToJSHandle(this));
61714514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(set, ERROR);
61724514f5e3Sopenharmony_ci    JSSet::Add(vm->GetJSThread(), set, JSNApiHelper::ToJSHandle(value));
61734514f5e3Sopenharmony_ci}
61744514f5e3Sopenharmony_ci
61754514f5e3Sopenharmony_ci// ---------------------------------- WeakMapRef --------------------------------------
61764514f5e3Sopenharmony_ciint32_t WeakMapRef::GetSize(const EcmaVM *vm)
61774514f5e3Sopenharmony_ci{
61784514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
61794514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
61804514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
61814514f5e3Sopenharmony_ci    return weakMap->GetSize();
61824514f5e3Sopenharmony_ci}
61834514f5e3Sopenharmony_ci
61844514f5e3Sopenharmony_ciint32_t WeakMapRef::GetTotalElements(const EcmaVM *vm)
61854514f5e3Sopenharmony_ci{
61864514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
61874514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
61884514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
61894514f5e3Sopenharmony_ci    return weakMap->GetSize() +
61904514f5e3Sopenharmony_ci                LinkedHashMap::Cast(weakMap->GetLinkedMap().GetTaggedObject())->NumberOfDeletedElements();
61914514f5e3Sopenharmony_ci}
61924514f5e3Sopenharmony_ci
61934514f5e3Sopenharmony_ciLocal<JSValueRef> WeakMapRef::GetKey(const EcmaVM *vm, int entry)
61944514f5e3Sopenharmony_ci{
61954514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
61964514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
61974514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
61984514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(weakMap, FATAL);
61994514f5e3Sopenharmony_ci    JSTaggedValue key = weakMap->GetKey(entry);
62004514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, key.GetWeakRawValue()));
62014514f5e3Sopenharmony_ci}
62024514f5e3Sopenharmony_ci
62034514f5e3Sopenharmony_ciLocal<JSValueRef> WeakMapRef::GetValue(const EcmaVM *vm, int entry)
62044514f5e3Sopenharmony_ci{
62054514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
62064514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
62074514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(weakMap, FATAL);
62084514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, weakMap->GetValue(entry)));
62094514f5e3Sopenharmony_ci}
62104514f5e3Sopenharmony_ci
62114514f5e3Sopenharmony_ciLocal<WeakMapRef> WeakMapRef::New(const EcmaVM *vm)
62124514f5e3Sopenharmony_ci{
62134514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
62144514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62154514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetJSThread()->GetEcmaVM()->GetFactory();
62164514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetJSThread()->GetEcmaVM()->GetGlobalEnv();
62174514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetBuiltinsWeakMapFunction();
62184514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap =
62194514f5e3Sopenharmony_ci        JSHandle<JSWeakMap>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
62204514f5e3Sopenharmony_ci    JSHandle<LinkedHashMap> hashMap = LinkedHashMap::Create(vm->GetJSThread());
62214514f5e3Sopenharmony_ci    weakMap->SetLinkedMap(vm->GetJSThread(), hashMap);
62224514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> weakMapTag = JSHandle<JSTaggedValue>::Cast(weakMap);
62234514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<WeakMapRef>(weakMapTag);
62244514f5e3Sopenharmony_ci}
62254514f5e3Sopenharmony_ci
62264514f5e3Sopenharmony_civoid WeakMapRef::Set(const EcmaVM *vm, const Local<JSValueRef> &key, const Local<JSValueRef> &value)
62274514f5e3Sopenharmony_ci{
62284514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
62294514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62304514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
62314514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(weakMap, FATAL);
62324514f5e3Sopenharmony_ci    JSWeakMap::Set(vm->GetJSThread(), weakMap, JSNApiHelper::ToJSHandle(key), JSNApiHelper::ToJSHandle(value));
62334514f5e3Sopenharmony_ci}
62344514f5e3Sopenharmony_ci
62354514f5e3Sopenharmony_cibool WeakMapRef::Has(const EcmaVM *vm, Local<JSValueRef> key)
62364514f5e3Sopenharmony_ci{
62374514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, false);
62384514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, false);
62394514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62404514f5e3Sopenharmony_ci    JSHandle<JSWeakMap> weakMap(JSNApiHelper::ToJSHandle(this));
62414514f5e3Sopenharmony_ci    return weakMap->Has(thread, JSNApiHelper::ToJSTaggedValue(*key));
62424514f5e3Sopenharmony_ci}
62434514f5e3Sopenharmony_ci
62444514f5e3Sopenharmony_ci// ---------------------------------- WeakSetRef --------------------------------------
62454514f5e3Sopenharmony_ciint32_t WeakSetRef::GetSize(const EcmaVM *vm)
62464514f5e3Sopenharmony_ci{
62474514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
62484514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
62494514f5e3Sopenharmony_ci    JSHandle<JSWeakSet> weakSet(JSNApiHelper::ToJSHandle(this));
62504514f5e3Sopenharmony_ci    return weakSet->GetSize();
62514514f5e3Sopenharmony_ci}
62524514f5e3Sopenharmony_ci
62534514f5e3Sopenharmony_ciint32_t WeakSetRef::GetTotalElements(const EcmaVM *vm)
62544514f5e3Sopenharmony_ci{
62554514f5e3Sopenharmony_ci    DCHECK_SPECIAL_VALUE_WITH_RETURN(this, 0);
62564514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
62574514f5e3Sopenharmony_ci    JSHandle<JSWeakSet> weakSet(JSNApiHelper::ToJSHandle(this));
62584514f5e3Sopenharmony_ci    return weakSet->GetSize() +
62594514f5e3Sopenharmony_ci                LinkedHashSet::Cast(weakSet->GetLinkedSet().GetTaggedObject())->NumberOfDeletedElements();
62604514f5e3Sopenharmony_ci}
62614514f5e3Sopenharmony_ci
62624514f5e3Sopenharmony_ciLocal<JSValueRef> WeakSetRef::GetValue(const EcmaVM *vm, int entry)
62634514f5e3Sopenharmony_ci{
62644514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
62654514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62664514f5e3Sopenharmony_ci    JSHandle<JSWeakSet> weakSet(JSNApiHelper::ToJSHandle(this));
62674514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(weakSet, FATAL);
62684514f5e3Sopenharmony_ci    JSTaggedValue value = weakSet->GetValue(entry);
62694514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<JSValueRef>(JSHandle<JSTaggedValue>(thread, value.GetWeakRawValue()));
62704514f5e3Sopenharmony_ci}
62714514f5e3Sopenharmony_ci
62724514f5e3Sopenharmony_ciLocal<WeakSetRef> WeakSetRef::New(const EcmaVM *vm)
62734514f5e3Sopenharmony_ci{
62744514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK_WITH_RETURN(vm, JSValueRef::Undefined(vm));
62754514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62764514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetJSThread()->GetEcmaVM()->GetFactory();
62774514f5e3Sopenharmony_ci    JSHandle<GlobalEnv> env = vm->GetJSThread()->GetEcmaVM()->GetGlobalEnv();
62784514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> constructor = env->GetBuiltinsWeakSetFunction();
62794514f5e3Sopenharmony_ci    JSHandle<JSWeakSet> weakSet =
62804514f5e3Sopenharmony_ci        JSHandle<JSWeakSet>::Cast(factory->NewJSObjectByConstructor(JSHandle<JSFunction>(constructor), constructor));
62814514f5e3Sopenharmony_ci    JSHandle<LinkedHashSet> hashWeakSet = LinkedHashSet::Create(vm->GetJSThread());
62824514f5e3Sopenharmony_ci    weakSet->SetLinkedSet(vm->GetJSThread(), hashWeakSet);
62834514f5e3Sopenharmony_ci    JSHandle<JSTaggedValue> setTag = JSHandle<JSTaggedValue>::Cast(weakSet);
62844514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<WeakSetRef>(setTag);
62854514f5e3Sopenharmony_ci}
62864514f5e3Sopenharmony_ci
62874514f5e3Sopenharmony_civoid WeakSetRef::Add(const EcmaVM *vm, Local<JSValueRef> value)
62884514f5e3Sopenharmony_ci{
62894514f5e3Sopenharmony_ci    CROSS_THREAD_AND_EXCEPTION_CHECK(vm);
62904514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(thread);
62914514f5e3Sopenharmony_ci    JSHandle<JSWeakSet> weakSet(JSNApiHelper::ToJSHandle(this));
62924514f5e3Sopenharmony_ci    LOG_IF_SPECIAL(weakSet, ERROR);
62934514f5e3Sopenharmony_ci    JSWeakSet::Add(vm->GetJSThread(), weakSet, JSNApiHelper::ToJSHandle(value));
62944514f5e3Sopenharmony_ci}
62954514f5e3Sopenharmony_ci
62964514f5e3Sopenharmony_ciTryCatch::~TryCatch() {}
62974514f5e3Sopenharmony_ci
62984514f5e3Sopenharmony_cibool TryCatch::HasCaught() const
62994514f5e3Sopenharmony_ci{
63004514f5e3Sopenharmony_ci    return ecmaVm_->GetJSThread()->HasPendingException();
63014514f5e3Sopenharmony_ci}
63024514f5e3Sopenharmony_ci
63034514f5e3Sopenharmony_civoid TryCatch::Rethrow()
63044514f5e3Sopenharmony_ci{
63054514f5e3Sopenharmony_ci    rethrow_ = true;
63064514f5e3Sopenharmony_ci}
63074514f5e3Sopenharmony_ci
63084514f5e3Sopenharmony_ciLocal<ObjectRef> TryCatch::GetAndClearException()
63094514f5e3Sopenharmony_ci{
63104514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(ecmaVm_->GetJSThread());
63114514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(ecmaVm_->GetAndClearEcmaUncaughtException());
63124514f5e3Sopenharmony_ci}
63134514f5e3Sopenharmony_ci
63144514f5e3Sopenharmony_ciLocal<ObjectRef> TryCatch::GetException()
63154514f5e3Sopenharmony_ci{
63164514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(ecmaVm_->GetJSThread());
63174514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<ObjectRef>(ecmaVm_->GetEcmaUncaughtException());
63184514f5e3Sopenharmony_ci}
63194514f5e3Sopenharmony_ci
63204514f5e3Sopenharmony_civoid TryCatch::ClearException()
63214514f5e3Sopenharmony_ci{
63224514f5e3Sopenharmony_ci    ecmaVm_->GetJSThread()->ClearException();
63234514f5e3Sopenharmony_ci}
63244514f5e3Sopenharmony_ci
63254514f5e3Sopenharmony_cibool ExternalStringCache::RegisterStringCacheTable(const EcmaVM *vm, uint32_t size)
63264514f5e3Sopenharmony_ci{
63274514f5e3Sopenharmony_ci    auto instance = ecmascript::Runtime::GetInstance();
63284514f5e3Sopenharmony_ci    ASSERT(instance != nullptr);
63294514f5e3Sopenharmony_ci
63304514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
63314514f5e3Sopenharmony_ci    return instance->CreateStringCacheTable(size);
63324514f5e3Sopenharmony_ci}
63334514f5e3Sopenharmony_ci
63344514f5e3Sopenharmony_cibool ExternalStringCache::SetCachedString(const EcmaVM *vm, const char *name, uint32_t propertyIndex)
63354514f5e3Sopenharmony_ci{
63364514f5e3Sopenharmony_ci    auto instance = ecmascript::Runtime::GetInstance();
63374514f5e3Sopenharmony_ci    ASSERT(instance != nullptr);
63384514f5e3Sopenharmony_ci
63394514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
63404514f5e3Sopenharmony_ci    [[maybe_unused]] LocalScope scope(vm);
63414514f5e3Sopenharmony_ci    ObjectFactory *factory = vm->GetFactory();
63424514f5e3Sopenharmony_ci    JSHandle<EcmaString> str = factory->NewFromUtf8(name);
63434514f5e3Sopenharmony_ci    return instance->SetCachedString(str, propertyIndex);
63444514f5e3Sopenharmony_ci}
63454514f5e3Sopenharmony_ci
63464514f5e3Sopenharmony_ciLocal<StringRef> ExternalStringCache::GetCachedString(const EcmaVM *vm, uint32_t propertyIndex)
63474514f5e3Sopenharmony_ci{
63484514f5e3Sopenharmony_ci    auto instance = ecmascript::Runtime::GetInstance();
63494514f5e3Sopenharmony_ci    ASSERT(instance != nullptr);
63504514f5e3Sopenharmony_ci
63514514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
63524514f5e3Sopenharmony_ci    JSHandle<EcmaString> str = instance->GetCachedString(vm->GetJSThread(), propertyIndex);
63534514f5e3Sopenharmony_ci    return JSNApiHelper::ToLocal<StringRef>(JSHandle<JSTaggedValue>(str));
63544514f5e3Sopenharmony_ci}
63554514f5e3Sopenharmony_ci
63564514f5e3Sopenharmony_cibool ExternalStringCache::HasCachedString([[maybe_unused]] const EcmaVM *vm, uint32_t propertyIndex)
63574514f5e3Sopenharmony_ci{
63584514f5e3Sopenharmony_ci    auto instance = ecmascript::Runtime::GetInstance();
63594514f5e3Sopenharmony_ci    ASSERT(instance != nullptr);
63604514f5e3Sopenharmony_ci    ecmascript::ThreadManagedScope managedScope(vm->GetJSThread());
63614514f5e3Sopenharmony_ci    return instance->HasCachedString(propertyIndex);
63624514f5e3Sopenharmony_ci}
63634514f5e3Sopenharmony_ci} // namespace panda
6364