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:
panzhenyu1
2022-01-27 12:06:48 +08:00
parent 49f0a819b1
commit c97f2bce11
2 changed files with 36 additions and 0 deletions
+9
View File
@@ -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>();
+27
View File
@@ -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);