From 895e92dcf1cd64f74e08a5f3edd5c5d7f955f411 Mon Sep 17 00:00:00 2001 From: johnche Date: Thu, 7 Nov 2024 15:38:53 +0800 Subject: [PATCH] =?UTF-8?q?[unity]=E6=B7=BB=E5=8A=A0pesapi=5Fextract=5Fcal?= =?UTF-8?q?lback=5Finfo=E5=B9=B6=E4=BD=BF=E7=94=A8=E5=85=B6=E9=87=8D?= =?UTF-8?q?=E6=9E=84wrapper=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../puerts/templates/il2cpp_snippets.mjs | 22 ++--- .../puerts/templates/il2cppwrapper.tpl.mjs | 2 +- .../puerts/templates/il2cppwrapperdef.tpl.mjs | 10 +-- .../puerts/xil2cpp/Puerts_il2cpp.cpp.txt | 88 ++++++++++++------- .../Resources/puerts/xil2cpp/TDataTrans.h.txt | 3 +- .../Resources/puerts/xil2cpp/pesapi.h.txt | 12 ++- unity/native_src_il2cpp/Inc/pesapi.h | 12 ++- unity/native_src_il2cpp/Src/PesapiV8Impl.cpp | 34 +++++++ 8 files changed, 128 insertions(+), 55 deletions(-) diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cpp_snippets.mjs b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cpp_snippets.mjs index e05b309c80..26a768711c 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cpp_snippets.mjs +++ b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cpp_snippets.mjs @@ -136,14 +136,14 @@ export function checkJSArg(signature, index) { let ret = '' let typeInfoVar = `TIp${index}`; if (signature[0] == "D") { - ret += `if (js_args_len > ${index} && ` + ret += `if (argc > ${index} && ` signature = signature.substring(1); } else if (signature[0] == 'V') { const elmSignature = signature.substring(1); const elmClassDecl = (elmSignature == 'o' || elmSignature == 'O' || elmSignature == 'a' || ((elmSignature.startsWith(sigs.StructPrefix) || elmSignature.startsWith(sigs.NullableStructPrefix)) && elmSignature.endsWith('_')) ) ? `auto ${typeInfoVar}_V = il2cpp::vm::Class::GetElementClass(${typeInfoVar});` : ''; - ret += `${elmClassDecl}if (js_args_len > ${index} && ` + ret += `${elmClassDecl}if (argc > ${index} && ` signature = elmSignature; typeInfoVar += '_V'; } else { @@ -261,19 +261,19 @@ export function JSValToCSVal(signature, JSName, CSName) { const start = parseInt(JSName.match(/_sv(\d+)/)[1]); if (si in PrimitiveSignatureCppTypeMap) { return ` // JSValToCSVal primitive params - Il2CppArray* ${CSName} = Params<${PrimitiveSignatureCppTypeMap[si]}>::PackPrimitive(apis, env, info, TI${CSName}, js_args_len, ${start}); + Il2CppArray* ${CSName} = Params<${PrimitiveSignatureCppTypeMap[si]}>::PackPrimitive(apis, env, info, TI${CSName}, argc, ${start}); ` } else if (si == 's') { return ` // JSValToCSVal string params - Il2CppArray* ${CSName} = Params::PackString(apis, env, info, TI${CSName}, js_args_len, ${start}); + Il2CppArray* ${CSName} = Params::PackString(apis, env, info, TI${CSName}, argc, ${start}); ` } else if (si == 'o' || si == 'O' || si == 'a') { return ` // JSValToCSVal ref params - Il2CppArray* ${CSName} = Params::PackRef(apis, env, info, TI${CSName}, js_args_len, ${start}); + Il2CppArray* ${CSName} = Params::PackRef(apis, env, info, TI${CSName}, argc, ${start}); ` } else if ((si.startsWith(sigs.StructPrefix) || si.startsWith(sigs.NullableStructPrefix)) && si.endsWith('_')) { return ` // JSValToCSVal valuetype params - Il2CppArray* ${CSName} = Params<${si}>::PackValueType(apis, env, info, TI${CSName}, js_args_len, ${start}); + Il2CppArray* ${CSName} = Params<${si}>::PackValueType(apis, env, info, TI${CSName}, argc, ${start}); ` } else { return ` // JSValToCSVal unknow params type @@ -285,19 +285,19 @@ export function JSValToCSVal(signature, JSName, CSName) { const start = parseInt(JSName.match(/_sv(\d+)/)[1]); if (si in PrimitiveSignatureCppTypeMap) { return ` // JSValToCSVal primitive with default - ${PrimitiveSignatureCppTypeMap[si]} ${CSName} = OptionalParameter<${PrimitiveSignatureCppTypeMap[si]}>::GetPrimitive(apis, env, info, method, wrapData, js_args_len, ${start}); + ${PrimitiveSignatureCppTypeMap[si]} ${CSName} = OptionalParameter<${PrimitiveSignatureCppTypeMap[si]}>::GetPrimitive(apis, env, info, wrapData->Method, wrapData, argc, ${start}); ` } else if (si == 's') { return ` // JSValToCSVal string with default - Il2CppString* ${CSName} = OptionalParameter::GetString(apis, env, info, method, wrapData, js_args_len, ${start}); + Il2CppString* ${CSName} = OptionalParameter::GetString(apis, env, info, wrapData->Method, wrapData, argc, ${start}); ` } else if (si == 'o' || si == 'O' || si == 'a') { return ` // JSValToCSVal ref with default - Il2CppObject* ${CSName} = OptionalParameter::GetRefType(apis, env, info, method, wrapData, js_args_len, ${start}, TI${CSName}); + Il2CppObject* ${CSName} = OptionalParameter::GetRefType(apis, env, info, wrapData->Method, wrapData, argc, ${start}, TI${CSName}); ` } else if ((si.startsWith(sigs.StructPrefix) || si.startsWith(sigs.NullableStructPrefix)) && si.endsWith('_')) { return ` // JSValToCSVal valuetype with default - ${si} ${CSName} = OptionalParameter<${si}>::GetValueType(apis, env, info, method, wrapData, js_args_len, ${start}); + ${si} ${CSName} = OptionalParameter<${si}>::GetValueType(apis, env, info, wrapData->Method, wrapData, argc, ${start}); ` } else { return ` // JSValToCSVal unknow type with default @@ -346,6 +346,6 @@ export function CSValToJSVal(signature, CSName) { export function genArgsLenCheck(parameterSignatures) { var requireNum = 0; for (; requireNum < parameterSignatures.length && parameterSignatures[requireNum][0] != 'V' && parameterSignatures[requireNum][0] != 'D'; ++requireNum) { } - return requireNum != parameterSignatures.length ? `js_args_len < ${requireNum}` : `js_args_len != ${parameterSignatures.length}`; + return requireNum != parameterSignatures.length ? `argc < ${requireNum}` : `argc != ${parameterSignatures.length}`; } diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapper.tpl.mjs b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapper.tpl.mjs index bdde222603..0cabd4734e 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapper.tpl.mjs +++ b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapper.tpl.mjs @@ -24,7 +24,7 @@ export default function Gen(genInfos) { namespace puerts { -${wrapperInfos.map((wrapperInfo) => `bool w_${wrapperInfo.Signature}(struct pesapi_ffi* apis, MethodInfo* method, Il2CppMethodPointer methodPointer, pesapi_callback_info info, pesapi_env env, void* self, bool checkJSArgument, WrapData* wrapData);`).join('\n')} +${wrapperInfos.map((wrapperInfo) => `bool w_${wrapperInfo.Signature}(struct pesapi_ffi* apis, pesapi_callback_info info, pesapi_env env, size_t argc, pesapi_value* argv, void* self, bool checkJSArgument, WrapData* wrapData);`).join('\n')} static WrapFuncInfo g_wrapFuncInfos[] = { ${FOR(wrapperInfos, info => t` diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapperdef.tpl.mjs b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapperdef.tpl.mjs index 601cc5ddf8..792eac308f 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapperdef.tpl.mjs +++ b/unity/Assets/core/upm/Editor/Resources/puerts/templates/il2cppwrapperdef.tpl.mjs @@ -13,14 +13,12 @@ function genFuncWrapper(wrapperInfo) { return t` // ${wrapperInfo.CsName} -bool w_${wrapperInfo.Signature}(struct pesapi_ffi* apis, MethodInfo* method, Il2CppMethodPointer methodPointer, pesapi_callback_info info, pesapi_env env, void* self, bool checkJSArgument, WrapData* wrapData) { +bool w_${wrapperInfo.Signature}(struct pesapi_ffi* apis, pesapi_callback_info info, pesapi_env env, size_t argc, pesapi_value* argv, void* self, bool checkJSArgument, WrapData* wrapData) { // PLog("Running w_${wrapperInfo.Signature}"); ${il2cpp_snippets.declareTypeInfo(wrapperInfo)} - - int js_args_len = apis->get_args_len(info); -${parameterSignatures.map((x, i) => ` pesapi_value _sv${i} = apis->get_arg(info, ${i});`).join('\n')} +${parameterSignatures.map((x, i) => ` pesapi_value _sv${i} = argv[${i}];`).join('\n')} if (${parameterSignatures.filter(s => s[0] == 'D').length ? 'true' : 'checkJSArgument'}) { if (${il2cpp_snippets.genArgsLenCheck(parameterSignatures)}) return false; @@ -31,8 +29,8 @@ ${parameterSignatures.map((x, i) => ` pesapi_value _sv${i} = apis->get_arg(in ${parameterSignatures.map((x, i) => il2cpp_snippets.JSValToCSVal(x, `_sv${i}`, `p${i}`)).join('\n')} - typedef ${il2cpp_snippets.SToCPPType(wrapperInfo.ReturnSignature)} (*FuncToCall)(${il2cpp_snippets.needThis(wrapperInfo) ? 'void*,' : ''}${parameterSignatures.map((S, i) => `${il2cpp_snippets.SToCPPType(S)} p${i}`).map(s => `${s}, `).join('')}const void* method); - ${IF(wrapperInfo.ReturnSignature != 'v')}${il2cpp_snippets.SToCPPType(wrapperInfo.ReturnSignature)} ret = ${ENDIF()}((FuncToCall)methodPointer)(${il2cpp_snippets.needThis(wrapperInfo) ? 'self,' : ''} ${parameterSignatures.map((_, i) => `p${i}, `).join('')} method); + typedef ${il2cpp_snippets.SToCPPType(wrapperInfo.ReturnSignature)} (*FuncToCall)(${il2cpp_snippets.needThis(wrapperInfo) ? 'void*,' : ''}${parameterSignatures.map((S, i) => `${il2cpp_snippets.SToCPPType(S)} p${i}`).map(s => `${s}, `).join('')}const MethodInfo* method); + ${IF(wrapperInfo.ReturnSignature != 'v')}${il2cpp_snippets.SToCPPType(wrapperInfo.ReturnSignature)} ret = ${ENDIF()}((FuncToCall)wrapData->MethodPointer)(${il2cpp_snippets.needThis(wrapperInfo) ? 'self,' : ''} ${parameterSignatures.map((_, i) => `p${i}, `).join('')} wrapData->Method); ${FOR(parameterSignatures, (x, i) => t` ${il2cpp_snippets.refSetback(x, i, wrapperInfo)} 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 4cd6ee7664..b2e5f4a7be 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 @@ -50,6 +50,8 @@ struct CSharpMethodInfo bool IsStatic; bool IsGetter; bool IsSetter; + int MaxParamCount; + bool NeedBoxing; std::vector OverloadDatas; }; @@ -65,6 +67,7 @@ struct JsClassInfoHeader Il2CppClass* TypeId; Il2CppClass* SuperTypeId; bool IsValueType; + int MaxCtorParamCount; Il2CppMethodPointer DelegateBridge; WrapData** CtorWrapDatas; }; @@ -285,14 +288,17 @@ static void MethodCallback(struct pesapi_ffi* apis, pesapi_callback_info info) { try { - WrapData** wrapDatas = (WrapData**)apis->get_userdata(info); + CSharpMethodInfo* csharpMethodInfo = (CSharpMethodInfo*)apis->get_userdata(info); + pesapi_value jsThis = nullptr; + pesapi_env env = nullptr; void* self = nullptr; - pesapi_env env = apis->get_env(info); - if (!((*wrapDatas)->IsStatic)) + size_t argc = csharpMethodInfo->MaxParamCount < 0 ? apis->get_args_len(info) : csharpMethodInfo->MaxParamCount; + pesapi_value *argv = (pesapi_value *)alloca(sizeof(pesapi_value) * argc); + apis->extract_callback_info(info, &env, &argc, argv, &jsThis, nullptr); + if (!(csharpMethodInfo->IsStatic)) { - pesapi_value jsThis = apis->get_holder(info); self = apis->get_native_object_ptr(env, jsThis); - if ((*wrapDatas)->NeedBoxing) + if (csharpMethodInfo->NeedBoxing) { auto ptrType = (Il2CppClass*) apis->get_native_object_typeid(env, jsThis); if (Class::IsValuetype(ptrType)) @@ -301,16 +307,18 @@ static void MethodCallback(struct pesapi_ffi* apis, pesapi_callback_info info) } } } - bool checkArgument = *wrapDatas && *(wrapDatas + 1); + bool checkArgument = csharpMethodInfo->OverloadDatas.size() > 2; // including null terminator + WrapData** wrapDatas = csharpMethodInfo->OverloadDatas.data(); while(*wrapDatas) { - if ((*wrapDatas)->Wrap(apis, (*wrapDatas)->Method, (*wrapDatas)->MethodPointer, info, env, self, checkArgument, *wrapDatas)) + if ((*wrapDatas)->Wrap(apis, info, env, argc, argv, self, checkArgument, *wrapDatas)) { return; } ++wrapDatas; } - apis->throw_by_string(info, "invalid arguments"); + std::string err_info = "invalid arguments for " + csharpMethodInfo->Name; + apis->throw_by_string(info, err_info.c_str()); } catch (Il2CppExceptionWrapper& exception) { @@ -453,12 +461,16 @@ static void* CtorCallback(struct pesapi_ffi* apis, pesapi_callback_info info) try { + pesapi_env env = nullptr; + size_t argc = classInfo->MaxCtorParamCount < 0 ? apis->get_args_len(info) : classInfo->MaxCtorParamCount; + pesapi_value *argv = (pesapi_value *)alloca(sizeof(pesapi_value) * argc); + apis->extract_callback_info(info, &env, &argc, argv, nullptr, nullptr); + WrapData** wrapDatas = classInfo->CtorWrapDatas; bool checkArgument = *wrapDatas && *(wrapDatas + 1); - pesapi_env env = apis->get_env(info); while(*wrapDatas) { - if ((*wrapDatas)->Wrap(apis, (*wrapDatas)->Method, (*wrapDatas)->MethodPointer, info, env, self, checkArgument, *wrapDatas)) + if ((*wrapDatas)->Wrap(apis, info, env, argc, argv, self, checkArgument, *wrapDatas)) { return self; } @@ -1235,18 +1247,18 @@ static void JsObjectSetRef(struct pesapi_ffi* apis, pesapi_env env, pesapi_value } } -static bool ReflectionWrapper(struct pesapi_ffi* apis, MethodInfo* method, Il2CppMethodPointer methodPointer, pesapi_callback_info info, pesapi_env env, void* self, bool checkJSArgument, WrapData* wrapData) +static bool ReflectionWrapper(struct pesapi_ffi* apis, pesapi_callback_info info, pesapi_env env, size_t argc, pesapi_value* argv, void* self, bool checkJSArgument, WrapData* wrapData) { - int js_args_len = apis->get_args_len(info); bool hasParamArray = wrapData->HasParamArray; bool isExtensionMethod = wrapData->IsExtensionMethod; auto csArgStart = isExtensionMethod ? 1 : 0; + MethodInfo* method = wrapData->Method; if (checkJSArgument || wrapData->OptionalNum > 0) { if (!hasParamArray && wrapData->OptionalNum == 0) { - if (js_args_len != method->parameters_count - csArgStart) + if (argc != method->parameters_count - csArgStart) { return false; } @@ -1254,7 +1266,7 @@ static bool ReflectionWrapper(struct pesapi_ffi* apis, MethodInfo* method, Il2Cp else { auto requireNum = method->parameters_count - csArgStart - wrapData->OptionalNum - (hasParamArray ? 1 : 0); - if (js_args_len < requireNum) + if (argc < requireNum) { return false; } @@ -1267,7 +1279,7 @@ static bool ReflectionWrapper(struct pesapi_ffi* apis, MethodInfo* method, Il2Cp bool isLastArgument = i == (method->parameters_count - 1); Il2CppClass* parameterKlass = Class::FromIl2CppType(parameterType); Class::Init(parameterKlass); - pesapi_value jsValue = apis->get_arg(info, i - csArgStart); + pesapi_value jsValue = argv[i - csArgStart]; if ((hasDefault || (isLastArgument && hasParamArray)) && apis->is_undefined(env, jsValue)) { @@ -1418,7 +1430,7 @@ handle_underlying: } } void** args = method->parameters_count > 0 ? (void**)alloca(sizeof(void*) * method->parameters_count) : nullptr; - pesapi_value jsThis = apis->get_holder(info); + #ifndef UNITY_2021_1_OR_NEWER if (self) { @@ -1432,6 +1444,7 @@ handle_underlying: #endif if (isExtensionMethod) { + pesapi_value jsThis = apis->get_holder(info); args[0] = apis->get_native_object_ptr(env, jsThis); } @@ -1448,29 +1461,29 @@ handle_underlying: { int jsParamStart = i - csArgStart; auto elementType = Class::FromIl2CppType(¶meterKlass->element_class->byval_arg); - auto arrayLen = js_args_len - jsParamStart > 0 ? js_args_len - jsParamStart : 0; + auto arrayLen = argc - jsParamStart > 0 ? argc - jsParamStart : 0; auto array = Array::NewSpecific(parameterKlass, arrayLen); if (Class::IsValuetype(elementType)) { auto valueSize = elementType->instance_size - sizeof(Il2CppObject); char* addr = Array::GetFirstElementAddress(array); - for(int j = jsParamStart; j < js_args_len; ++j) + for(int j = jsParamStart; j < argc; ++j) { - GetValueTypeFromJs(apis, env, apis->get_arg(info, j), elementType, addr + valueSize * (j - i + csArgStart)); + GetValueTypeFromJs(apis, env, argv[j], elementType, addr + valueSize * (j - i + csArgStart)); } } else { - for(int j = jsParamStart; j < js_args_len; ++j) + for(int j = jsParamStart; j < argc; ++j) { - il2cpp_array_setref(array, j - i + csArgStart, JsValueToCSRef(apis, elementType, env, apis->get_arg(info, j))); + il2cpp_array_setref(array, j - i + csArgStart, JsValueToCSRef(apis, elementType, env, argv[j])); } } args[i] = array; continue; } - pesapi_value jsValue = apis->get_arg(info, i - csArgStart); + pesapi_value jsValue = argv[i - csArgStart]; if (Class::IsValuetype(parameterKlass)) { @@ -1565,7 +1578,7 @@ handle_underlying: bool passedByReference = parameterType->byref; Il2CppClass* parameterKlass = Class::FromIl2CppType(parameterType); - pesapi_value jsValue = apis->get_arg(info, i - csArgStart); + pesapi_value jsValue = argv[i - csArgStart]; if (Class::IsValuetype(parameterKlass) && passedByReference) { @@ -2061,6 +2074,7 @@ puerts::JsClassInfo* CreateCSharpTypeInfo(const char* name, Il2CppClass* type_id ret->SuperTypeId = super_type_id; ret->IsValueType = isValueType; ret->DelegateBridge = delegateBridge; + ret->MaxCtorParamCount = 0; return ret; } @@ -2071,11 +2085,11 @@ void ReleaseCSharpTypeInfo(puerts::JsClassInfo* classInfo) delete classInfo; } -static void SetParamArrayFlagAndOptionalNum(puerts::WrapData* data, const char* signature) +static bool SetParamArrayFlagAndOptionalNum(puerts::WrapData* data, const char* signature) { data->HasParamArray = false; data->OptionalNum = 0; - data->NeedBoxing = false; + bool NeedBoxing = false; const char* p = signature; while(*p) @@ -2086,7 +2100,7 @@ static void SetParamArrayFlagAndOptionalNum(puerts::WrapData* data, const char* } if (*p == 'T') { - data->NeedBoxing = true; + NeedBoxing = true; } if (*p == 'D') { @@ -2094,6 +2108,7 @@ static void SetParamArrayFlagAndOptionalNum(puerts::WrapData* data, const char* } ++p; } + return NeedBoxing; } puerts::WrapData* AddConstructor(puerts::JsClassInfo* classInfo, const char* signature, puerts::WrapFuncPtr WrapFunc, MethodInfo* method, Il2CppMethodPointer methodPointer, int typeInfoNum) @@ -2110,6 +2125,11 @@ puerts::WrapData* AddConstructor(puerts::JsClassInfo* classInfo, const char* sig data->IsExtensionMethod = false; SetParamArrayFlagAndOptionalNum(data, signature); + if (classInfo->MaxCtorParamCount >= 0) + { + classInfo->MaxCtorParamCount = data->HasParamArray ? -1 : std::max(classInfo->MaxCtorParamCount, (int)il2cpp::vm::Method::GetParamCount(method)); + } + classInfo->Ctors.push_back(data); return data; } @@ -2125,7 +2145,7 @@ puerts::WrapData* AddMethod(puerts::JsClassInfo* classInfo, const char* signatur data->Wrap = WrapFunc; data->IsStatic = isStatic; data->IsExtensionMethod = isExtensionMethod; - SetParamArrayFlagAndOptionalNum(data, signature); + bool NeedBoxing = SetParamArrayFlagAndOptionalNum(data, signature); for(int i = 0; i < classInfo->Methods.size(); ++i) { @@ -2137,6 +2157,11 @@ puerts::WrapData* AddMethod(puerts::JsClassInfo* classInfo, const char* signatur return nullptr; } //puerts::PLog("add overload for %s, %s", name, signature); + if (classInfo->Methods[i].MaxParamCount >= 0) + { + classInfo->Methods[i].MaxParamCount = data->HasParamArray ? -1 : std::max(classInfo->Methods[i].MaxParamCount, (int)il2cpp::vm::Method::GetParamCount(method)); + } + //puerts::PLog("overload [%s] :%d, method: %d", name, data->HasParamArray ? -1 : (int)il2cpp::vm::Method::GetParamCount(method), classInfo->Methods[i].MaxParamCount); classInfo->Methods[i].OverloadDatas.push_back(data); return data; } @@ -2145,7 +2170,8 @@ puerts::WrapData* AddMethod(puerts::JsClassInfo* classInfo, const char* signatur //puerts::PLog("%s %d %d %d %p", name, typeInfoNum, allocSize, sizeof(puerts::WrapData), data); std::vector OverloadDatas; OverloadDatas.push_back(data); - classInfo->Methods.push_back({std::string(name), isStatic, isGetter, isSetter, std::move(OverloadDatas)}); + //puerts::PLog("new mathod [%s] MaxParamCount:%d", name, data->HasParamArray ? -1 : (int)il2cpp::vm::Method::GetParamCount(method)); + classInfo->Methods.push_back({std::string(name), isStatic, isGetter, isSetter, data->HasParamArray ? -1 : (int)il2cpp::vm::Method::GetParamCount(method), NeedBoxing, std::move(OverloadDatas)}); return data; } @@ -2222,7 +2248,7 @@ bool RegisterCSharpType(puerts::JsClassInfo* classInfo) for (auto const& method: methods) { pesapi_set_method_info( - properties, pos++, method->Name.c_str(), method->IsStatic, &puerts::MethodCallback, method->OverloadDatas.data(), nullptr); + properties, pos++, method->Name.c_str(), method->IsStatic, &puerts::MethodCallback, method, nullptr); } for (auto const& kv: gseters) @@ -2231,8 +2257,8 @@ bool RegisterCSharpType(puerts::JsClassInfo* classInfo) pesapi_set_property_info(properties, pos++, geter_or_setter->Name.c_str(), geter_or_setter->IsStatic, kv.second.first ? &puerts::MethodCallback : nullptr, kv.second.second ? &puerts::MethodCallback : nullptr, - kv.second.first ? kv.second.first->OverloadDatas.data() : nullptr, - kv.second.second ? kv.second.second->OverloadDatas.data() : nullptr, + kv.second.first, + kv.second.second, nullptr); } diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/TDataTrans.h.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/TDataTrans.h.txt index b36dbebdf0..156b318678 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/TDataTrans.h.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/TDataTrans.h.txt @@ -14,7 +14,7 @@ namespace puerts { typedef void (*FieldWrapFuncPtr)(struct pesapi_ffi* apis, pesapi_callback_info info, FieldInfo* field, size_t offset, Il2CppClass* fieldType); -typedef bool (*WrapFuncPtr)(struct pesapi_ffi* apis, MethodInfo* method, Il2CppMethodPointer methodPointer, pesapi_callback_info info, pesapi_env env, void* self, bool checkArgument, struct WrapData* wrapData); +typedef bool (*WrapFuncPtr)(struct pesapi_ffi* apis, pesapi_callback_info info, pesapi_env env, size_t argc, pesapi_value* argv, void* self, bool checkArgument, struct WrapData* wrapData); struct FieldWrapData { @@ -34,7 +34,6 @@ struct WrapData bool IsExtensionMethod; bool HasParamArray; int OptionalNum; - bool NeedBoxing; Il2CppClass* TypeInfos[0]; }; diff --git a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt index cd421a7314..006bdf647e 100644 --- a/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt +++ b/unity/Assets/core/upm/Editor/Resources/puerts/xil2cpp/pesapi.h.txt @@ -108,6 +108,12 @@ EXTERN_C_START +typedef enum +{ + pesapi_ok, + pesapi_fail +} pesapi_code; + // alloc on stack struct pesapi_scope_memory { @@ -189,11 +195,12 @@ typedef pesapi_value (*pesapi_unboxing_func)(pesapi_env env, pesapi_value value) typedef void (*pesapi_update_boxed_value_func)(pesapi_env env, pesapi_value boxed_value, pesapi_value value); typedef bool (*pesapi_is_boxed_value_func)(pesapi_env env, pesapi_value value); -typedef int (*pesapi_get_args_len_func)(pesapi_callback_info info); +typedef pesapi_code (*pesapi_extract_callback_info_func)(pesapi_callback_info info, pesapi_env* env, size_t* argc, pesapi_value* argv, pesapi_value* this_object, void** data); +typedef int (*pesapi_get_args_len_func)(pesapi_callback_info info);// TODO: rename get_args_count typedef pesapi_value (*pesapi_get_arg_func)(pesapi_callback_info info, int index); typedef pesapi_env (*pesapi_get_env_func)(pesapi_callback_info info); typedef pesapi_value (*pesapi_get_this_func)(pesapi_callback_info info); -typedef pesapi_value (*pesapi_get_holder_func)(pesapi_callback_info info); +typedef pesapi_value (*pesapi_get_holder_func)(pesapi_callback_info info); // TODO: to be remove typedef void* (*pesapi_get_userdata_func)(pesapi_callback_info info); typedef void (*pesapi_add_return_func)(pesapi_callback_info info, pesapi_value value); typedef void (*pesapi_throw_by_string_func)(pesapi_callback_info pinfo, const char* msg); @@ -280,6 +287,7 @@ struct pesapi_ffi pesapi_unboxing_func unboxing; pesapi_update_boxed_value_func update_boxed_value; pesapi_is_boxed_value_func is_boxed_value; + pesapi_extract_callback_info_func extract_callback_info; pesapi_get_args_len_func get_args_len; pesapi_get_arg_func get_arg; pesapi_get_env_func get_env; diff --git a/unity/native_src_il2cpp/Inc/pesapi.h b/unity/native_src_il2cpp/Inc/pesapi.h index cd421a7314..006bdf647e 100644 --- a/unity/native_src_il2cpp/Inc/pesapi.h +++ b/unity/native_src_il2cpp/Inc/pesapi.h @@ -108,6 +108,12 @@ EXTERN_C_START +typedef enum +{ + pesapi_ok, + pesapi_fail +} pesapi_code; + // alloc on stack struct pesapi_scope_memory { @@ -189,11 +195,12 @@ typedef pesapi_value (*pesapi_unboxing_func)(pesapi_env env, pesapi_value value) typedef void (*pesapi_update_boxed_value_func)(pesapi_env env, pesapi_value boxed_value, pesapi_value value); typedef bool (*pesapi_is_boxed_value_func)(pesapi_env env, pesapi_value value); -typedef int (*pesapi_get_args_len_func)(pesapi_callback_info info); +typedef pesapi_code (*pesapi_extract_callback_info_func)(pesapi_callback_info info, pesapi_env* env, size_t* argc, pesapi_value* argv, pesapi_value* this_object, void** data); +typedef int (*pesapi_get_args_len_func)(pesapi_callback_info info);// TODO: rename get_args_count typedef pesapi_value (*pesapi_get_arg_func)(pesapi_callback_info info, int index); typedef pesapi_env (*pesapi_get_env_func)(pesapi_callback_info info); typedef pesapi_value (*pesapi_get_this_func)(pesapi_callback_info info); -typedef pesapi_value (*pesapi_get_holder_func)(pesapi_callback_info info); +typedef pesapi_value (*pesapi_get_holder_func)(pesapi_callback_info info); // TODO: to be remove typedef void* (*pesapi_get_userdata_func)(pesapi_callback_info info); typedef void (*pesapi_add_return_func)(pesapi_callback_info info, pesapi_value value); typedef void (*pesapi_throw_by_string_func)(pesapi_callback_info pinfo, const char* msg); @@ -280,6 +287,7 @@ struct pesapi_ffi pesapi_unboxing_func unboxing; pesapi_update_boxed_value_func update_boxed_value; pesapi_is_boxed_value_func is_boxed_value; + pesapi_extract_callback_info_func extract_callback_info; pesapi_get_args_len_func get_args_len; pesapi_get_arg_func get_arg; pesapi_get_env_func get_env; diff --git a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp index c6d018263b..dec471f6f4 100644 --- a/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp +++ b/unity/native_src_il2cpp/Src/PesapiV8Impl.cpp @@ -418,6 +418,39 @@ bool pesapi_is_boxed_value(pesapi_env env, pesapi_value value) return pesapi_is_object(env, value); } +pesapi_code pesapi_extract_callback_info(pesapi_callback_info pinfo, pesapi_env* env, size_t* argc, pesapi_value* argv, pesapi_value* this_object, void** data) +{ + auto info = reinterpret_cast*>(pinfo); + if (env) + { + *env = v8impl::PesapiEnvFromV8LocalContext((*info).GetIsolate()->GetCurrentContext()); + } + + if (argc && argv) + { + for(int i = 0; i < *argc; ++i) + { + argv[i] = v8impl::PesapiValueFromV8LocalValue((*info)[i]); + } + } + + if (argc) + { + *argc = (*info).Length(); + } + + if (this_object) + { + *this_object = v8impl::PesapiValueFromV8LocalValue((*info).This()); + } + + if (data) + { + *data = *(static_cast(v8::Local::Cast((*info).Data())->Value())); + } + return pesapi_ok; +} + int pesapi_get_args_len(pesapi_callback_info pinfo) { auto info = reinterpret_cast*>(pinfo); @@ -859,6 +892,7 @@ pesapi_ffi g_pesapi_ffi { &pesapi_unboxing, &pesapi_update_boxed_value, &pesapi_is_boxed_value, + &pesapi_extract_callback_info, &pesapi_get_args_len, &pesapi_get_arg, &pesapi_get_env,