mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-07 08:03:29 +00:00
Modify the copy algorithm of the list after grow capacity
https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/I8DT01 Signed-off-by: jiangkai43 <jiangkai43@huawei.com>
This commit is contained in:
parent
8b48aa0de6
commit
7e5795abc4
@ -49,13 +49,38 @@ JSHandle<Derived> TaggedList<Derived>::Create(const JSThread *thread, int number
|
||||
template <typename Derived>
|
||||
void TaggedList<Derived>::CopyArray(const JSThread *thread, JSHandle<Derived> &taggedList)
|
||||
{
|
||||
int capacity = GetCapacityFromTaggedArray();
|
||||
int deleteNodeNum = NumberOfDeletedNodes();
|
||||
JSMutableHandle<JSTaggedValue> value(thread, JSTaggedValue::Undefined());
|
||||
for (int i = 0; i < capacity; i++) {
|
||||
value.Update(GetElement(i));
|
||||
taggedList->SetElement(thread, i, value.GetTaggedValue());
|
||||
if (deleteNodeNum == 0 || std::is_same_v<TaggedDoubleList, Derived>) {
|
||||
int capacity = GetCapacityFromTaggedArray();
|
||||
for (int i = 0; i < capacity; i++) {
|
||||
value.Update(GetElement(i));
|
||||
taggedList->SetElement(thread, i, value.GetTaggedValue());
|
||||
}
|
||||
taggedList->SetNumberOfDeletedNodes(thread, NumberOfDeletedNodes());
|
||||
return;
|
||||
}
|
||||
taggedList->SetNumberOfDeletedNodes(thread, NumberOfDeletedNodes());
|
||||
|
||||
int actualNodeNum = NumberOfNodes();
|
||||
int tailTableIndex = ELEMENTS_START_INDEX + actualNodeNum * Derived::ENTRY_SIZE;
|
||||
int nextTailIndex = ELEMENTS_START_INDEX + Derived::ENTRY_SIZE;
|
||||
JSTaggedValue data = JSTaggedValue(ELEMENTS_START_INDEX);
|
||||
taggedList->SetNumberOfNodes(thread, actualNodeNum);
|
||||
taggedList->SetNumberOfDeletedNodes(thread, 0);
|
||||
taggedList->SetElement(thread, HEAD_TABLE_INDEX, data);
|
||||
taggedList->SetElement(thread, TAIL_TABLE_INDEX, JSTaggedValue(tailTableIndex));
|
||||
taggedList->SetElement(thread, ELEMENTS_START_INDEX, JSTaggedValue::Hole());
|
||||
taggedList->SetElement(thread, ELEMENTS_START_INDEX + NEXT_PTR_OFFSET, JSTaggedValue(nextTailIndex));
|
||||
|
||||
int dataIndex = ELEMENTS_START_INDEX;
|
||||
int nextIndex = GetElement(dataIndex + Derived::NEXT_PTR_OFFSET).GetInt();
|
||||
for (int i = 0; i < actualNodeNum; i++) {
|
||||
taggedList->SetElement(thread, nextTailIndex + i * Derived::ENTRY_SIZE,
|
||||
GetElement(nextIndex + i * Derived::ENTRY_SIZE));
|
||||
taggedList->SetElement(thread, nextTailIndex + NEXT_PTR_OFFSET + i * Derived::ENTRY_SIZE,
|
||||
JSTaggedValue(nextTailIndex + (i + 1) * Derived::ENTRY_SIZE));
|
||||
}
|
||||
taggedList->SetElement(thread, tailTableIndex + 1, JSTaggedValue(dataIndex));
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
@ -85,6 +110,13 @@ JSTaggedValue TaggedList<Derived>::AddNode(const JSThread *thread, const JSHandl
|
||||
int nodeLength = list->NumberOfNodes();
|
||||
int finalDataIndex = ELEMENTS_START_INDEX + (nodeLength + 1 + deleteNodeLength) * Derived::ENTRY_SIZE;
|
||||
|
||||
if (std::is_same_v<TaggedSingleList, Derived> && taggedList != list) {
|
||||
if (index != -1) {
|
||||
prevDataIndex = list->FindPrevNodeByIndex(index);
|
||||
} else {
|
||||
prevDataIndex = list->GetElement(TAIL_TABLE_INDEX).GetInt();
|
||||
}
|
||||
}
|
||||
list->InsertNode(thread, value, prevDataIndex, finalDataIndex);
|
||||
if (index == -1 || nodeLength == index) {
|
||||
list->SetElement(thread, TAIL_TABLE_INDEX, JSTaggedValue(finalDataIndex));
|
||||
|
@ -350,4 +350,22 @@ if (globalThis["ArkPrivate"] != undefined) {
|
||||
} else {
|
||||
print("Test List fail: " + flag);
|
||||
}
|
||||
|
||||
let mList = new List();
|
||||
for (let i = 1; i <= 10; ++i) {
|
||||
mList.add(i);
|
||||
}
|
||||
|
||||
for (let i = 1; i <= 10; ++i) {
|
||||
mList.remove(i);
|
||||
}
|
||||
|
||||
for (let i = 1; i <= 3; ++i) {
|
||||
mList.add(i);
|
||||
}
|
||||
|
||||
if (mList.getLast() != 3 ||
|
||||
("convertToArray= " + mList.convertToArray()) != "convertToArray= 1,2,3") {
|
||||
print("Test List fail!!!");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user