extensions/bintools/CallWrapper.cpp
author David Anderson <dvander@alliedmods.net>
Wed Aug 01 01:54:53 2007 +0000 (2007-08-01)
changeset 1226 478550a4d5ec
parent 948 8d0eff1ab907
child 1330 ab94316bb52b
permissions -rw-r--r--
updated license headers for most extensions
updated sdk bases for most extensions
     1 /**
     2  * vim: set ts=4 :
     3  * ================================================================
     4  * SourceMod BinTools Extension
     5  * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
     6  * ================================================================
     7  *
     8  * This program is free software; you can redistribute it and/or 
     9  * modify it under the terms of the GNU General Public License, 
    10  * version 3.0, as published by the Free Software Foundation.
    11  * 
    12  * This program is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    19  *
    20  * As a special exception, AlliedModders LLC gives you permission to 
    21  * link the code of this program (as well as its derivative works) to 
    22  * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
    23  * Game MODs that run on software by the Valve Corporation.  You must 
    24  * obey the GNU General Public License in all respects for all other 
    25  * code used. Additionally, AlliedModders LLC grants this exception 
    26  * to all derivative works. AlliedModders LLC defines further 
    27  * exceptions, found in LICENSE.txt (as of this writing, version 
    28  * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
    29  *
    30  * Version: $Id$
    31  */
    32 
    33 #include "extension.h"
    34 #include "CallWrapper.h"
    35 
    36 CallWrapper::CallWrapper(CallConvention cv, const PassInfo *paramInfo, const PassInfo *retInfo, unsigned int numParams)
    37 {
    38 	m_Cv = cv;
    39 
    40 	if (numParams)
    41 	{
    42 		m_Params = new PassEncode[numParams];
    43 		for (size_t i=0; i<numParams; i++)
    44 		{
    45 			m_Params[i].info = paramInfo[i];
    46 		}
    47 	} else {
    48 		m_Params = NULL;
    49 	}
    50 
    51 	if (retInfo)
    52 	{
    53 		m_RetParam = new PassInfo;
    54 		*m_RetParam = *retInfo;
    55 	} else {
    56 		m_RetParam = NULL;
    57 	}
    58 
    59 	m_NumParams = numParams;
    60 
    61 	/* Calculate virtual stack offsets for each parameter */
    62 	size_t offs = 0;
    63 
    64 	if (cv == CallConv_ThisCall)
    65 	{
    66 		offs += sizeof(void *);
    67 	}
    68 	for (size_t i=0; i<numParams; i++)
    69 	{
    70 		m_Params[i].offset = offs;
    71 		offs += m_Params[i].info.size;
    72 	}
    73 }
    74 
    75 CallWrapper::~CallWrapper()
    76 {
    77 	delete [] m_Params;
    78 	delete m_RetParam;
    79 	g_SPEngine->ExecFree(m_Addrs[ADDR_CODEBASE]);
    80 }
    81 
    82 void CallWrapper::Destroy()
    83 {
    84 	delete this;
    85 }
    86 
    87 CallConvention CallWrapper::GetCallConvention()
    88 {
    89 	return m_Cv;
    90 }
    91 
    92 const PassEncode *CallWrapper::GetParamInfo(unsigned int num)
    93 {
    94 	return (num+1 > m_NumParams) ? NULL : &m_Params[num];
    95 }
    96 
    97 const PassInfo *CallWrapper::GetReturnInfo()
    98 {
    99 	return m_RetParam;
   100 }
   101 
   102 unsigned int CallWrapper::GetParamCount()
   103 {
   104 	return m_NumParams;
   105 }
   106 
   107 void CallWrapper::Execute(void *vParamStack, void *retBuffer)
   108 {
   109 	typedef void (*CALL_EXECUTE)(void *, void *);
   110 	CALL_EXECUTE fn = (CALL_EXECUTE)m_Addrs[ADDR_CODEBASE];
   111 	fn(vParamStack, retBuffer);
   112 }