Made testhookmangen easier for the compiler

--HG--
branch : hookman_autogen
extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/hookman_autogen%40566
This commit is contained in:
Pavol Marko 2007-11-18 15:08:03 +00:00
parent 184232777a
commit 14c51ca8d1
5 changed files with 759 additions and 2703 deletions

View File

@ -529,6 +529,10 @@
RelativePath="..\testevents.h"
>
</File>
<File
RelativePath="..\testhookmangen.h"
>
</File>
<Filter
Name="generate"
>

View File

@ -151,9 +151,9 @@ namespace
p1_type m_Param1; \
name(p1_type param1) : m_Param1(param1) {} \
virtual bool IsEqual(State *other) { \
name *other2 = dynamic_cast<name*>(other); \
if (!other2) \
if (MakeHash(GetName()) != MakeHash(other->GetName())) \
return false; \
name *other2 = static_cast<name*>(other); \
return other2->m_Param1 == m_Param1;\
} \
virtual void Dump() { \
@ -166,9 +166,9 @@ namespace
p2_type m_Param2; \
name(p1_type param1, p2_type param2) : m_Param1(param1), m_Param2(param2) {} \
virtual bool IsEqual(State *other) { \
name *other2 = dynamic_cast<name*>(other); \
if (!other2) \
if (MakeHash(GetName()) != MakeHash(other->GetName())) \
return false; \
name *other2 = static_cast<name*>(other); \
return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2;\
} \
virtual void Dump() { \
@ -182,9 +182,9 @@ namespace
p3_type m_Param3; \
name(p1_type param1, p2_type param2, p3_type param3) : m_Param1(param1), m_Param2(param2), m_Param3(param3) {} \
virtual bool IsEqual(State *other) { \
name *other2 = dynamic_cast<name*>(other); \
if (!other2) \
if (MakeHash(GetName()) != MakeHash(other->GetName())) \
return false; \
name *other2 = static_cast<name*>(other); \
return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2 && other2->m_Param3 == m_Param3;\
} \
virtual void Dump() { \
@ -192,6 +192,23 @@ namespace
const char *GetName() { return #name; } \
}
#define MAKE_STATE_4(name, p1_type, p2_type, p3_type, p4_type) struct name : State { \
p1_type m_Param1; \
p2_type m_Param2; \
p3_type m_Param3; \
p4_type m_Param4; \
name(p1_type param1, p2_type param2, p3_type param3, p4_type param4) : m_Param1(param1), m_Param2(param2), m_Param3(param3), m_Param4(param4) {} \
virtual bool IsEqual(State *other) { \
if (MakeHash(GetName()) != MakeHash(other->GetName())) \
return false; \
name *other2 = static_cast<name*>(other); \
return other2->m_Param1 == m_Param1 && other2->m_Param2 == m_Param2 && other2->m_Param3 == m_Param3 && other2->m_Param4 == m_Param4;\
} \
virtual void Dump() { \
std::cout << " " << #name << "; Param1=" << m_Param1 << "; Param2=" << m_Param2 << "; Param3=" << m_Param3 << "; Param4=" << m_Param4 << std::endl; } \
const char *GetName() { return #name; } \
}
#define CHECK_COND(c, err) if (!(c)) { error = err; return false; }
#endif

View File

@ -565,23 +565,9 @@ namespace
ADD_STATE(State_Hello_Func79_PreHook);
}
};
}
bool TestHookManGen(std::string &error)
{
GET_SHPTR(g_SHPtr);
GET_HMAG(g_HMAGPtr, g_SHPtr);
g_PLID = 1337;
// 5 Global constructors (g_O111_*)
CHECK_STATES((&g_States,
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
NULL), "GlobCtors");
bool Tests1(std::string &error)
{
THGM_DO_TEST_void(0, ());
THGM_DO_TEST_void(1, (100));
@ -596,6 +582,11 @@ bool TestHookManGen(std::string &error)
THGM_DO_TEST_void(6, (100, 0x1f00, 0x1f000000, 0.5f, 5.5));
return true;
}
bool Tests2(std::string &error)
{
char a = 5;
double b = 233.33;
THGM_DO_TEST_void(7, (a, b));
@ -610,8 +601,11 @@ bool TestHookManGen(std::string &error)
// Test11: Special: constructors/destructors
PtrBuf_Clear();
Object<3> obj3(33);
Object<600> obj600(21);
Object<3> *obj3_real = new Object<3>(33);
Object<600> *obj600_real = new Object<600>(21);
Object<3> & obj3 = *obj3_real;
Object<600> & obj600 = *obj600_real;
CHECK_STATES((&g_States,
new State_ObjOCtor_Called(3),
@ -648,7 +642,7 @@ bool TestHookManGen(std::string &error)
new State_ObjCCtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg1_11(pTest11, 0, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(1, pTest11, 0, ParamState_m11 (obj3, obj600)),
new State_ObjODtor_Called(3),
new State_ObjCCtor_Called(3),
@ -673,19 +667,19 @@ bool TestHookManGen(std::string &error)
new State_ObjCCtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg1_11(pTest11, 0, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(1, pTest11, 0, ParamState_m11 (obj3, obj600)),
new State_ObjODtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg2_11(pTest11, 1, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(2, pTest11, 1, ParamState_m11 (obj3, obj600)),
new State_ObjODtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg3_11(pTest11, 2, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(3, pTest11, 2, ParamState_m11 (obj3, obj600)),
new State_ObjODtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg4_11(pTest11, 3, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(4, pTest11, 3, ParamState_m11 (obj3, obj600)),
new State_ObjODtor_Called(3),
new State_ObjODtor_Called(3),
@ -702,7 +696,7 @@ bool TestHookManGen(std::string &error)
new State_ObjCCtor_Called(3),
new State_ObjCCtor_Called(3),
new State_Deleg1_11(pTest11, 0 /* first deleg ptr */, ParamState_m11 (obj3, obj600)),
new State_Deleg_11(1, pTest11, 0 /* first deleg ptr */, ParamState_m11 (obj3, obj600)),
// recall !
// second hookfunc -> new copy
@ -717,7 +711,7 @@ bool TestHookManGen(std::string &error)
// calls first posthook
new State_ObjCCtor_Called(3),
new State_Deleg3_11(pTest11, 1 /* second deleg ptr */, ParamState_m11 (obj3, obj600)(1)),
new State_Deleg_11(3, pTest11, 1 /* second deleg ptr */, ParamState_m11 (obj3, obj600)(1)),
// recall!
// third hookfunc -> new copy
@ -726,7 +720,7 @@ bool TestHookManGen(std::string &error)
// calls second posthook
new State_ObjCCtor_Called(3),
new State_Deleg4_11(pTest11, 2 /* third deleg ptr */, ParamState_m11 (obj3, obj600)(2)),
new State_Deleg_11(4, pTest11, 2 /* third deleg ptr */, ParamState_m11 (obj3, obj600)(2)),
// recall!
// fourth hookfunc -> new copy
@ -758,6 +752,19 @@ bool TestHookManGen(std::string &error)
THGM_REMOVE_HOOK(11, 3);
THGM_REMOVE_HOOK(11, 4);
delete obj3_real;
delete obj600_real;
CHECK_STATES((&g_States,
new State_ObjODtor_Called(3),
new State_ObjODtor_Called(600),
NULL), "Test11 Part100");
return true;
}
bool Tests3(std::string &error)
{
THGM_DO_TEST(101, ());
THGM_DO_TEST(102, ());
@ -774,9 +781,15 @@ bool TestHookManGen(std::string &error)
THGM_DO_TEST(108, (5));
THGM_DO_TEST(109, (5));
return true;
}
bool Tests4(std::string &error)
{
// Test110: Special: constructors/destructors on return
PtrBuf_Clear();
ObjRet13 obj13;
ObjRet13 *obj13_real = new ObjRet13;
ObjRet13 &obj13 = *obj13_real;
CHECK_STATES((&g_States,
new State_ObjOCtor_Called(13),
@ -821,7 +834,7 @@ bool TestHookManGen(std::string &error)
new State_ObjOCtor_Called(13),
// Calling delegate
new State_Deleg1_110(pTest110, 0, ParamState_m110 (5)),
new State_Deleg_110(1, 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
@ -858,7 +871,7 @@ bool TestHookManGen(std::string &error)
CHECK_COND(obj13 == 0, "Test" "11" " Part 2.1");
g_Inside_LeafFunc = false;
THGM_REMOVE_HOOK(11, 1);
THGM_REMOVE_HOOK(110, 1);
/* hook1, hook2 - hook3, hook4 */
THGM_ADD_HOOK(110, 1);
@ -876,7 +889,7 @@ bool TestHookManGen(std::string &error)
new State_ObjOCtor_Called(13),
// Calling delegate1
new State_Deleg1_110(pTest110, 0, ParamState_m110 (5)),
new State_Deleg_110(1, 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
@ -888,7 +901,7 @@ bool TestHookManGen(std::string &error)
// Calling delegate2
new State_Deleg2_110(pTest110, 1, ParamState_m110 (5)),
new State_Deleg_110(2, 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
@ -906,7 +919,7 @@ bool TestHookManGen(std::string &error)
new State_ObjAssignOp_Called(13),
// Calling delegate3
new State_Deleg3_110(pTest110, 2, ParamState_m110 (5)),
new State_Deleg_110(3, 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
@ -917,7 +930,7 @@ bool TestHookManGen(std::string &error)
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_Deleg_110(4, 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
@ -952,7 +965,17 @@ bool TestHookManGen(std::string &error)
THGM_REMOVE_HOOK(110, 3);
THGM_REMOVE_HOOK(110, 4);
delete obj13_real;
CHECK_STATES((&g_States,
new State_ObjODtor_Called(13),
NULL), "Test110 Part100");
return true;
}
bool Tests5(std::string &error)
{
// RefRet
THGM_DO_TEST(111, ());
@ -966,13 +989,14 @@ bool TestHookManGen(std::string &error)
THGM_DO_TEST_void(206, (100, 0x1f00, 0x1f000000, 0.5f, 5.5, "Hello %s%d%s", "BA", 1, "L!"));
a = 5;
b = 233.33;
char a = 5;
double b = 233.33;
THGM_DO_TEST_void(207, (a, b, "Hello %s%d%s", "BA", 1, "L!"));
pod7 = MakeRet< POD<7> >::Do(78);
POD<7> pod7 = MakeRet< POD<7> >::Do(78);
THGM_DO_TEST_void(208, (pod7, "Hello %s%d%s", "BA", 1, "L!"));
POD<600> pod600 = MakeRet< POD<600> >::Do(34);
THGM_DO_TEST_void(210, (pod600, "Hello %s%d%s", "BA", 1, "L!"));
// Test for lange vtable indices
@ -1018,6 +1042,37 @@ bool TestHookManGen(std::string &error)
g_HMAGPtr->ReleaseHookMan(helloHM_4);
g_HMAGPtr->ReleaseHookMan(helloHM_79);
return true;
}
}
bool TestHookManGen(std::string &error)
{
GET_SHPTR(g_SHPtr);
GET_HMAG(g_HMAGPtr, g_SHPtr);
g_PLID = 1337;
// 5 Global constructors (g_O111_*)
CHECK_STATES((&g_States,
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
new State_ObjOCtor_Called(111),
NULL), "GlobCtors");
if (!Tests1(error))
return false;
if (!Tests2(error))
return false;
if (!Tests3(error))
return false;
if (!Tests4(error))
return false;
if (!Tests5(error))
return false;
// Shutdown now!
// If we don't SH will auto-shutdown _after_ genc's destructor is called
// -> crash

File diff suppressed because it is too large Load Diff

View File

@ -203,10 +203,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
struct TestClass##id; \
typedef ParamState$1<0@[$2,1,$1:, param$2@] > ParamState_m##id; \
MAKE_STATE_2(State_Func##id, TestClass##id* /*thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg1_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg2_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg3_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg4_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_4(State_Deleg_##id, int /*delegnumber*/, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
\
struct TestClass##id \
{ \
@ -219,70 +216,25 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
g_Inside_LeafFunc = false; \
} \
\
struct Delegate1 : public MyDelegate \
struct Delegate : public MyDelegate \
{ \
int m_DelegNumber; \
Delegate(int num) : m_DelegNumber(num) { } \
\
virtual void Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg1_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
ADD_STATE(State_Deleg_##id(m_DelegNumber, META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
RETURN_META_NEWPARAMS((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE, &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
} \
else \
RETURN_META(MRES_IGNORED); \
RETURN_META((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE); \
} \
}; \
struct Delegate2 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg2_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_SUPERCEDE, &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
} \
else \
RETURN_META(MRES_SUPERCEDE); \
} \
}; \
struct Delegate3 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg3_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
} \
else \
RETURN_META(MRES_IGNORED); \
} \
}; \
struct Delegate4 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg4_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_SUPERCEDE, &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
} \
else \
RETURN_META(MRES_SUPERCEDE); \
}; \
}; \
}; \
\
bool TestClass##id::ms_DoRecall = false; \
@ -294,10 +246,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
typedef ret_type RetType##id; \
typedef ParamState$1<0@[$2,1,$1:, param$2@] > ParamState_m##id; \
MAKE_STATE_2(State_Func##id, TestClass##id* /*thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg1_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg2_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg3_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg4_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_4(State_Deleg_##id, int /*delegnumber*/, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
\
struct TestClass##id \
{ \
@ -312,70 +261,25 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
return MakeRet< ret_type >::Do(0); \
} \
\
struct Delegate1 : public MyDelegate \
struct Delegate : public MyDelegate \
{ \
int m_DelegNumber; \
Delegate(int num) : m_DelegNumber(num) { } \
\
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg1_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
ADD_STATE(State_Deleg_##id(m_DelegNumber, META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE, MakeRet< ret_type >::Do(m_DelegNumber), &TestClass##id::Func, (@[$2,1,$1|, :p$2@])); \
} \
else \
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
RETURN_META_VALUE((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE, MakeRet< ret_type >::Do(m_DelegNumber)); \
} \
}; \
struct Delegate2 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg2_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
} \
}; \
struct Delegate3 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg3_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
} \
}; \
struct Delegate4 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg4_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
}; \
}; \
}; \
\
bool TestClass##id::ms_DoRecall = false; \
@ -385,10 +289,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
struct TestClass##id; \
typedef ParamState@($1+1)<0@[$2,1,$1:, param$2@], std::string > ParamState_m##id; \
MAKE_STATE_2(State_Func##id, TestClass##id* /*thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg1_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg2_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg3_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg4_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_4(State_Deleg_##id, int /*delegnumber*/, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
\
struct TestClass##id \
{ \
@ -409,169 +310,30 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
g_Inside_LeafFunc = false; \
} \
\
struct Delegate1 : public MyDelegate \
struct Delegate : public MyDelegate \
{ \
int m_DelegNumber; \
Delegate(int num) : m_DelegNumber(num) { } \
\
virtual void Call(@[$2,1,$1:param$2 p$2, @]const char *buf) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg1_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1:p$2, @]buf))); \
ADD_STATE(State_Deleg_##id(m_DelegNumber, META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1:p$2, @]buf))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1:p$2, @]"%s!", buf)); \
RETURN_META_NEWPARAMS((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE, &TestClass##id::Func, (@[$2,1,$1:p$2, @]"%s!", buf)); \
} \
else \
RETURN_META(MRES_IGNORED); \
RETURN_META((m_DelegNumber & 1) ? MRES_IGNORED : MRES_SUPERCEDE); \
} \
}; \
struct Delegate2 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1:param$2 p$2, @]const char *buf) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg2_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1:p$2, @]buf))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1:p$2, @]"%s!", buf)); \
} \
else \
RETURN_META(MRES_SUPERCEDE); \
} \
}; \
struct Delegate3 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1:param$2 p$2, @]const char *buf) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg3_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1:p$2, @]buf))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1:p$2, @]"%s!", buf)); \
} \
else \
RETURN_META(MRES_IGNORED); \
} \
}; \
struct Delegate4 : public MyDelegate \
{ \
virtual void Call(@[$2,1,$1:param$2 p$2, @]const char *buf) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg4_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1:p$2, @]buf))); \
g_Inside_LeafFunc = false; \
if (ms_DoRecall) \
{ \
@[$2,1,$1:Increment<StripRef< param$2 >::type>::Incr(p$2);@] \
RETURN_META_NEWPARAMS(MRES_IGNORED, &TestClass##id::Func, (@[$2,1,$1:p$2, @]"%s!", buf)); \
} \
else \
RETURN_META(MRES_SUPERCEDE); \
}; \
}; \
}; \
\
bool TestClass##id::ms_DoRecall = false; \
SourceHook::CProtoInfoBuilder protoinfo_##id(SourceHook::ProtoInfo::CallConv_ThisCall | SourceHook::ProtoInfo::CallConv_HasVafmt);
#define THGM_MAKE_TEST$1_vafmt(id, ret_type@[$2,1,$1:, param$2@]) \
struct TestClass##id; \
typedef ret_type RetType##id; \
typedef ParamState$1<0@[$2,1,$1:, param$2@] > ParamState_m##id; \
MAKE_STATE_2(State_Func##id, TestClass##id* /*thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg1_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg2_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg3_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
MAKE_STATE_3(State_Deleg4_##id, TestClass##id* /*ifptr*/, int /*deleg thisptr*/, ParamState_m##id ); \
\
struct TestClass##id \
{ \
static bool ms_DoRecall; \
\
virtual ret_type Func(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Func##id(this, ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
\
return MakeRet< ret_type >::Do(0); \
} \
\
struct Delegate1 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg1_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(1)); \
} \
}; \
struct Delegate2 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg2_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(2)); \
} \
}; \
struct Delegate3 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg3_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_IGNORED, MakeRet< ret_type >::Do(3)); \
} \
}; \
struct Delegate4 : public MyDelegate \
{ \
virtual ret_type Call(@[$2,1,$1|, :param$2 p$2@]) \
{ \
g_Inside_LeafFunc = true; \
ADD_STATE(State_Deleg4_##id(META_IFACEPTR(TestClass##id), PtrBuf(this), ParamState_m##id(@[$2,1,$1|, :p$2@]))); \
g_Inside_LeafFunc = false; \
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@])); \
} \
else \
RETURN_META_VALUE(MRES_SUPERCEDE, MakeRet< ret_type >::Do(4)); \
}; \
}; \
}; \
\
bool TestClass##id::ms_DoRecall = false; \
SourceHook::CProtoInfoBuilder protoinfo_##id(SourceHook::ProtoInfo::CallConv_ThisCall)
#define THGM_SETUP_PI$1(id@[$2,1,$1:, p$2_type, p$2_passtype, p$2_flags@]) \
void setuppi_##id() \
{ \
@ -600,7 +362,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
#define THGM_ADD_HOOK(id, num) \
CAT4(hook, num, _, id) = g_SHPtr->AddHook(g_PLID, SourceHook::ISourceHook::Hook_Normal, reinterpret_cast<void*>(pTest##id), \
0, myhookman##id, PtrBufPtr(new TestClass##id::Delegate##num), num >= 3);
0, myhookman##id, PtrBufPtr(new TestClass##id::Delegate(num)), num >= 3);
#define THGM_REMOVE_HOOK(id, num) \
g_SHPtr->RemoveHookByID(CAT4(hook, num, _, id));
@ -626,28 +388,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part1"); \
\
/* hook1 - no hooks */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 1); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part2"); \
THGM_REMOVE_HOOK(id, 1); \
\
/* no hooks - hook3 */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 3); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part3"); \
THGM_REMOVE_HOOK(id, 3); \
\
/* hook1 - hook3 */ \
PtrBuf_Clear(); \
@ -655,9 +395,9 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
THGM_ADD_HOOK(id, 3); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 1, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part4"); \
THGM_REMOVE_HOOK(id, 1); \
@ -670,26 +410,19 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
THGM_ADD_HOOK(id, 3); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg2_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(2, pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part5"); \
THGM_REMOVE_HOOK(id, 1); \
THGM_REMOVE_HOOK(id, 2); \
THGM_REMOVE_HOOK(id, 3); \
/* hook1, hook2 - hook3, hook4 */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 1); \
THGM_ADD_HOOK(id, 2); \
THGM_ADD_HOOK(id, 3); \
THGM_ADD_HOOK(id, 4); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg2_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg4_##id(pTest##id, 3, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(2, pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg_##id(4, pTest##id, 3, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part6"); \
\
@ -699,10 +432,10 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@]
THGM_REMOVE_HOOK(id, 2); \
THGM_CALLS_void(id, call_params); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params(0)), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params(0)), \
new State_Func##id(pTest##id, ParamState_m##id call_params(1)), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params(1)), \
new State_Deleg4_##id(pTest##id, 3, ParamState_m##id call_params(2)), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params(1)), \
new State_Deleg_##id(4, pTest##id, 3, ParamState_m##id call_params(2)), \
/* sh_call one */ \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part7"); \
@ -744,28 +477,6 @@ T* ComparableRef(T& x)
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part1"); \
\
/* hook1 - no hooks */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 1); \
THGM_CALLS(id, call_params, 0, 0, "Part2"); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part2"); \
THGM_REMOVE_HOOK(id, 1); \
\
/* no hooks - hook3 */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 3); \
THGM_CALLS(id, call_params, 0, 0, "Part3"); \
CHECK_STATES((&g_States, \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part3"); \
THGM_REMOVE_HOOK(id, 3); \
\
/* hook1 - hook3 */ \
PtrBuf_Clear(); \
@ -773,9 +484,9 @@ T* ComparableRef(T& x)
THGM_ADD_HOOK(id, 3); \
THGM_CALLS(id, call_params, 0, 0, "Part4"); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 1, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part4"); \
THGM_REMOVE_HOOK(id, 1); \
@ -788,26 +499,19 @@ T* ComparableRef(T& x)
THGM_ADD_HOOK(id, 3); \
THGM_CALLS(id, call_params, 2, 0, "Part5"); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg2_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(2, pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part5"); \
THGM_REMOVE_HOOK(id, 1); \
THGM_REMOVE_HOOK(id, 2); \
THGM_REMOVE_HOOK(id, 3); \
/* hook1, hook2 - hook3, hook4 */ \
PtrBuf_Clear(); \
THGM_ADD_HOOK(id, 1); \
THGM_ADD_HOOK(id, 2); \
THGM_ADD_HOOK(id, 3); \
THGM_ADD_HOOK(id, 4); \
THGM_CALLS(id, call_params, 4, 0, "Part6"); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg2_##id(pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg4_##id(pTest##id, 3, ParamState_m##id call_params), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params), \
new State_Deleg_##id(2, pTest##id, 1, ParamState_m##id call_params), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params), \
new State_Deleg_##id(4, pTest##id, 3, ParamState_m##id call_params), \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part6"); \
\
@ -817,10 +521,10 @@ T* ComparableRef(T& x)
THGM_REMOVE_HOOK(id, 2); \
THGM_CALLS(id, call_params, 4, 0, "Part7"); \
CHECK_STATES((&g_States, \
new State_Deleg1_##id(pTest##id, 0, ParamState_m##id call_params(0)), \
new State_Deleg_##id(1, pTest##id, 0, ParamState_m##id call_params(0)), \
new State_Func##id(pTest##id, ParamState_m##id call_params(1)), \
new State_Deleg3_##id(pTest##id, 2, ParamState_m##id call_params(1)), \
new State_Deleg4_##id(pTest##id, 3, ParamState_m##id call_params(2)), \
new State_Deleg_##id(3, pTest##id, 2, ParamState_m##id call_params(1)), \
new State_Deleg_##id(4, pTest##id, 3, ParamState_m##id call_params(2)), \
/* sh_call one */ \
new State_Func##id(pTest##id, ParamState_m##id call_params), \
NULL), "Test" #id " Part7"); \