constexpr static std::enable_if_t< idx< std::tuple_size_v< DefArgsTuple >, bool > needsWrapFuncArg() { typedef std::tuple_element_t< idx, DefArgsTuple > ArgType;if constexpr(std::is_base_of_v< Variant, typename ArgType::Type >||std::is_base_of_v< VariantArray, typename ArgType::Type >||std::is_base_of_v< std::string_view, typename ArgType::Type >||std::is_base_of_v< std::u16string_view, typename ArgType::Type >||std::is_base_of_v< std::u32string_view, typename ArgType::Type >||std::is_base_of_v< RMonoObjectHandleTag, typename ArgType::Type >||tags::has_param_tag_v< ArgType, tags::ParamOutTag >) { return true;} else { return needsWrapFuncArg< idx+1 >);} } template< size_t idx=0 > constexpr static std::enable_if_t< idx==std::tuple_size_v< DefArgsTuple >, bool > needsWrapFuncArg() { return false;} constexpr static bool needsWrapFunc() { if constexpr(std::is_base_of_v< Variant, typename DefRetType::Type >||std::is_base_of_v< VariantArray, typename DefRetType::Type >||std::is_base_of_v< std::string, typename DefRetType::Type >||std::is_base_of_v< std::u16string, typename DefRetType::Type >||std::is_base_of_v< std::u32string, typename DefRetType::Type >||std::is_base_of_v< RMonoObjectHandleTag, typename DefRetType::Type >) { return true;} else { return needsWrapFuncArg< 0 >);} }public:asmjit::Label compileWrap(blackbone::IAsmHelper &a);protected:void resetWrap() { wrapFunc.reset();}private:void generateWrapperAsm(AsmBuildContext &ctx);template< size_t wrapArgIdx > void genWrapperSpillArgsToStackX64(AsmBuildContext &ctx);void genWrapperReserveStack(AsmBuildContext &ctx);template< size_t wrapArgIdx, typename ArgT, typename... RestT > void genWrapperReserveArgStack(AsmBuildContext &ctx, PackHelper< ArgT >, PackHelper< RestT >... rest);template< size_t wrapArgIdx > void genWrapperReserveArgStack(AsmBuildContext &ctx) {} template< size_t rawArgIdx > void genWrapperCalculateRawArgStackSize(AsmBuildContext &ctx);void genWrapperBuildRawArgs(AsmBuildContext &ctx);template< size_t wrapArgIdx, size_t rawArgIdx, typename ArgT, typename... RestT > void genWrapperBuildRawArg(AsmBuildContext &ctx, PackHelper< ArgT >, PackHelper< RestT >... rest);template< size_t wrapArgIdx, size_t rawArgIdx > void genWrapperBuildRawArg(AsmBuildContext &ctx) {} template< size_t rawArgIdx > void genWrapperMoveStackArgsToRegsX64(AsmBuildContext &ctx);void genWrapperHandleRetAndOutParams(AsmBuildContext &ctx);template< size_t wrapArgIdx, size_t rawArgIdx, typename ArgT, typename... RestT > void genWrapperHandleOutParams(AsmBuildContext &ctx, PackHelper< ArgT >, PackHelper< RestT >... rest);template< size_t wrapArgIdx, size_t rawArgIdx > void genWrapperHandleOutParams(AsmBuildContext &ctx) {} void genGchandleGetTargetChecked(AsmBuildContext &ctx);void genGchandleNewChecked(AsmBuildContext &ctx);void genIsValueTypeInstance(AsmBuildContext &ctx);void genObjectUnbox(AsmBuildContext &ctx);template< size_t argIdx, typename ArgsTupleT > constexpr size_t calcStackArgOffset() { if constexpr(argIdx==0) { return 0;} else { return static_align(sizeof(std::tuple_element_t< argIdx-1, ArgsTupleT >), sizeof(irmono_voidp))+calcStackArgOffset< argIdx-1, ArgsTupleT >);} } template< size_t argIdx > asmjit::X86Mem ptrWrapFuncArg(AsmBuildContext &ctx, size_t partIdx=0, uint32_t size=0) { return asmjit::host::ptr((*ctx.a) ->zbp, int32_t(ctx.stackOffsArgBase+calcStackArgOffset< argIdx, typename RMonoAPIFunctionWrapTraits< RMonoAPIFunctionBase< ABI, required, RetT, ArgsT... > >::WrapArgsTuple >)+partIdx *sizeof(irmono_voidp)), size);} template< size_t argIdx > asmjit::X86Mem ptrRawFuncArg(AsmBuildContext &ctx, size_t partIdx=0, uint32_t size=0) { return asmjit::host::ptr((*ctx.a) ->zsp, int32_t(calcStackArgOffset< argIdx, typename RMonoAPIFunctionRawTraits< RMonoAPIFunctionBase< ABI, required, RetT, ArgsT... > >::RawArgsTuple >)+partIdx *sizeof(irmono_voidp)), size);}private:ABI *getABI() { return static_cast< RMonoAPIFunctionBase< ABI, required, RetT, ArgsT... > * >this) -> | getABI () |