• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h"
17 
18 #include "base/log/ace_performance_monitor.h"
19 #include "frameworks/bridge/declarative_frontend/engine/jsi/js_ui_index.h"
20 #include "frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h"
21 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h"
22 
23 namespace OHOS::Ace::Framework {
24 
25 // -----------------------
26 // Implementation of JsiValue
27 // -----------------------
JsiValue(const panda::CopyableGlobal<panda::JSValueRef> & val)28 JsiValue::JsiValue(const panda::CopyableGlobal<panda::JSValueRef>& val) : JsiType(val) {}
29 
JsiValue(panda::Local<panda::JSValueRef> val)30 JsiValue::JsiValue(panda::Local<panda::JSValueRef> val) : JsiType(val) {}
31 
JsiValue(const EcmaVM * vm,panda::Local<panda::JSValueRef> val)32 JsiValue::JsiValue(const EcmaVM *vm, panda::Local<panda::JSValueRef> val) : JsiType(vm, val) {}
33 
IsEmpty() const34 bool JsiValue::IsEmpty() const
35 {
36     if (GetHandle().IsEmpty()) {
37         return true;
38     }
39     return GetHandle()->IsUndefined() || GetHandle()->IsNull();
40 }
41 
IsFunction() const42 bool JsiValue::IsFunction() const
43 {
44     if (GetHandle().IsEmpty()) {
45         return false;
46     } else {
47         return GetHandle()->IsFunction(GetEcmaVM());
48     }
49 }
50 
IsNumber() const51 bool JsiValue::IsNumber() const
52 {
53     if (GetHandle().IsEmpty()) {
54         return false;
55     } else {
56         return GetHandle()->IsNumber();
57     }
58 }
59 
IsString() const60 bool JsiValue::IsString() const
61 {
62     if (GetHandle().IsEmpty()) {
63         return false;
64     } else {
65         return GetHandle()->IsString(GetEcmaVM());
66     }
67 }
68 
IsBoolean() const69 bool JsiValue::IsBoolean() const
70 {
71     if (GetHandle().IsEmpty()) {
72         return false;
73     } else {
74         return GetHandle()->IsBoolean();
75     }
76 }
77 
IsObject() const78 bool JsiValue::IsObject() const
79 {
80     if (GetHandle().IsEmpty()) {
81         return false;
82     } else {
83         return GetHandle()->IsObject(GetEcmaVM());
84     }
85 }
86 
IsArray() const87 bool JsiValue::IsArray() const
88 {
89     if (GetHandle().IsEmpty()) {
90         return false;
91     } else {
92         return GetHandle()->IsArray(GetEcmaVM());
93     }
94 }
95 
IsArrayBuffer() const96 bool JsiValue::IsArrayBuffer() const
97 {
98     if (GetHandle().IsEmpty()) {
99         return false;
100     } else {
101         return GetHandle()->IsArrayBuffer(GetEcmaVM());
102     }
103 }
104 
IsUint8ClampedArray() const105 bool JsiValue::IsUint8ClampedArray() const
106 {
107     return (!GetHandle().IsEmpty()) && (GetHandle()->IsUint8ClampedArray(GetEcmaVM()));
108 }
109 
IsUndefined() const110 bool JsiValue::IsUndefined() const
111 {
112     if (GetHandle().IsEmpty()) {
113         return true;
114     } else {
115         return GetHandle()->IsUndefined();
116     }
117 }
118 
IsNull() const119 bool JsiValue::IsNull() const
120 {
121     if (GetHandle().IsEmpty()) {
122         return true;
123     } else {
124         return GetHandle()->IsNull();
125     }
126 }
127 
ToString() const128 std::string JsiValue::ToString() const
129 {
130     auto vm = GetEcmaVM();
131     panda::LocalScope scope(vm);
132     if (IsObject()) {
133         return JSON::Stringify(vm, GetLocalHandle())->ToString(vm)->ToString(vm);
134     }
135     return GetHandle()->ToString(vm)->ToString(vm);
136 }
137 
ToU16String() const138 std::u16string JsiValue::ToU16String() const
139 {
140     auto vm = GetEcmaVM();
141     Local<StringRef> stringRef;
142     panda::LocalScope scope(vm);
143     if (IsObject()) {
144         stringRef = JSON::Stringify(vm, GetLocalHandle())->ToString(vm);
145     } else {
146         stringRef = GetHandle()->ToString(vm);
147     }
148     auto utf16Len = stringRef->Length(vm);
149     std::unique_ptr<char16_t[]> pBuf16 = std::make_unique<char16_t[]>(utf16Len);
150     char16_t *buf16 = pBuf16.get();
151     auto resultLen = stringRef->WriteUtf16(vm, buf16, utf16Len);
152     return std::u16string(buf16, resultLen);
153 }
154 
ToBoolean() const155 bool JsiValue::ToBoolean() const
156 {
157     return GetHandle()->BooleaValue(GetEcmaVM());
158 }
159 
Undefined()160 JsiRef<JsiValue> JsiValue::Undefined()
161 {
162     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
163     return JsiRef<JsiValue>::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm()));
164 }
165 
Null()166 JsiRef<JsiValue> JsiValue::Null()
167 {
168     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
169     return JsiRef<JsiValue>::Make(panda::JSValueRef::Null(runtime->GetEcmaVm()));
170 }
171 
True()172 JsiRef<JsiValue> JsiValue::True()
173 {
174     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
175     return JsiRef<JsiValue>::Make(panda::JSValueRef::True(runtime->GetEcmaVm()));
176 }
177 
False()178 JsiRef<JsiValue> JsiValue::False()
179 {
180     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
181     return JsiRef<JsiValue>::Make(panda::JSValueRef::False(runtime->GetEcmaVm()));
182 }
183 
184 // -----------------------
185 // Implementation of JsiArray
186 // -----------------------
JsiArray()187 JsiArray::JsiArray() {}
JsiArray(const panda::CopyableGlobal<panda::ArrayRef> & val)188 JsiArray::JsiArray(const panda::CopyableGlobal<panda::ArrayRef>& val) : JsiType(val) {}
JsiArray(panda::Local<panda::ArrayRef> val)189 JsiArray::JsiArray(panda::Local<panda::ArrayRef> val) : JsiType(val) {}
JsiArray(const EcmaVM * vm,panda::Local<panda::ArrayRef> val)190 JsiArray::JsiArray(const EcmaVM *vm, panda::Local<panda::ArrayRef> val) : JsiType(vm, val) {}
191 
GetValueAt(size_t index) const192 JsiRef<JsiValue> JsiArray::GetValueAt(size_t index) const
193 {
194     return JsiRef<JsiValue>::FastMake(GetEcmaVM(), panda::ArrayRef::GetValueAt(GetEcmaVM(), GetLocalHandle(), index));
195 }
196 
SetValueAt(size_t index,JsiRef<JsiValue> value) const197 void JsiArray::SetValueAt(size_t index, JsiRef<JsiValue> value) const
198 {
199     panda::ArrayRef::SetValueAt(GetEcmaVM(), GetLocalHandle(), index, value.Get().GetLocalHandle());
200 }
201 
GetProperty(const char * prop) const202 JsiRef<JsiValue> JsiArray::GetProperty(const char* prop) const
203 {
204     auto vm = GetEcmaVM();
205     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
206     auto value = GetHandle()->Get(vm, stringRef);
207     auto func = JsiValue(vm, value);
208     auto refValue =  JsiRef<JsiValue>(func);
209     return refValue;
210 }
211 
GetProperty(int32_t propertyIndex) const212 JsiRef<JsiValue> JsiArray::GetProperty(int32_t propertyIndex) const
213 {
214     auto vm = GetEcmaVM();
215     auto stringRef = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
216     auto value = GetHandle()->Get(vm, stringRef);
217     auto func = JsiValue(vm, value);
218     auto refValue = JsiRef<JsiValue>(func);
219     return refValue;
220 }
221 
Length() const222 size_t JsiArray::Length() const
223 {
224     size_t length = -1;
225     JsiRef<JsiValue> propLength = GetProperty(static_cast<int32_t>(ArkUIIndex::LENGTH));
226     if (propLength->IsNumber()) {
227         length = propLength->ToNumber<int32_t>();
228     }
229     return length;
230 }
231 
SetLength(size_t length) const232 void JsiArray::SetLength(size_t length) const
233 {
234     auto stringRef = panda::StringRef::NewFromUtf8(GetEcmaVM(), "length");
235     GetHandle()->Set(GetEcmaVM(), stringRef, JsiValueConvertor::toJsiValueWithVM<size_t>(GetEcmaVM(), length));
236 }
237 
IsArray() const238 bool JsiArray::IsArray() const
239 {
240     if (GetHandle().IsEmpty()) {
241         return false;
242     } else {
243         return GetHandle()->IsArray(GetEcmaVM());
244     }
245 }
246 
247 // -----------------------
248 // Implementation of JsiArrayBuffer
249 // -----------------------
JsiArrayBuffer(panda::Local<panda::ArrayBufferRef> val)250 JsiArrayBuffer::JsiArrayBuffer(panda::Local<panda::ArrayBufferRef> val) : JsiType(val) {}
JsiArrayBuffer(const panda::CopyableGlobal<panda::ArrayBufferRef> & val)251 JsiArrayBuffer::JsiArrayBuffer(const panda::CopyableGlobal<panda::ArrayBufferRef>& val) : JsiType(val) {}
252 
ByteLength() const253 int32_t JsiArrayBuffer::ByteLength() const
254 {
255     return GetHandle()->ByteLength(GetEcmaVM());
256 }
257 
GetBuffer() const258 void* JsiArrayBuffer::GetBuffer() const
259 {
260     return GetHandle()->GetBuffer(GetEcmaVM());
261 }
262 
Detach() const263 void JsiArrayBuffer::Detach() const
264 {
265     GetHandle()->Detach(GetEcmaVM());
266 }
267 
IsDetach() const268 bool JsiArrayBuffer::IsDetach() const
269 {
270     return GetHandle()->IsDetach(GetEcmaVM());
271 }
272 
273 // -----------------------
274 // Implementation of JsiArrayBufferRef
275 // -----------------------
JsiUint8ClampedArray(panda::Local<panda::Uint8ClampedArrayRef> val)276 JsiUint8ClampedArray::JsiUint8ClampedArray(panda::Local<panda::Uint8ClampedArrayRef> val) : JsiType(val) {}
JsiUint8ClampedArray(const panda::CopyableGlobal<panda::Uint8ClampedArrayRef> & val)277 JsiUint8ClampedArray::JsiUint8ClampedArray(const panda::CopyableGlobal<panda::Uint8ClampedArrayRef>& val) : JsiType(val)
278 {}
279 
GetArrayBuffer() const280 JsiRef<JsiArrayBuffer> JsiUint8ClampedArray::GetArrayBuffer() const
281 {
282     return JsiRef<JsiArrayBuffer>(JsiArrayBuffer(GetHandle()->GetArrayBuffer(GetEcmaVM())));
283 }
284 
285 // -----------------------
286 // Implementation of JsiObject
287 // -----------------------
JsiObject()288 JsiObject::JsiObject() : JsiType() {}
JsiObject(const panda::CopyableGlobal<panda::ObjectRef> & val)289 JsiObject::JsiObject(const panda::CopyableGlobal<panda::ObjectRef>& val) : JsiType(val) {}
JsiObject(panda::Local<panda::ObjectRef> val)290 JsiObject::JsiObject(panda::Local<panda::ObjectRef> val) : JsiType(val) {}
JsiObject(const EcmaVM * vm,panda::Local<panda::ObjectRef> val)291 JsiObject::JsiObject(const EcmaVM *vm, panda::Local<panda::ObjectRef> val) : JsiType(vm, val) {}
292 
IsUndefined() const293 bool JsiObject::IsUndefined() const
294 {
295     if (GetHandle().IsEmpty()) {
296         return true;
297     } else {
298         return GetHandle()->IsUndefined();
299     }
300 }
301 
GetPropertyNames() const302 JsiRef<JsiArray> JsiObject::GetPropertyNames() const
303 {
304     auto vm = GetEcmaVM();
305     return JsiRef<JsiArray>::Make(GetHandle()->GetOwnPropertyNames(vm));
306 }
307 
GetProperty(int32_t propertyIndex) const308 JsiRef<JsiValue> JsiObject::GetProperty(int32_t propertyIndex) const
309 {
310     auto vm = GetEcmaVM();
311     auto str = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
312     auto value = GetHandle()->Get(vm, str);
313     auto func = JsiValue(vm, value);
314     auto refValue = JsiRef<JsiValue>(func);
315     return refValue;
316 }
317 
HasProperty(int32_t propertyIndex) const318 bool JsiObject::HasProperty(int32_t propertyIndex) const
319 {
320     auto vm = GetEcmaVM();
321     auto stringRef = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
322     bool has = GetHandle()->Has(vm, stringRef);
323     return has;
324 }
325 
GetProperty(const char * prop) const326 JsiRef<JsiValue> JsiObject::GetProperty(const char* prop) const
327 {
328     auto vm = GetEcmaVM();
329     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
330     auto value = GetHandle()->Get(vm, stringRef);
331     auto func = JsiValue(vm, value);
332     auto refValue =  JsiRef<JsiValue>(func);
333     return refValue;
334 }
335 
HasProperty(const char * prop) const336 bool JsiObject::HasProperty(const char* prop) const
337 {
338     auto vm = GetEcmaVM();
339     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
340     bool has = GetHandle()->Has(vm, stringRef);
341     return has;
342 }
343 
ToJsonObject(const char * value) const344 JsiRef<JsiValue> JsiObject::ToJsonObject(const char* value) const
345 {
346     auto vm = GetEcmaVM();
347     panda::TryCatch trycatch(vm);
348     auto valueRef = JsiValueConvertor::toJsiValueWithVM<std::string>(vm, value);
349     panda::Local<JSValueRef> result = JSON::Parse(vm, valueRef);
350     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
351     if (result.IsEmpty() || trycatch.HasCaught()) {
352         runtime->HandleUncaughtException(trycatch);
353         return JsiRef<JsiValue>::Make(JSValueRef::Undefined(vm));
354     }
355 
356     return JsiRef<JsiValue>::Make(result);
357 }
358 
SetPropertyJsonObject(const char * prop,const char * value) const359 void JsiObject::SetPropertyJsonObject(const char* prop, const char* value) const
360 {
361     auto vm = GetEcmaVM();
362     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
363     auto valueRef = JsiValueConvertor::toJsiValueWithVM<std::string>(GetEcmaVM(), value);
364     if (valueRef->IsString(vm)) {
365         GetHandle()->Set(vm, stringRef, JSON::Parse(vm, valueRef));
366     }
367 }
368 
SetPropertyObject(const char * prop,JsiRef<JsiValue> value) const369 void JsiObject::SetPropertyObject(const char* prop, JsiRef<JsiValue> value) const
370 {
371     auto vm = GetEcmaVM();
372     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
373     GetHandle()->Set(vm, stringRef, value.Get().GetLocalHandle());
374 }
375 
376 // -----------------------
377 // Implementation of JsiFunction
378 // -----------------------
JsiFunction()379 JsiFunction::JsiFunction() {}
JsiFunction(const panda::CopyableGlobal<panda::FunctionRef> & val)380 JsiFunction::JsiFunction(const panda::CopyableGlobal<panda::FunctionRef>& val) : JsiType(val) {}
381 
JsiFunction(panda::Local<panda::FunctionRef> val)382 JsiFunction::JsiFunction(panda::Local<panda::FunctionRef> val) : JsiType(val) {}
383 
JsiFunction(const EcmaVM * vm,panda::Local<panda::FunctionRef> val)384 JsiFunction::JsiFunction(const EcmaVM *vm, panda::Local<panda::FunctionRef> val) : JsiType(vm, val) {}
385 
Call(JsiRef<JsiValue> thisVal,int argc,JsiRef<JsiValue> argv[]) const386 JsiRef<JsiValue> JsiFunction::Call(JsiRef<JsiValue> thisVal, int argc, JsiRef<JsiValue> argv[]) const
387 {
388     JS_CALLBACK_DURATION();
389     auto vm = GetEcmaVM();
390     panda::JsiFastNativeScope fastNativeScope(vm);
391     LocalScope scope(vm);
392     panda::TryCatch trycatch(vm);
393     bool traceEnabled = false;
394     if (SystemProperties::GetDebugEnabled()) {
395         traceEnabled = AceTraceBeginWithArgs("ExecuteJS[%s]", GetHandle()->GetName(vm)->ToString(vm).c_str());
396     }
397     std::vector<panda::Local<panda::JSValueRef>> arguments;
398     for (int i = 0; i < argc; ++i) {
399         arguments.emplace_back(argv[i].Get().GetLocalHandle());
400     }
401     auto thisObj = thisVal.Get().GetLocalHandle();
402     auto result = GetHandle()->Call(vm, thisObj, arguments.data(), argc);
403     JSNApi::ExecutePendingJob(vm);
404     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
405     if (result.IsEmpty() || trycatch.HasCaught()) {
406         runtime->HandleUncaughtException(trycatch);
407         result = JSValueRef::Undefined(vm);
408     }
409     if (traceEnabled) {
410         AceTraceEnd();
411     }
412     return JsiRef<JsiValue>::Make(result);
413 }
414 
New(JsiFunctionCallback func)415 panda::Local<panda::FunctionRef> JsiFunction::New(JsiFunctionCallback func)
416 {
417     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
418     return panda::FunctionRef::New(const_cast<EcmaVM*>(runtime->GetEcmaVm()), func);
419 }
420 
421 // -----------------------
422 // Implementation of JsiObjectTemplate
423 // -----------------------
JsiObjTemplate(const panda::CopyableGlobal<panda::ObjectRef> & val)424 JsiObjTemplate::JsiObjTemplate(const panda::CopyableGlobal<panda::ObjectRef>& val) : JsiObject(val) {}
JsiObjTemplate(panda::Local<panda::ObjectRef> val)425 JsiObjTemplate::JsiObjTemplate(panda::Local<panda::ObjectRef> val) : JsiObject(val) {}
426 
SetInternalFieldCount(int32_t count) const427 void JsiObjTemplate::SetInternalFieldCount(int32_t count) const
428 {
429     GetHandle()->SetNativePointerFieldCount(GetEcmaVM(), count);
430 }
431 
NewInstance() const432 JsiRef<JsiObject> JsiObjTemplate::NewInstance() const
433 {
434     auto instance = panda::ObjectRef::New(GetEcmaVM());
435     instance->SetNativePointerFieldCount(GetEcmaVM(), 1);
436     return JsiRef<JsiObject>::Make(instance);
437 }
438 
New()439 panda::Local<panda::JSValueRef> JsiObjTemplate::New()
440 {
441     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
442     return panda::ObjectRef::New(runtime->GetEcmaVm());
443 }
444 
445 // -----------------------
446 // Implementation of JsiCallBackInfo
447 // -----------------------
JsiCallbackInfo(panda::JsiRuntimeCallInfo * info)448 JsiCallbackInfo::JsiCallbackInfo(panda::JsiRuntimeCallInfo* info) : info_(info) {}
449 
operator [](size_t index) const450 JsiRef<JsiValue> JsiCallbackInfo::operator[](size_t index) const
451 {
452     if (index < Length()) {
453         return JsiRef<JsiValue>::FastMake(info_->GetVM(), info_->GetCallArgRef(index));
454     }
455     return JsiRef<JsiValue>::FastMake(info_->GetVM(), panda::JSValueRef::Undefined(info_->GetVM()));
456 }
457 
This() const458 JsiRef<JsiObject> JsiCallbackInfo::This() const
459 {
460     auto obj = JsiObject { info_->GetVM(), info_->GetThisRef() };
461     auto ref = JsiRef<JsiObject>(obj);
462     return ref;
463 }
464 
Length() const465 uint32_t JsiCallbackInfo::Length() const
466 {
467     return info_->GetArgsNumber();
468 }
469 
ReturnSelf() const470 void JsiCallbackInfo::ReturnSelf() const
471 {
472     panda::CopyableGlobal<panda::JSValueRef> thisObj(info_->GetVM(), info_->GetThisRef());
473     retVal_ = thisObj;
474 }
475 
GetBooleanArg(size_t index,bool & value) const476 bool JsiCallbackInfo::GetBooleanArg(size_t index, bool& value) const
477 {
478     auto arg = info_->GetCallArgRef(index);
479     if (arg.IsEmpty() || !arg->IsBoolean()) {
480         return false;
481     }
482     value = arg->ToBoolean(info_->GetVM())->Value();
483     return true;
484 }
485 
GetInt32Arg(size_t index,int32_t & value) const486 bool JsiCallbackInfo::GetInt32Arg(size_t index, int32_t& value) const
487 {
488     auto arg = info_->GetCallArgRef(index);
489     if (arg.IsEmpty() || !arg->IsNumber()) {
490         return false;
491     }
492     value = arg->Int32Value(info_->GetVM());
493     return true;
494 }
495 
GetUint32Arg(size_t index,uint32_t & value) const496 bool JsiCallbackInfo::GetUint32Arg(size_t index, uint32_t& value) const
497 {
498     auto arg = info_->GetCallArgRef(index);
499     if (arg.IsEmpty() || !arg->IsNumber()) {
500         return false;
501     }
502     value = arg->Uint32Value(info_->GetVM());
503     return true;
504 }
505 
GetDoubleArg(size_t index,double & value,bool isJudgeSpecialValue) const506 bool JsiCallbackInfo::GetDoubleArg(size_t index, double& value, bool isJudgeSpecialValue) const
507 {
508     auto arg = info_->GetCallArgRef(index);
509     if (arg.IsEmpty()) {
510         return false;
511     }
512     bool ret = false;
513     value = arg->GetValueDouble(ret);
514     if (isJudgeSpecialValue) {
515         return (std::isnan(value) || std::isinf(value)) ? false : ret;
516     }
517     return ret;
518 }
519 
GetStringArg(size_t index,std::string & value) const520 bool JsiCallbackInfo::GetStringArg(size_t index, std::string& value) const
521 {
522     auto arg = info_->GetCallArgRef(index);
523     if (arg.IsEmpty() || !arg->IsString(info_->GetVM())) {
524         return false;
525     }
526     value = arg->ToString(info_->GetVM())->ToString(info_->GetVM());
527     return true;
528 }
529 
GetDoubleArrayArg(size_t index,std::vector<double> & valueArr) const530 bool JsiCallbackInfo::GetDoubleArrayArg(size_t index, std::vector<double>& valueArr) const
531 {
532     auto arg = info_->GetCallArgRef(index);
533     if (arg.IsEmpty() || !arg->IsArray(info_->GetVM())) {
534         return false;
535     }
536     auto arrayRef = Local<ArrayRef>(arg);
537     uint32_t length = arrayRef->Length(info_->GetVM());
538     valueArr.reserve(length);
539     for (uint32_t i = 0; i < length; ++i) {
540         auto jsDouble = panda::ArrayRef::GetValueAt(info_->GetVM(), arrayRef, i);
541         if (!jsDouble.IsEmpty() && jsDouble->IsNumber()) {
542             valueArr.emplace_back(jsDouble->ToNumber(info_->GetVM())->Value());
543         }
544     }
545     return true;
546 }
547 
548 // -----------------------
549 // Implementation of JsiString
550 // -----------------------
JsiString(const panda::CopyableGlobal<panda::StringRef> & val)551 JsiString::JsiString(const panda::CopyableGlobal<panda::StringRef>& val) : JsiType(val) {}
JsiString(panda::Local<panda::StringRef> val)552 JsiString::JsiString(panda::Local<panda::StringRef> val) : JsiType(val) {}
553 
New(const char * str)554 panda::Local<panda::StringRef> JsiString::New(const char* str)
555 {
556     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
557     return panda::StringRef::NewFromUtf8(runtime->GetEcmaVm(), str);
558 }
559 
New(const std::string & str)560 panda::Local<panda::StringRef> JsiString::New(const std::string& str)
561 {
562     return JsiString::New(str.c_str());
563 }
564 
565 // -----------------------
566 // Implementation of JsiDate
567 // -----------------------
JsiDate(const panda::CopyableGlobal<panda::DateRef> & val)568 JsiDate::JsiDate(const panda::CopyableGlobal<panda::DateRef>& val) : JsiType(val) {}
JsiDate(panda::Local<panda::DateRef> val)569 JsiDate::JsiDate(panda::Local<panda::DateRef> val) : JsiType(val) {}
570 
New(double value)571 JsiRef<JsiValue> JsiDate::New(double value)
572 {
573     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
574     return JsiRef<JsiValue>::Make(panda::DateRef::New(runtime->GetEcmaVm(), value));
575 }
576 
577 } // namespace OHOS::Ace::Framework
578