mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
Fix serialize shared object with clone list bug
Description: Fix serialize shared object with clone list bug Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IARMXG?from=project-issue Signed-off-by: dingwen <dingwen6@huawei.com> Change-Id: I65362110c9e6233bea41bf90c61754363efaa949
This commit is contained in:
parent
089fe0d204
commit
6854ae9d97
@ -603,7 +603,7 @@ void BaseDeserializer::AllocateMultiRegion(SparseSpace *space, size_t spaceObjSi
|
||||
space->ResetTopPointer(space->GetCurrentRegion()->GetEnd() - lastRegionRemainSize);
|
||||
}
|
||||
|
||||
Region *BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t ®ionIndex)
|
||||
void BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t ®ionIndex)
|
||||
{
|
||||
regionIndex = regionVector_.size();
|
||||
size_t regionAlignedSize = SerializeData::AlignUpRegionAvailableSize(spaceObjSize);
|
||||
@ -628,7 +628,6 @@ Region *BaseDeserializer::AllocateMultiSharedRegion(SharedSparseSpace *space, si
|
||||
regionNum--;
|
||||
}
|
||||
space->MergeDeserializeAllocateRegions(allocateRegions);
|
||||
return allocateRegions.front();
|
||||
}
|
||||
|
||||
void BaseDeserializer::AllocateToOldSpace(size_t oldSpaceSize)
|
||||
@ -687,8 +686,8 @@ void BaseDeserializer::AllocateToSharedOldSpace(size_t sOldSpaceSize)
|
||||
SharedSparseSpace *space = sheap_->GetOldSpace();
|
||||
uintptr_t object = space->AllocateNoGCAndExpand(thread_, sOldSpaceSize);
|
||||
if (UNLIKELY(object == 0U)) {
|
||||
Region *region = AllocateMultiSharedRegion(space, sOldSpaceSize, sOldRegionIndex_);
|
||||
sOldSpaceBeginAddr_ = region->GetBegin();
|
||||
AllocateMultiSharedRegion(space, sOldSpaceSize, sOldRegionIndex_);
|
||||
sOldSpaceBeginAddr_ = regionVector_[sOldRegionIndex_++]->GetBegin();
|
||||
} else {
|
||||
if (thread_->IsSharedConcurrentMarkingOrFinished()) {
|
||||
Region *region = Region::ObjectAddressToRange(object);
|
||||
@ -704,8 +703,8 @@ void BaseDeserializer::AllocateToSharedNonMovableSpace(size_t sNonMovableSpaceSi
|
||||
SharedNonMovableSpace *space = sheap_->GetNonMovableSpace();
|
||||
uintptr_t object = space->AllocateNoGCAndExpand(thread_, sNonMovableSpaceSize);
|
||||
if (UNLIKELY(object == 0U)) {
|
||||
Region *region = AllocateMultiSharedRegion(space, sNonMovableSpaceSize, sNonMovableRegionIndex_);
|
||||
sNonMovableSpaceBeginAddr_ = region->GetBegin();
|
||||
AllocateMultiSharedRegion(space, sNonMovableSpaceSize, sNonMovableRegionIndex_);
|
||||
sNonMovableSpaceBeginAddr_ = regionVector_[sNonMovableRegionIndex_++]->GetBegin();
|
||||
} else {
|
||||
if (thread_->IsSharedConcurrentMarkingOrFinished()) {
|
||||
Region *region = Region::ObjectAddressToRange(object);
|
||||
|
@ -108,7 +108,7 @@ private:
|
||||
|
||||
void AllocateToDifferentSpaces();
|
||||
void AllocateMultiRegion(SparseSpace *space, size_t spaceObjSize, size_t ®ionIndex);
|
||||
Region *AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t ®ionIndex);
|
||||
void AllocateMultiSharedRegion(SharedSparseSpace *space, size_t spaceObjSize, size_t ®ionIndex);
|
||||
void AllocateToOldSpace(size_t oldSpaceSize);
|
||||
void AllocateToNonMovableSpace(size_t nonMovableSpaceSize);
|
||||
void AllocateToMachineCodeSpace(size_t machineCodeSpaceSize);
|
||||
|
@ -569,6 +569,23 @@ public:
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void SerializeMultiSharedRegionTest(SerializeData *data)
|
||||
{
|
||||
Init();
|
||||
BaseDeserializer deserializer(thread, data);
|
||||
JSHandle<JSTaggedValue> res = deserializer.ReadValue();
|
||||
EXPECT_TRUE(!res.IsEmpty());
|
||||
EXPECT_TRUE(res->IsJSObject());
|
||||
JSTaggedValue elements = JSHandle<JSObject>(res)->GetElements();
|
||||
EXPECT_TRUE(elements.IsTaggedArray());
|
||||
EXPECT_EQ(JSHandle<TaggedArray>(thread, elements)->GetLength(), 10 * 1024); // 10 * 1024: array length
|
||||
JSTaggedValue value = JSHandle<TaggedArray>(thread, elements)->Get(0);
|
||||
EXPECT_TRUE(value.IsTaggedArray());
|
||||
uint32_t length = JSHandle<TaggedArray>(thread, value)->GetLength();
|
||||
EXPECT_EQ(length, 11 * 1024); // 11 * 1024: array length
|
||||
Destroy();
|
||||
}
|
||||
|
||||
void JSSharedSetBasicTest1(SerializeData *data)
|
||||
{
|
||||
Init();
|
||||
@ -2468,4 +2485,27 @@ HWTEST_F_L0(JSSerializerTest, SerializeJSSharedMapBasic)
|
||||
}
|
||||
delete serializer;
|
||||
};
|
||||
|
||||
HWTEST_F_L0(JSSerializerTest, SerializeMultiSharedRegion)
|
||||
{
|
||||
ObjectFactory *factory = ecmaVm->GetFactory();
|
||||
JSHandle<TaggedArray> array = factory->NewSTaggedArray(10 * 1024, JSTaggedValue::Hole()); // 10 * 1024: array length
|
||||
for (int i = 0; i < 5; i++) {
|
||||
JSHandle<TaggedArray> element = factory->NewSTaggedArray((11 + i) * 1024, JSTaggedValue::Hole());
|
||||
array->Set(thread, i, element);
|
||||
}
|
||||
JSHandle<JSObject> sobj = CreateEmptySObject(thread);
|
||||
sobj->SetElements(thread, array);
|
||||
ValueSerializer *serializer = new ValueSerializer(thread, false, true);
|
||||
bool success = serializer->WriteValue(thread, JSHandle<JSTaggedValue>(sobj),
|
||||
JSHandle<JSTaggedValue>(thread, JSTaggedValue::Undefined()),
|
||||
JSHandle<JSTaggedValue>(thread, JSTaggedValue::Undefined()));
|
||||
EXPECT_TRUE(success);
|
||||
std::unique_ptr<SerializeData> data = serializer->Release();
|
||||
JSDeserializerTest jsDeserializerTest;
|
||||
std::thread t1(&JSDeserializerTest::SerializeMultiSharedRegionTest, jsDeserializerTest, data.release());
|
||||
ThreadSuspensionScope scope(thread);
|
||||
t1.join();
|
||||
delete serializer;
|
||||
};
|
||||
} // namespace panda::test
|
||||
|
Loading…
Reference in New Issue
Block a user