extensions/bintools/CallWrapper.cpp
author Borja Ferrer <faluco@alliedmods.net>
Fri May 04 21:39:05 2007 +0000 (2007-05-04)
changeset 739 d22243bb5864
child 757 b799caa9a190
permissions -rw-r--r--
added new function calling module, wow
faluco@739
     1
/**
faluco@739
     2
 * vim: set ts=4 :
faluco@739
     3
 * ===============================================================
faluco@739
     4
 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
faluco@739
     5
 * All rights reserved.
faluco@739
     6
 * ===============================================================
faluco@739
     7
 *
faluco@739
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be 
faluco@739
     9
 * used or modified under the Terms and Conditions of its License Agreement, 
faluco@739
    10
 * which is found in public/licenses/LICENSE.txt.  As of this notice, derivative 
faluco@739
    11
 * works must be licensed under the GNU General Public License (version 2 or 
faluco@739
    12
 * greater).  A copy of the GPL is included under public/licenses/GPL.txt.
faluco@739
    13
 * 
faluco@739
    14
 * To view the latest information, see: http://www.sourcemod.net/license.php
faluco@739
    15
 *
faluco@739
    16
 * Version: $Id$
faluco@739
    17
 */
faluco@739
    18
faluco@739
    19
#include "extension.h"
faluco@739
    20
#include "CallWrapper.h"
faluco@739
    21
faluco@739
    22
CallWrapper::CallWrapper(CallConvention cv, const PassInfo *paramInfo, const PassInfo *retInfo, unsigned int numParams)
faluco@739
    23
{
faluco@739
    24
	m_Cv = cv;
faluco@739
    25
faluco@739
    26
	if (numParams)
faluco@739
    27
	{
faluco@739
    28
		m_Params = new PassEncode[numParams];
faluco@739
    29
		for (size_t i=0; i<numParams; i++)
faluco@739
    30
		{
faluco@739
    31
			m_Params[i].info = paramInfo[i];
faluco@739
    32
		}
faluco@739
    33
	}
faluco@739
    34
faluco@739
    35
	if (retInfo)
faluco@739
    36
	{
faluco@739
    37
		m_RetParam = new PassInfo;
faluco@739
    38
		*m_RetParam = *retInfo;
faluco@739
    39
	} else {
faluco@739
    40
		m_RetParam = NULL;
faluco@739
    41
	}
faluco@739
    42
faluco@739
    43
	m_NumParams = numParams;
faluco@739
    44
faluco@739
    45
	/* Calculate virtual stack offsets for each parameter */
faluco@739
    46
	size_t offs = 0;
faluco@739
    47
faluco@739
    48
	if (cv == CallConv_ThisCall)
faluco@739
    49
	{
faluco@739
    50
		offs += sizeof(void *);
faluco@739
    51
	}
faluco@739
    52
	for (size_t i=0; i<numParams; i++)
faluco@739
    53
	{
faluco@739
    54
		m_Params[i].offset = offs;
faluco@739
    55
		offs += m_Params[i].info.size;
faluco@739
    56
	}
faluco@739
    57
}
faluco@739
    58
faluco@739
    59
CallWrapper::~CallWrapper()
faluco@739
    60
{
faluco@739
    61
	delete [] m_Params;
faluco@739
    62
	delete m_RetParam;
faluco@739
    63
	g_SPEngine->ExecFree(m_Addrs[ADDR_CODEBASE]);
faluco@739
    64
}
faluco@739
    65
faluco@739
    66
CallConvention CallWrapper::GetCallConvention()
faluco@739
    67
{
faluco@739
    68
	return m_Cv;
faluco@739
    69
}
faluco@739
    70
faluco@739
    71
const PassEncode *CallWrapper::GetParamInfo(unsigned int num)
faluco@739
    72
{
faluco@739
    73
	return (num+1 > m_NumParams) ? NULL : &m_Params[num];
faluco@739
    74
}
faluco@739
    75
faluco@739
    76
const PassInfo *CallWrapper::GetReturnInfo()
faluco@739
    77
{
faluco@739
    78
	return m_RetParam;
faluco@739
    79
}
faluco@739
    80
faluco@739
    81
unsigned int CallWrapper::GetParamCount()
faluco@739
    82
{
faluco@739
    83
	return m_NumParams;
faluco@739
    84
}
faluco@739
    85
faluco@739
    86
void CallWrapper::Execute(void *vParamStack, void *retBuffer)
faluco@739
    87
{
faluco@739
    88
	typedef void (*CALL_EXECUTE)(void *, void *);
faluco@739
    89
	CALL_EXECUTE fn = (CALL_EXECUTE)m_Addrs[ADDR_CODEBASE];
faluco@739
    90
	fn(vParamStack, retBuffer);
faluco@739
    91
}