[pgo] onHeap与notOnHeap转换未维护proto链问题修复

Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IABOX4
Description:替换hclass需要维护proto链,对未维护proto链的场景进行修复

Signed-off-by: zhangyinlu <zhangyinlu@huawei.com>
Change-Id: Ifcc642099a1f40d29728cf7274d1a063518e185f
This commit is contained in:
zhangyinlu 2024-07-09 16:05:37 +08:00
parent c3faf68dff
commit 27a4033cbc
3 changed files with 26 additions and 1 deletions

View File

@ -179,6 +179,9 @@ JSHandle<JSObject> TypedArrayHelper::AllocateTypedArrayBuffer<TypedArrayKind::NO
thread->GetEcmaVM()->GetFactory()->NewByteArray(arrayLength, elementSize).GetTaggedValue());
JSHandle<JSHClass> onHeapHclass = TypedArrayHelper::GetOnHeapHclassFromType(
thread, JSHandle<JSTypedArray>(obj), arrayType);
#if ECMASCRIPT_ENABLE_IC
JSHClass::NotifyHclassChanged(thread, JSHandle<JSHClass>(thread, obj->GetJSHClass()), onHeapHclass);
#endif
TaggedObject::Cast(*obj)->SynchronizedSetClass(thread, *onHeapHclass); // notOnHeap->onHeap
}
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, exception);
@ -233,6 +236,9 @@ JSHandle<JSObject> TypedArrayHelper::AllocateTypedArrayBuffer<TypedArrayKind::SH
MemSpaceType::SHARED_OLD_SPACE).GetTaggedValue());
JSHandle<JSHClass> onHeapHclass = TypedArrayHelper::GetSharedOnHeapHclassFromType(
thread, JSHandle<JSTypedArray>(obj), arrayType);
#if ECMASCRIPT_ENABLE_IC
JSHClass::NotifyHclassChanged(thread, JSHandle<JSHClass>(thread, obj->GetJSHClass()), onHeapHclass);
#endif
TaggedObject::Cast(*obj)->SynchronizedSetClass(thread, *onHeapHclass); // notOnHeap->onHeap
}
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, exception);

View File

@ -618,7 +618,7 @@ bool JSTypedArray::IntegerIndexedElementSet(JSThread *thread, const JSHandle<JST
numValueHandle = JSHandle<JSTaggedValue>(thread, JSTaggedValue::ToNumber(thread, value));
RETURN_VALUE_IF_ABRUPT_COMPLETION(thread, false);
}
JSHandle<JSTypedArray> typedarrayObj(typedarray);
JSTaggedValue buffer = typedarrayObj->GetViewedArrayBufferOrByteArray();
JSHandle<JSTaggedValue> indexHandle(thread, index);
@ -774,6 +774,9 @@ JSTaggedValue JSTypedArray::GetOffHeapBuffer(JSThread *thread, JSHandle<JSTypedA
DataViewType arrayType = JSTypedArray::GetTypeFromName(thread, typeName);
JSHandle<JSHClass> notOnHeapHclass = TypedArrayHelper::GetNotOnHeapHclassFromType(
thread, typedArray, arrayType);
#if ECMASCRIPT_ENABLE_IC
JSHClass::NotifyHclassChanged(thread, JSHandle<JSHClass>(thread, typedArray->GetJSHClass()), notOnHeapHclass);
#endif
TaggedObject::Cast(*typedArray)->SynchronizedSetClass(thread, *notOnHeapHclass); // onHeap->notOnHeap
return arrayBuffer.GetTaggedValue();
@ -803,6 +806,9 @@ JSTaggedValue JSSharedTypedArray::GetSharedOffHeapBuffer(JSThread *thread, JSHan
DataViewType arrayType = JSTypedArray::GetTypeFromName(thread, typeName);
JSHandle<JSHClass> notOnHeapHclass = TypedArrayHelper::GetSharedNotOnHeapHclassFromType(
thread, typedArray, arrayType);
#if ECMASCRIPT_ENABLE_IC
JSHClass::NotifyHclassChanged(thread, JSHandle<JSHClass>(thread, typedArray->GetJSHClass()), notOnHeapHclass);
#endif
TaggedObject::Cast(*typedArray)->SynchronizedSetClass(thread, *notOnHeapHclass); // onHeap->notOnHeap
return arrayBuffer.GetTaggedValue();

View File

@ -60,3 +60,16 @@ function baz(ta: Uint32Array | Float64Array) {
baz(ta0);
baz(ta1);
function foo2() {
for (let v0 = 0; v0 < 5; v0++) {
function f1(a2, a3, a4) {
const v6 = new BigUint64Array(a2);
const v8 = new Uint8ClampedArray();
const t13 = v8.__proto__;
t13.__proto__ = v6;
return v6;
}
f1(f1());
}
}
foo2()