1
0
mirror of https://github.com/alliedmodders/metamod-source.git synced 2025-02-20 13:54:14 +01:00

Added IHookManagerAutoGen interface

--HG--
branch : hookman_autogen
extra : convert_revision : svn%3Ac2935e3e-5518-0410-8daf-afa5dab7d4e3/branches/hookman_autogen%40555
This commit is contained in:
Pavol Marko 2007-11-10 16:10:55 +00:00
parent f3f226444a
commit 92c795e830
12 changed files with 274 additions and 63 deletions

View File

@ -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<T>::type.

View File

@ -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<T>::type.

View File

@ -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

View File

@ -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<T>::type.

View File

@ -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<HookManagerPubFunc>(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<StoredContext>::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<StoredContext>::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<StoredContext>::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;
}
}
}
}
}

View File

@ -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<StoredContext> 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);
};
}
}

View File

@ -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;

View File

@ -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<SourceHook::Impl::CSourceHookImpl *>(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<SourceHook::Impl::CHookManagerAutoGen*>(ptr);
}

View File

@ -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);

View File

@ -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<const void*> 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;

View File

@ -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 <class T> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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; \

View File

@ -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 <class T> 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<SourceHook::Impl::GenContext> 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<SourceHook::Impl::GenContext> 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; \