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 &params,
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