mirror of
https://github.com/openharmony/ark_js_runtime.git
synced 2026-07-25 22:15:32 -04:00
Add special case for empty string in JSSerializer
Add special case for empty EcmaString and testcase at same condition for JSSerialzer Unit Test Relevant issue:https://e.gitee.com/open_harmony/dashboard?issue=I4SDCF Signed-off-by: panzhenyu1 <panzhenyu1@huawei.com>
This commit is contained in:
@@ -415,6 +415,10 @@ bool JSSerializer::WriteEcmaString(const JSHandle<JSTaggedValue> &value)
|
||||
bufferSize_ = oldSize;
|
||||
return false;
|
||||
}
|
||||
// skip writeRawData for empty EcmaString
|
||||
if (length == 0) {
|
||||
return true;
|
||||
}
|
||||
const uint8_t *data = string->GetDataUtf8();
|
||||
const uint8_t strEnd = '\0';
|
||||
if (!WriteRawData(data, length) || !WriteRawData(&strEnd, sizeof(uint8_t))) {
|
||||
@@ -989,6 +993,11 @@ JSHandle<JSTaggedValue> JSDeserializer::ReadEcmaString()
|
||||
return JSHandle<JSTaggedValue>();
|
||||
}
|
||||
ObjectFactory *factory = thread_->GetEcmaVM()->GetFactory();
|
||||
if (stringLength == 0) {
|
||||
JSHandle<JSTaggedValue> emptyString = JSHandle<JSTaggedValue>::Cast(factory->GetEmptyString());
|
||||
return emptyString;
|
||||
}
|
||||
|
||||
uint8_t *string = reinterpret_cast<uint8_t*>(GetBuffer(stringLength + 1));
|
||||
if (string == nullptr) {
|
||||
return JSHandle<JSTaggedValue>();
|
||||
|
||||
@@ -264,6 +264,20 @@ public:
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void EcmaStringTest3(std::pair<uint8_t *, size_t> data)
|
||||
{
|
||||
Init();
|
||||
JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->GetEmptyString();
|
||||
|
||||
JSDeserializer deserializer(thread, data.first, data.second);
|
||||
JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
|
||||
EXPECT_TRUE(res->IsString()) << "[NotString] Deserialize ecmaString fail";
|
||||
JSHandle<EcmaString> resEcmaString = JSHandle<EcmaString>::Cast(res);
|
||||
EXPECT_TRUE(ecmaString->GetHashcode() == resEcmaString->GetHashcode()) << "Not same HashCode";
|
||||
EXPECT_TRUE(EcmaString::StringsAreEqual(*ecmaString, *resEcmaString)) << "Not same EcmaString";
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void Int32Test(std::pair<uint8_t *, size_t> data)
|
||||
{
|
||||
Init();
|
||||
@@ -714,6 +728,19 @@ HWTEST_F_L0(JSSerializerTest, SerializeEcmaString2)
|
||||
delete serializer;
|
||||
};
|
||||
|
||||
HWTEST_F_L0(JSSerializerTest, SerializeEcmaString3)
|
||||
{
|
||||
JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->GetEmptyString();
|
||||
JSSerializer *serializer = new JSSerializer(thread);
|
||||
bool success = serializer->SerializeJSTaggedValue(JSHandle<JSTaggedValue>(ecmaString));
|
||||
EXPECT_TRUE(success) << "Serialize EcmaString fail";
|
||||
std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
|
||||
JSDeserializerTest jsDeserializerTest;
|
||||
std::thread t1(&JSDeserializerTest::EcmaStringTest3, jsDeserializerTest, data);
|
||||
t1.join();
|
||||
delete serializer;
|
||||
};
|
||||
|
||||
HWTEST_F_L0(JSSerializerTest, SerializeInt32_t)
|
||||
{
|
||||
JSSerializer *serializer = new JSSerializer(thread);
|
||||
|
||||
Reference in New Issue
Block a user