From 92c795e830fc599664516e9865b6b085ba473158 Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Sat, 10 Nov 2007 16:10:55 +0000 Subject: [PATCH] Added IHookManagerAutoGen interface --HG-- branch : hookman_autogen extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/hookman_autogen%40555 --- sourcehook/generate/sourcehook.h | 16 +++++ sourcehook/generate/sourcehook.hxx | 16 +++++ sourcehook/sourcehook.cpp | 19 ++++++ sourcehook/sourcehook.h | 16 +++++ sourcehook/sourcehook_hookmangen.cpp | 89 +++++++++++++++++++++++++++- sourcehook/sourcehook_hookmangen.h | 32 +++++++++- sourcehook/sourcehook_impl_cproto.h | 17 ++++++ sourcehook/test/main.cpp | 12 ++++ sourcehook/test/sourcehook_test.h | 13 ++++ sourcehook/test/testhookmangen.cpp | 15 +++-- sourcehook/test/testhookmangen.h | 64 +++++++------------- sourcehook/test/testhookmangen.hxx | 28 +++++---- 12 files changed, 274 insertions(+), 63 deletions(-) diff --git a/sourcehook/generate/sourcehook.h b/sourcehook/generate/sourcehook.h index 32cdee9..ee287dc 100644 --- a/sourcehook/generate/sourcehook.h +++ b/sourcehook/generate/sourcehook.h @@ -35,6 +35,11 @@ // 1 - standard #define SH_HOOKMAN_VERSION 1 +// Hookmanautogen versions +// 1 - initial +#define SH_HOOKMANAUTOGEN_IFACE_VERSION 1 +#define SH_HOOKMANAUTOGEN_IMPL_VERSION 1 + // The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook // It's used in various macros #ifndef SH_GLOB_SHPTR @@ -472,6 +477,17 @@ namespace SourceHook virtual void EndContext(IHookContext *pCtx) = 0; }; + + class IHookManagerAutoGen + { + public: + virtual int GetIfaceVersion() = 0; + virtual int GetImplVersion() = 0; + + virtual HookManagerPubFunc MakeHookMan(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx) = 0; + virtual void ReleaseHookMan(HookManagerPubFunc pubFunc) = 0; + }; + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: // These have to be able to return references. If T is a reference, the pointers returned // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. diff --git a/sourcehook/generate/sourcehook.hxx b/sourcehook/generate/sourcehook.hxx index 0f349ba..bde13ab 100755 --- a/sourcehook/generate/sourcehook.hxx +++ b/sourcehook/generate/sourcehook.hxx @@ -35,6 +35,11 @@ // 1 - standard #define SH_HOOKMAN_VERSION 1 +// Hookmanautogen versions +// 1 - initial +#define SH_HOOKMANAUTOGEN_IFACE_VERSION 1 +#define SH_HOOKMANAUTOGEN_IMPL_VERSION 1 + // The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook // It's used in various macros #ifndef SH_GLOB_SHPTR @@ -472,6 +477,17 @@ namespace SourceHook virtual void EndContext(IHookContext *pCtx) = 0; }; + + class IHookManagerAutoGen + { + public: + virtual int GetIfaceVersion() = 0; + virtual int GetImplVersion() = 0; + + virtual HookManagerPubFunc MakeHookMan(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx) = 0; + virtual void ReleaseHookMan(HookManagerPubFunc pubFunc) = 0; + }; + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: // These have to be able to return references. If T is a reference, the pointers returned // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. diff --git a/sourcehook/sourcehook.cpp b/sourcehook/sourcehook.cpp index 7296624..c817ac3 100644 --- a/sourcehook/sourcehook.cpp +++ b/sourcehook/sourcehook.cpp @@ -151,6 +151,25 @@ namespace SourceHook return true; } + + bool CProto::ExactlyEqual(const CProto &other) const + { + if (m_Version != other.m_Version || + m_NumOfParams != other.m_NumOfParams || + m_Convention != other.m_Convention || + GetRet() != other.GetRet()) + { + return false; + } + + for (int i = 0; i < m_NumOfParams; ++i) + { + if(GetParam(i) != other.GetParam(i)) + return false; + } + + return true; + } ////////////////////////////////////////////////////////////////////////// // CHookManager diff --git a/sourcehook/sourcehook.h b/sourcehook/sourcehook.h index 32cdee9..ee287dc 100644 --- a/sourcehook/sourcehook.h +++ b/sourcehook/sourcehook.h @@ -35,6 +35,11 @@ // 1 - standard #define SH_HOOKMAN_VERSION 1 +// Hookmanautogen versions +// 1 - initial +#define SH_HOOKMANAUTOGEN_IFACE_VERSION 1 +#define SH_HOOKMANAUTOGEN_IMPL_VERSION 1 + // The value of SH_GLOB_SHPTR has to be a pointer to SourceHook::ISourceHook // It's used in various macros #ifndef SH_GLOB_SHPTR @@ -472,6 +477,17 @@ namespace SourceHook virtual void EndContext(IHookContext *pCtx) = 0; }; + + class IHookManagerAutoGen + { + public: + virtual int GetIfaceVersion() = 0; + virtual int GetImplVersion() = 0; + + virtual HookManagerPubFunc MakeHookMan(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx) = 0; + virtual void ReleaseHookMan(HookManagerPubFunc pubFunc) = 0; + }; + // For META_RESULT_ORIG_RET and META_RESULT_OVERRIDE_RET: // These have to be able to return references. If T is a reference, the pointers returned // from the SH_GLOB_SHPTR are pointers to instances of ReferenceCarrier::type. diff --git a/sourcehook/sourcehook_hookmangen.cpp b/sourcehook/sourcehook_hookmangen.cpp index f72304a..2113853 100644 --- a/sourcehook/sourcehook_hookmangen.cpp +++ b/sourcehook/sourcehook_hookmangen.cpp @@ -15,6 +15,7 @@ // http://www.angelcode.com/dev/callconv/callconv.html // http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_6/CH06-1.html +#include "sourcehook_impl.h" #include "sourcehook_hookmangen.h" #include "sourcehook_hookmangen_x86.h" #include "sh_memory.h" @@ -47,7 +48,7 @@ namespace SourceHook } GenContext::GenContext(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx, ISourceHook *pSHPtr) - : m_Proto(proto), m_VtblOffs(vtbl_offs), m_VtblIdx(vtbl_idx), m_SHPtr(pSHPtr), + : m_GeneratedPubFunc(NULL), m_Proto(proto), m_VtblOffs(vtbl_offs), m_VtblIdx(vtbl_idx), m_SHPtr(pSHPtr), m_pHI(NULL), m_HookfuncVfnptr(NULL), m_RegCounter(0) { m_pHI = new void*; @@ -1652,5 +1653,91 @@ namespace SourceHook GenerateHookFunc(); return fastdelegate::detail::horrible_cast(GeneratePubFunc()); } + + HookManagerPubFunc GenContext::GetPubFunc() + { + if (m_GeneratedPubFunc == 0) + m_GeneratedPubFunc = Generate(); + + return m_GeneratedPubFunc; + } + + bool GenContext::Equal(const CProto &proto, int vtbl_offs, int vtbl_idx) + { + return (m_Proto.ExactlyEqual(proto) && m_VtblOffs == vtbl_offs && m_VtblIdx == vtbl_idx); + } + + bool GenContext::Equal(HookManagerPubFunc other) + { + return m_GeneratedPubFunc == other; + } + + // *********************************** class GenContextContainer + CHookManagerAutoGen::CHookManagerAutoGen(ISourceHook *pSHPtr) : m_pSHPtr(pSHPtr) + { + } + + CHookManagerAutoGen::~CHookManagerAutoGen() + { + for (List::iterator iter = m_Contexts.begin(); iter != m_Contexts.end(); ++iter) + { + delete iter->m_GenContext; + } + } + + int CHookManagerAutoGen::GetIfaceVersion() + { + return SH_HOOKMANAUTOGEN_IFACE_VERSION; + } + + int CHookManagerAutoGen::GetImplVersion() + { + return SH_HOOKMANAUTOGEN_IMPL_VERSION; + } + + HookManagerPubFunc CHookManagerAutoGen::MakeHookMan(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx) + { + CProto mproto(proto); + for (List::iterator iter = m_Contexts.begin(); iter != m_Contexts.end(); ++iter) + { + if (iter->m_GenContext->Equal(mproto, vtbl_offs, vtbl_idx)) + { + iter->m_RefCnt++; + return iter->m_GenContext->GetPubFunc(); + } + } + + // Not found yet -> new one + StoredContext sctx; + sctx.m_RefCnt = 1; + sctx.m_GenContext = new GenContext(proto, vtbl_offs, vtbl_idx, m_pSHPtr); + + if (sctx.m_GenContext->GetPubFunc() == NULL) + { + return NULL; + } + else + { + m_Contexts.push_back(sctx); + return sctx.m_GenContext->GetPubFunc(); + } + } + + void CHookManagerAutoGen::ReleaseHookMan(HookManagerPubFunc pubFunc) + { + for (List::iterator iter = m_Contexts.begin(); iter != m_Contexts.end(); ++iter) + { + if (iter->m_GenContext->Equal(pubFunc)) + { + iter->m_RefCnt--; + if (iter->m_RefCnt == 0) + { + delete iter->m_GenContext; + m_Contexts.erase(iter); + } + break; + } + } + } } } diff --git a/sourcehook/sourcehook_hookmangen.h b/sourcehook/sourcehook_hookmangen.h index 83e80df..b22a3bf 100644 --- a/sourcehook/sourcehook_hookmangen.h +++ b/sourcehook/sourcehook_hookmangen.h @@ -11,7 +11,6 @@ #ifndef __SOURCEHOOK_HOOKMANGEN_H__ #define __SOURCEHOOK_HOOKMANGEN_H__ -#include "sourcehook_impl.h" #include "sh_pagealloc.h" namespace SourceHook @@ -158,6 +157,8 @@ namespace SourceHook const static int SIZE_PTR = sizeof(void*); const static int PassFlag_ForcedByRef = (1<<30); // ByVal in source, but actually passed by reference (GCC) -> private pass, destruct + HookManagerPubFunc m_GeneratedPubFunc; + CProto m_Proto; int m_VtblOffs; int m_VtblIdx; @@ -231,13 +232,40 @@ namespace SourceHook void BuildProtoInfo(); void *GenerateHookFunc(); void *GeneratePubFunc(); + + HookManagerPubFunc Generate(); public: // Level 1 -> Public interface GenContext(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx, ISourceHook *pSHPtr); ~GenContext(); - HookManagerPubFunc Generate(); + bool Equal(const CProto &proto, int vtbl_offs, int vtbl_idx); + bool Equal(HookManagerPubFunc other); + + HookManagerPubFunc GetPubFunc(); }; + + class CHookManagerAutoGen : public IHookManagerAutoGen + { + struct StoredContext + { + int m_RefCnt; + GenContext *m_GenContext; + }; + List m_Contexts; + ISourceHook *m_pSHPtr; + + public: + CHookManagerAutoGen(ISourceHook *pSHPtr); + ~CHookManagerAutoGen(); + + int GetIfaceVersion(); + int GetImplVersion(); + + HookManagerPubFunc MakeHookMan(const ProtoInfo *proto, int vtbl_offs, int vtbl_idx); + void ReleaseHookMan(HookManagerPubFunc pubFunc); + }; + } } diff --git a/sourcehook/sourcehook_impl_cproto.h b/sourcehook/sourcehook_impl_cproto.h index 949b8ed..9521cd2 100644 --- a/sourcehook/sourcehook_impl_cproto.h +++ b/sourcehook/sourcehook_impl_cproto.h @@ -26,6 +26,21 @@ namespace SourceHook void *pCopyCtor; void *pDtor; void *pAssignOperator; + + bool operator == (const IntPassInfo &other) const + { + return size == other.size + && type == other.type + && flags == other.flags + && pNormalCtor == other.pNormalCtor + && pDtor == other.pDtor + && pAssignOperator == other.pAssignOperator; + } + + bool operator != (const IntPassInfo &other) const + { + return !(*this == other); + } }; class CProto @@ -72,6 +87,8 @@ namespace SourceHook bool operator == (const CProto &other) const; + bool ExactlyEqual(const CProto &other) const; + int GetVersion() const { return m_Version; diff --git a/sourcehook/test/main.cpp b/sourcehook/test/main.cpp index 993c695..9b2ba82 100644 --- a/sourcehook/test/main.cpp +++ b/sourcehook/test/main.cpp @@ -13,6 +13,7 @@ #include "sourcehook_impl.h" #include "sourcehook.h" +#include "sourcehook_hookmangen.h" using namespace std; bool g_Verbose; @@ -111,3 +112,14 @@ void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug) { static_cast(shptr)->UnpausePlugin(plug); } + +SourceHook::IHookManagerAutoGen *Test_HMAG_Factory(SourceHook::ISourceHook *shptr) +{ + return new SourceHook::Impl::CHookManagerAutoGen(shptr); +} + +void Test_HMAG_Delete(SourceHook::IHookManagerAutoGen *ptr) +{ + delete static_cast(ptr); +} + diff --git a/sourcehook/test/sourcehook_test.h b/sourcehook/test/sourcehook_test.h index babb5ba..065b543 100644 --- a/sourcehook/test/sourcehook_test.h +++ b/sourcehook/test/sourcehook_test.h @@ -34,3 +34,16 @@ void Test_CompleteShutdown(SourceHook::ISourceHook *shptr); void Test_UnloadPlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); void Test_PausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); void Test_UnpausePlugin(SourceHook::ISourceHook *shptr, SourceHook::Plugin plug); + +SourceHook::IHookManagerAutoGen *Test_HMAG_Factory(SourceHook::ISourceHook *pSHPtr); +void Test_HMAG_Delete(SourceHook::IHookManagerAutoGen *ptr); + +struct CHMAGAutoDestruction +{ + SourceHook::IHookManagerAutoGen *m_Ptr; + CHMAGAutoDestruction(SourceHook::IHookManagerAutoGen *ptr) : m_Ptr(ptr) {} + ~CHMAGAutoDestruction() { Test_HMAG_Delete(m_Ptr); } +}; + + +#define GET_HMAG(var, shptr) var = Test_HMAG_Factory(shptr); CHMAGAutoDestruction __hmagautodestruction(var); diff --git a/sourcehook/test/testhookmangen.cpp b/sourcehook/test/testhookmangen.cpp index a238e5d..0f7313b 100644 --- a/sourcehook/test/testhookmangen.cpp +++ b/sourcehook/test/testhookmangen.cpp @@ -2,7 +2,6 @@ #include "sourcehook.h" #include "sourcehook_test.h" #include "testevents.h" -#include "sourcehook_hookmangen.h" #include "sh_memory.h" #include "sh_pagealloc.h" @@ -23,6 +22,8 @@ namespace SourceHook::ISourceHook *g_SHPtr; SourceHook::Plugin g_PLID; + SourceHook::IHookManagerAutoGen *g_HMAGPtr; + // PtrBuf(ptr) gives ptrs unique numbers // in the order they appear SourceHook::List g_PtrHash; @@ -254,7 +255,6 @@ namespace } } - // MyDelegate base class for other delegates class MyDelegate : public SourceHook::ISHDelegate { @@ -415,6 +415,7 @@ namespace bool TestHookManGen(std::string &error) { GET_SHPTR(g_SHPtr); + GET_HMAG(g_HMAGPtr, g_SHPtr); g_PLID = 1337; // 5 Global constructors (g_O111_*) @@ -463,9 +464,8 @@ bool TestHookManGen(std::string &error) NULL), "Test11 Part0"); setuppi_11(); - g_Genc11 = new SourceHook::Impl::GenContext(&protoinfo_11, 0, 0, g_SHPtr); - g_Genc_ad11.set(g_Genc11); - SourceHook::HookManagerPubFunc myhookman11 = g_Genc11->Generate(); + SourceHook::HookManagerPubFunc myhookman11 = g_HMAGPtr->MakeHookMan(&protoinfo_11, 0, 0); \ + CAutoReleaseHookMan arhm_11(myhookman11); \ int hook1_11, hook2_11, hook3_11, hook4_11; TestClass11 *pTest11 = new TestClass11; @@ -630,9 +630,8 @@ bool TestHookManGen(std::string &error) 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(); + SourceHook::HookManagerPubFunc myhookman110 = g_HMAGPtr->MakeHookMan(&protoinfo_110, 0, 0); \ + CAutoReleaseHookMan arhm_110(myhookman110); \ int hook1_110, hook2_110, hook3_110, hook4_110; TestClass110 *pTest110 = new TestClass110; diff --git a/sourcehook/test/testhookmangen.h b/sourcehook/test/testhookmangen.h index 9b5a52e..b1caf8c 100644 --- a/sourcehook/test/testhookmangen.h +++ b/sourcehook/test/testhookmangen.h @@ -1,3 +1,15 @@ +struct CAutoReleaseHookMan +{ + SourceHook::HookManagerPubFunc m_Ptr; + CAutoReleaseHookMan(SourceHook::HookManagerPubFunc ptr) : m_Ptr(ptr) + { + } + ~CAutoReleaseHookMan() + { + g_HMAGPtr->ReleaseHookMan(m_Ptr); + } +}; + // Strip & template struct StripRef { @@ -520,9 +532,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[0+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 0, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST0(id, ret_type) \ @@ -621,8 +630,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 0, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI0(id) \ void setuppi_##id() \ @@ -731,9 +739,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[1+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 1, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST1(id, ret_type, param1) \ @@ -832,8 +837,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 1, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI1(id, p1_type, p1_passtype, p1_flags) \ void setuppi_##id() \ @@ -942,9 +946,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[2+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 2, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST2(id, ret_type, param1, param2) \ @@ -1043,8 +1044,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 2, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI2(id, p1_type, p1_passtype, p1_flags, p2_type, p2_passtype, p2_flags) \ void setuppi_##id() \ @@ -1153,9 +1153,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[3+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 3, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST3(id, ret_type, param1, param2, param3) \ @@ -1254,8 +1251,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 3, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI3(id, p1_type, p1_passtype, p1_flags, p2_type, p2_passtype, p2_flags, p3_type, p3_passtype, p3_flags) \ void setuppi_##id() \ @@ -1364,9 +1360,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[4+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 4, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST4(id, ret_type, param1, param2, param3, param4) \ @@ -1465,8 +1458,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 4, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI4(id, p1_type, p1_passtype, p1_flags, p2_type, p2_passtype, p2_flags, p3_type, p3_passtype, p3_flags, p4_type, p4_passtype, p4_flags) \ void setuppi_##id() \ @@ -1575,9 +1567,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[5+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 5, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST5(id, ret_type, param1, param2, param3, param4, param5) \ @@ -1676,8 +1665,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 5, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI5(id, p1_type, p1_passtype, p1_flags, p2_type, p2_passtype, p2_flags, p3_type, p3_passtype, p3_flags, p4_type, p4_passtype, p4_flags, p5_type, p5_passtype, p5_flags) \ void setuppi_##id() \ @@ -1786,9 +1774,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::PassInfo::V2Info paraminfos2_##id[6+1]; \ SourceHook::ProtoInfo protoinfo_##id = { 6, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST6(id, ret_type, param1, param2, param3, param4, param5, param6) \ @@ -1887,8 +1872,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, SourceHook::ProtoInfo protoinfo_##id = { 6, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI6(id, p1_type, p1_passtype, p1_flags, p2_type, p2_passtype, p2_flags, p3_type, p3_passtype, p3_flags, p4_type, p4_passtype, p4_flags, p5_type, p5_passtype, p5_flags, p6_type, p6_passtype, p6_flags) \ void setuppi_##id() \ @@ -1931,9 +1915,8 @@ std::ostream& operator <<(std::ostream &os,const ParamState6<0, p1, p2, p3, p4, #define THGM_DO_TEST_void(id, call_params) \ setuppi_##id(); \ - g_Genc##id = new SourceHook::Impl::GenContext(&protoinfo_##id, 0, 0, g_SHPtr); \ - g_Genc_ad##id.set(g_Genc##id); \ - SourceHook::HookManagerPubFunc myhookman##id = g_Genc##id->Generate(); \ + SourceHook::HookManagerPubFunc myhookman##id = g_HMAGPtr->MakeHookMan(&protoinfo_##id, 0, 0); \ + CAutoReleaseHookMan arhm_##id(myhookman##id); \ int hook1_##id, hook2_##id, hook3_##id, hook4_##id; \ \ TestClass##id::ms_DoRecall = false; \ @@ -2050,9 +2033,8 @@ T* ComparableRef(T& x) #define THGM_DO_TEST(id, call_params) \ setuppi_##id(); \ setupri_##id(); \ - g_Genc##id = new SourceHook::Impl::GenContext(&protoinfo_##id, 0, 0, g_SHPtr); \ - g_Genc_ad##id.set(g_Genc##id); \ - SourceHook::HookManagerPubFunc myhookman##id = g_Genc##id->Generate(); \ + SourceHook::HookManagerPubFunc myhookman##id = g_HMAGPtr->MakeHookMan(&protoinfo_##id, 0, 0); \ + CAutoReleaseHookMan arhm_##id(myhookman##id); \ int hook1_##id, hook2_##id, hook3_##id, hook4_##id; \ \ TestClass##id::ms_DoRecall = false; \ diff --git a/sourcehook/test/testhookmangen.hxx b/sourcehook/test/testhookmangen.hxx index ce709d6..0e283dd 100644 --- a/sourcehook/test/testhookmangen.hxx +++ b/sourcehook/test/testhookmangen.hxx @@ -1,3 +1,15 @@ +struct CAutoReleaseHookMan +{ + SourceHook::HookManagerPubFunc m_Ptr; + CAutoReleaseHookMan(SourceHook::HookManagerPubFunc ptr) : m_Ptr(ptr) + { + } + ~CAutoReleaseHookMan() + { + g_HMAGPtr->ReleaseHookMan(m_Ptr); + } +}; + // Strip & template struct StripRef { @@ -262,9 +274,6 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@] SourceHook::PassInfo::V2Info paraminfos2_##id[$1+1]; \ SourceHook::ProtoInfo protoinfo_##id = { $1, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ - \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); #define THGM_MAKE_TEST$1(id, ret_type@[$2,1,$1:, param$2@]) \ @@ -363,8 +372,7 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@] SourceHook::ProtoInfo protoinfo_##id = { $1, {0, 0, 0}, paraminfos_##id, \ SourceHook::ProtoInfo::CallConv_ThisCall, __SH_EPI, paraminfos2_##id }; \ \ - SourceHook::Impl::GenContext *g_Genc##id = NULL; \ - CAutoPtrDestruction g_Genc_ad##id(NULL); + CAutoReleaseHookMan g_Genc_ad##id(NULL); #define THGM_SETUP_PI$1(id@[$2,1,$1:, p$2_type, p$2_passtype, p$2_flags@]) \ void setuppi_##id() \ @@ -407,9 +415,8 @@ std::ostream& operator <<(std::ostream &os,const ParamState$1<0@[$2,1,$1:, p$2@] #define THGM_DO_TEST_void(id, call_params) \ setuppi_##id(); \ - g_Genc##id = new SourceHook::Impl::GenContext(&protoinfo_##id, 0, 0, g_SHPtr); \ - g_Genc_ad##id.set(g_Genc##id); \ - SourceHook::HookManagerPubFunc myhookman##id = g_Genc##id->Generate(); \ + SourceHook::HookManagerPubFunc myhookman##id = g_HMAGPtr->MakeHookMan(&protoinfo_##id, 0, 0); \ + CAutoReleaseHookMan arhm_##id(myhookman##id); \ int hook1_##id, hook2_##id, hook3_##id, hook4_##id; \ \ TestClass##id::ms_DoRecall = false; \ @@ -526,9 +533,8 @@ T* ComparableRef(T& x) #define THGM_DO_TEST(id, call_params) \ setuppi_##id(); \ setupri_##id(); \ - g_Genc##id = new SourceHook::Impl::GenContext(&protoinfo_##id, 0, 0, g_SHPtr); \ - g_Genc_ad##id.set(g_Genc##id); \ - SourceHook::HookManagerPubFunc myhookman##id = g_Genc##id->Generate(); \ + SourceHook::HookManagerPubFunc myhookman##id = g_HMAGPtr->MakeHookMan(&protoinfo_##id, 0, 0); \ + CAutoReleaseHookMan arhm_##id(myhookman##id); \ int hook1_##id, hook2_##id, hook3_##id, hook4_##id; \ \ TestClass##id::ms_DoRecall = false; \