diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp index 5242c911e814ad19cf872a3fb57715c3203531a7..35d3f2c8e0648d30fd37e70b54574a010aa1f4b0 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp @@ -122,6 +122,30 @@ bool JsiValue::ToBoolean() const return GetHandle()->BooleaValue(); } +JsiRef JsiValue::Undefined() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::Null() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::Null(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::True() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::True(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::False() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::False(runtime->GetEcmaVm())); +} + // ----------------------- // Implementation of JsiArray // ----------------------- @@ -204,8 +228,14 @@ JsiRef JsiObject::ToJsonObject(const char* value) const { auto vm = GetEcmaVM(); auto valueRef = JsiValueConvertor::toJsiValueWithVM(vm, value); - auto refValue = JsiRef::Make(JSON::Parse(vm, valueRef)); - return refValue; + panda::Local result = JSON::Parse(vm, valueRef); + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + if (result.IsEmpty() || runtime->HasPendingException()) { + runtime->HandleUncaughtException(); + return JsiRef::Make(JSValueRef::Undefined(vm)); + } + + return JsiRef::Make(result); } void JsiObject::SetPropertyJsonObject(const char* prop, const char* value) const diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h index 98e78bbb48c6c8dff788298b66a43ae945ed764b..baa15d8693f1dbf2f5c194bd3ab60c44773a1749 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h @@ -93,6 +93,11 @@ public: template T ToNumber() const; + static JsiRef Undefined(); + static JsiRef Null(); + static JsiRef True(); + static JsiRef False(); + FAKE_PTR_FOR_FUNCTION_ACCESS(JsiValue) }; diff --git a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp index 4b6383174f9362dcab6bc7aa41d41b968bda1ed1..86bfe43ada41e4aed45bfba8ecaa28a70df36cd3 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp @@ -104,9 +104,13 @@ void JSPersistent::Get(const JSCallbackInfo& args) } auto executor = container->GetTaskExecutor(); std::string value = StorageProxy::GetInstance()->GetStorage(executor)->GetString(key); - auto returnValue = JSVal(ToJSValue(value)); - auto returnPtr = JSRef::Make(returnValue); - args.SetReturnValue(returnPtr); + if (value.empty()) { + args.SetReturnValue(JSVal::Undefined()); + return; + } + JSRef obj = JSRef::New(); + JSRef ret = obj->ToJsonObject(value.c_str()); + args.SetReturnValue(ret); } void JSPersistent::Delete(const JSCallbackInfo& args)