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