Fix Jsnapi_Sendable_Test

Signed-off-by: liu-zelin <liuzelin8@huawei.com>
Change-Id: I69626e3dc83ee6085289c9cc8e174d41f3d5d95f
This commit is contained in:
liu-zelin 2024-03-17 20:37:47 +08:00
parent 8c1d4935a5
commit e8e8a21598
6 changed files with 69 additions and 12 deletions

View File

@ -936,6 +936,49 @@ void JSFunction::SetFunctionExtraInfo(JSThread *thread, void *nativeFunc,
}
}
void JSFunction::SetSFunctionExtraInfo(
JSThread *thread, void *nativeFunc, const DeleteEntryPoint &deleter, void *data, size_t nativeBindingsize)
{
JSTaggedType hashField = Barriers::GetValue<JSTaggedType>(this, HASH_OFFSET);
EcmaVM *vm = thread->GetEcmaVM();
JSHandle<JSTaggedValue> value(thread, JSTaggedValue(hashField));
JSHandle<ECMAObject> obj(thread, this);
JSHandle<JSNativePointer> pointer =
vm->GetFactory()->NewSJSNativePointer(nativeFunc, deleter, data, false, nativeBindingsize);
if (!obj->HasHash()) {
Barriers::SetObject<true>(thread, *obj, HASH_OFFSET, pointer.GetTaggedValue().GetRawData());
return;
}
if (value->IsHeapObject()) {
if (value->IsJSNativePointer()) {
Barriers::SetObject<true>(thread, *obj, HASH_OFFSET, pointer.GetTaggedValue().GetRawData());
return;
}
JSHandle<TaggedArray> array(value);
uint32_t nativeFieldCount = array->GetExtraLength();
if (array->GetLength() >= nativeFieldCount + RESOLVED_MAX_SIZE) {
array->Set(thread, nativeFieldCount + FUNCTION_EXTRA_INDEX, pointer);
} else {
JSHandle<TaggedArray> newArray =
vm->GetFactory()->NewSTaggedArrayWithoutInit(nativeFieldCount + RESOLVED_MAX_SIZE);
newArray->SetExtraLength(nativeFieldCount);
for (uint32_t i = 0; i < nativeFieldCount; i++) {
newArray->Set(thread, i, array->Get(i));
}
newArray->Set(thread, nativeFieldCount + HASH_INDEX, array->Get(nativeFieldCount + HASH_INDEX));
newArray->Set(thread, nativeFieldCount + FUNCTION_EXTRA_INDEX, pointer);
Barriers::SetObject<true>(thread, *obj, HASH_OFFSET, newArray.GetTaggedValue().GetRawData());
}
} else {
JSHandle<TaggedArray> newArray = vm->GetFactory()->NewSTaggedArrayWithoutInit(RESOLVED_MAX_SIZE);
newArray->SetExtraLength(0);
newArray->Set(thread, HASH_INDEX, value);
newArray->Set(thread, FUNCTION_EXTRA_INDEX, pointer);
Barriers::SetObject<true>(thread, *obj, HASH_OFFSET, newArray.GetTaggedValue().GetRawData());
}
}
JSTaggedValue JSFunction::GetFunctionExtraInfo() const
{
JSTaggedType hashField = Barriers::GetValue<JSTaggedType>(this, HASH_OFFSET);

View File

@ -222,6 +222,8 @@ public:
void SetFunctionExtraInfo(JSThread *thread, void *nativeFunc, const DeleteEntryPoint &deleter,
void *data, size_t nativeBindingsize = 0);
void SetSFunctionExtraInfo(
JSThread *thread, void *nativeFunc, const DeleteEntryPoint &deleter, void *data, size_t nativeBindingsize = 0);
JSTaggedValue GetFunctionExtraInfo() const;
JSTaggedValue GetNativeFunctionExtraInfo() const;

View File

@ -2201,7 +2201,7 @@ Local<FunctionRef> FunctionRef::NewSendable(EcmaVM *vm,
ObjectFactory *factory = vm->GetFactory();
JSHandle<GlobalEnv> env = vm->GetGlobalEnv();
JSHandle<JSFunction> current(factory->NewSFunction(env, reinterpret_cast<void *>(nativeFunc)));
current->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize);
current->SetSFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingsize);
current->SetCallNapi(callNapi);
return JSNApiHelper::ToLocal<FunctionRef>(JSHandle<JSTaggedValue>(current));
}
@ -2296,8 +2296,7 @@ JSHandle<JSHClass> CreateInlinedSendableHClass(JSThread *thread,
JSHandle<JSHClass> hclass;
uint32_t length = info.keys->Length(vm);
JSMutableHandle<JSTaggedValue> key(thread, JSTaggedValue::Undefined());
JSHandle<ecmascript::LayoutInfo> layout =
factory->CreateLayoutInfo(length, ecmascript::MemSpaceType::OLD_SPACE, ecmascript::GrowMode::KEEP);
JSHandle<ecmascript::LayoutInfo> layout = factory->CreateSLayoutInfo(length);
for (uint32_t i = 0; i < length; ++i) {
key.Update(JSNApiHelper::ToJSHandle(info.keys->Get(vm, i)));
@ -2334,7 +2333,8 @@ JSHandle<JSHClass> CreateDictSendableHClass(JSThread *thread,
uint32_t length = info.keys->Length(vm);
JSMutableHandle<JSTaggedValue> key(thread, JSTaggedValue::Undefined());
JSMutableHandle<ecmascript::NameDictionary> dict(
thread, ecmascript::NameDictionary::Create(thread, ecmascript::NameDictionary::ComputeHashTableSize(length)));
thread, ecmascript::NameDictionary::CreateInSharedHeap(
thread, ecmascript::NameDictionary::ComputeHashTableSize(length)));
auto globalConst = const_cast<GlobalEnvConstants *>(thread->GlobalConstants());
JSHandle<JSTaggedValue> value = globalConst->GetHandledUndefined();
@ -2401,8 +2401,8 @@ void SetInlinedAndDictProps(JSThread *thread,
}
} else {
JSMutableHandle<ecmascript::NameDictionary> dict(
thread,
ecmascript::NameDictionary::Create(thread, ecmascript::NameDictionary::ComputeHashTableSize(length)));
thread, ecmascript::NameDictionary::CreateInSharedHeap(
thread, ecmascript::NameDictionary::ComputeHashTableSize(length)));
for (uint32_t i = 0; i < length; i++) {
ecmascript::PropertyAttributes attr = ecmascript::PropertyAttributes::Default(
info.attributes[i].IsWritable(), info.attributes[i].IsEnumerable(),
@ -2462,9 +2462,9 @@ Local<FunctionRef> FunctionRef::NewSendableClassFunction(const EcmaVM *vm,
constructor->SetProtoOrHClass(thread, prototype);
constructor->SetLexicalEnv(thread, constructor);
constructor->SetCallNapi(callNapi);
constructor->SetFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingSize);
constructor->SetSFunctionExtraInfo(thread, nullptr, deleter, data, nativeBindingSize);
JSHandle<JSHClass> iHClass = CreateSendableHClass(thread, instancePropertiesInfo, false);
JSHandle<JSHClass> iHClass = CreateSendableHClass(thread, instancePropertiesInfo, true);
iHClass->SetPrototype(thread, JSHandle<JSTaggedValue>(prototype));
iHClass->SetExtensible(false);
constructor->SetProtoOrHClass(thread, iHClass);

View File

@ -43,6 +43,7 @@ class JSNApiTests : public testing::Test {
ASSERT_TRUE(vm_ != nullptr) << "Cannot create Runtime";
thread_ = vm_->GetJSThread();
vm_->SetEnableForceGC(true);
thread_->ManagedCodeBegin();
staticKey = StringRef::NewFromUtf8(vm_, "static");
nonStaticKey = StringRef::NewFromUtf8(vm_, "nonStatic");
instanceKey = StringRef::NewFromUtf8(vm_, "instance");
@ -52,6 +53,7 @@ class JSNApiTests : public testing::Test {
void TearDown() override
{
thread_->ManagedCodeEnd();
vm_->SetEnableForceGC(false);
JSNApi::DestroyJSVM(vm_);
}

View File

@ -792,6 +792,7 @@ public:
const JSHandle<JSTaggedValue> &prototype, bool isAccessor = true);
JSHandle<JSNativePointer> NewSJSNativePointer(void *externalPointer,
const DeleteEntryPoint &callBack,
void *data = nullptr,
bool nonMovable = false,
size_t nativeBindingsize = 0,

View File

@ -328,6 +328,7 @@ JSHandle<MutantTaggedArray> ObjectFactory::NewSEmptyMutantArray()
}
JSHandle<JSNativePointer> ObjectFactory::NewSJSNativePointer(void *externalPointer,
const DeleteEntryPoint &callBack,
void *data,
bool nonMovable,
size_t nativeBindingsize,
@ -343,10 +344,18 @@ JSHandle<JSNativePointer> ObjectFactory::NewSJSNativePointer(void *externalPoint
}
JSHandle<JSNativePointer> obj(thread_, header);
obj->SetExternalPointer(externalPointer);
obj->SetDeleter(nullptr);
obj->SetDeleter(callBack);
obj->SetData(data);
obj->SetBindingSize(nativeBindingsize);
obj->SetNativeFlag(flag);
if (callBack != nullptr) {
// heap_->IncreaseNativeBindingSize(nativeBindingsize);
vm_->PushToNativePointerList(static_cast<JSNativePointer *>(header));
// In some cases, the size of JS/TS object is too small and the native binding size is too large.
// Check and try trigger concurrent mark here.
// heap_->TryTriggerFullMarkByNativeSize();
}
return obj;
}
@ -359,11 +368,11 @@ JSHandle<AccessorData> ObjectFactory::NewSInternalAccessor(void *setter, void *g
obj->SetGetter(thread_, JSTaggedValue::Undefined());
obj->SetSetter(thread_, JSTaggedValue::Undefined());
if (setter != nullptr) {
JSHandle<JSNativePointer> setFunc = NewSJSNativePointer(setter, nullptr, true);
JSHandle<JSNativePointer> setFunc = NewSJSNativePointer(setter, nullptr, nullptr, true);
obj->SetSetter(thread_, setFunc.GetTaggedValue());
}
if (getter != nullptr) {
JSHandle<JSNativePointer> getFunc = NewSJSNativePointer(getter, nullptr, true);
JSHandle<JSNativePointer> getFunc = NewSJSNativePointer(getter, nullptr, nullptr, true);
obj->SetGetter(thread_, getFunc);
}
return obj;
@ -583,4 +592,4 @@ JSHandle<AOTLiteralInfo> ObjectFactory::NewSAOTLiteralInfo(uint32_t length, JSTa
aotLiteralInfo->InitializeWithSpecialValue(initVal, length);
return aotLiteralInfo;
}
} // namespace panda::ecmascript
} // namespace panda::ecmascript