mirror of
https://github.com/alliedmodders/metamod-source.git
synced 2025-03-22 13:19:40 +01:00
Return type can now also be an object with normal ctor/copy ctor/dtor/assign op
--HG-- branch : hookman_autogen extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/hookman_autogen%40537
This commit is contained in:
parent
83c51e6cfa
commit
ebf7cf8fee
@ -147,6 +147,47 @@ namespace SourceHook
|
||||
}
|
||||
}
|
||||
|
||||
void GenContext::BitwiseCopy_Setup()
|
||||
{
|
||||
//cld
|
||||
//push edi
|
||||
//push esi
|
||||
|
||||
IA32_Cld(&m_HookFunc);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDI);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ESI);
|
||||
}
|
||||
|
||||
void GenContext::BitwiseCopy_Do(size_t size)
|
||||
{
|
||||
jit_uint32_t dwords = DownCastSize(size) / 4;
|
||||
jit_uint32_t bytes = DownCastSize(size) % 4;
|
||||
|
||||
//if dwords
|
||||
// mov ecx, <dwords>
|
||||
// rep movsd
|
||||
//if bytes
|
||||
// mov ecx, <bytes>
|
||||
// rep movsb
|
||||
//pop esi
|
||||
//pop edi
|
||||
|
||||
if (dwords)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, dwords);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsd(&m_HookFunc);
|
||||
}
|
||||
if (bytes)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, bytes);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsb(&m_HookFunc);
|
||||
}
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDI);
|
||||
}
|
||||
|
||||
jit_int32_t GenContext::PushRef(jit_int32_t param_offset, const IntPassInfo &pi)
|
||||
{
|
||||
// push [ebp+<offset>]
|
||||
@ -262,51 +303,24 @@ namespace SourceHook
|
||||
}
|
||||
else
|
||||
{
|
||||
jit_uint32_t dwords = DownCastSize(pi.size) / 4;
|
||||
jit_uint32_t bytes = DownCastSize(pi.size) % 4;
|
||||
|
||||
// bitwise copy
|
||||
|
||||
//cld
|
||||
//push edi
|
||||
//push esi
|
||||
|
||||
BitwiseCopy_Setup();
|
||||
|
||||
//lea edi, [esp+8]
|
||||
//lea esi, [ebp+<offs>]
|
||||
//if dwords
|
||||
// mov ecx, <dwords>
|
||||
// rep movsd
|
||||
//if bytes
|
||||
// mov ecx, <bytes>
|
||||
// rep movsb
|
||||
//pop esi
|
||||
//pop edi
|
||||
|
||||
IA32_Cld(&m_HookFunc);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDI);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Lea_Reg_DispRegMultImm8(&m_HookFunc, REG_EDI, REG_NOIDX, REG_ESP, NOSCALE, 8);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ESI, REG_EBP, param_offset);
|
||||
if (dwords)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, dwords);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsd(&m_HookFunc);
|
||||
}
|
||||
if (bytes)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, bytes);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsb(&m_HookFunc);
|
||||
}
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDI);
|
||||
|
||||
BitwiseCopy_Do(pi.size);
|
||||
}
|
||||
|
||||
return DownCastSize(pi.size);
|
||||
}
|
||||
|
||||
// May not touch eax!
|
||||
jit_int32_t GenContext::PushParams(jit_int32_t param_base_offset, jit_int32_t save_ret_to)
|
||||
jit_int32_t GenContext::PushParams(jit_int32_t param_base_offset, jit_int32_t save_ret_to, int v_place_for_memret)
|
||||
{
|
||||
jit_int32_t added_to_stack = 0;
|
||||
jit_int32_t ret = 0;
|
||||
@ -354,7 +368,8 @@ namespace SourceHook
|
||||
{
|
||||
// push address where to save it!
|
||||
int reg = NextRegEBX_ECX_EDX();
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, reg, REG_EBP, save_ret_to);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, reg, REG_EBP,
|
||||
MemRetWithTempObj() ? v_place_for_memret : save_ret_to);
|
||||
IA32_Push_Reg(&m_HookFunc, reg);
|
||||
|
||||
added_to_stack += SIZE_PTR;
|
||||
@ -363,7 +378,7 @@ namespace SourceHook
|
||||
return added_to_stack;
|
||||
}
|
||||
|
||||
void GenContext::SaveRetVal(int v_where)
|
||||
void GenContext::SaveRetVal(int v_where, int v_place_for_memret)
|
||||
{
|
||||
size_t size = m_Proto.GetRet().size;
|
||||
if (size == 0)
|
||||
@ -373,9 +388,65 @@ namespace SourceHook
|
||||
}
|
||||
|
||||
// Memory return:
|
||||
// PushParams already did everything that was neccessary
|
||||
if (m_Proto.GetRet().flags & PassInfo::PassFlag_RetMem)
|
||||
return;
|
||||
{
|
||||
if (MemRetWithTempObj())
|
||||
{
|
||||
// *v_where = *v_place_for_memret
|
||||
|
||||
// if we have an assign operator, use that
|
||||
if (m_Proto.GetRet().pAssignOperator)
|
||||
{
|
||||
// lea edx, [ebp + v_place_for_memret] <-- src addr
|
||||
// lea ecx, [ebp + v_where] <-- dest addr
|
||||
// gcc: push ecx
|
||||
// push edx
|
||||
// call it
|
||||
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_EDX, REG_EBP, v_place_for_memret);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_where);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ECX);
|
||||
#endif
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDX);
|
||||
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pAssignOperator));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
}
|
||||
else
|
||||
{
|
||||
// bitwise copy
|
||||
BitwiseCopy_Setup();
|
||||
|
||||
//lea edi, [evp+v_where] <-- destination
|
||||
//lea esi, [ebp+v_place_for_memret] <-- src
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_EDI, REG_EBP, v_where);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ESI, REG_EBP, v_place_for_memret);
|
||||
|
||||
BitwiseCopy_Do(m_Proto.GetRet().size);
|
||||
}
|
||||
|
||||
// Then: destruct *v_place_for_memret if required
|
||||
if (m_Proto.GetRet().pDtor)
|
||||
{
|
||||
//lea ecx, [ebp+v_place_for_memret]
|
||||
//gcc: push ecx
|
||||
//call it
|
||||
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_place_for_memret);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ECX);
|
||||
#endif
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pDtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Already copied to correct address -> we're done
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_Proto.GetRet().type == PassInfo::PassType_Float)
|
||||
{
|
||||
@ -436,6 +507,13 @@ namespace SourceHook
|
||||
}
|
||||
}
|
||||
|
||||
bool GenContext::MemRetWithTempObj()
|
||||
{
|
||||
// Memory return AND (has destructor OR has assign operator)
|
||||
return ((m_Proto.GetRet().flags & PassInfo::PassFlag_RetMem)
|
||||
&& (m_Proto.GetRet().flags & (PassInfo::PassFlag_ODtor | PassInfo::PassFlag_AssignOp)));
|
||||
}
|
||||
|
||||
void GenContext::ProcessPluginRetVal(int v_cur_res, int v_pContext, int v_plugin_ret)
|
||||
{
|
||||
// only for non-void functions!
|
||||
@ -500,44 +578,15 @@ namespace SourceHook
|
||||
}
|
||||
else
|
||||
{
|
||||
jit_uint32_t dwords = DownCastSize(m_Proto.GetRet().size) / 4;
|
||||
jit_uint32_t bytes = DownCastSize(m_Proto.GetRet().size) % 4;
|
||||
|
||||
// bitwise copy
|
||||
|
||||
//cld
|
||||
//push edi
|
||||
//push esi
|
||||
BitwiseCopy_Setup();
|
||||
|
||||
//mov edi, eax <-- destination
|
||||
//lea esi, [ebp+v_plugin_ret] <-- src
|
||||
//if dwords
|
||||
// mov ecx, <dwords>
|
||||
// rep movsd
|
||||
//if bytes
|
||||
// mov ecx, <bytes>
|
||||
// rep movsb
|
||||
//pop esi
|
||||
//pop edi
|
||||
|
||||
IA32_Cld(&m_HookFunc);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDI);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Mov_Reg_Rm(&m_HookFunc, REG_EDI, REG_EAX, MOD_REG);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ESI, REG_EBP, v_plugin_ret);
|
||||
if (dwords)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, dwords);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsd(&m_HookFunc);
|
||||
}
|
||||
if (bytes)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, bytes);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsb(&m_HookFunc);
|
||||
}
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDI);
|
||||
|
||||
BitwiseCopy_Do(m_Proto.GetRet().size);
|
||||
}
|
||||
|
||||
m_HookFunc.end_count(counter);
|
||||
@ -600,7 +649,6 @@ namespace SourceHook
|
||||
if (!size)
|
||||
return;
|
||||
|
||||
// :TODO: assign op support
|
||||
// :TODO: memory return support
|
||||
|
||||
// Get real ret pointer into ecx
|
||||
@ -645,7 +693,7 @@ namespace SourceHook
|
||||
if (m_Proto.GetRet().flags & PassInfo::PassFlag_RetMem)
|
||||
{
|
||||
// *memret_outaddr = plugin_ret
|
||||
if (m_Proto.GetRet().pAssignOperator)
|
||||
if (m_Proto.GetRet().pCopyCtor)
|
||||
{
|
||||
// mov edx, ecx <-- src ( we set ecx to [ebp+v_retptr] before )
|
||||
// msvc: ecx = [ebp + v_memret_outaddr] <-- dest addr
|
||||
@ -662,49 +710,20 @@ namespace SourceHook
|
||||
#endif
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDX);
|
||||
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pAssignOperator));
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pCopyCtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
}
|
||||
else
|
||||
{
|
||||
jit_uint32_t dwords = DownCastSize(m_Proto.GetRet().size) / 4;
|
||||
jit_uint32_t bytes = DownCastSize(m_Proto.GetRet().size) % 4;
|
||||
|
||||
// bitwise copy
|
||||
BitwiseCopy_Setup();
|
||||
|
||||
//cld
|
||||
//push edi
|
||||
//push esi
|
||||
//mov edi, [ebp+v_memret_outaddr] <-- destination
|
||||
//mov esi, ecx <-- src ( we set ecx to [ebp+v_retptr] before )
|
||||
//if dwords
|
||||
// mov ecx, <dwords>
|
||||
// rep movsd
|
||||
//if bytes
|
||||
// mov ecx, <bytes>
|
||||
// rep movsb
|
||||
//pop esi
|
||||
//pop edi
|
||||
|
||||
IA32_Cld(&m_HookFunc);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDI);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Mov_Reg_Rm_DispAuto(&m_HookFunc, REG_EDI, REG_EBP, v_memret_outaddr);
|
||||
IA32_Mov_Reg_Rm(&m_HookFunc, REG_ESI, REG_ECX, MOD_REG);
|
||||
if (dwords)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, dwords);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsd(&m_HookFunc);
|
||||
}
|
||||
if (bytes)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, bytes);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsb(&m_HookFunc);
|
||||
}
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDI);
|
||||
|
||||
BitwiseCopy_Do(m_Proto.GetRet().size);
|
||||
}
|
||||
|
||||
// In both cases: return the pointer in EAX
|
||||
@ -714,7 +733,7 @@ namespace SourceHook
|
||||
}
|
||||
|
||||
void GenContext::GenerateCallHooks(int v_status, int v_prev_res, int v_cur_res, int v_iter,
|
||||
int v_pContext, int base_param_offset, int v_plugin_ret)
|
||||
int v_pContext, int base_param_offset, int v_plugin_ret, int v_place_for_memret)
|
||||
{
|
||||
jitoffs_t counter, tmppos;
|
||||
jitoffs_t counter2, tmppos2;
|
||||
@ -759,7 +778,7 @@ namespace SourceHook
|
||||
// eax = [ecx]
|
||||
// eax = [eax+2*SIZE_PTR]
|
||||
// call eax
|
||||
jit_int32_t gcc_clean_bytes = PushParams(base_param_offset, v_plugin_ret);
|
||||
jit_int32_t gcc_clean_bytes = PushParams(base_param_offset, v_plugin_ret, v_place_for_memret);
|
||||
|
||||
IA32_Mov_Reg_Rm(&m_HookFunc, REG_ECX, REG_EAX, MOD_REG);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
@ -769,7 +788,7 @@ namespace SourceHook
|
||||
IA32_Mov_Reg_Rm_DispAuto(&m_HookFunc, REG_EAX, REG_EAX, 2*SIZE_PTR);
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
|
||||
SaveRetVal(v_plugin_ret);
|
||||
SaveRetVal(v_plugin_ret, v_place_for_memret);
|
||||
|
||||
// cleanup
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
@ -831,8 +850,8 @@ namespace SourceHook
|
||||
return acc;
|
||||
}
|
||||
|
||||
void GenContext::GenerateCallOrig(int v_status, int v_pContext,
|
||||
int param_base_offs, int v_this, int v_vfnptr_origentry, int v_orig_ret, int v_override_ret)
|
||||
void GenContext::GenerateCallOrig(int v_status, int v_pContext, int param_base_offs, int v_this,
|
||||
int v_vfnptr_origentry, int v_orig_ret, int v_override_ret, int v_place_for_memret)
|
||||
{
|
||||
jitoffs_t counter, tmppos;
|
||||
jitoffs_t counter2, tmppos2;
|
||||
@ -885,7 +904,7 @@ namespace SourceHook
|
||||
m_HookFunc.start_count(counter2);
|
||||
|
||||
// push params
|
||||
jit_int32_t gcc_clean_bytes = PushParams(param_base_offs, v_orig_ret);
|
||||
jit_int32_t gcc_clean_bytes = PushParams(param_base_offs, v_orig_ret, v_place_for_memret);
|
||||
|
||||
// thisptr
|
||||
IA32_Mov_Reg_Rm_DispAuto(&m_HookFunc, REG_ECX, REG_EBP, v_this);
|
||||
@ -906,7 +925,7 @@ namespace SourceHook
|
||||
#endif
|
||||
|
||||
// save retval
|
||||
SaveRetVal(v_orig_ret);
|
||||
SaveRetVal(v_orig_ret, v_place_for_memret);
|
||||
|
||||
// Skip don't call variant
|
||||
tmppos3 = IA32_Jump_Imm32(&m_HookFunc, 0);
|
||||
@ -941,44 +960,15 @@ namespace SourceHook
|
||||
}
|
||||
else
|
||||
{
|
||||
jit_uint32_t dwords = DownCastSize(m_Proto.GetRet().size) / 4;
|
||||
jit_uint32_t bytes = DownCastSize(m_Proto.GetRet().size) % 4;
|
||||
|
||||
// bitwise copy
|
||||
BitwiseCopy_Setup();
|
||||
|
||||
//cld
|
||||
//push edi
|
||||
//push esi
|
||||
//lea edi, [ebp+v_orig_ret] <-- destination
|
||||
//lea esi, [ebp+v_override_ret] <-- src
|
||||
//if dwords
|
||||
// mov ecx, <dwords>
|
||||
// rep movsd
|
||||
//if bytes
|
||||
// mov ecx, <bytes>
|
||||
// rep movsb
|
||||
//pop esi
|
||||
//pop edi
|
||||
|
||||
IA32_Cld(&m_HookFunc);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDI);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_EDI, REG_EBP, v_orig_ret);
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ESI, REG_EBP, v_override_ret);
|
||||
if (dwords)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, dwords);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsd(&m_HookFunc);
|
||||
}
|
||||
if (bytes)
|
||||
{
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_ECX, bytes);
|
||||
IA32_Rep(&m_HookFunc);
|
||||
IA32_Movsb(&m_HookFunc);
|
||||
}
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_ESI);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDI);
|
||||
|
||||
BitwiseCopy_Do(m_Proto.GetRet().size);
|
||||
}
|
||||
|
||||
// skip don't call label target:
|
||||
@ -1134,6 +1124,10 @@ namespace SourceHook
|
||||
// my_rettype plugin_ret ebp - 28 - sizeof(my_rettype)*3 -4
|
||||
// == + 3 * sizeof(my_rettype) bytes
|
||||
|
||||
// if required:
|
||||
// my_rettype place_for_memret ebp - 28 - sizeof(my_rettype)*4 -4
|
||||
|
||||
|
||||
const jit_int8_t v_vfnptr_origentry = -4 + addstackoffset;
|
||||
const jit_int8_t v_status = -8 + addstackoffset;
|
||||
const jit_int8_t v_prev_res = -12 + addstackoffset;
|
||||
@ -1160,10 +1154,13 @@ namespace SourceHook
|
||||
jit_int32_t v_override_ret = -28 + addstackoffset - GetStackSize(m_Proto.GetRet()) * 2;
|
||||
jit_int32_t v_plugin_ret = -28 + addstackoffset - GetStackSize(m_Proto.GetRet()) * 3;
|
||||
|
||||
jit_int32_t v_place_for_memret = -28 + addstackoffset - GetStackSize(m_Proto.GetRet()) * 4;
|
||||
|
||||
// Hash for temporary storage for byval params with copy constructors
|
||||
// (param, offset into stack)
|
||||
short usedStackBytes = 3*SIZE_MWORD + 3*SIZE_PTR + // vfnptr_origentry, status, prev_res, cur_res, iter, pContext
|
||||
3 * GetStackSize(m_Proto.GetRet()) + (m_Proto.GetRet().size == 0 ? 0 : SIZE_PTR) // ret_ptr, orig_ret, override_ret, plugin_ret
|
||||
short usedStackBytes = 3*SIZE_MWORD + 3*SIZE_PTR // vfnptr_origentry, status, prev_res, cur_res, iter, pContext
|
||||
+ 3 * GetStackSize(m_Proto.GetRet()) + (m_Proto.GetRet().size == 0 ? 0 : SIZE_PTR) // ret_ptr, orig_ret, override_ret, plugin_ret
|
||||
+ (MemRetWithTempObj() ? GetStackSize(m_Proto.GetRet()) : 0)
|
||||
- addstackoffset; // msvc: current thisptr
|
||||
|
||||
IA32_Sub_Rm_Imm32(&m_HookFunc, REG_ESP, usedStackBytes, MOD_REG);
|
||||
@ -1190,6 +1187,8 @@ namespace SourceHook
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_plugin_ret);
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pNormalCtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
|
||||
// _don't_ call a constructor for v_place_for_memret !
|
||||
}
|
||||
|
||||
// ********************** SetupHookLoop **********************
|
||||
@ -1198,15 +1197,15 @@ namespace SourceHook
|
||||
|
||||
// ********************** call pre hooks **********************
|
||||
GenerateCallHooks(v_status, v_prev_res, v_cur_res, v_iter, v_pContext, param_base_offs,
|
||||
v_plugin_ret);
|
||||
v_plugin_ret, v_place_for_memret);
|
||||
|
||||
// ********************** call orig func **********************
|
||||
GenerateCallOrig(v_status, v_pContext, param_base_offs, v_this, v_vfnptr_origentry, v_orig_ret,
|
||||
v_override_ret);
|
||||
v_override_ret, v_place_for_memret);
|
||||
|
||||
// ********************** call post hooks **********************
|
||||
GenerateCallHooks(v_status, v_prev_res, v_cur_res, v_iter, v_pContext, param_base_offs,
|
||||
v_plugin_ret);
|
||||
v_plugin_ret, v_place_for_memret);
|
||||
|
||||
// ********************** end context and return **********************
|
||||
|
||||
@ -1231,7 +1230,37 @@ namespace SourceHook
|
||||
|
||||
DoReturn(v_ret_ptr, v_memret_addr);
|
||||
|
||||
// !! :TODO: Call destructors of orig_ret/ ...
|
||||
// Call destructors of orig_ret/ ...
|
||||
if(m_Proto.GetRet().pDtor)
|
||||
{
|
||||
// Preserve return value in EAX(:EDX)
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EAX);
|
||||
IA32_Push_Reg(&m_HookFunc, REG_EDX);
|
||||
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_plugin_ret);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ECX);
|
||||
#endif
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pDtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_override_ret);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ECX);
|
||||
#endif
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pDtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
|
||||
IA32_Lea_DispRegImmAuto(&m_HookFunc, REG_ECX, REG_EBP, v_orig_ret);
|
||||
#if SH_COMP == SH_COMP_GCC
|
||||
IA32_Push_Reg(&m_HookFunc, REG_ECX);
|
||||
#endif
|
||||
IA32_Mov_Reg_Imm32(&m_HookFunc, REG_EAX, DownCastPtr(m_Proto.GetRet().pDtor));
|
||||
IA32_Call_Reg(&m_HookFunc, REG_EAX);
|
||||
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EDX);
|
||||
IA32_Pop_Reg(&m_HookFunc, REG_EAX);
|
||||
}
|
||||
|
||||
// epilogue
|
||||
IA32_Mov_Reg_Rm(&m_HookFunc, REG_ESP, REG_EBP, MOD_REG);
|
||||
@ -1351,17 +1380,16 @@ namespace SourceHook
|
||||
if (pi.type == PassInfo::PassType_Object &&
|
||||
(pi.flags & PassInfo::PassFlag_ByVal))
|
||||
{
|
||||
if ((pi.flags & PassInfo::PassFlag_CCtor) && !pi.pNormalCtor)
|
||||
if ((pi.flags & PassInfo::PassFlag_CCtor) && !pi.pCopyCtor)
|
||||
return false;
|
||||
|
||||
if ((pi.flags & PassInfo::PassFlag_ODtor) && !pi.pDtor)
|
||||
return false;
|
||||
|
||||
// only care for assignop and normalctor for return types
|
||||
if (is_ret && (pi.flags & PassInfo::PassFlag_AssignOp) && !pi.pAssignOperator)
|
||||
if ((pi.flags & PassInfo::PassFlag_AssignOp) && !pi.pAssignOperator)
|
||||
return false;
|
||||
|
||||
if (is_ret && (pi.flags & PassInfo::PassFlag_CCtor) && !pi.pNormalCtor)
|
||||
if ((pi.flags & PassInfo::PassFlag_OCtor) && !pi.pNormalCtor)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -182,28 +182,34 @@ namespace SourceHook
|
||||
jit_int32_t GetStackSize(const IntPassInfo &info);
|
||||
short GetParamsStackSize(); // sum(GetStackSize(i), 0 <= i < numOfParams)
|
||||
|
||||
// Helpers
|
||||
void BitwiseCopy_Setup();
|
||||
void BitwiseCopy_Do(size_t size);
|
||||
|
||||
// Param push
|
||||
jit_int32_t PushParams(jit_int32_t param_base_offset, jit_int32_t save_ret_to); // save_ret_to only used for memory returns
|
||||
jit_int32_t PushParams(jit_int32_t param_base_offset, jit_int32_t save_ret_to,
|
||||
jit_int32_t v_place_for_memret); // save_ret_to and v_place_for_memret only used for memory returns
|
||||
jit_int32_t PushRef(jit_int32_t param_offset, const IntPassInfo &pi);
|
||||
jit_int32_t PushBasic(jit_int32_t param_offset, const IntPassInfo &pi);
|
||||
jit_int32_t PushFloat(jit_int32_t param_offset, const IntPassInfo &pi);
|
||||
jit_int32_t PushObject(jit_int32_t param_offset, const IntPassInfo &pi);
|
||||
|
||||
// Ret val processing
|
||||
void SaveRetVal(int v_where);
|
||||
void ProcessPluginRetVal(int v_cur_res, int v_pContext, int v_plugin_ret);
|
||||
void SaveRetVal(jit_int32_t v_where, jit_int32_t v_place_for_memret);
|
||||
void ProcessPluginRetVal(jit_int32_t v_cur_res, jit_int32_t v_pContext, jit_int32_t v_plugin_ret);
|
||||
|
||||
void PrepareReturn(int v_status, int v_pContext, int v_retptr);
|
||||
void DoReturn(int v_retptr, int v_memret_outaddr);
|
||||
void PrepareReturn(jit_int32_t v_status, jit_int32_t v_pContext, jit_int32_t v_retptr);
|
||||
void DoReturn(jit_int32_t v_retptr, jit_int32_t v_memret_outaddr);
|
||||
|
||||
bool MemRetWithTempObj(); // do we do a memory return AND need a temporary place for it?
|
||||
|
||||
// Call hooks
|
||||
void GenerateCallHooks(int v_status, int v_prev_res, int v_cur_res, int v_iter,
|
||||
int v_pContext, int base_param_offset, int v_plugin_ret);
|
||||
int v_pContext, int base_param_offset, int v_plugin_ret, int v_place_for_memret);
|
||||
|
||||
// Call orig
|
||||
void GenerateCallOrig(int v_status, int v_pContext,
|
||||
int param_base_offs, int v_this, int v_vfnptr_origentry, int v_orig_ret, int v_override_ret);
|
||||
void GenerateCallOrig(int v_status, int v_pContext, int param_base_offs, int v_this,
|
||||
int v_vfnptr_origentry, int v_orig_ret, int v_override_ret, int v_place_for_memret);
|
||||
|
||||
// Hook loop
|
||||
void CallSetupHookLoop(int v_orig_ret, int v_override_ret,
|
||||
|
@ -41,7 +41,7 @@ namespace
|
||||
};
|
||||
|
||||
template <int MYSIZE>
|
||||
std::ostream& operator <<(std::ostream &os, const POD<MYSIZE> &obj)
|
||||
std::ostream& operator <<(std::ostream &os, const POD<MYSIZE> &obj)
|
||||
{
|
||||
os << "Some POD!";
|
||||
return os;
|
||||
@ -50,6 +50,7 @@ namespace
|
||||
MAKE_STATE_1(State_ObjOCtor_Called, int /*MYSIZE*/);
|
||||
MAKE_STATE_1(State_ObjCCtor_Called, int /*MYSIZE*/);
|
||||
MAKE_STATE_1(State_ObjODtor_Called, int /*MYSIZE*/);
|
||||
MAKE_STATE_1(State_ObjAssignOp_Called, int /*MYSIZE*/);
|
||||
|
||||
template <int MYSIZE>
|
||||
struct Object
|
||||
@ -82,6 +83,16 @@ namespace
|
||||
ADD_STATE(State_ObjODtor_Called(MYSIZE));
|
||||
}
|
||||
|
||||
Object & operator = (const Object &other)
|
||||
{
|
||||
if (!g_Inside_LeafFunc)
|
||||
ADD_STATE(State_ObjAssignOp_Called(MYSIZE));
|
||||
|
||||
memcpy(reinterpret_cast<void*>(x), reinterpret_cast<const void*>(other.x), MYSIZE);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool operator==(const Object<MYSIZE> &other)
|
||||
{
|
||||
return memcmp(reinterpret_cast<void*>(x), reinterpret_cast<const void*>(other.x), MYSIZE) == 0;
|
||||
@ -95,6 +106,51 @@ namespace
|
||||
return os;
|
||||
}
|
||||
|
||||
// Because of some weird bug in MSVC < 1400
|
||||
#define MAKE_PODRET(size) \
|
||||
struct PodRet##size \
|
||||
{ \
|
||||
POD<size> actPod; \
|
||||
bool operator==(const PodRet##size &other) { return actPod == other.actPod; } \
|
||||
bool operator==(char other) { return actPod == other; } \
|
||||
}; \
|
||||
std::ostream& operator <<(std::ostream &os, const PodRet##size &obj) \
|
||||
{ \
|
||||
os << obj.actPod; \
|
||||
return os; \
|
||||
} \
|
||||
template <> struct MakeRet< PodRet##size > \
|
||||
{ \
|
||||
static PodRet##size Do(int a) \
|
||||
{ \
|
||||
PodRet##size x; \
|
||||
memset(reinterpret_cast<void*>(x.actPod.x), a, size); \
|
||||
return x; \
|
||||
} \
|
||||
};
|
||||
|
||||
#define MAKE_OBJRET(size) \
|
||||
struct ObjRet##size \
|
||||
{ \
|
||||
Object<size> actObj; \
|
||||
bool operator==(const ObjRet##size &other) { return actObj == other.actObj; } \
|
||||
bool operator==(char other) { return actObj == other; } \
|
||||
}; \
|
||||
std::ostream& operator <<(std::ostream &os, const ObjRet##size &obj) \
|
||||
{ \
|
||||
os << obj.actObj; \
|
||||
return os; \
|
||||
} \
|
||||
template <> struct MakeRet< ObjRet##size > \
|
||||
{ \
|
||||
static ObjRet##size Do(int a) \
|
||||
{ \
|
||||
ObjRet##size x; \
|
||||
memset(reinterpret_cast<void*>(x.actObj.x), a, size); \
|
||||
return x; \
|
||||
} \
|
||||
};
|
||||
|
||||
#include "testhookmangen.h"
|
||||
|
||||
StateList g_States;
|
||||
@ -279,29 +335,43 @@ namespace
|
||||
THGM_SETUP_RI(105, double, SourceHook::PassInfo::PassType_Float, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
|
||||
// pod 1-13
|
||||
THGM_MAKE_TEST1(106, POD<1>, int);
|
||||
MAKE_PODRET(1);
|
||||
THGM_MAKE_TEST1(106, PodRet1, int);
|
||||
THGM_SETUP_PI1(106,
|
||||
int, SourceHook::PassInfo::PassType_Basic, SourceHook::PassInfo::PassFlag_ByVal
|
||||
);
|
||||
THGM_SETUP_RI(106, POD<1>, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
THGM_SETUP_RI(106, PodRet1, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
|
||||
THGM_MAKE_TEST1(107, POD<4>, int);
|
||||
MAKE_PODRET(4);
|
||||
THGM_MAKE_TEST1(107, PodRet4, int);
|
||||
THGM_SETUP_PI1(107,
|
||||
int, SourceHook::PassInfo::PassType_Basic, SourceHook::PassInfo::PassFlag_ByVal
|
||||
);
|
||||
THGM_SETUP_RI(107, POD<4>, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
THGM_SETUP_RI(107, PodRet4, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
|
||||
THGM_MAKE_TEST1(108, POD<8>, int);
|
||||
MAKE_PODRET(8);
|
||||
THGM_MAKE_TEST1(108, PodRet8, int);
|
||||
THGM_SETUP_PI1(108,
|
||||
int, SourceHook::PassInfo::PassType_Basic, SourceHook::PassInfo::PassFlag_ByVal
|
||||
);
|
||||
THGM_SETUP_RI(108, POD<8>, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
THGM_SETUP_RI(108, PodRet8, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
|
||||
THGM_MAKE_TEST1(109, POD<13>, int);
|
||||
MAKE_PODRET(13);
|
||||
THGM_MAKE_TEST1(109, PodRet13, int);
|
||||
THGM_SETUP_PI1(109,
|
||||
int, SourceHook::PassInfo::PassType_Basic, SourceHook::PassInfo::PassFlag_ByVal
|
||||
);
|
||||
THGM_SETUP_RI(109, POD<13>, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
THGM_SETUP_RI(109, PodRet13, SourceHook::PassInfo::PassType_Object, SourceHook::PassInfo::PassFlag_ByVal);
|
||||
|
||||
MAKE_OBJRET(13);
|
||||
THGM_MAKE_TEST1(110, ObjRet13, int);
|
||||
THGM_SETUP_PI1(110,
|
||||
int, SourceHook::PassInfo::PassType_Basic, SourceHook::PassInfo::PassFlag_ByVal
|
||||
);
|
||||
THGM_SETUP_RI(110, ObjRet13, SourceHook::PassInfo::PassType_Object,
|
||||
SourceHook::PassInfo::PassFlag_ByVal | SourceHook::PassInfo::PassFlag_OCtor | SourceHook::PassInfo::PassFlag_ODtor |
|
||||
SourceHook::PassInfo::PassFlag_CCtor | SourceHook::PassInfo::PassFlag_AssignOp);
|
||||
|
||||
}
|
||||
|
||||
bool TestHookManGen(std::string &error)
|
||||
@ -502,11 +572,196 @@ bool TestHookManGen(std::string &error)
|
||||
THGM_DO_TEST(108, (5));
|
||||
THGM_DO_TEST(109, (5));
|
||||
|
||||
// Test110: Special: constructors/destructors on return
|
||||
PtrBuf_Clear();
|
||||
ObjRet13 obj13;
|
||||
|
||||
CHECK_STATES((&g_States,
|
||||
new State_ObjOCtor_Called(13),
|
||||
NULL), "Test110 Part0");
|
||||
|
||||
setuppi_110();
|
||||
setupri_110();
|
||||
|
||||
g_Genc110 = new SourceHook::Impl::GenContext(&protoinfo_110, 0, 0, g_SHPtr);
|
||||
g_Genc_ad110.set(g_Genc110);
|
||||
SourceHook::HookManagerPubFunc myhookman110 = g_Genc110->Generate();
|
||||
int hook1_110, hook2_110, hook3_110, hook4_110;
|
||||
|
||||
TestClass110 *pTest110 = new TestClass110;
|
||||
CAutoPtrDestruction<TestClass110> apd110(pTest110);
|
||||
|
||||
/* no hooks - no hooks */
|
||||
PtrBuf_Clear();
|
||||
obj13 = pTest110->Func(5);
|
||||
|
||||
g_Inside_LeafFunc = true;
|
||||
CHECK_STATES((&g_States,
|
||||
new State_Func110(pTest110, ParamState_m110 (5)),
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in our stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
new State_ObjAssignOp_Called(13), // assign: obj13 = temporary object in our stack
|
||||
new State_ObjODtor_Called(13), // Func110: destruction of temporary object
|
||||
NULL), "Test" "110" " Part1");
|
||||
g_Inside_LeafFunc = false;
|
||||
|
||||
/* hook1 - no hooks */
|
||||
THGM_ADD_HOOK(110, 1);
|
||||
|
||||
PtrBuf_Clear();
|
||||
obj13 = pTest110->Func(5);
|
||||
g_Inside_LeafFunc = true;
|
||||
CHECK_STATES((&g_States,
|
||||
// HookFunc: construct orig_ret/override_ret/plugin_ret objects
|
||||
new State_ObjOCtor_Called(13),
|
||||
new State_ObjOCtor_Called(13),
|
||||
new State_ObjOCtor_Called(13),
|
||||
|
||||
// Calling delegate
|
||||
new State_Deleg1_110(pTest110, 0, ParamState_m110 (5)),
|
||||
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: plugin_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
// Calling orig function Func110
|
||||
new State_Func110(pTest110, ParamState_m110 (5)),
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: orig_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
// hookfunc is returning:
|
||||
new State_ObjCCtor_Called(13), // copy to temp object in our stack
|
||||
|
||||
// hookfunc cleans up its stack -> destroys plugin_ret/override_ret/orig_ret
|
||||
new State_ObjODtor_Called(13),
|
||||
new State_ObjODtor_Called(13),
|
||||
new State_ObjODtor_Called(13),
|
||||
|
||||
// we are in our function: assign
|
||||
new State_ObjAssignOp_Called(13), // assign: obj13 = temporary object in our stack
|
||||
new State_ObjODtor_Called(13), // Func110: destruction of temporary object
|
||||
|
||||
NULL), "Test" "11" " Part2");
|
||||
|
||||
CHECK_COND(obj13 == 0, "Test" "11" " Part 2.1");
|
||||
g_Inside_LeafFunc = false;
|
||||
|
||||
THGM_REMOVE_HOOK(11, 1);
|
||||
|
||||
/* hook1, hook2 - hook3, hook4 */
|
||||
THGM_ADD_HOOK(110, 1);
|
||||
THGM_ADD_HOOK(110, 2);
|
||||
THGM_ADD_HOOK(110, 3);
|
||||
THGM_ADD_HOOK(110, 4);
|
||||
|
||||
PtrBuf_Clear();
|
||||
obj13 = pTest110->Func(5);
|
||||
g_Inside_LeafFunc = true;
|
||||
CHECK_STATES((&g_States,
|
||||
// HookFunc: construct orig_ret/override_ret/plugin_ret objects
|
||||
new State_ObjOCtor_Called(13),
|
||||
new State_ObjOCtor_Called(13),
|
||||
new State_ObjOCtor_Called(13),
|
||||
|
||||
// Calling delegate1
|
||||
new State_Deleg1_110(pTest110, 0, ParamState_m110 (5)),
|
||||
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: plugin_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
|
||||
// Calling delegate2
|
||||
new State_Deleg2_110(pTest110, 1, ParamState_m110 (5)),
|
||||
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: plugin_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
// hookfunc finds out that the hook wanted to SUPERCEDE --> copy to override_Ret
|
||||
new State_ObjAssignOp_Called(13),
|
||||
|
||||
// SUPERCEDE -> orig function is not called
|
||||
// instead: orig_ret = override_ret
|
||||
new State_ObjAssignOp_Called(13),
|
||||
|
||||
// Calling delegate3
|
||||
new State_Deleg3_110(pTest110, 2, ParamState_m110 (5)),
|
||||
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: plugin_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
// Calling delegate4
|
||||
new State_Deleg4_110(pTest110, 3, ParamState_m110 (5)),
|
||||
|
||||
new State_ObjOCtor_Called(13), // MakeRet: Construction of x
|
||||
new State_ObjCCtor_Called(13), // Return from MakeRet -> construct temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // MakeRet: Destruction of x
|
||||
|
||||
// back in hookfunc
|
||||
new State_ObjAssignOp_Called(13), // assign: plugin_ret = temporary object in HookFunc's stack
|
||||
new State_ObjODtor_Called(13), // destruction of temporary object in HookFunc's stack
|
||||
|
||||
// hookfunc finds out that the hook wanted to SUPERCEDE --> copy to override_Ret (yes really, we overwrite the old value!)
|
||||
new State_ObjAssignOp_Called(13),
|
||||
|
||||
// hookfunc is returning:
|
||||
new State_ObjCCtor_Called(13), // copy to temp object in our stack
|
||||
|
||||
// hookfunc cleans up its stack -> destroys plugin_ret/override_ret/orig_ret
|
||||
new State_ObjODtor_Called(13),
|
||||
new State_ObjODtor_Called(13),
|
||||
new State_ObjODtor_Called(13),
|
||||
|
||||
// we are in our function: assign
|
||||
new State_ObjAssignOp_Called(13), // assign: obj13 = temporary object in our stack
|
||||
new State_ObjODtor_Called(13), // Func110: destruction of temporary object
|
||||
|
||||
NULL), "Test" "11" " Part3");
|
||||
|
||||
CHECK_COND(obj13 == 4, "Test" "11" " Part 3.1");
|
||||
g_Inside_LeafFunc = false;
|
||||
|
||||
THGM_REMOVE_HOOK(110, 1);
|
||||
THGM_REMOVE_HOOK(110, 2);
|
||||
THGM_REMOVE_HOOK(110, 3);
|
||||
THGM_REMOVE_HOOK(110, 4);
|
||||
|
||||
// Shutdown now!
|
||||
// If we don't SH will auto-shutdown _after_ genc's destructor is called
|
||||
// -> crash
|
||||
|
||||
Test_CompleteShutdown(g_SHPtr);
|
||||
|
||||
CHECK_COND(sizeof(PodRet1) == 1, "WTF!");
|
||||
CHECK_COND(sizeof(PodRet4) == 4, "WTF!");
|
||||
CHECK_COND(sizeof(PodRet8) == 8, "WTF!");
|
||||
CHECK_COND(sizeof(PodRet13) == 13, "WTF!");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,11 @@ public:
|
||||
{
|
||||
reinterpret_cast<T*>(this)->~T();
|
||||
}
|
||||
|
||||
const T& AssignOp(const T &other)
|
||||
{
|
||||
return (*reinterpret_cast<T*>(this) = other);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -90,7 +95,7 @@ struct MakeRet
|
||||
{
|
||||
static T Do(int a)
|
||||
{
|
||||
return static_cast<T>(a);
|
||||
return a;
|
||||
}
|
||||
};
|
||||
|
||||
@ -530,7 +535,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id())); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -543,10 +548,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
\
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, ()); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, ()); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -559,10 +564,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
\
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, ()); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, ()); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -575,10 +580,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
\
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, ()); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, ()); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -591,10 +596,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
\
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, ()); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, ()); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -619,6 +624,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
\
|
||||
\
|
||||
\
|
||||
\
|
||||
}
|
||||
|
||||
|
||||
@ -739,7 +745,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -752,10 +758,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -768,10 +774,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -784,10 +790,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -800,10 +806,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -828,6 +834,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -948,7 +955,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1, p2))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -961,10 +968,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1, p2)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1, p2)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -977,10 +984,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1, p2)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1, p2)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -993,10 +1000,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1, p2)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1, p2)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -1009,10 +1016,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1, p2)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1, p2)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -1037,6 +1044,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[2].pNormalCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[2].pCopyCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; paraminfos2_##id[2].pDtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; paraminfos2_##id[2].pAssignOperator = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -1157,7 +1165,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1, p2, p3))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -1170,10 +1178,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -1186,10 +1194,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -1202,10 +1210,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -1218,10 +1226,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1, p2, p3)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -1246,6 +1254,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[2].pNormalCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[3].pNormalCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[2].pCopyCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[3].pCopyCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; paraminfos2_##id[2].pDtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::Destructor) : NULL; paraminfos2_##id[3].pDtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; paraminfos2_##id[2].pAssignOperator = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::AssignOp) : NULL; paraminfos2_##id[3].pAssignOperator = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -1366,7 +1375,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1, p2, p3, p4))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -1379,10 +1388,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -1395,10 +1404,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -1411,10 +1420,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -1427,10 +1436,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1, p2, p3, p4)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -1455,6 +1464,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[2].pNormalCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[3].pNormalCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[4].pNormalCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[2].pCopyCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[3].pCopyCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[4].pCopyCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; paraminfos2_##id[2].pDtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::Destructor) : NULL; paraminfos2_##id[3].pDtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::Destructor) : NULL; paraminfos2_##id[4].pDtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; paraminfos2_##id[2].pAssignOperator = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::AssignOp) : NULL; paraminfos2_##id[3].pAssignOperator = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::AssignOp) : NULL; paraminfos2_##id[4].pAssignOperator = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -1575,7 +1585,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1, p2, p3, p4, p5))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -1588,10 +1598,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -1604,10 +1614,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -1620,10 +1630,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -1636,10 +1646,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1, p2, p3, p4, p5)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -1664,6 +1674,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[2].pNormalCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[3].pNormalCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[4].pNormalCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[5].pNormalCtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[2].pCopyCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[3].pCopyCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[4].pCopyCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[5].pCopyCtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; paraminfos2_##id[2].pDtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::Destructor) : NULL; paraminfos2_##id[3].pDtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::Destructor) : NULL; paraminfos2_##id[4].pDtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::Destructor) : NULL; paraminfos2_##id[5].pDtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; paraminfos2_##id[2].pAssignOperator = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::AssignOp) : NULL; paraminfos2_##id[3].pAssignOperator = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::AssignOp) : NULL; paraminfos2_##id[4].pAssignOperator = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::AssignOp) : NULL; paraminfos2_##id[5].pAssignOperator = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -1784,7 +1795,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(p1, p2, p3, p4, p5, p6))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -1797,10 +1808,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5);Increment<StripRef< param6 >::type>::Incr(p6); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -1813,10 +1824,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5);Increment<StripRef< param6 >::type>::Incr(p6); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -1829,10 +1840,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5);Increment<StripRef< param6 >::type>::Incr(p6); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -1845,10 +1856,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
Increment<StripRef< param1 >::type>::Incr(p1);Increment<StripRef< param2 >::type>::Incr(p2);Increment<StripRef< param3 >::type>::Incr(p3);Increment<StripRef< param4 >::type>::Incr(p4);Increment<StripRef< param5 >::type>::Incr(p5);Increment<StripRef< param6 >::type>::Incr(p6); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (p1, p2, p3, p4, p5, p6)); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -1873,6 +1884,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
paraminfos2_##id[1].pNormalCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[2].pNormalCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[3].pNormalCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[4].pNormalCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[5].pNormalCtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::NormalConstructor) : NULL; paraminfos2_##id[6].pNormalCtor = (paraminfos_##id[6].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p6_type >::type>::NormalConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pCopyCtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[2].pCopyCtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[3].pCopyCtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[4].pCopyCtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[5].pCopyCtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::CopyConstructor) : NULL; paraminfos2_##id[6].pCopyCtor = (paraminfos_##id[6].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p6_type >::type>::CopyConstructor) : NULL; \
|
||||
paraminfos2_##id[1].pDtor = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::Destructor) : NULL; paraminfos2_##id[2].pDtor = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::Destructor) : NULL; paraminfos2_##id[3].pDtor = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::Destructor) : NULL; paraminfos2_##id[4].pDtor = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::Destructor) : NULL; paraminfos2_##id[5].pDtor = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::Destructor) : NULL; paraminfos2_##id[6].pDtor = (paraminfos_##id[6].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p6_type >::type>::Destructor) : NULL; \
|
||||
paraminfos2_##id[1].pAssignOperator = (paraminfos_##id[1].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p1_type >::type>::AssignOp) : NULL; paraminfos2_##id[2].pAssignOperator = (paraminfos_##id[2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p2_type >::type>::AssignOp) : NULL; paraminfos2_##id[3].pAssignOperator = (paraminfos_##id[3].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p3_type >::type>::AssignOp) : NULL; paraminfos2_##id[4].pAssignOperator = (paraminfos_##id[4].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p4_type >::type>::AssignOp) : NULL; paraminfos2_##id[5].pAssignOperator = (paraminfos_##id[5].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p5_type >::type>::AssignOp) : NULL; paraminfos2_##id[6].pAssignOperator = (paraminfos_##id[6].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p6_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
|
||||
@ -1887,6 +1899,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4,
|
||||
protoinfo_##id.retPassInfo2.pNormalCtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::NormalConstructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pCopyCtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::CopyConstructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pDtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::Destructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pAssignOperator = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
#define THGM_ADD_HOOK(id, num) \
|
||||
|
@ -29,6 +29,11 @@ public:
|
||||
{
|
||||
reinterpret_cast<T*>(this)->~T();
|
||||
}
|
||||
|
||||
const T& AssignOp(const T &other)
|
||||
{
|
||||
return (*reinterpret_cast<T*>(this) = other);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -99,7 +104,7 @@ struct MakeRet< POD<SIZE> >
|
||||
{
|
||||
static POD<SIZE> Do(int a)
|
||||
{
|
||||
POD x;
|
||||
POD<SIZE> x;
|
||||
memset(reinterpret_cast<void*>(x.x), a, SIZE);
|
||||
return x;
|
||||
}
|
||||
@ -272,7 +277,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
ADD_STATE(State_Func##id(this, ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
|
||||
g_Inside_LeafFunc = false; \
|
||||
\
|
||||
return MakeRet<ret_type>::Do(0); \
|
||||
return MakeRet< ret_type >::Do(0); \
|
||||
} \
|
||||
\
|
||||
struct Delegate1 : public MyDelegate \
|
||||
@ -285,10 +290,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(1), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(1), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(1)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate2 : public MyDelegate \
|
||||
@ -301,10 +306,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(2)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate3 : public MyDelegate \
|
||||
@ -317,10 +322,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet<ret_type>::Do(3), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, MakeRet< ret_type >::Do(3), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet<ret_type>::Do(3)); \
|
||||
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
|
||||
} \
|
||||
}; \
|
||||
struct Delegate4 : public MyDelegate \
|
||||
@ -333,10 +338,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
if (ms_DoRecall) \
|
||||
{ \
|
||||
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
RETURN_META_VALUE_NEWPARAMS(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
|
||||
} \
|
||||
else \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet<ret_type>::Do(4)); \
|
||||
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
|
||||
}; \
|
||||
}; \
|
||||
}; \
|
||||
@ -361,6 +366,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
@[$2,1,$1: paraminfos2_##id[$2].pNormalCtor = (paraminfos_##id[$2].flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p$2_type >::type>::NormalConstructor) : NULL; @] \
|
||||
@[$2,1,$1: paraminfos2_##id[$2].pCopyCtor = (paraminfos_##id[$2].flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p$2_type >::type>::CopyConstructor) : NULL; @] \
|
||||
@[$2,1,$1: paraminfos2_##id[$2].pDtor = (paraminfos_##id[$2].flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< p$2_type >::type>::Destructor) : NULL; @] \
|
||||
@[$2,1,$1: paraminfos2_##id[$2].pAssignOperator = (paraminfos_##id[$2].flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< p$2_type >::type>::AssignOp) : NULL; @] \
|
||||
}
|
||||
|
||||
@]
|
||||
@ -375,6 +381,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
|
||||
protoinfo_##id.retPassInfo2.pNormalCtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_OCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::NormalConstructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pCopyCtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_CCtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::CopyConstructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pDtor = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_ODtor) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::Destructor) : NULL; \
|
||||
protoinfo_##id.retPassInfo2.pAssignOperator = (protoinfo_##id.retPassInfo.flags & SourceHook::PassInfo::PassFlag_AssignOp) ? FindFuncAddr(&Ctor_Thunk<StripRef< ret_type >::type>::AssignOp) : NULL; \
|
||||
}
|
||||
|
||||
#define THGM_ADD_HOOK(id, num) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user