Fix JsSerializerTest allocate buffer bug

Signed-off-by: panzhenyu1 <panzhenyu1@huawei.com>
This commit is contained in:
panzhenyu1 2021-12-27 12:06:27 +08:00
parent ee7da79043
commit 8b86eabd0f
3 changed files with 52 additions and 3 deletions

View File

@ -158,8 +158,16 @@ bool JSSerializer::WriteRawData(const void *data, size_t length)
bool JSSerializer::AllocateBuffer(size_t bytes)
{
// Get internal heap size
if (sizeLimit_ == 0) {
uint64_t heapSize = thread_->GetEcmaVM()->GetJSOptions().GetInternalMemorySizeLimit();
sizeLimit_ = heapSize;
}
size_t oldSize = bufferSize_;
size_t newSize = oldSize + bytes;
if (newSize > sizeLimit_) {
return false;
}
if (bufferCapacity_ == 0) {
if (bytes < INITIAL_CAPACITY) {
buffer_ = reinterpret_cast<uint8_t *>(malloc(INITIAL_CAPACITY));
@ -190,6 +198,10 @@ bool JSSerializer::AllocateBuffer(size_t bytes)
bool JSSerializer::ExpandBuffer(size_t requestedSize)
{
size_t newCapacity = bufferCapacity_ * CAPACITY_INCREASE_RATE;
newCapacity = std::max(newCapacity, requestedSize);
if (newCapacity > sizeLimit_) {
return false;
}
uint8_t *newBuffer = reinterpret_cast<uint8_t *>(malloc(newCapacity));
if (newBuffer == nullptr) {
return false;

View File

@ -124,6 +124,7 @@ private:
JSThread *thread_;
uint8_t *buffer_ = nullptr;
uint64_t sizeLimit_ = 0;
size_t bufferSize_ = 0;
size_t bufferCapacity_ = 0;
// The Reference map is used for check whether a tagged object has been serialized

View File

@ -230,7 +230,7 @@ public:
Destroy();
}
void EcmaStringTest(std::pair<uint8_t *, size_t> data)
void EcmaStringTest1(std::pair<uint8_t *, size_t> data)
{
Init();
const char *rawStr = "this is a test ecmaString";
@ -246,6 +246,25 @@ public:
Destroy();
}
void EcmaStringTest2(std::pair<uint8_t *, size_t> data)
{
Init();
const char *rawStr = "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"ssssss";
JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromCanBeCompressString(rawStr);
JSDeserializer deserializer(thread, data.first, data.second);
JSHandle<JSTaggedValue> res = deserializer.DeserializeJSTaggedValue();
EXPECT_TRUE(!res.IsEmpty()) << "[Empty] Deserialize ecmaString fail";
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();
@ -666,7 +685,7 @@ HWTEST_F_L0(JSSerializerTest, TestObjectsPropertyReference)
delete serializer;
};
HWTEST_F_L0(JSSerializerTest, SerializeEcmaString)
HWTEST_F_L0(JSSerializerTest, SerializeEcmaString1)
{
const char *rawStr = "this is a test ecmaString";
JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromCanBeCompressString(rawStr);
@ -675,7 +694,24 @@ HWTEST_F_L0(JSSerializerTest, SerializeEcmaString)
EXPECT_TRUE(success) << "Serialize EcmaString fail";
std::pair<uint8_t *, size_t> data = serializer->ReleaseBuffer();
JSDeserializerTest jsDeserializerTest;
std::thread t1(&JSDeserializerTest::EcmaStringTest, jsDeserializerTest, data);
std::thread t1(&JSDeserializerTest::EcmaStringTest1, jsDeserializerTest, data);
t1.join();
delete serializer;
};
HWTEST_F_L0(JSSerializerTest, SerializeEcmaString2)
{
const char *rawStr = "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"\
"ssssss";
JSHandle<EcmaString> ecmaString = thread->GetEcmaVM()->GetFactory()->NewFromCanBeCompressString(rawStr);
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::EcmaStringTest2, jsDeserializerTest, data);
t1.join();
delete serializer;
};