diff --git a/ecmascript/dfx/hprof/tests/heap_dump_test.cpp b/ecmascript/dfx/hprof/tests/heap_dump_test.cpp index 577780c47917d123c84c59165444b0364bf7bc87..5c691b5eb104833df0ecf8fb8e1d248bd38568d8 100644 --- a/ecmascript/dfx/hprof/tests/heap_dump_test.cpp +++ b/ecmascript/dfx/hprof/tests/heap_dump_test.cpp @@ -16,6 +16,7 @@ #include #include #include "ecmascript/base/number_helper.h" +#include "ecmascript/builtins/builtins_finalization_registry.h" #include "ecmascript/dfx/hprof/heap_snapshot.h" #include "ecmascript/dfx/hprof/heap_profiler.h" #include "ecmascript/dfx/hprof/heap_root_visitor.h" @@ -59,6 +60,7 @@ namespace panda::test { using namespace panda::ecmascript; +using namespace panda::ecmascript::builtins; using ErrorType = base::ErrorType; class HeapDumpTest : public testing::Test { @@ -723,14 +725,50 @@ public: return jsWeakRef; } + static JSTaggedValue callbackTest() + { + return JSTaggedValue::Undefined(); + } + // JS_FINALIZATION_REGISTRY JSHandle NewJSFinalizationRegistry() { - JSHandle proto = instance->GetGlobalEnv()->GetFunctionPrototype(); - JSHandle jsFinalizationRegistryObject = - NewObject(JSFinalizationRegistry::SIZE, JSType::JS_FINALIZATION_REGISTRY, proto); - JSHandle jsFinalizationRegistry = - JSHandle::Cast(jsFinalizationRegistryObject); + auto factory = instance->GetFactory(); + auto env = instance->GetGlobalEnv(); + auto thread = instance->GetJSThread(); + + JSHandle finalRegFunc(env->GetBuiltinsFinalizationRegistryFunction()); + JSHandle callbackFunc = factory->NewJSFunction(env, reinterpret_cast(callbackTest)); + auto ecmaRuntimeCallInfo = TestHelper::CreateEcmaRuntimeCallInfo(thread, JSTaggedValue(*finalRegFunc), 6); + ecmaRuntimeCallInfo->SetFunction(finalRegFunc.GetTaggedValue()); + ecmaRuntimeCallInfo->SetThis(JSTaggedValue::Undefined()); + ecmaRuntimeCallInfo->SetCallArg(0, callbackFunc.GetTaggedValue()); + + auto prev = TestHelper::SetupFrame(thread, ecmaRuntimeCallInfo); + JSTaggedValue finalizationRegistry = + BuiltinsFinalizationRegistry::FinalizationRegistryConstructor(ecmaRuntimeCallInfo); + JSHandle finalizationRegistryHandle(thread, finalizationRegistry); + TestHelper::TearDownFrame(thread, prev); + + JSHandle objectFunc = env->GetObjectFunction(); + JSHandle target( + factory->NewJSObjectByConstructor(JSHandle(objectFunc), objectFunc)); + JSHandle key(factory->NewFromASCII("key2")); + JSHandle value(thread, JSTaggedValue(2)); + JSObject::SetProperty(thread, target, key, value); + JSHandle heldValue(thread, JSTaggedValue(100)); + JSHandle unregisterToken = target; + + JSHandle cellRecord = factory->NewCellRecord(); + cellRecord->SetToWeakRefTarget(thread, target.GetTaggedValue()); + cellRecord->SetHeldValue(thread, heldValue); + JSHandle cell(cellRecord); + JSHandle array = JSHandle(CellRecordVector::Create(thread)); + array = CellRecordVector::Append(thread, array, cell); + JSHandle arrayValue(array); + JSHandle jsFinalizationRegistry(thread, finalizationRegistryHandle.GetTaggedValue()); + JSFinalizationRegistry::Register(thread, target, heldValue, unregisterToken, jsFinalizationRegistry); + return jsFinalizationRegistry; }