From 14c96444912be5afa616a1b211a47e2540d0c026 Mon Sep 17 00:00:00 2001 From: johnche Date: Sun, 29 Sep 2024 11:52:45 +0800 Subject: [PATCH] =?UTF-8?q?[unity]=E7=AE=80=E5=8C=96=EF=BC=8CFunctionToDel?= =?UTF-8?q?egate=5Fpesapi=E6=94=B9=E4=B8=BA=E5=9C=A8Puerts=5Fil2cpp.cpp?= =?UTF-8?q?=E4=B8=AD=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../puerts/xil2cpp/Puerts_il2cpp.cpp.txt | 9 ++-- .../puerts/xil2cpp/UnityExports4Puerts.h.txt | 10 +--- unity/native_src_il2cpp/Src/Puerts.cpp | 47 +++---------------- 3 files changed, 15 insertions(+), 51 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 a82cb5c623..e82eb7e301 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 @@ -781,7 +781,12 @@ handle_underlying: { if (IsDelegate(klass)) { - return (Il2CppObject*)g_unityExports.FunctionToDelegate(env, jsval, klass, true); + JsClassInfoHeader* jsClassInfo = g_unityExports.GetJsClassInfo(klass); + if (!jsClassInfo) + { + Exception::Raise(Exception::GetInvalidOperationException("call not load type of delegate")); + } + return FunctionToDelegate(env, jsval, jsClassInfo); } return nullptr; } @@ -1694,8 +1699,6 @@ MethodPointer FindBridgeFunc(const char* signature); puerts::UnityExports* GetUnityExports() { - g_unityExports.ObjectAllocate = &ObjectAllocate; - g_unityExports.DelegateAllocate = &DelegateAllocate; g_unityExports.ValueTypeDeallocate = &ValueTypeFree; g_unityExports.MethodCallback = &MethodCallback; g_unityExports.ConstructorCallback = &CtorCallback; 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 d4a83c53eb..7cea7320f6 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 @@ -20,9 +20,7 @@ struct PObjectRefInfo #if defined(USE_OUTSIZE_UNITY) typedef void (*MethodPointer)(); -typedef void* (*ObjectAllocateFunc)(const void* type); typedef void (*ValueTypeDeallocateFunc)(void* ptr); -typedef void* (*DelegateAllocateFunc)(const void* type, MethodPointer methodPointer, struct PObjectRefInfo** outDelegateInfo); typedef void MethodType; typedef bool (*WrapFuncPtr)(MethodType* method, MethodPointer methodPointer, const v8::FunctionCallbackInfo& info, bool checkArgument, struct WrapData* wrapData); typedef v8::FunctionCallback FunctionCallbackFunc; @@ -43,9 +41,7 @@ typedef v8::Value* (*GetModuleExecutorFunc)(v8::Context* env); #define MethodPointer Il2CppMethodPointer -typedef void* (*ObjectAllocateFunc)(Il2CppClass *klass); typedef void (*ValueTypeDeallocateFunc)(void* ptr); -typedef void* (*DelegateAllocateFunc)(Il2CppClass* klass, MethodPointer methodPointer, struct PObjectRefInfo** outDelegateInfo); typedef MethodInfo MethodType; typedef bool (*WrapFuncPtr)(MethodType* method, Il2CppMethodPointer methodPointer, pesapi_callback_info info, bool checkArgument, struct WrapData* wrapData); typedef pesapi_callback FunctionCallbackFunc; @@ -64,7 +60,7 @@ typedef pesapi_value (*GetModuleExecutorFunc)(pesapi_env env); #endif -typedef void* (*FunctionToDelegateFunc)(pesapi_env env, pesapi_value pvalue, const void* TypeId, bool throwIfFail); +typedef struct JsClassInfoHeader* (*GetJsClassInfoFunc)(const void* TypeId); typedef void* (*GetRuntimeObjectFromPersistentObjectFunc)(pesapi_env env, pesapi_value pvalue); @@ -105,8 +101,6 @@ struct JsClassInfoHeader struct UnityExports { //.cpp api - ObjectAllocateFunc ObjectAllocate = nullptr; - DelegateAllocateFunc DelegateAllocate = nullptr; ValueTypeDeallocateFunc ValueTypeDeallocate = nullptr; FunctionCallbackFunc MethodCallback = nullptr; InitializeFunc ConstructorCallback = nullptr; @@ -124,7 +118,7 @@ struct UnityExports SetNativePtrFunc SetNativePtr = nullptr; UnrefJsObjectFunc UnrefJsObject = nullptr; - FunctionToDelegateFunc FunctionToDelegate = nullptr; + GetJsClassInfoFunc GetJsClassInfo = nullptr; GetModuleExecutorFunc GetModuleExecutor = nullptr; diff --git a/unity/native_src_il2cpp/Src/Puerts.cpp b/unity/native_src_il2cpp/Src/Puerts.cpp index 453404c4cc..05e9ab166c 100644 --- a/unity/native_src_il2cpp/Src/Puerts.cpp +++ b/unity/native_src_il2cpp/Src/Puerts.cpp @@ -172,53 +172,20 @@ static void SetRuntimeObjectToPersistentObject(pesapi_env env, pesapi_value pval } -static void* FunctionToDelegate_pesapi(pesapi_env env, pesapi_value jsval, const void* TypeId, bool throwIfFail) +static JsClassInfoHeader* GetJsClassInfo(const void* TypeId) { - //TODO: pesapi 数据到v8的转换应该交给pesapi实现来提供 - v8::Local Context; - memcpy(static_cast(&Context), &env, sizeof(env)); - v8::Local Func; - memcpy(static_cast(&Func), &jsval, sizeof(jsval)); - - if (!Func->IsFunction()) + auto ClassDefinition = FindClassByID(TypeId, true); + if (!ClassDefinition) { - if (throwIfFail) - { - DataTransfer::ThrowException(Context->GetIsolate(), "not a function, can not use as Delegate"); - } return nullptr; } - void* Ptr = _GetRuntimeObjectFromPersistentObject(Context, Func); - if (Ptr == nullptr) - { - auto ClassDefinition = FindClassByID(TypeId, true); - if (!ClassDefinition) - { - if (throwIfFail) - { - DataTransfer::ThrowException(Context->GetIsolate(), "call not load type of delegate"); - } - return nullptr; - } - - JsClassInfo* classInfo = static_cast(ClassDefinition->Data); - - PObjectRefInfo* delegateInfo = nullptr; - Ptr = GUnityExports.DelegateAllocate(classInfo->Class, classInfo->DelegateBridge, &delegateInfo); - memset(delegateInfo, 0, sizeof(PObjectRefInfo)); - - delegateInfo->EnvRef = pesapi_create_env_ref(env); - delegateInfo->ValueRef = pesapi_create_value_ref(env, jsval); - //puerts::PLog(puerts::LogLevel::Log, "FunctionToDelegate (Plugin):%p, %p, %p, %p", Ptr, delegateInfo, delegateInfo->EnvRef, delegateInfo->ValueRef); - - _SetRuntimeObjectToPersistentObject(Context, Func, Ptr); - } - return Ptr; + return static_cast(ClassDefinition->Data); } static v8::Value* GetModuleExecutor(v8::Context* env) { + //TODO: pesapi 数据到v8的转换应该交给pesapi实现来提供 v8::Local Context; memcpy(static_cast(&Context), &env, sizeof(env)); @@ -717,7 +684,7 @@ V8_EXPORT void ExchangeAPI(puerts::UnityExports * exports) exports->SetNativePtr = &puerts::SetNativePtr; exports->SetExtraData = &puerts::SetExtraData; exports->UnrefJsObject = &puerts::UnrefJsObject; - exports->FunctionToDelegate = &puerts::FunctionToDelegate_pesapi; + exports->GetJsClassInfo = &puerts::GetJsClassInfo; exports->SetRuntimeObjectToPersistentObject = &puerts::SetRuntimeObjectToPersistentObject; exports->GetRuntimeObjectFromPersistentObject = &puerts::GetRuntimeObjectFromPersistentObject; exports->GetModuleExecutor = &puerts::GetModuleExecutor; @@ -754,7 +721,7 @@ V8_EXPORT void SetObjectToGlobal(puerts::JSEnv* jsEnv, const char* key, void *ob v8::Local Context = jsEnv->MainContext.Get(Isolate); v8::Context::Scope ContextScope(Context); - void* klass = *static_cast(obj); + void* klass = *static_cast(obj); //TODO: 这是Il2cpp内部实现 Context->Global()->Set(Context, v8::String::NewFromUtf8(Isolate, key).ToLocalChecked(), puerts::DataTransfer::FindOrAddCData(Isolate, Context, klass, obj, true)).Check(); } }