1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2021-2023 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#include "agent/runtime_impl.h" 17e509ee18Sopenharmony_ci 18e509ee18Sopenharmony_ci#include <iomanip> 19e509ee18Sopenharmony_ci 20e509ee18Sopenharmony_ci#include "tooling/base/pt_returns.h" 21e509ee18Sopenharmony_ci#include "protocol_channel.h" 22e509ee18Sopenharmony_ci 23e509ee18Sopenharmony_ci#include "ecmascript/napi/include/dfx_jsnapi.h" 24e509ee18Sopenharmony_ci 25e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling { 26e509ee18Sopenharmony_ci// Whenever adding a new protocol which is not a standard CDP protocol, 27e509ee18Sopenharmony_ci// must add its methodName to the runtimeProtocolsList 28e509ee18Sopenharmony_civoid RuntimeImpl::InitializeExtendedProtocolsList() 29e509ee18Sopenharmony_ci{ 30e509ee18Sopenharmony_ci std::vector<std::string> runtimeProtocolList {}; 31e509ee18Sopenharmony_ci runtimeExtendedProtocols_ = std::move(runtimeProtocolList); 32e509ee18Sopenharmony_ci} 33e509ee18Sopenharmony_ci 34e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::Dispatch(const DispatchRequest &request) 35e509ee18Sopenharmony_ci{ 36e509ee18Sopenharmony_ci Method method = GetMethodEnum(request.GetMethod()); 37e509ee18Sopenharmony_ci LOG_DEBUGGER(DEBUG) << "dispatch [" << request.GetMethod() << "] to RuntimeImpl"; 38e509ee18Sopenharmony_ci switch (method) { 39e509ee18Sopenharmony_ci case Method::ENABLE: 40e509ee18Sopenharmony_ci Enable(request); 41e509ee18Sopenharmony_ci break; 42e509ee18Sopenharmony_ci case Method::DISABLE: 43e509ee18Sopenharmony_ci Disable(request); 44e509ee18Sopenharmony_ci break; 45e509ee18Sopenharmony_ci case Method::GET_PROPERTIES: 46e509ee18Sopenharmony_ci GetProperties(request); 47e509ee18Sopenharmony_ci break; 48e509ee18Sopenharmony_ci case Method::RUN_IF_WAITING_FOR_DEBUGGER: 49e509ee18Sopenharmony_ci RunIfWaitingForDebugger(request); 50e509ee18Sopenharmony_ci break; 51e509ee18Sopenharmony_ci case Method::GET_HEAP_USAGE: 52e509ee18Sopenharmony_ci GetHeapUsage(request); 53e509ee18Sopenharmony_ci break; 54e509ee18Sopenharmony_ci default: 55e509ee18Sopenharmony_ci SendResponse(request, DispatchResponse::Fail("unknown method: " + request.GetMethod())); 56e509ee18Sopenharmony_ci break; 57e509ee18Sopenharmony_ci } 58e509ee18Sopenharmony_ci} 59e509ee18Sopenharmony_ci 60e509ee18Sopenharmony_ciRuntimeImpl::DispatcherImpl::Method RuntimeImpl::DispatcherImpl::GetMethodEnum(const std::string& method) 61e509ee18Sopenharmony_ci{ 62e509ee18Sopenharmony_ci if (method == "enable") { 63e509ee18Sopenharmony_ci return Method::ENABLE; 64e509ee18Sopenharmony_ci } else if (method == "disable") { 65e509ee18Sopenharmony_ci return Method::DISABLE; 66e509ee18Sopenharmony_ci } else if (method == "getProperties") { 67e509ee18Sopenharmony_ci return Method::GET_PROPERTIES; 68e509ee18Sopenharmony_ci } else if (method == "runIfWaitingForDebugger") { 69e509ee18Sopenharmony_ci return Method::RUN_IF_WAITING_FOR_DEBUGGER; 70e509ee18Sopenharmony_ci } else if (method == "getHeapUsage") { 71e509ee18Sopenharmony_ci return Method::GET_HEAP_USAGE; 72e509ee18Sopenharmony_ci } else { 73e509ee18Sopenharmony_ci return Method::UNKNOWN; 74e509ee18Sopenharmony_ci } 75e509ee18Sopenharmony_ci} 76e509ee18Sopenharmony_ci 77e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::Enable(const DispatchRequest &request) 78e509ee18Sopenharmony_ci{ 79e509ee18Sopenharmony_ci DispatchResponse response = runtime_->Enable(); 80e509ee18Sopenharmony_ci runtime_->InitializeExtendedProtocolsList(); 81e509ee18Sopenharmony_ci EnableReturns result(runtime_->runtimeExtendedProtocols_); 82e509ee18Sopenharmony_ci SendResponse(request, response, result); 83e509ee18Sopenharmony_ci} 84e509ee18Sopenharmony_ci 85e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::Disable(const DispatchRequest &request) 86e509ee18Sopenharmony_ci{ 87e509ee18Sopenharmony_ci DispatchResponse response = runtime_->Disable(); 88e509ee18Sopenharmony_ci SendResponse(request, response); 89e509ee18Sopenharmony_ci} 90e509ee18Sopenharmony_ci 91e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::RunIfWaitingForDebugger(const DispatchRequest &request) 92e509ee18Sopenharmony_ci{ 93e509ee18Sopenharmony_ci DispatchResponse response = runtime_->RunIfWaitingForDebugger(); 94e509ee18Sopenharmony_ci SendResponse(request, response); 95e509ee18Sopenharmony_ci} 96e509ee18Sopenharmony_ci 97e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::GetProperties(const DispatchRequest &request) 98e509ee18Sopenharmony_ci{ 99e509ee18Sopenharmony_ci std::unique_ptr<GetPropertiesParams> params = GetPropertiesParams::Create(request.GetParams()); 100e509ee18Sopenharmony_ci if (params == nullptr) { 101e509ee18Sopenharmony_ci SendResponse(request, DispatchResponse::Fail("wrong params")); 102e509ee18Sopenharmony_ci return; 103e509ee18Sopenharmony_ci } 104e509ee18Sopenharmony_ci 105e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> outPropertyDesc; 106e509ee18Sopenharmony_ci std::optional<std::vector<std::unique_ptr<InternalPropertyDescriptor>>> outInternalDescs; 107e509ee18Sopenharmony_ci std::optional<std::vector<std::unique_ptr<PrivatePropertyDescriptor>>> outPrivateProperties; 108e509ee18Sopenharmony_ci std::optional<std::unique_ptr<ExceptionDetails>> outExceptionDetails; 109e509ee18Sopenharmony_ci DispatchResponse response = runtime_->GetProperties(*params, &outPropertyDesc, &outInternalDescs, 110e509ee18Sopenharmony_ci &outPrivateProperties, &outExceptionDetails); 111e509ee18Sopenharmony_ci if (outExceptionDetails) { 112e509ee18Sopenharmony_ci ASSERT(outExceptionDetails.value() != nullptr); 113e509ee18Sopenharmony_ci LOG_DEBUGGER(WARN) << "GetProperties thrown an exception"; 114e509ee18Sopenharmony_ci } 115e509ee18Sopenharmony_ci GetPropertiesReturns result(std::move(outPropertyDesc), 116e509ee18Sopenharmony_ci std::move(outInternalDescs), 117e509ee18Sopenharmony_ci std::move(outPrivateProperties), 118e509ee18Sopenharmony_ci std::move(outExceptionDetails)); 119e509ee18Sopenharmony_ci SendResponse(request, response, result); 120e509ee18Sopenharmony_ci} 121e509ee18Sopenharmony_ci 122e509ee18Sopenharmony_civoid RuntimeImpl::DispatcherImpl::GetHeapUsage(const DispatchRequest &request) 123e509ee18Sopenharmony_ci{ 124e509ee18Sopenharmony_ci double usedSize = 0; 125e509ee18Sopenharmony_ci double totalSize = 0; 126e509ee18Sopenharmony_ci DispatchResponse response = runtime_->GetHeapUsage(&usedSize, &totalSize); 127e509ee18Sopenharmony_ci GetHeapUsageReturns result(usedSize, totalSize); 128e509ee18Sopenharmony_ci SendResponse(request, response, result); 129e509ee18Sopenharmony_ci} 130e509ee18Sopenharmony_ci 131e509ee18Sopenharmony_cibool RuntimeImpl::Frontend::AllowNotify() const 132e509ee18Sopenharmony_ci{ 133e509ee18Sopenharmony_ci return channel_ != nullptr; 134e509ee18Sopenharmony_ci} 135e509ee18Sopenharmony_ci 136e509ee18Sopenharmony_civoid RuntimeImpl::Frontend::RunIfWaitingForDebugger() 137e509ee18Sopenharmony_ci{ 138e509ee18Sopenharmony_ci if (!AllowNotify()) { 139e509ee18Sopenharmony_ci return; 140e509ee18Sopenharmony_ci } 141e509ee18Sopenharmony_ci 142e509ee18Sopenharmony_ci channel_->RunIfWaitingForDebugger(); 143e509ee18Sopenharmony_ci} 144e509ee18Sopenharmony_ci 145e509ee18Sopenharmony_ciDispatchResponse RuntimeImpl::Enable() 146e509ee18Sopenharmony_ci{ 147e509ee18Sopenharmony_ci internalObjects_ = Global<MapRef>(vm_, MapRef::New(vm_)); 148e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 149e509ee18Sopenharmony_ci} 150e509ee18Sopenharmony_ci 151e509ee18Sopenharmony_ciDispatchResponse RuntimeImpl::Disable() 152e509ee18Sopenharmony_ci{ 153e509ee18Sopenharmony_ci internalObjects_.FreeGlobalHandleAddr(); 154e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 155e509ee18Sopenharmony_ci} 156e509ee18Sopenharmony_ci 157e509ee18Sopenharmony_ciDispatchResponse RuntimeImpl::RunIfWaitingForDebugger() 158e509ee18Sopenharmony_ci{ 159e509ee18Sopenharmony_ci frontend_.RunIfWaitingForDebugger(); 160e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 161e509ee18Sopenharmony_ci} 162e509ee18Sopenharmony_ci 163e509ee18Sopenharmony_ciDispatchResponse RuntimeImpl::GetHeapUsage(double *usedSize, double *totalSize) 164e509ee18Sopenharmony_ci{ 165e509ee18Sopenharmony_ci#ifdef ECMASCRIPT_SUPPORT_HEAPPROFILER 166e509ee18Sopenharmony_ci *totalSize = static_cast<double>(DFXJSNApi::GetHeapTotalSize(vm_)); 167e509ee18Sopenharmony_ci *usedSize = static_cast<double>(DFXJSNApi::GetHeapUsedSize(vm_)); 168e509ee18Sopenharmony_ci#else 169e509ee18Sopenharmony_ci *totalSize = 0; 170e509ee18Sopenharmony_ci *usedSize = 0; 171e509ee18Sopenharmony_ci#endif 172e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 173e509ee18Sopenharmony_ci} 174e509ee18Sopenharmony_ci 175e509ee18Sopenharmony_ciDispatchResponse RuntimeImpl::GetProperties(const GetPropertiesParams ¶ms, 176e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc, 177e509ee18Sopenharmony_ci [[maybe_unused]] std::optional<std::vector<std::unique_ptr<InternalPropertyDescriptor>>> *outInternalDescs, 178e509ee18Sopenharmony_ci [[maybe_unused]] std::optional<std::vector<std::unique_ptr<PrivatePropertyDescriptor>>> *outPrivateProps, 179e509ee18Sopenharmony_ci [[maybe_unused]] std::optional<std::unique_ptr<ExceptionDetails>> *outExceptionDetails) 180e509ee18Sopenharmony_ci{ 181e509ee18Sopenharmony_ci RemoteObjectId objectId = params.GetObjectId(); 182e509ee18Sopenharmony_ci bool isOwn = params.GetOwnProperties(); 183e509ee18Sopenharmony_ci bool isAccessorOnly = params.GetAccessPropertiesOnly(); 184e509ee18Sopenharmony_ci auto iter = properties_.find(objectId); 185e509ee18Sopenharmony_ci if (iter == properties_.end()) { 186e509ee18Sopenharmony_ci LOG_DEBUGGER(ERROR) << "RuntimeImpl::GetProperties Unknown object id: " << objectId; 187e509ee18Sopenharmony_ci return DispatchResponse::Fail("Unknown object id"); 188e509ee18Sopenharmony_ci } 189e509ee18Sopenharmony_ci Local<JSValueRef> value = Local<JSValueRef>(vm_, iter->second); 190e509ee18Sopenharmony_ci if (value.IsEmpty() || !value->IsObject(vm_)) { 191e509ee18Sopenharmony_ci LOG_DEBUGGER(ERROR) << "RuntimeImpl::GetProperties should a js object"; 192e509ee18Sopenharmony_ci return DispatchResponse::Fail("Not a object"); 193e509ee18Sopenharmony_ci } 194e509ee18Sopenharmony_ci bool skipProto = false; 195e509ee18Sopenharmony_ci if (!internalObjects_.IsEmpty() && internalObjects_->Get(vm_, value)->IsNumber()) { 196e509ee18Sopenharmony_ci if (static_cast<ArkInternalValueType>(internalObjects_->Get(vm_, value)->ToNumber(vm_)->Value()) == 197e509ee18Sopenharmony_ci ArkInternalValueType::Entry || static_cast<ArkInternalValueType>(internalObjects_->Get(vm_, value)-> 198e509ee18Sopenharmony_ci ToNumber(vm_)->Value()) == ArkInternalValueType::Scope) { 199e509ee18Sopenharmony_ci skipProto = true; 200e509ee18Sopenharmony_ci } 201e509ee18Sopenharmony_ci } 202e509ee18Sopenharmony_ci if (value->IsArrayBuffer(vm_)) { 203e509ee18Sopenharmony_ci Local<ArrayBufferRef> arrayBufferRef(value); 204e509ee18Sopenharmony_ci AddTypedArrayRefs(arrayBufferRef, outPropertyDesc); 205e509ee18Sopenharmony_ci } else if (value->IsSharedArrayBuffer(vm_)) { 206e509ee18Sopenharmony_ci Local<ArrayBufferRef> arrayBufferRef(value); 207e509ee18Sopenharmony_ci AddSharedArrayBufferRefs(arrayBufferRef, outPropertyDesc); 208e509ee18Sopenharmony_ci } else if (value->IsProxy(vm_)) { 209e509ee18Sopenharmony_ci GetProxyValue(value, outPropertyDesc); 210e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 211e509ee18Sopenharmony_ci } else if (value->IsMapIterator(vm_)) { 212e509ee18Sopenharmony_ci GetMapIteratorValue(value, outPropertyDesc); 213e509ee18Sopenharmony_ci } else if (value->IsSetIterator(vm_)) { 214e509ee18Sopenharmony_ci GetSetIteratorValue(value, outPropertyDesc); 215e509ee18Sopenharmony_ci } else if (value->IsJSPrimitiveRef(vm_) && value->IsJSPrimitiveNumber(vm_)) { 216e509ee18Sopenharmony_ci GetPrimitiveNumberValue(value, outPropertyDesc); 217e509ee18Sopenharmony_ci } else if (value->IsJSPrimitiveRef(vm_) && value->IsJSPrimitiveString(vm_)) { 218e509ee18Sopenharmony_ci GetPrimitiveStringValue(value, outPropertyDesc); 219e509ee18Sopenharmony_ci } else if (value->IsJSPrimitiveRef(vm_) && value->IsJSPrimitiveBoolean(vm_)) { 220e509ee18Sopenharmony_ci GetPrimitiveBooleanValue(value, outPropertyDesc); 221e509ee18Sopenharmony_ci } else if (value->IsGeneratorFunction(vm_)) { 222e509ee18Sopenharmony_ci GetGeneratorFunctionValue(value, outPropertyDesc); 223e509ee18Sopenharmony_ci } else if (value->IsGeneratorObject(vm_)) { 224e509ee18Sopenharmony_ci GetGeneratorObjectValue(value, outPropertyDesc); 225e509ee18Sopenharmony_ci } else if (value->IsJSNumberFormat(vm_)) { 226e509ee18Sopenharmony_ci GetNumberFormatValue(value, outPropertyDesc); 227e509ee18Sopenharmony_ci } else if (value->IsJSCollator(vm_)) { 228e509ee18Sopenharmony_ci GetCollatorValue(value, outPropertyDesc); 229e509ee18Sopenharmony_ci } else if (value->IsJSDateTimeFormat(vm_)) { 230e509ee18Sopenharmony_ci GetDateTimeFormatValue(value, outPropertyDesc); 231e509ee18Sopenharmony_ci } else if (value->IsSharedMap(vm_)) { 232e509ee18Sopenharmony_ci GetSharedMapValue(value, outPropertyDesc); 233e509ee18Sopenharmony_ci } else if (value->IsMap(vm_)) { 234e509ee18Sopenharmony_ci GetMapValue(value, outPropertyDesc); 235e509ee18Sopenharmony_ci } else if (value->IsWeakMap(vm_)) { 236e509ee18Sopenharmony_ci GetWeakMapValue(value, outPropertyDesc); 237e509ee18Sopenharmony_ci } else if (value->IsRegExp(vm_)) { 238e509ee18Sopenharmony_ci GetRegExpValue(value, outPropertyDesc); 239e509ee18Sopenharmony_ci } else if (value->IsSharedSet(vm_)) { 240e509ee18Sopenharmony_ci GetSendableSetValue(value, outPropertyDesc); 241e509ee18Sopenharmony_ci } else if (value->IsSet(vm_)) { 242e509ee18Sopenharmony_ci GetSetValue(value, outPropertyDesc); 243e509ee18Sopenharmony_ci } else if (value->IsWeakSet(vm_)) { 244e509ee18Sopenharmony_ci GetWeakSetValue(value, outPropertyDesc); 245e509ee18Sopenharmony_ci } else if (value->IsDataView(vm_)) { 246e509ee18Sopenharmony_ci GetDataViewValue(value, outPropertyDesc); 247e509ee18Sopenharmony_ci } else if (value->IsHashMap(vm_)) { 248e509ee18Sopenharmony_ci GetHashMapValue(value, outPropertyDesc); 249e509ee18Sopenharmony_ci } else if (value->IsHashSet(vm_)) { 250e509ee18Sopenharmony_ci GetHashSetValue(value, outPropertyDesc); 251e509ee18Sopenharmony_ci } else if (value->IsLightWeightMap(vm_)) { 252e509ee18Sopenharmony_ci GetLightWeightMapValue(value, outPropertyDesc); 253e509ee18Sopenharmony_ci } else if (value->IsLightWeightSet(vm_)) { 254e509ee18Sopenharmony_ci GetLightWeightSetValue(value, outPropertyDesc); 255e509ee18Sopenharmony_ci } else if (value->IsLinkedList(vm_)) { 256e509ee18Sopenharmony_ci GetLinkedListValue(value, outPropertyDesc); 257e509ee18Sopenharmony_ci } else if (value->IsList(vm_)) { 258e509ee18Sopenharmony_ci GetListValue(value, outPropertyDesc); 259e509ee18Sopenharmony_ci } else if (value->IsPlainArray(vm_)) { 260e509ee18Sopenharmony_ci GetPlainArrayValue(value, outPropertyDesc); 261e509ee18Sopenharmony_ci } else if (value->IsTreeMap(vm_)) { 262e509ee18Sopenharmony_ci GetTreeMapValue(value, outPropertyDesc); 263e509ee18Sopenharmony_ci } else if (value->IsTreeSet(vm_)) { 264e509ee18Sopenharmony_ci GetTreeSetValue(value, outPropertyDesc); 265e509ee18Sopenharmony_ci } else if (value->IsArrayList(vm_)) { 266e509ee18Sopenharmony_ci GetArrayListValue(value, outPropertyDesc); 267e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 268e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 269e509ee18Sopenharmony_ci } else if (value->IsDeque(vm_)) { 270e509ee18Sopenharmony_ci GetDequeValue(value, outPropertyDesc); 271e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 272e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 273e509ee18Sopenharmony_ci } else if (value->IsQueue(vm_)) { 274e509ee18Sopenharmony_ci GetQueueValue(value, outPropertyDesc); 275e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 276e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 277e509ee18Sopenharmony_ci } else if (value->IsStack(vm_)) { 278e509ee18Sopenharmony_ci GetStackValue(value, outPropertyDesc); 279e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 280e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 281e509ee18Sopenharmony_ci } else if (value->IsVector(vm_)) { 282e509ee18Sopenharmony_ci GetVectorValue(value, outPropertyDesc); 283e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 284e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 285e509ee18Sopenharmony_ci } else if (value->IsPromise(vm_)) { 286e509ee18Sopenharmony_ci GetPromiseValue(value, outPropertyDesc); 287e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 288e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 289e509ee18Sopenharmony_ci } 290e509ee18Sopenharmony_ci Local<ArrayRef> keys = Local<ObjectRef>(value)->GetOwnPropertyNames(vm_); 291e509ee18Sopenharmony_ci int32_t length = static_cast<int32_t>(keys->Length(vm_)); 292e509ee18Sopenharmony_ci Local<JSValueRef> name = JSValueRef::Undefined(vm_); 293e509ee18Sopenharmony_ci for (int32_t i = 0; i < length; ++i) { 294e509ee18Sopenharmony_ci name = keys->Get(vm_, i); 295e509ee18Sopenharmony_ci PropertyAttribute jsProperty = PropertyAttribute::Default(); 296e509ee18Sopenharmony_ci if (!Local<ObjectRef>(value)->GetOwnProperty(vm_, name, jsProperty)) { 297e509ee18Sopenharmony_ci continue; 298e509ee18Sopenharmony_ci } 299e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = 300e509ee18Sopenharmony_ci PropertyDescriptor::FromProperty(vm_, name, jsProperty); 301e509ee18Sopenharmony_ci if (isAccessorOnly && !jsProperty.HasGetter() && !jsProperty.HasSetter()) { 302e509ee18Sopenharmony_ci continue; 303e509ee18Sopenharmony_ci } 304e509ee18Sopenharmony_ci if (debuggerProperty->HasGet()) { 305e509ee18Sopenharmony_ci debuggerProperty->GetGet()->SetObjectId(curObjectId_); 306e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, jsProperty.GetGetter(vm_)); 307e509ee18Sopenharmony_ci } 308e509ee18Sopenharmony_ci if (debuggerProperty->HasSet()) { 309e509ee18Sopenharmony_ci debuggerProperty->GetSet()->SetObjectId(curObjectId_); 310e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, jsProperty.GetSetter(vm_)); 311e509ee18Sopenharmony_ci } 312e509ee18Sopenharmony_ci if (debuggerProperty->HasValue()) { 313e509ee18Sopenharmony_ci Local<JSValueRef> vValue = jsProperty.GetValue(vm_); 314e509ee18Sopenharmony_ci if (vValue->IsObject(vm_)) { 315e509ee18Sopenharmony_ci debuggerProperty->GetValue()->SetObjectId(curObjectId_); 316e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, vValue); 317e509ee18Sopenharmony_ci } 318e509ee18Sopenharmony_ci } 319e509ee18Sopenharmony_ci if (debuggerProperty->HasSymbol()) { 320e509ee18Sopenharmony_ci debuggerProperty->GetSymbol()->SetObjectId(curObjectId_); 321e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, name); 322e509ee18Sopenharmony_ci } 323e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 324e509ee18Sopenharmony_ci } 325e509ee18Sopenharmony_ci if (!skipProto) { 326e509ee18Sopenharmony_ci GetProtoOrProtoType(value, isOwn, isAccessorOnly, outPropertyDesc); 327e509ee18Sopenharmony_ci } 328e509ee18Sopenharmony_ci 329e509ee18Sopenharmony_ci return DispatchResponse::Ok(); 330e509ee18Sopenharmony_ci} 331e509ee18Sopenharmony_ci 332e509ee18Sopenharmony_civoid RuntimeImpl::AddTypedArrayRefs(Local<ArrayBufferRef> arrayBufferRef, 333e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 334e509ee18Sopenharmony_ci{ 335e509ee18Sopenharmony_ci int32_t arrayBufferByteLength = arrayBufferRef->ByteLength(vm_); 336e509ee18Sopenharmony_ci int32_t typedArrayLength = arrayBufferByteLength; 337e509ee18Sopenharmony_ci AddTypedArrayRef<Int8ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int8Array]]", outPropertyDesc); 338e509ee18Sopenharmony_ci AddTypedArrayRef<Uint8ArrayRef>(arrayBufferRef, typedArrayLength, "[[Uint8Array]]", outPropertyDesc); 339e509ee18Sopenharmony_ci AddTypedArrayRef<Uint8ClampedArrayRef>(arrayBufferRef, typedArrayLength, "[[Uint8ClampedArray]]", outPropertyDesc); 340e509ee18Sopenharmony_ci 341e509ee18Sopenharmony_ci if ((arrayBufferByteLength % NumberSize::BYTES_OF_16BITS) == 0) { 342e509ee18Sopenharmony_ci typedArrayLength = arrayBufferByteLength / NumberSize::BYTES_OF_16BITS; 343e509ee18Sopenharmony_ci AddTypedArrayRef<Int16ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int16Array]]", outPropertyDesc); 344e509ee18Sopenharmony_ci AddTypedArrayRef<Uint16ArrayRef>(arrayBufferRef, typedArrayLength, "[[Uint16Array]]", outPropertyDesc); 345e509ee18Sopenharmony_ci } 346e509ee18Sopenharmony_ci 347e509ee18Sopenharmony_ci if ((arrayBufferByteLength % NumberSize::BYTES_OF_32BITS) == 0) { 348e509ee18Sopenharmony_ci typedArrayLength = arrayBufferByteLength / NumberSize::BYTES_OF_32BITS; 349e509ee18Sopenharmony_ci AddTypedArrayRef<Int32ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int32Array]]", outPropertyDesc); 350e509ee18Sopenharmony_ci AddTypedArrayRef<Uint32ArrayRef>(arrayBufferRef, typedArrayLength, "[[Uint32Array]]", outPropertyDesc); 351e509ee18Sopenharmony_ci AddTypedArrayRef<Float32ArrayRef>(arrayBufferRef, typedArrayLength, "[[Float32Array]]", outPropertyDesc); 352e509ee18Sopenharmony_ci } 353e509ee18Sopenharmony_ci 354e509ee18Sopenharmony_ci if ((arrayBufferByteLength % NumberSize::BYTES_OF_64BITS) == 0) { 355e509ee18Sopenharmony_ci typedArrayLength = arrayBufferByteLength / NumberSize::BYTES_OF_64BITS; 356e509ee18Sopenharmony_ci AddTypedArrayRef<Float64ArrayRef>(arrayBufferRef, typedArrayLength, "[[Float64Array]]", outPropertyDesc); 357e509ee18Sopenharmony_ci AddTypedArrayRef<BigInt64ArrayRef>(arrayBufferRef, typedArrayLength, "[[BigInt64Array]]", outPropertyDesc); 358e509ee18Sopenharmony_ci AddTypedArrayRef<BigUint64ArrayRef>(arrayBufferRef, typedArrayLength, "[[BigUint64Array]]", outPropertyDesc); 359e509ee18Sopenharmony_ci } 360e509ee18Sopenharmony_ci} 361e509ee18Sopenharmony_ci 362e509ee18Sopenharmony_civoid RuntimeImpl::AddSharedArrayBufferRefs(Local<ArrayBufferRef> arrayBufferRef, 363e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 364e509ee18Sopenharmony_ci{ 365e509ee18Sopenharmony_ci int32_t arrayBufferByteLength = arrayBufferRef->ByteLength(vm_); 366e509ee18Sopenharmony_ci int32_t typedArrayLength = arrayBufferByteLength; 367e509ee18Sopenharmony_ci AddTypedArrayRef<Int8ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int8Array]]", outPropertyDesc); 368e509ee18Sopenharmony_ci AddTypedArrayRef<Uint8ArrayRef>(arrayBufferRef, typedArrayLength, "[[Uint8Array]]", outPropertyDesc); 369e509ee18Sopenharmony_ci 370e509ee18Sopenharmony_ci if ((arrayBufferByteLength % NumberSize::BYTES_OF_16BITS) == 0) { 371e509ee18Sopenharmony_ci typedArrayLength = arrayBufferByteLength / NumberSize::BYTES_OF_16BITS; 372e509ee18Sopenharmony_ci AddTypedArrayRef<Int16ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int16Array]]", outPropertyDesc); 373e509ee18Sopenharmony_ci } 374e509ee18Sopenharmony_ci 375e509ee18Sopenharmony_ci if ((arrayBufferByteLength % NumberSize::BYTES_OF_32BITS) == 0) { 376e509ee18Sopenharmony_ci typedArrayLength = arrayBufferByteLength / NumberSize::BYTES_OF_32BITS; 377e509ee18Sopenharmony_ci AddTypedArrayRef<Int32ArrayRef>(arrayBufferRef, typedArrayLength, "[[Int32Array]]", outPropertyDesc); 378e509ee18Sopenharmony_ci } 379e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 380e509ee18Sopenharmony_ci jsValueRef = NumberRef::New(vm_, arrayBufferByteLength); 381e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[ArrayBufferByteLength]]"); 382e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "byteLength"); 383e509ee18Sopenharmony_ci} 384e509ee18Sopenharmony_ci 385e509ee18Sopenharmony_citemplate <typename TypedArrayRef> 386e509ee18Sopenharmony_civoid RuntimeImpl::AddTypedArrayRef(Local<ArrayBufferRef> arrayBufferRef, int32_t length, const char* name, 387e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 388e509ee18Sopenharmony_ci{ 389e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRefTypedArray(TypedArrayRef::New(vm_, arrayBufferRef, 0, length)); 390e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> remoteObjectTypedArray = RemoteObject::FromTagged(vm_, jsValueRefTypedArray); 391e509ee18Sopenharmony_ci remoteObjectTypedArray->SetObjectId(curObjectId_); 392e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, jsValueRefTypedArray); 393e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = std::make_unique<PropertyDescriptor>(); 394e509ee18Sopenharmony_ci debuggerProperty->SetName(name) 395e509ee18Sopenharmony_ci .SetWritable(true) 396e509ee18Sopenharmony_ci .SetConfigurable(true) 397e509ee18Sopenharmony_ci .SetEnumerable(false) 398e509ee18Sopenharmony_ci .SetIsOwn(true) 399e509ee18Sopenharmony_ci .SetValue(std::move(remoteObjectTypedArray)); 400e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 401e509ee18Sopenharmony_ci} 402e509ee18Sopenharmony_ci 403e509ee18Sopenharmony_civoid RuntimeImpl::CacheObjectIfNeeded(Local<JSValueRef> valRef, RemoteObject *remoteObj) 404e509ee18Sopenharmony_ci{ 405e509ee18Sopenharmony_ci if (valRef->IsObject(vm_)) { 406e509ee18Sopenharmony_ci remoteObj->SetObjectId(curObjectId_); 407e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, valRef); 408e509ee18Sopenharmony_ci } 409e509ee18Sopenharmony_ci} 410e509ee18Sopenharmony_ci 411e509ee18Sopenharmony_civoid RuntimeImpl::GetProtoOrProtoType(Local<JSValueRef> value, bool isOwn, bool isAccessorOnly, 412e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 413e509ee18Sopenharmony_ci{ 414e509ee18Sopenharmony_ci if (!isAccessorOnly && isOwn) { 415e509ee18Sopenharmony_ci return; 416e509ee18Sopenharmony_ci } 417e509ee18Sopenharmony_ci // Get Function ProtoOrHClass 418e509ee18Sopenharmony_ci if (value->IsConstructor(vm_)) { 419e509ee18Sopenharmony_ci Local<JSValueRef> prototype = Local<FunctionRef>(value)->GetFunctionPrototype(vm_); 420e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> protoObj = RemoteObject::FromTagged(vm_, prototype); 421e509ee18Sopenharmony_ci CacheObjectIfNeeded(prototype, protoObj.get()); 422e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = std::make_unique<PropertyDescriptor>(); 423e509ee18Sopenharmony_ci debuggerProperty->SetName("prototype") 424e509ee18Sopenharmony_ci .SetWritable(false) 425e509ee18Sopenharmony_ci .SetConfigurable(false) 426e509ee18Sopenharmony_ci .SetEnumerable(false) 427e509ee18Sopenharmony_ci .SetIsOwn(true) 428e509ee18Sopenharmony_ci .SetValue(std::move(protoObj)); 429e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 430e509ee18Sopenharmony_ci } 431e509ee18Sopenharmony_ci // Get __proto__ 432e509ee18Sopenharmony_ci Local<JSValueRef> proto = Local<ObjectRef>(value)->GetPrototype(vm_); 433e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> protoObj = RemoteObject::FromTagged(vm_, proto); 434e509ee18Sopenharmony_ci CacheObjectIfNeeded(proto, protoObj.get()); 435e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = std::make_unique<PropertyDescriptor>(); 436e509ee18Sopenharmony_ci debuggerProperty->SetName("__proto__") 437e509ee18Sopenharmony_ci .SetWritable(true) 438e509ee18Sopenharmony_ci .SetConfigurable(true) 439e509ee18Sopenharmony_ci .SetEnumerable(false) 440e509ee18Sopenharmony_ci .SetIsOwn(true) 441e509ee18Sopenharmony_ci .SetValue(std::move(protoObj)); 442e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 443e509ee18Sopenharmony_ci} 444e509ee18Sopenharmony_ci 445e509ee18Sopenharmony_civoid RuntimeImpl::GetAdditionalProperties(Local<JSValueRef> value, 446e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 447e509ee18Sopenharmony_ci{ 448e509ee18Sopenharmony_ci // The length of the TypedArray have to be limited(less than or equal to lengthTypedArrayLimit) until we construct 449e509ee18Sopenharmony_ci // the PropertyPreview class. Let lengthTypedArrayLimit be 10000 temporarily. 450e509ee18Sopenharmony_ci static const uint32_t lengthTypedArrayLimit = 10000; 451e509ee18Sopenharmony_ci 452e509ee18Sopenharmony_ci // The width of the string-expression for JSTypedArray::MAX_TYPED_ARRAY_INDEX which is euqal to 453e509ee18Sopenharmony_ci // JSObject::MAX_ELEMENT_INDEX which is equal to std::numeric_limits<uint32_t>::max(). (42,9496,7295) 454e509ee18Sopenharmony_ci static const int32_t widthStrExprMaxElementIndex = 10; 455e509ee18Sopenharmony_ci 456e509ee18Sopenharmony_ci if (value->IsTypedArray(vm_)) { 457e509ee18Sopenharmony_ci Local<TypedArrayRef> localTypedArrayRef(value); 458e509ee18Sopenharmony_ci uint32_t lengthTypedArray = localTypedArrayRef->ArrayLength(vm_); 459e509ee18Sopenharmony_ci if (lengthTypedArray > lengthTypedArrayLimit) { 460e509ee18Sopenharmony_ci LOG_DEBUGGER(ERROR) << "The length of the TypedArray is non-compliant or unsupported."; 461e509ee18Sopenharmony_ci return; 462e509ee18Sopenharmony_ci } 463e509ee18Sopenharmony_ci for (uint32_t i = 0; i < lengthTypedArray; ++i) { 464e509ee18Sopenharmony_ci Local<JSValueRef> localValRefElement = localTypedArrayRef->Get(vm_, i); 465e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> remoteObjElement = RemoteObject::FromTagged(vm_, localValRefElement); 466e509ee18Sopenharmony_ci remoteObjElement->SetObjectId(curObjectId_); 467e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, localValRefElement); 468e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = std::make_unique<PropertyDescriptor>(); 469e509ee18Sopenharmony_ci 470e509ee18Sopenharmony_ci std::ostringstream osNameElement; 471e509ee18Sopenharmony_ci osNameElement << std::right << std::setw(widthStrExprMaxElementIndex) << i; 472e509ee18Sopenharmony_ci std::string cStrNameElement = osNameElement.str(); 473e509ee18Sopenharmony_ci debuggerProperty->SetName(cStrNameElement) 474e509ee18Sopenharmony_ci .SetWritable(true) 475e509ee18Sopenharmony_ci .SetConfigurable(true) 476e509ee18Sopenharmony_ci .SetEnumerable(false) 477e509ee18Sopenharmony_ci .SetIsOwn(true) 478e509ee18Sopenharmony_ci .SetValue(std::move(remoteObjElement)); 479e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 480e509ee18Sopenharmony_ci } 481e509ee18Sopenharmony_ci } 482e509ee18Sopenharmony_ci} 483e509ee18Sopenharmony_ci 484e509ee18Sopenharmony_civoid RuntimeImpl::SetKeyValue(Local<JSValueRef> &jsValueRef, 485e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc, const std::string &strProName) 486e509ee18Sopenharmony_ci{ 487e509ee18Sopenharmony_ci std::unique_ptr<RemoteObject> remoteObj = RemoteObject::FromTagged(vm_, jsValueRef); 488e509ee18Sopenharmony_ci remoteObj->SetObjectId(curObjectId_); 489e509ee18Sopenharmony_ci properties_[curObjectId_++] = Global<JSValueRef>(vm_, jsValueRef); 490e509ee18Sopenharmony_ci std::unique_ptr<PropertyDescriptor> debuggerProperty = std::make_unique<PropertyDescriptor>(); 491e509ee18Sopenharmony_ci debuggerProperty->SetName(strProName) 492e509ee18Sopenharmony_ci .SetWritable(false) 493e509ee18Sopenharmony_ci .SetConfigurable(false) 494e509ee18Sopenharmony_ci .SetEnumerable(false) 495e509ee18Sopenharmony_ci .SetIsOwn(false) 496e509ee18Sopenharmony_ci .SetValue(std::move(remoteObj)); 497e509ee18Sopenharmony_ci outPropertyDesc->emplace_back(std::move(debuggerProperty)); 498e509ee18Sopenharmony_ci} 499e509ee18Sopenharmony_ci 500e509ee18Sopenharmony_civoid RuntimeImpl::GetPrimitiveNumberValue(Local<JSValueRef> value, 501e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 502e509ee18Sopenharmony_ci{ 503e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 504e509ee18Sopenharmony_ci jsValueRef = value->ToNumber(vm_); 505e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[PrimitiveValue]]"); 506e509ee18Sopenharmony_ci} 507e509ee18Sopenharmony_ci 508e509ee18Sopenharmony_civoid RuntimeImpl::GetPrimitiveStringValue(Local<JSValueRef> value, 509e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 510e509ee18Sopenharmony_ci{ 511e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 512e509ee18Sopenharmony_ci jsValueRef = value->ToString(vm_); 513e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[PrimitiveValue]]"); 514e509ee18Sopenharmony_ci} 515e509ee18Sopenharmony_ci 516e509ee18Sopenharmony_civoid RuntimeImpl::GetPrimitiveBooleanValue(Local<JSValueRef> value, 517e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 518e509ee18Sopenharmony_ci{ 519e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 520e509ee18Sopenharmony_ci Local<PrimitiveRef> primitiveRef(value); 521e509ee18Sopenharmony_ci jsValueRef = primitiveRef->GetValue(vm_); 522e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[PrimitiveValue]]"); 523e509ee18Sopenharmony_ci} 524e509ee18Sopenharmony_ci 525e509ee18Sopenharmony_civoid RuntimeImpl::GetMapIteratorValue(Local<JSValueRef> value, 526e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 527e509ee18Sopenharmony_ci{ 528e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 529e509ee18Sopenharmony_ci Local<MapIteratorRef> iterRef = value->ToObject(vm_); 530e509ee18Sopenharmony_ci if (!iterRef.IsEmpty()) { 531e509ee18Sopenharmony_ci jsValueRef = NumberRef::New(vm_, iterRef->GetIndex()); 532e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[IteratorIndex]]"); 533e509ee18Sopenharmony_ci jsValueRef = iterRef->GetKind(vm_); 534e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[IteratorKind]]"); 535e509ee18Sopenharmony_ci } 536e509ee18Sopenharmony_ci} 537e509ee18Sopenharmony_ci 538e509ee18Sopenharmony_civoid RuntimeImpl::GetSetIteratorValue(Local<JSValueRef> value, 539e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 540e509ee18Sopenharmony_ci{ 541e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 542e509ee18Sopenharmony_ci Local<SetIteratorRef> iterRef = value->ToObject(vm_); 543e509ee18Sopenharmony_ci if (!iterRef.IsEmpty()) { 544e509ee18Sopenharmony_ci jsValueRef = NumberRef::New(vm_, iterRef->GetIndex()); 545e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[IteratorIndex]]"); 546e509ee18Sopenharmony_ci jsValueRef = iterRef->GetKind(vm_); 547e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[IteratorKind]]"); 548e509ee18Sopenharmony_ci } 549e509ee18Sopenharmony_ci} 550e509ee18Sopenharmony_ci 551e509ee18Sopenharmony_civoid RuntimeImpl::GetGeneratorFunctionValue(Local<JSValueRef> value, 552e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 553e509ee18Sopenharmony_ci{ 554e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 555e509ee18Sopenharmony_ci Local<GeneratorFunctionRef> genFuncRef = value->ToObject(vm_); 556e509ee18Sopenharmony_ci if (!genFuncRef.IsEmpty()) { 557e509ee18Sopenharmony_ci jsValueRef = BooleanRef::New(vm_, genFuncRef->IsGenerator(vm_)); 558e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[IsGenerator]]"); 559e509ee18Sopenharmony_ci } 560e509ee18Sopenharmony_ci} 561e509ee18Sopenharmony_ci 562e509ee18Sopenharmony_civoid RuntimeImpl::GetGeneratorObjectValue(Local<JSValueRef> value, 563e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 564e509ee18Sopenharmony_ci{ 565e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef; 566e509ee18Sopenharmony_ci Local<GeneratorObjectRef> genObjRef = value->ToObject(vm_); 567e509ee18Sopenharmony_ci if (!genObjRef.IsEmpty()) { 568e509ee18Sopenharmony_ci jsValueRef = genObjRef->GetGeneratorState(vm_); 569e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[GeneratorState]]"); 570e509ee18Sopenharmony_ci jsValueRef = genObjRef->GetGeneratorFunction(vm_); 571e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[GeneratorFunction]]"); 572e509ee18Sopenharmony_ci jsValueRef = JSNApi::GetGlobalObject(vm_); 573e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[GeneratorReceiver]]"); 574e509ee18Sopenharmony_ci } 575e509ee18Sopenharmony_ci} 576e509ee18Sopenharmony_ci 577e509ee18Sopenharmony_civoid RuntimeImpl::GetNumberFormatValue(Local<JSValueRef> value, 578e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 579e509ee18Sopenharmony_ci{ 580e509ee18Sopenharmony_ci Local<NumberFormatRef> numberFormatRef = value->ToObject(vm_); 581e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = numberFormatRef->GetFormatFunction(vm_); 582e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "format"); 583e509ee18Sopenharmony_ci} 584e509ee18Sopenharmony_ci 585e509ee18Sopenharmony_civoid RuntimeImpl::GetCollatorValue(Local<JSValueRef> value, 586e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 587e509ee18Sopenharmony_ci{ 588e509ee18Sopenharmony_ci Local<CollatorRef> collatorRef = value->ToObject(vm_); 589e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = collatorRef->GetCompareFunction(vm_); 590e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "compare"); 591e509ee18Sopenharmony_ci} 592e509ee18Sopenharmony_ci 593e509ee18Sopenharmony_civoid RuntimeImpl::GetDateTimeFormatValue(Local<JSValueRef> value, 594e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 595e509ee18Sopenharmony_ci{ 596e509ee18Sopenharmony_ci Local<DataTimeFormatRef> dtFormatRef = value->ToObject(vm_); 597e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = dtFormatRef->GetFormatFunction(vm_); 598e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "format"); 599e509ee18Sopenharmony_ci} 600e509ee18Sopenharmony_ci 601e509ee18Sopenharmony_civoid RuntimeImpl::GetSharedMapValue(Local<JSValueRef> value, 602e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 603e509ee18Sopenharmony_ci{ 604e509ee18Sopenharmony_ci Local<SendableMapRef> sendableMapRef(value); 605e509ee18Sopenharmony_ci uint32_t size = sendableMapRef->GetSize(vm_); 606e509ee18Sopenharmony_ci uint32_t len = sendableMapRef->GetTotalElements(vm_); 607e509ee18Sopenharmony_ci uint32_t index = 0; 608e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = NumberRef::New(vm_, size); 609e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "size"); 610e509ee18Sopenharmony_ci jsValueRef = ArrayRef::New(vm_, size); 611e509ee18Sopenharmony_ci for (uint32_t i = 0; i < len; ++i) { 612e509ee18Sopenharmony_ci Local<JSValueRef> jsKey = sendableMapRef->GetKey(vm_, i); 613e509ee18Sopenharmony_ci if (jsKey->IsHole()) { 614e509ee18Sopenharmony_ci continue; 615e509ee18Sopenharmony_ci } 616e509ee18Sopenharmony_ci Local<JSValueRef> jsValue = sendableMapRef->GetValue(vm_, i); 617e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 618e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "key"), jsKey); 619e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), jsValue); 620e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 621e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 622e509ee18Sopenharmony_ci } 623e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 624e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 625e509ee18Sopenharmony_ci} 626e509ee18Sopenharmony_civoid RuntimeImpl::GetMapValue(Local<JSValueRef> value, 627e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 628e509ee18Sopenharmony_ci{ 629e509ee18Sopenharmony_ci Local<MapRef> mapRef = value->ToObject(vm_); 630e509ee18Sopenharmony_ci int32_t size = mapRef->GetSize(vm_); 631e509ee18Sopenharmony_ci int32_t len = mapRef->GetTotalElements(vm_); 632e509ee18Sopenharmony_ci int32_t index = 0; 633e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = NumberRef::New(vm_, size); 634e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "size"); 635e509ee18Sopenharmony_ci jsValueRef = ArrayRef::New(vm_, size); 636e509ee18Sopenharmony_ci for (int32_t i = 0; i < len; ++i) { 637e509ee18Sopenharmony_ci Local<JSValueRef> jsKey = mapRef->GetKey(vm_, i); 638e509ee18Sopenharmony_ci if (jsKey->IsHole()) { 639e509ee18Sopenharmony_ci continue; 640e509ee18Sopenharmony_ci } 641e509ee18Sopenharmony_ci Local<JSValueRef> jsValue = mapRef->GetValue(vm_, i); 642e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 643e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "key"), jsKey); 644e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), jsValue); 645e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 646e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 647e509ee18Sopenharmony_ci } 648e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 649e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 650e509ee18Sopenharmony_ci} 651e509ee18Sopenharmony_ci 652e509ee18Sopenharmony_civoid RuntimeImpl::GetWeakMapValue(Local<JSValueRef> value, 653e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 654e509ee18Sopenharmony_ci{ 655e509ee18Sopenharmony_ci Local<WeakMapRef> weakMapRef = value->ToObject(vm_); 656e509ee18Sopenharmony_ci int32_t size = weakMapRef->GetSize(vm_); 657e509ee18Sopenharmony_ci int32_t len = weakMapRef->GetTotalElements(vm_); 658e509ee18Sopenharmony_ci int32_t index = 0; 659e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = ArrayRef::New(vm_, size); 660e509ee18Sopenharmony_ci for (int32_t i = 0; i < len; i++) { 661e509ee18Sopenharmony_ci Local<JSValueRef> jsKey = weakMapRef->GetKey(vm_, i); 662e509ee18Sopenharmony_ci if (jsKey->IsHole() || !jsKey->IsObject(vm_)) { 663e509ee18Sopenharmony_ci continue; 664e509ee18Sopenharmony_ci } 665e509ee18Sopenharmony_ci Local<JSValueRef> jsValue = weakMapRef->GetValue(vm_, i); 666e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 667e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "key"), jsKey); 668e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), jsValue); 669e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 670e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 671e509ee18Sopenharmony_ci } 672e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 673e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 674e509ee18Sopenharmony_ci} 675e509ee18Sopenharmony_ci 676e509ee18Sopenharmony_civoid RuntimeImpl::GetSendableSetValue(Local<JSValueRef> value, 677e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 678e509ee18Sopenharmony_ci{ 679e509ee18Sopenharmony_ci Local<SendableSetRef> setRef = value->ToObject(vm_); 680e509ee18Sopenharmony_ci uint32_t size = setRef->GetSize(vm_); 681e509ee18Sopenharmony_ci uint32_t len = setRef->GetTotalElements(vm_); 682e509ee18Sopenharmony_ci int32_t index = 0; 683e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = NumberRef::New(vm_, size); 684e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "size"); 685e509ee18Sopenharmony_ci jsValueRef = ArrayRef::New(vm_, size); 686e509ee18Sopenharmony_ci for (uint32_t i = 0; i < len; ++i) { 687e509ee18Sopenharmony_ci Local<JSValueRef> elementRef = setRef->GetValue(vm_, i); 688e509ee18Sopenharmony_ci if (elementRef->IsHole()) { 689e509ee18Sopenharmony_ci continue; 690e509ee18Sopenharmony_ci } else if (elementRef->IsObject(vm_)) { 691e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 692e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), elementRef); 693e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 694e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 695e509ee18Sopenharmony_ci } else { 696e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, elementRef); 697e509ee18Sopenharmony_ci } 698e509ee18Sopenharmony_ci } 699e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 700e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 701e509ee18Sopenharmony_ci} 702e509ee18Sopenharmony_ci 703e509ee18Sopenharmony_civoid RuntimeImpl::GetSetValue(Local<JSValueRef> value, 704e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 705e509ee18Sopenharmony_ci{ 706e509ee18Sopenharmony_ci Local<SetRef> setRef = value->ToObject(vm_); 707e509ee18Sopenharmony_ci int32_t size = setRef->GetSize(vm_); 708e509ee18Sopenharmony_ci int32_t len = setRef->GetTotalElements(vm_); 709e509ee18Sopenharmony_ci int32_t index = 0; 710e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = NumberRef::New(vm_, size); 711e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "size"); 712e509ee18Sopenharmony_ci jsValueRef = ArrayRef::New(vm_, size); 713e509ee18Sopenharmony_ci for (int32_t i = 0; i < len; ++i) { 714e509ee18Sopenharmony_ci Local<JSValueRef> elementRef = setRef->GetValue(vm_, i); 715e509ee18Sopenharmony_ci if (elementRef->IsHole()) { 716e509ee18Sopenharmony_ci continue; 717e509ee18Sopenharmony_ci } else if (elementRef->IsObject(vm_)) { 718e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 719e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), elementRef); 720e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 721e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 722e509ee18Sopenharmony_ci } else { 723e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, elementRef); 724e509ee18Sopenharmony_ci } 725e509ee18Sopenharmony_ci } 726e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 727e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 728e509ee18Sopenharmony_ci} 729e509ee18Sopenharmony_ci 730e509ee18Sopenharmony_civoid RuntimeImpl::GetWeakSetValue(Local<JSValueRef> value, 731e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 732e509ee18Sopenharmony_ci{ 733e509ee18Sopenharmony_ci Local<WeakSetRef> weakSetRef = value->ToObject(vm_); 734e509ee18Sopenharmony_ci int32_t size = weakSetRef->GetSize(vm_); 735e509ee18Sopenharmony_ci int32_t len = weakSetRef->GetTotalElements(vm_); 736e509ee18Sopenharmony_ci int32_t index = 0; 737e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = ArrayRef::New(vm_, size); 738e509ee18Sopenharmony_ci for (int32_t i = 0; i < len; ++i) { 739e509ee18Sopenharmony_ci Local<JSValueRef> elementRef = weakSetRef->GetValue(vm_, i); 740e509ee18Sopenharmony_ci if (elementRef->IsHole()) { 741e509ee18Sopenharmony_ci continue; 742e509ee18Sopenharmony_ci } 743e509ee18Sopenharmony_ci Local<ObjectRef> objRef = ObjectRef::New(vm_); 744e509ee18Sopenharmony_ci objRef->Set(vm_, StringRef::NewFromUtf8(vm_, "value"), elementRef); 745e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, objRef, ArkInternalValueType::Entry, internalObjects_); 746e509ee18Sopenharmony_ci ArrayRef::SetValueAt(vm_, jsValueRef, index++, objRef); 747e509ee18Sopenharmony_ci } 748e509ee18Sopenharmony_ci DebuggerApi::AddInternalProperties(vm_, jsValueRef, ArkInternalValueType::Entry, internalObjects_); 749e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Entries]]"); 750e509ee18Sopenharmony_ci} 751e509ee18Sopenharmony_ci 752e509ee18Sopenharmony_civoid RuntimeImpl::GetDataViewValue(Local<JSValueRef> value, 753e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 754e509ee18Sopenharmony_ci{ 755e509ee18Sopenharmony_ci Local<DataViewRef> dataViewRef = value->ToObject(vm_); 756e509ee18Sopenharmony_ci int32_t byteLength = static_cast<int32_t>(dataViewRef->ByteLength()); 757e509ee18Sopenharmony_ci int32_t byteOffset = static_cast<int32_t>(dataViewRef->ByteOffset()); 758e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = dataViewRef->GetArrayBuffer(vm_); 759e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "buffer"); 760e509ee18Sopenharmony_ci jsValueRef = NumberRef::New(vm_, byteLength); 761e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "byteLength"); 762e509ee18Sopenharmony_ci jsValueRef = NumberRef::New(vm_, byteOffset); 763e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "byteOffset"); 764e509ee18Sopenharmony_ci} 765e509ee18Sopenharmony_ci 766e509ee18Sopenharmony_civoid RuntimeImpl::GetRegExpValue(Local<JSValueRef> value, 767e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 768e509ee18Sopenharmony_ci{ 769e509ee18Sopenharmony_ci Local<RegExpRef> regExpRef = value->ToObject(vm_); 770e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = regExpRef->IsGlobal(vm_); 771e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "global"); 772e509ee18Sopenharmony_ci jsValueRef = regExpRef->IsIgnoreCase(vm_); 773e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "ignoreCase"); 774e509ee18Sopenharmony_ci jsValueRef = regExpRef->IsMultiline(vm_); 775e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "multiline"); 776e509ee18Sopenharmony_ci jsValueRef = regExpRef->IsDotAll(vm_); 777e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "dotAll"); 778e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "hasIndices"); 779e509ee18Sopenharmony_ci jsValueRef = regExpRef->IsUtf16(vm_); 780e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "unicode"); 781e509ee18Sopenharmony_ci jsValueRef = regExpRef->IsStick(vm_); 782e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "sticky"); 783e509ee18Sopenharmony_ci std::string strFlags = regExpRef->GetOriginalFlags(vm_); 784e509ee18Sopenharmony_ci jsValueRef = StringRef::NewFromUtf8(vm_, strFlags.c_str()); 785e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "flags"); 786e509ee18Sopenharmony_ci std::string strSource = regExpRef->GetOriginalSource(vm_)->ToString(vm_); 787e509ee18Sopenharmony_ci jsValueRef = StringRef::NewFromUtf8(vm_, strSource.c_str()); 788e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "source"); 789e509ee18Sopenharmony_ci} 790e509ee18Sopenharmony_ci 791e509ee18Sopenharmony_civoid RuntimeImpl::GetArrayListValue(Local<JSValueRef> value, 792e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 793e509ee18Sopenharmony_ci{ 794e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetArrayListValue(vm_, value, internalObjects_); 795e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 796e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 797e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[ArrayList]]"); 798e509ee18Sopenharmony_ci} 799e509ee18Sopenharmony_ci 800e509ee18Sopenharmony_civoid RuntimeImpl::GetDequeValue(Local<JSValueRef> value, 801e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 802e509ee18Sopenharmony_ci{ 803e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetDequeValue(vm_, value, internalObjects_); 804e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 805e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 806e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Deque]]"); 807e509ee18Sopenharmony_ci} 808e509ee18Sopenharmony_ci 809e509ee18Sopenharmony_civoid RuntimeImpl::GetHashMapValue(Local<JSValueRef> value, 810e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 811e509ee18Sopenharmony_ci{ 812e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetHashMapValue(vm_, value, internalObjects_); 813e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 814e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 815e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[HashMap]]"); 816e509ee18Sopenharmony_ci} 817e509ee18Sopenharmony_ci 818e509ee18Sopenharmony_civoid RuntimeImpl::GetHashSetValue(Local<JSValueRef> value, 819e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 820e509ee18Sopenharmony_ci{ 821e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetHashSetValue(vm_, value, internalObjects_); 822e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 823e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 824e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[HashSet]]"); 825e509ee18Sopenharmony_ci} 826e509ee18Sopenharmony_ci 827e509ee18Sopenharmony_civoid RuntimeImpl::GetLightWeightMapValue(Local<JSValueRef> value, 828e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 829e509ee18Sopenharmony_ci{ 830e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetLightWeightMapValue(vm_, value, internalObjects_); 831e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 832e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 833e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[LightWeightMap]]"); 834e509ee18Sopenharmony_ci} 835e509ee18Sopenharmony_ci 836e509ee18Sopenharmony_civoid RuntimeImpl::GetLightWeightSetValue(Local<JSValueRef> value, 837e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 838e509ee18Sopenharmony_ci{ 839e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetLightWeightSetValue(vm_, value, internalObjects_); 840e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 841e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 842e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[LightWeightSet]]"); 843e509ee18Sopenharmony_ci} 844e509ee18Sopenharmony_ci 845e509ee18Sopenharmony_civoid RuntimeImpl::GetLinkedListValue(Local<JSValueRef> value, 846e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 847e509ee18Sopenharmony_ci{ 848e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetLinkedListValue(vm_, value, internalObjects_); 849e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 850e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 851e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[LinkedList]]"); 852e509ee18Sopenharmony_ci} 853e509ee18Sopenharmony_ci 854e509ee18Sopenharmony_civoid RuntimeImpl::GetListValue(Local<JSValueRef> value, 855e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 856e509ee18Sopenharmony_ci{ 857e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetListValue(vm_, value, internalObjects_); 858e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 859e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 860e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[List]]"); 861e509ee18Sopenharmony_ci} 862e509ee18Sopenharmony_ci 863e509ee18Sopenharmony_civoid RuntimeImpl::GetPlainArrayValue(Local<JSValueRef> value, 864e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 865e509ee18Sopenharmony_ci{ 866e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetPlainArrayValue(vm_, value, internalObjects_); 867e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 868e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 869e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[PlainArray]]"); 870e509ee18Sopenharmony_ci} 871e509ee18Sopenharmony_ci 872e509ee18Sopenharmony_civoid RuntimeImpl::GetQueueValue(Local<JSValueRef> value, 873e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 874e509ee18Sopenharmony_ci{ 875e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetQueueValue(vm_, value, internalObjects_); 876e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 877e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 878e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Queue]]"); 879e509ee18Sopenharmony_ci} 880e509ee18Sopenharmony_ci 881e509ee18Sopenharmony_civoid RuntimeImpl::GetStackValue(Local<JSValueRef> value, 882e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 883e509ee18Sopenharmony_ci{ 884e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetStackValue(vm_, value, internalObjects_); 885e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 886e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 887e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Stack]]"); 888e509ee18Sopenharmony_ci} 889e509ee18Sopenharmony_ci 890e509ee18Sopenharmony_civoid RuntimeImpl::GetTreeMapValue(Local<JSValueRef> value, 891e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 892e509ee18Sopenharmony_ci{ 893e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetTreeMapValue(vm_, value, internalObjects_); 894e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 895e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 896e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[TreeMap]]"); 897e509ee18Sopenharmony_ci} 898e509ee18Sopenharmony_ci 899e509ee18Sopenharmony_civoid RuntimeImpl::GetTreeSetValue(Local<JSValueRef> value, 900e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 901e509ee18Sopenharmony_ci{ 902e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetTreeSetValue(vm_, value, internalObjects_); 903e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 904e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 905e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[TreeSet]]"); 906e509ee18Sopenharmony_ci} 907e509ee18Sopenharmony_ci 908e509ee18Sopenharmony_civoid RuntimeImpl::GetVectorValue(Local<JSValueRef> value, 909e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 910e509ee18Sopenharmony_ci{ 911e509ee18Sopenharmony_ci Local<JSValueRef> jsValueRef = DebuggerApi::GetVectorValue(vm_, value, internalObjects_); 912e509ee18Sopenharmony_ci Local<JSValueRef> size = NumberRef::New(vm_, DebuggerApi::GetContainerLength(vm_, jsValueRef)); 913e509ee18Sopenharmony_ci SetKeyValue(size, outPropertyDesc, "size"); 914e509ee18Sopenharmony_ci SetKeyValue(jsValueRef, outPropertyDesc, "[[Vector]]"); 915e509ee18Sopenharmony_ci} 916e509ee18Sopenharmony_ci 917e509ee18Sopenharmony_civoid RuntimeImpl::GetProxyValue(Local<JSValueRef> value, 918e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 919e509ee18Sopenharmony_ci{ 920e509ee18Sopenharmony_ci Local<ProxyRef> proxyRef = value->ToObject(vm_); 921e509ee18Sopenharmony_ci if (proxyRef.IsEmpty()) { 922e509ee18Sopenharmony_ci return; 923e509ee18Sopenharmony_ci } 924e509ee18Sopenharmony_ci Local<JSValueRef> target = proxyRef->GetTarget(vm_); 925e509ee18Sopenharmony_ci SetKeyValue(target, outPropertyDesc, "[[Target]]"); 926e509ee18Sopenharmony_ci Local<JSValueRef> handler = proxyRef->GetHandler(vm_); 927e509ee18Sopenharmony_ci SetKeyValue(handler, outPropertyDesc, "[[Handler]]"); 928e509ee18Sopenharmony_ci Local<JSValueRef> isRevoked = BooleanRef::New(vm_, proxyRef->IsRevoked()); 929e509ee18Sopenharmony_ci SetKeyValue(isRevoked, outPropertyDesc, "[[IsRevoked]]"); 930e509ee18Sopenharmony_ci} 931e509ee18Sopenharmony_ci 932e509ee18Sopenharmony_civoid RuntimeImpl::GetPromiseValue(Local<JSValueRef> value, 933e509ee18Sopenharmony_ci std::vector<std::unique_ptr<PropertyDescriptor>> *outPropertyDesc) 934e509ee18Sopenharmony_ci{ 935e509ee18Sopenharmony_ci Local<PromiseRef> promiseRef = value->ToObject(vm_); 936e509ee18Sopenharmony_ci if (promiseRef.IsEmpty()) { 937e509ee18Sopenharmony_ci return; 938e509ee18Sopenharmony_ci } 939e509ee18Sopenharmony_ci Local<JSValueRef> promiseState = promiseRef->GetPromiseState(vm_); 940e509ee18Sopenharmony_ci SetKeyValue(promiseState, outPropertyDesc, "[[PromiseState]]"); 941e509ee18Sopenharmony_ci Local<JSValueRef> promiseResult = promiseRef->GetPromiseResult(vm_); 942e509ee18Sopenharmony_ci SetKeyValue(promiseResult, outPropertyDesc, "[[PromiseResult]]"); 943e509ee18Sopenharmony_ci} 944e509ee18Sopenharmony_ci} // namespace panda::ecmascript::tooling 945