Skip to content

Commit

Permalink
[unity]添加pesapi_extract_callback_info并使用其重构wrapper实现
Browse files Browse the repository at this point in the history
  • Loading branch information
chexiongsheng committed Nov 7, 2024
1 parent 053d091 commit 895e92d
Show file tree
Hide file tree
Showing 8 changed files with 128 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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<void*>::PackString(apis, env, info, TI${CSName}, js_args_len, ${start});
Il2CppArray* ${CSName} = Params<void*>::PackString(apis, env, info, TI${CSName}, argc, ${start});
`
} else if (si == 'o' || si == 'O' || si == 'a') {
return ` // JSValToCSVal ref params
Il2CppArray* ${CSName} = Params<void*>::PackRef(apis, env, info, TI${CSName}, js_args_len, ${start});
Il2CppArray* ${CSName} = Params<void*>::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
Expand All @@ -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<Il2CppString*>::GetString(apis, env, info, method, wrapData, js_args_len, ${start});
Il2CppString* ${CSName} = OptionalParameter<Il2CppString*>::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<Il2CppObject*>::GetRefType(apis, env, info, method, wrapData, js_args_len, ${start}, TI${CSName});
Il2CppObject* ${CSName} = OptionalParameter<Il2CppObject*>::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
Expand Down Expand Up @@ -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}`;
}

Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)}
Expand Down
Loading

0 comments on commit 895e92d

Please sign in to comment.