!4566 Add optimization for StableJSArray in StArraySpread

Merge pull request !4566 from duzhiyuan/master
This commit is contained in:
openharmony_ci 2023-08-04 09:31:32 +00:00 committed by Gitee
commit 16706f0224
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 34 additions and 1 deletions

View File

@ -430,6 +430,17 @@ JSTaggedValue RuntimeStubs::RuntimeStArraySpread(JSThread *thread, const JSHandl
return JSTaggedValue(dstLen + strLen);
}
if (index.GetInt() == 0 && src->IsStableJSArray(thread)) {
JSHandle<TaggedArray> srcElements(thread, JSHandle<JSObject>::Cast(src)->GetElements());
uint32_t length = JSHandle<JSArray>::Cast(src)->GetArrayLength();
JSHandle<TaggedArray> dstElements = factory->NewTaggedArray(length);
JSHandle<JSArray> dstArray = JSHandle<JSArray>::Cast(dst);
dstArray->SetElements(thread, dstElements);
dstArray->SetArrayLength(thread, length);
TaggedArray::CopyTaggedArrayElement(thread, srcElements, dstElements, length);
return JSTaggedValue(length);
}
JSHandle<JSTaggedValue> iter;
auto globalConst = thread->GlobalConstants();
if (src->IsJSArrayIterator() || src->IsJSMapIterator() || src->IsJSSetIterator() ||

View File

@ -34,3 +34,8 @@ foo
Apple Banana
1 2 3
1 2 3
0
1
2
3
4

View File

@ -110,4 +110,21 @@ Array.prototype[Symbol.iterator] = function* () {
yield 3;
}
print(...fruits1)
print(...fruits2)
print(...fruits2)
// test spread array when encounter situations like [...arr, elem1, elem2] with arr be StableJSArray
function appendChild(newNode) {
this.childNodes = [...this.childNodes, newNode];
}
const app = { tageName: 'VIEW', childNodes: [], appendChild };
for (let i = 0; i < 5; ++i) {
const el = { tageName: 'VIEW', childNodes: [], appendChild };
const text = { tageName: 'VIEW', childNodes: [], appendChild };
const content = { tageName: '#text', content: i };
text.appendChild(content);
el.appendChild(text);
app.appendChild(el);
}
for (let i = 0; i < 5; ++i) {
print(app.childNodes[i].childNodes[0].childNodes[0].content);
}