From 561f194ba694ba32538488a8446baafb574187dd Mon Sep 17 00:00:00 2001 From: johnche Date: Tue, 24 Sep 2024 15:51:22 +0800 Subject: [PATCH] =?UTF-8?q?[unity]Delegate=E6=9E=84=E9=80=A0=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E5=88=B0Puerts=5Fil2cpp.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../puerts/xil2cpp/Puerts_il2cpp.cpp.txt | 34 ++++++++++++++----- .../puerts/xil2cpp/UnityExports4Puerts.h.txt | 13 +++++-- unity/native_src_il2cpp/Inc/CppObjectMapper.h | 2 ++ .../native_src_il2cpp/Src/CppObjectMapper.cpp | 6 ++++ unity/native_src_il2cpp/Src/Puerts.cpp | 25 +++++++++++++- 5 files changed, 68 insertions(+), 12 deletions(-) diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt index 6e789e46eb..922bdb3307 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/Puerts_il2cpp.cpp.txt @@ -342,8 +342,18 @@ void* GetDefaultValuePtr(const MethodInfo* method, uint32_t index) static void* CtorCallback(pesapi_callback_info info); +static void* DelegateCtorCallback(pesapi_callback_info Info); + static puerts::UnityExports g_unityExports; +void IL2cppLog(const char* value) +{ + if (g_unityExports.LogCallback) + { + g_unityExports.LogCallback(value); + } +} + static void* CtorCallback(pesapi_callback_info info) { JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_constructor_userdata(info)); @@ -407,6 +417,21 @@ static void* CtorCallback(pesapi_callback_info info) return nullptr; } +static void* DelegateCtorCallback(pesapi_callback_info info) +{ + IL2cppLog("DelegateCtorCallback in Puerts_il2cpp.cpp"); + pesapi_env env = pesapi_get_env(info); + pesapi_value jsval = pesapi_get_arg(info, 0); + if (!pesapi_is_function(env, jsval)) + { + pesapi_throw_by_string(info, "expect a function"); + return nullptr; + } + JsClassInfoHeader* classInfo = reinterpret_cast(pesapi_get_constructor_userdata(info)); + + return g_unityExports.FunctionToDelegate(env, jsval, classInfo->Class, true); +} + void ReleaseScriptObject(RuntimeObject* obj) { int32_t _offset = 1; @@ -1615,14 +1640,6 @@ Il2CppObject* GetJSObjectValue(Il2CppObject* jsObject, Il2CppString* key, Il2Cpp WrapFuncPtr FindWrapFunc(const char* signature); struct FieldWrapFuncInfo * FindFieldWrapFuncInfo(const char* signature); -void IL2cppLog(const char* value) -{ - if (g_unityExports.LogCallback) - { - g_unityExports.LogCallback(value); - } -} - puerts::UnityExports* GetUnityExports() { g_unityExports.ObjectAllocate = &ObjectAllocate; @@ -1630,6 +1647,7 @@ puerts::UnityExports* GetUnityExports() g_unityExports.ValueTypeDeallocate = &ValueTypeFree; g_unityExports.MethodCallback = &MethodCallback; g_unityExports.ConstructorCallback = &CtorCallback; + g_unityExports.DelegateConstructorCallback = &DelegateCtorCallback; g_unityExports.FieldGet = &GetFieldValue; g_unityExports.FieldSet = &SetFieldValue; g_unityExports.GetValueTypeFieldPtr = &GetValueTypeFieldPtr; diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/UnityExports4Puerts.h.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/UnityExports4Puerts.h.txt index 47a6540490..4f78a524f0 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/UnityExports4Puerts.h.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/UnityExports4Puerts.h.txt @@ -154,6 +154,8 @@ typedef struct FieldWrapFuncInfo * (*FindFieldWrapFuncInfoFunc)(const char* sign typedef void(*LogCallbackFunc)(const char* value); +typedef void (*AddPendingReleasePersistentObjectFunc)(pesapi_env env, pesapi_value pvalue); + struct WrapData { WrapFuncPtr Wrap; @@ -184,6 +186,7 @@ struct UnityExports ValueTypeDeallocateFunc ValueTypeDeallocate = nullptr; FunctionCallbackFunc MethodCallback = nullptr; InitializeFunc ConstructorCallback = nullptr; + InitializeFunc DelegateConstructorCallback = nullptr; FieldOperationFunc FieldGet = nullptr; FieldOperationFunc FieldSet = nullptr; GetValueTypeFieldPtrFunc GetValueTypeFieldPtr = nullptr; @@ -212,6 +215,10 @@ struct UnityExports WrapFuncPtr ReflectionWrapper = nullptr; FieldWrapFuncPtr ReflectionGetFieldWrapper = nullptr; FieldWrapFuncPtr ReflectionSetFieldWrapper = nullptr; + + FindWrapFuncFunc FindWrapFunc = nullptr; + FindFieldWrapFuncInfoFunc FindFieldWrapFuncInfo = nullptr; + int SizeOfRuntimeObject = 0; //plugin api @@ -227,10 +234,10 @@ struct UnityExports GetRuntimeObjectFromPersistentObjectFunc GetRuntimeObjectFromPersistentObject = nullptr; SetRuntimeObjectToPersistentObjectFunc SetRuntimeObjectToPersistentObject = nullptr; - LogCallbackFunc LogCallback = nullptr; - FindWrapFuncFunc FindWrapFunc = nullptr; - FindFieldWrapFuncInfoFunc FindFieldWrapFuncInfo = nullptr; + AddPendingReleasePersistentObjectFunc AddPendingReleasePersistentObject = nullptr; + + LogCallbackFunc LogCallback = nullptr; }; } \ No newline at end of file diff --git a/unity/native_src_il2cpp/Inc/CppObjectMapper.h b/unity/native_src_il2cpp/Inc/CppObjectMapper.h index 27e4af1f73..d9b921e80d 100644 --- a/unity/native_src_il2cpp/Inc/CppObjectMapper.h +++ b/unity/native_src_il2cpp/Inc/CppObjectMapper.h @@ -75,6 +75,8 @@ class FCppObjectMapper final : public ICppObjectMapper void* ObjectPoolInstance = nullptr; FPersistentObjectEnvInfo PersistentObjectEnvInfo; + + void AddPendingReleasePersistentObject(v8::Local Context, v8::Local Obj); void ClearPendingPersistentObject(v8::Isolate* Isolate, v8::Local Context); diff --git a/unity/native_src_il2cpp/Src/CppObjectMapper.cpp b/unity/native_src_il2cpp/Src/CppObjectMapper.cpp index 716a6c5f84..5c27bf3e61 100644 --- a/unity/native_src_il2cpp/Src/CppObjectMapper.cpp +++ b/unity/native_src_il2cpp/Src/CppObjectMapper.cpp @@ -185,6 +185,12 @@ static void CDataNew(const v8::FunctionCallbackInfo& Info) } } +void FCppObjectMapper::AddPendingReleasePersistentObject(v8::Local Context, v8::Local Obj) +{ + std::lock_guard guard(PersistentObjectEnvInfo.Mutex); + PersistentObjectEnvInfo.PendingReleaseObjects.push_back(v8::Global(Context->GetIsolate(), Obj)); +} + void FCppObjectMapper::ClearPendingPersistentObject(v8::Isolate* Isolate, v8::Local Context) { std::lock_guard guard(PersistentObjectEnvInfo.Mutex); diff --git a/unity/native_src_il2cpp/Src/Puerts.cpp b/unity/native_src_il2cpp/Src/Puerts.cpp index 1dc00b5468..fdfd9a2444 100644 --- a/unity/native_src_il2cpp/Src/Puerts.cpp +++ b/unity/native_src_il2cpp/Src/Puerts.cpp @@ -492,6 +492,28 @@ static void UnrefJsObject(PersistentObjectInfo* objectInfo) objectInfo->EnvInfo = nullptr; } +static void _AddPendingReleasePersistentObject(v8::Local Context, v8::Local Obj) +{ + auto Isolate = Context->GetIsolate(); + auto POEnv = DataTransfer::GetPersistentObjectEnvInfo(Isolate); + + puerts::FCppObjectMapper* mapper = static_cast(Isolate->GetData(MAPPER_ISOLATE_DATA_POS)); + + mapper->AddPendingReleasePersistentObject(Context, Obj); + +} + +static void AddPendingReleasePersistentObject(pesapi_env env, pesapi_value pvalue) +{ + // TODO: quickjs兼容 /// + v8::Local Context; + memcpy(static_cast(&Context), &env, sizeof(env)); + v8::Local Obj; + memcpy(static_cast(&Obj), &pvalue, sizeof(pvalue)); + + _AddPendingReleasePersistentObject(Context, Obj); +} + template struct RestArguments { @@ -1027,7 +1049,7 @@ V8_EXPORT bool RegisterCSharpType(puerts::JsClassInfo* classInfo) ClassDef.TypeId = classInfo->TypeId; ClassDef.SuperTypeId = classInfo->SuperTypeId; - ClassDef.Initialize = classInfo->DelegateBridge ? puerts::DelegateCtorCallback : puerts::GUnityExports.ConstructorCallback; + ClassDef.Initialize = classInfo->DelegateBridge ? puerts::GUnityExports.DelegateConstructorCallback : puerts::GUnityExports.ConstructorCallback; ClassDef.Finalize = classInfo->IsValueType ? puerts::GUnityExports.ValueTypeDeallocate : (puerts::FinalizeFunc)nullptr; ClassDef.Data = classInfo; @@ -1152,6 +1174,7 @@ V8_EXPORT void ExchangeAPI(puerts::UnityExports * exports) exports->GetJSObjectValue = &puerts::GetJSObjectValue; exports->GetModuleExecutor = &puerts::GetModuleExecutor; exports->LogCallback = puerts::GLogCallback; + exports->AddPendingReleasePersistentObject = &puerts::AddPendingReleasePersistentObject; puerts::GUnityExports = *exports; }