mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
!4566 Add optimization for StableJSArray in StArraySpread
Merge pull request !4566 from duzhiyuan/master
This commit is contained in:
commit
16706f0224
@ -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() ||
|
||||
|
@ -34,3 +34,8 @@ foo
|
||||
Apple Banana
|
||||
1 2 3
|
||||
1 2 3
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user