• 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 
ToBoolean() const138 bool JsiValue::ToBoolean() const
139 {
140     return GetHandle()->BooleaValue(GetEcmaVM());
141 }
142 
Undefined()143 JsiRef<JsiValue> JsiValue::Undefined()
144 {
145     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
146     return JsiRef<JsiValue>::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm()));
147 }
148 
Null()149 JsiRef<JsiValue> JsiValue::Null()
150 {
151     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
152     return JsiRef<JsiValue>::Make(panda::JSValueRef::Null(runtime->GetEcmaVm()));
153 }
154 
True()155 JsiRef<JsiValue> JsiValue::True()
156 {
157     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
158     return JsiRef<JsiValue>::Make(panda::JSValueRef::True(runtime->GetEcmaVm()));
159 }
160 
False()161 JsiRef<JsiValue> JsiValue::False()
162 {
163     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
164     return JsiRef<JsiValue>::Make(panda::JSValueRef::False(runtime->GetEcmaVm()));
165 }
166 
167 // -----------------------
168 // Implementation of JsiArray
169 // -----------------------
JsiArray()170 JsiArray::JsiArray() {}
JsiArray(const panda::CopyableGlobal<panda::ArrayRef> & val)171 JsiArray::JsiArray(const panda::CopyableGlobal<panda::ArrayRef>& val) : JsiType(val) {}
JsiArray(panda::Local<panda::ArrayRef> val)172 JsiArray::JsiArray(panda::Local<panda::ArrayRef> val) : JsiType(val) {}
JsiArray(const EcmaVM * vm,panda::Local<panda::ArrayRef> val)173 JsiArray::JsiArray(const EcmaVM *vm, panda::Local<panda::ArrayRef> val) : JsiType(vm, val) {}
174 
GetValueAt(size_t index) const175 JsiRef<JsiValue> JsiArray::GetValueAt(size_t index) const
176 {
177     return JsiRef<JsiValue>::FastMake(GetEcmaVM(), panda::ArrayRef::GetValueAt(GetEcmaVM(), GetLocalHandle(), index));
178 }
179 
SetValueAt(size_t index,JsiRef<JsiValue> value) const180 void JsiArray::SetValueAt(size_t index, JsiRef<JsiValue> value) const
181 {
182     panda::ArrayRef::SetValueAt(GetEcmaVM(), GetLocalHandle(), index, value.Get().GetLocalHandle());
183 }
184 
GetProperty(const char * prop) const185 JsiRef<JsiValue> JsiArray::GetProperty(const char* prop) const
186 {
187     auto vm = GetEcmaVM();
188     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
189     auto value = GetHandle()->Get(vm, stringRef);
190     auto func = JsiValue(vm, value);
191     auto refValue =  JsiRef<JsiValue>(func);
192     return refValue;
193 }
194 
GetProperty(int32_t propertyIndex) const195 JsiRef<JsiValue> JsiArray::GetProperty(int32_t propertyIndex) const
196 {
197     auto vm = GetEcmaVM();
198     auto stringRef = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
199     auto value = GetHandle()->Get(vm, stringRef);
200     auto func = JsiValue(vm, value);
201     auto refValue = JsiRef<JsiValue>(func);
202     return refValue;
203 }
204 
Length() const205 size_t JsiArray::Length() const
206 {
207     size_t length = -1;
208     JsiRef<JsiValue> propLength = GetProperty(static_cast<int32_t>(ArkUIIndex::LENGTH));
209     if (propLength->IsNumber()) {
210         length = propLength->ToNumber<int32_t>();
211     }
212     return length;
213 }
214 
SetLength(size_t length) const215 void JsiArray::SetLength(size_t length) const
216 {
217     auto stringRef = panda::StringRef::NewFromUtf8(GetEcmaVM(), "length");
218     GetHandle()->Set(GetEcmaVM(), stringRef, JsiValueConvertor::toJsiValueWithVM<size_t>(GetEcmaVM(), length));
219 }
220 
IsArray() const221 bool JsiArray::IsArray() const
222 {
223     if (GetHandle().IsEmpty()) {
224         return false;
225     } else {
226         return GetHandle()->IsArray(GetEcmaVM());
227     }
228 }
229 
230 // -----------------------
231 // Implementation of JsiArrayBuffer
232 // -----------------------
JsiArrayBuffer(panda::Local<panda::ArrayBufferRef> val)233 JsiArrayBuffer::JsiArrayBuffer(panda::Local<panda::ArrayBufferRef> val) : JsiType(val) {}
JsiArrayBuffer(const panda::CopyableGlobal<panda::ArrayBufferRef> & val)234 JsiArrayBuffer::JsiArrayBuffer(const panda::CopyableGlobal<panda::ArrayBufferRef>& val) : JsiType(val) {}
235 
ByteLength() const236 int32_t JsiArrayBuffer::ByteLength() const
237 {
238     return GetHandle()->ByteLength(GetEcmaVM());
239 }
240 
GetBuffer() const241 void* JsiArrayBuffer::GetBuffer() const
242 {
243     return GetHandle()->GetBuffer(GetEcmaVM());
244 }
245 
Detach() const246 void JsiArrayBuffer::Detach() const
247 {
248     GetHandle()->Detach(GetEcmaVM());
249 }
250 
IsDetach() const251 bool JsiArrayBuffer::IsDetach() const
252 {
253     return GetHandle()->IsDetach(GetEcmaVM());
254 }
255 
256 // -----------------------
257 // Implementation of JsiArrayBufferRef
258 // -----------------------
JsiUint8ClampedArray(panda::Local<panda::Uint8ClampedArrayRef> val)259 JsiUint8ClampedArray::JsiUint8ClampedArray(panda::Local<panda::Uint8ClampedArrayRef> val) : JsiType(val) {}
JsiUint8ClampedArray(const panda::CopyableGlobal<panda::Uint8ClampedArrayRef> & val)260 JsiUint8ClampedArray::JsiUint8ClampedArray(const panda::CopyableGlobal<panda::Uint8ClampedArrayRef>& val) : JsiType(val)
261 {}
262 
GetArrayBuffer() const263 JsiRef<JsiArrayBuffer> JsiUint8ClampedArray::GetArrayBuffer() const
264 {
265     return JsiRef<JsiArrayBuffer>(JsiArrayBuffer(GetHandle()->GetArrayBuffer(GetEcmaVM())));
266 }
267 
268 // -----------------------
269 // Implementation of JsiObject
270 // -----------------------
JsiObject()271 JsiObject::JsiObject() : JsiType() {}
JsiObject(const panda::CopyableGlobal<panda::ObjectRef> & val)272 JsiObject::JsiObject(const panda::CopyableGlobal<panda::ObjectRef>& val) : JsiType(val) {}
JsiObject(panda::Local<panda::ObjectRef> val)273 JsiObject::JsiObject(panda::Local<panda::ObjectRef> val) : JsiType(val) {}
JsiObject(const EcmaVM * vm,panda::Local<panda::ObjectRef> val)274 JsiObject::JsiObject(const EcmaVM *vm, panda::Local<panda::ObjectRef> val) : JsiType(vm, val) {}
275 
IsUndefined() const276 bool JsiObject::IsUndefined() const
277 {
278     if (GetHandle().IsEmpty()) {
279         return true;
280     } else {
281         return GetHandle()->IsUndefined();
282     }
283 }
284 
GetPropertyNames() const285 JsiRef<JsiArray> JsiObject::GetPropertyNames() const
286 {
287     auto vm = GetEcmaVM();
288     return JsiRef<JsiArray>::Make(GetHandle()->GetOwnPropertyNames(vm));
289 }
290 
GetProperty(int32_t propertyIndex) const291 JsiRef<JsiValue> JsiObject::GetProperty(int32_t propertyIndex) const
292 {
293     auto vm = GetEcmaVM();
294     auto str = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
295     auto value = GetHandle()->Get(vm, str);
296     auto func = JsiValue(vm, value);
297     auto refValue = JsiRef<JsiValue>(func);
298     return refValue;
299 }
300 
HasProperty(int32_t propertyIndex) const301 bool JsiObject::HasProperty(int32_t propertyIndex) const
302 {
303     auto vm = GetEcmaVM();
304     auto stringRef = panda::ExternalStringCache::GetCachedString(vm, propertyIndex);
305     bool has = GetHandle()->Has(vm, stringRef);
306     return has;
307 }
308 
GetProperty(const char * prop) const309 JsiRef<JsiValue> JsiObject::GetProperty(const char* prop) const
310 {
311     auto vm = GetEcmaVM();
312     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
313     auto value = GetHandle()->Get(vm, stringRef);
314     auto func = JsiValue(vm, value);
315     auto refValue =  JsiRef<JsiValue>(func);
316     return refValue;
317 }
318 
HasProperty(const char * prop) const319 bool JsiObject::HasProperty(const char* prop) const
320 {
321     auto vm = GetEcmaVM();
322     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
323     bool has = GetHandle()->Has(vm, stringRef);
324     return has;
325 }
326 
ToJsonObject(const char * value) const327 JsiRef<JsiValue> JsiObject::ToJsonObject(const char* value) const
328 {
329     auto vm = GetEcmaVM();
330     panda::TryCatch trycatch(vm);
331     auto valueRef = JsiValueConvertor::toJsiValueWithVM<std::string>(vm, value);
332     panda::Local<JSValueRef> result = JSON::Parse(vm, valueRef);
333     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
334     if (result.IsEmpty() || trycatch.HasCaught()) {
335         runtime->HandleUncaughtException(trycatch);
336         return JsiRef<JsiValue>::Make(JSValueRef::Undefined(vm));
337     }
338 
339     return JsiRef<JsiValue>::Make(result);
340 }
341 
SetPropertyJsonObject(const char * prop,const char * value) const342 void JsiObject::SetPropertyJsonObject(const char* prop, const char* value) const
343 {
344     auto vm = GetEcmaVM();
345     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
346     auto valueRef = JsiValueConvertor::toJsiValueWithVM<std::string>(GetEcmaVM(), value);
347     if (valueRef->IsString(vm)) {
348         GetHandle()->Set(vm, stringRef, JSON::Parse(vm, valueRef));
349     }
350 }
351 
SetPropertyObject(const char * prop,JsiRef<JsiValue> value) const352 void JsiObject::SetPropertyObject(const char* prop, JsiRef<JsiValue> value) const
353 {
354     auto vm = GetEcmaVM();
355     auto stringRef = panda::StringRef::NewFromUtf8(vm, prop);
356     GetHandle()->Set(vm, stringRef, value.Get().GetLocalHandle());
357 }
358 
359 // -----------------------
360 // Implementation of JsiFunction
361 // -----------------------
JsiFunction()362 JsiFunction::JsiFunction() {}
JsiFunction(const panda::CopyableGlobal<panda::FunctionRef> & val)363 JsiFunction::JsiFunction(const panda::CopyableGlobal<panda::FunctionRef>& val) : JsiType(val) {}
364 
JsiFunction(panda::Local<panda::FunctionRef> val)365 JsiFunction::JsiFunction(panda::Local<panda::FunctionRef> val) : JsiType(val) {}
366 
JsiFunction(const EcmaVM * vm,panda::Local<panda::FunctionRef> val)367 JsiFunction::JsiFunction(const EcmaVM *vm, panda::Local<panda::FunctionRef> val) : JsiType(vm, val) {}
368 
Call(JsiRef<JsiValue> thisVal,int argc,JsiRef<JsiValue> argv[]) const369 JsiRef<JsiValue> JsiFunction::Call(JsiRef<JsiValue> thisVal, int argc, JsiRef<JsiValue> argv[]) const
370 {
371     JS_CALLBACK_DURATION();
372     auto vm = GetEcmaVM();
373     LocalScope scope(vm);
374     panda::TryCatch trycatch(vm);
375     bool traceEnabled = false;
376     if (SystemProperties::GetDebugEnabled()) {
377         traceEnabled = AceTraceBeginWithArgs("ExecuteJS[%s]", GetHandle()->GetName(vm)->ToString(vm).c_str());
378     }
379     std::vector<panda::Local<panda::JSValueRef>> arguments;
380     for (int i = 0; i < argc; ++i) {
381         arguments.emplace_back(argv[i].Get().GetLocalHandle());
382     }
383     auto thisObj = thisVal.Get().GetLocalHandle();
384     auto result = GetHandle()->Call(vm, thisObj, arguments.data(), argc);
385     JSNApi::ExecutePendingJob(vm);
386     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
387     if (result.IsEmpty() || trycatch.HasCaught()) {
388         runtime->HandleUncaughtException(trycatch);
389         result = JSValueRef::Undefined(vm);
390     }
391     if (traceEnabled) {
392         AceTraceEnd();
393     }
394     return JsiRef<JsiValue>::Make(result);
395 }
396 
New(JsiFunctionCallback func)397 panda::Local<panda::FunctionRef> JsiFunction::New(JsiFunctionCallback func)
398 {
399     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
400     return panda::FunctionRef::New(const_cast<EcmaVM*>(runtime->GetEcmaVm()), func);
401 }
402 
403 // -----------------------
404 // Implementation of JsiObjectTemplate
405 // -----------------------
JsiObjTemplate(const panda::CopyableGlobal<panda::ObjectRef> & val)406 JsiObjTemplate::JsiObjTemplate(const panda::CopyableGlobal<panda::ObjectRef>& val) : JsiObject(val) {}
JsiObjTemplate(panda::Local<panda::ObjectRef> val)407 JsiObjTemplate::JsiObjTemplate(panda::Local<panda::ObjectRef> val) : JsiObject(val) {}
408 
SetInternalFieldCount(int32_t count) const409 void JsiObjTemplate::SetInternalFieldCount(int32_t count) const
410 {
411     GetHandle()->SetNativePointerFieldCount(GetEcmaVM(), count);
412 }
413 
NewInstance() const414 JsiRef<JsiObject> JsiObjTemplate::NewInstance() const
415 {
416     auto instance = panda::ObjectRef::New(GetEcmaVM());
417     instance->SetNativePointerFieldCount(GetEcmaVM(), 1);
418     return JsiRef<JsiObject>::Make(instance);
419 }
420 
New()421 panda::Local<panda::JSValueRef> JsiObjTemplate::New()
422 {
423     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
424     return panda::ObjectRef::New(runtime->GetEcmaVm());
425 }
426 
427 // -----------------------
428 // Implementation of JsiCallBackInfo
429 // -----------------------
JsiCallbackInfo(panda::JsiRuntimeCallInfo * info)430 JsiCallbackInfo::JsiCallbackInfo(panda::JsiRuntimeCallInfo* info) : info_(info) {}
431 
operator [](size_t index) const432 JsiRef<JsiValue> JsiCallbackInfo::operator[](size_t index) const
433 {
434     if (static_cast<int32_t>(index) < Length()) {
435         return JsiRef<JsiValue>::FastMake(info_->GetVM(), info_->GetCallArgRef(index));
436     }
437     return JsiRef<JsiValue>::FastMake(info_->GetVM(), panda::JSValueRef::Undefined(info_->GetVM()));
438 }
439 
This() const440 JsiRef<JsiObject> JsiCallbackInfo::This() const
441 {
442     auto obj = JsiObject { info_->GetVM(), info_->GetThisRef() };
443     auto ref = JsiRef<JsiObject>(obj);
444     return ref;
445 }
446 
Length() const447 int JsiCallbackInfo::Length() const
448 {
449     return info_->GetArgsNumber();
450 }
451 
ReturnSelf() const452 void JsiCallbackInfo::ReturnSelf() const
453 {
454     panda::CopyableGlobal<panda::JSValueRef> thisObj(info_->GetVM(), info_->GetThisRef());
455     retVal_ = thisObj;
456 }
457 
GetBooleanArg(size_t index,bool & value) const458 bool JsiCallbackInfo::GetBooleanArg(size_t index, bool& value) const
459 {
460     auto arg = info_->GetCallArgRef(index);
461     if (arg.IsEmpty() || !arg->IsBoolean()) {
462         return false;
463     }
464     value = arg->ToBoolean(info_->GetVM())->Value();
465     return true;
466 }
467 
GetInt32Arg(size_t index,int32_t & value) const468 bool JsiCallbackInfo::GetInt32Arg(size_t index, int32_t& value) const
469 {
470     auto arg = info_->GetCallArgRef(index);
471     if (arg.IsEmpty() || !arg->IsNumber()) {
472         return false;
473     }
474     value = arg->Int32Value(info_->GetVM());
475     return true;
476 }
477 
GetUint32Arg(size_t index,uint32_t & value) const478 bool JsiCallbackInfo::GetUint32Arg(size_t index, uint32_t& value) const
479 {
480     auto arg = info_->GetCallArgRef(index);
481     if (arg.IsEmpty() || !arg->IsNumber()) {
482         return false;
483     }
484     value = arg->Uint32Value(info_->GetVM());
485     return true;
486 }
487 
GetDoubleArg(size_t index,double & value) const488 bool JsiCallbackInfo::GetDoubleArg(size_t index, double& value) const
489 {
490     auto arg = info_->GetCallArgRef(index);
491     if (arg.IsEmpty()) {
492         return false;
493     }
494     bool ret = false;
495     value = arg->GetValueDouble(ret);
496     return ret;
497 }
498 
GetStringArg(size_t index,std::string & value) const499 bool JsiCallbackInfo::GetStringArg(size_t index, std::string& value) const
500 {
501     auto arg = info_->GetCallArgRef(index);
502     if (arg.IsEmpty() || !arg->IsString(info_->GetVM())) {
503         return false;
504     }
505     value = arg->ToString(info_->GetVM())->ToString(info_->GetVM());
506     return true;
507 }
508 
GetDoubleArrayArg(size_t index,std::vector<double> & valueArr) const509 bool JsiCallbackInfo::GetDoubleArrayArg(size_t index, std::vector<double>& valueArr) const
510 {
511     auto arg = info_->GetCallArgRef(index);
512     if (arg.IsEmpty() || !arg->IsArray(info_->GetVM())) {
513         return false;
514     }
515     auto arrayRef = Local<ArrayRef>(arg);
516     uint32_t length = arrayRef->Length(info_->GetVM());
517     valueArr.reserve(length);
518     for (uint32_t i = 0; i < length; ++i) {
519         auto jsDouble = panda::ArrayRef::GetValueAt(info_->GetVM(), arrayRef, i);
520         if (!jsDouble.IsEmpty() && jsDouble->IsNumber()) {
521             valueArr.emplace_back(jsDouble->ToNumber(info_->GetVM())->Value());
522         }
523     }
524     return true;
525 }
526 
527 // -----------------------
528 // Implementation of JsiString
529 // -----------------------
JsiString(const panda::CopyableGlobal<panda::StringRef> & val)530 JsiString::JsiString(const panda::CopyableGlobal<panda::StringRef>& val) : JsiType(val) {}
JsiString(panda::Local<panda::StringRef> val)531 JsiString::JsiString(panda::Local<panda::StringRef> val) : JsiType(val) {}
532 
New(const char * str)533 panda::Local<panda::StringRef> JsiString::New(const char* str)
534 {
535     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
536     return panda::StringRef::NewFromUtf8(runtime->GetEcmaVm(), str);
537 }
538 
New(const std::string & str)539 panda::Local<panda::StringRef> JsiString::New(const std::string& str)
540 {
541     return JsiString::New(str.c_str());
542 }
543 
544 // -----------------------
545 // Implementation of JsiDate
546 // -----------------------
JsiDate(const panda::CopyableGlobal<panda::DateRef> & val)547 JsiDate::JsiDate(const panda::CopyableGlobal<panda::DateRef>& val) : JsiType(val) {}
JsiDate(panda::Local<panda::DateRef> val)548 JsiDate::JsiDate(panda::Local<panda::DateRef> val) : JsiType(val) {}
549 
New(double value)550 JsiRef<JsiValue> JsiDate::New(double value)
551 {
552     auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
553     return JsiRef<JsiValue>::Make(panda::DateRef::New(runtime->GetEcmaVm(), value));
554 }
555 
556 } // namespace OHOS::Ace::Framework
557