extensions/bintools/CallWrapper.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed May 09 05:20:03 2007 +0000 (2007-05-09)
changeset 757 b799caa9a190
parent 739 d22243bb5864
child 942 5a930535b6d0
permissions -rw-r--r--
Whew, massive-ish reorgranization for extensions and such. I will inevitably be shot for this.
(Yes, bail, it all compiles on both platforms)
faluco@739
     1
/**
faluco@739
     2
 * vim: set ts=4 :
faluco@739
     3
 * ===============================================================
ds@757
     4
 * SourceMod BinTools Extension
ds@757
     5
 * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
faluco@739
     6
 * ===============================================================
faluco@739
     7
 *
ds@757
     8
 * This program is free software; you can redistribute it and/or
ds@757
     9
 * modify it under the terms of the GNU General Public License
ds@757
    10
 * as published by the Free Software Foundation; either version 2
ds@757
    11
 * of the License, or (at your option) any later version.
ds@757
    12
 * This program is distributed in the hope that it will be useful,
ds@757
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ds@757
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ds@757
    15
 * GNU General Public License for more details.
faluco@739
    16
 * 
ds@757
    17
 * You should have received a copy of the GNU General Public License
ds@757
    18
 * along with this program; if not, write to the Free Software
ds@757
    19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
faluco@739
    20
 *
faluco@739
    21
 * Version: $Id$
faluco@739
    22
 */
faluco@739
    23
faluco@739
    24
#include "extension.h"
faluco@739
    25
#include "CallWrapper.h"
faluco@739
    26
faluco@739
    27
CallWrapper::CallWrapper(CallConvention cv, const PassInfo *paramInfo, const PassInfo *retInfo, unsigned int numParams)
faluco@739
    28
{
faluco@739
    29
	m_Cv = cv;
faluco@739
    30
faluco@739
    31
	if (numParams)
faluco@739
    32
	{
faluco@739
    33
		m_Params = new PassEncode[numParams];
faluco@739
    34
		for (size_t i=0; i<numParams; i++)
faluco@739
    35
		{
faluco@739
    36
			m_Params[i].info = paramInfo[i];
faluco@739
    37
		}
faluco@739
    38
	}
faluco@739
    39
faluco@739
    40
	if (retInfo)
faluco@739
    41
	{
faluco@739
    42
		m_RetParam = new PassInfo;
faluco@739
    43
		*m_RetParam = *retInfo;
faluco@739
    44
	} else {
faluco@739
    45
		m_RetParam = NULL;
faluco@739
    46
	}
faluco@739
    47
faluco@739
    48
	m_NumParams = numParams;
faluco@739
    49
faluco@739
    50
	/* Calculate virtual stack offsets for each parameter */
faluco@739
    51
	size_t offs = 0;
faluco@739
    52
faluco@739
    53
	if (cv == CallConv_ThisCall)
faluco@739
    54
	{
faluco@739
    55
		offs += sizeof(void *);
faluco@739
    56
	}
faluco@739
    57
	for (size_t i=0; i<numParams; i++)
faluco@739
    58
	{
faluco@739
    59
		m_Params[i].offset = offs;
faluco@739
    60
		offs += m_Params[i].info.size;
faluco@739
    61
	}
faluco@739
    62
}
faluco@739
    63
faluco@739
    64
CallWrapper::~CallWrapper()
faluco@739
    65
{
faluco@739
    66
	delete [] m_Params;
faluco@739
    67
	delete m_RetParam;
faluco@739
    68
	g_SPEngine->ExecFree(m_Addrs[ADDR_CODEBASE]);
faluco@739
    69
}
faluco@739
    70
faluco@739
    71
CallConvention CallWrapper::GetCallConvention()
faluco@739
    72
{
faluco@739
    73
	return m_Cv;
faluco@739
    74
}
faluco@739
    75
faluco@739
    76
const PassEncode *CallWrapper::GetParamInfo(unsigned int num)
faluco@739
    77
{
faluco@739
    78
	return (num+1 > m_NumParams) ? NULL : &m_Params[num];
faluco@739
    79
}
faluco@739
    80
faluco@739
    81
const PassInfo *CallWrapper::GetReturnInfo()
faluco@739
    82
{
faluco@739
    83
	return m_RetParam;
faluco@739
    84
}
faluco@739
    85
faluco@739
    86
unsigned int CallWrapper::GetParamCount()
faluco@739
    87
{
faluco@739
    88
	return m_NumParams;
faluco@739
    89
}
faluco@739
    90
faluco@739
    91
void CallWrapper::Execute(void *vParamStack, void *retBuffer)
faluco@739
    92
{
faluco@739
    93
	typedef void (*CALL_EXECUTE)(void *, void *);
faluco@739
    94
	CALL_EXECUTE fn = (CALL_EXECUTE)m_Addrs[ADDR_CODEBASE];
faluco@739
    95
	fn(vParamStack, retBuffer);
faluco@739
    96
}