changed the API - funcid_t is now index only rather than a code address
--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40353
This commit is contained in:
parent
f9a5920e5b
commit
2129bb6d92
@ -128,7 +128,7 @@ IPluginDebugInfo *BaseContext::GetDebugInfo()
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BaseContext::Execute(funcid_t funcid, cell_t *result)
|
int BaseContext::Execute(uint32_t code_addr, cell_t *result)
|
||||||
{
|
{
|
||||||
if (!m_Runnable)
|
if (!m_Runnable)
|
||||||
{
|
{
|
||||||
@ -138,25 +138,8 @@ int BaseContext::Execute(funcid_t funcid, cell_t *result)
|
|||||||
IVirtualMachine *vm = (IVirtualMachine *)ctx->vmbase;
|
IVirtualMachine *vm = (IVirtualMachine *)ctx->vmbase;
|
||||||
|
|
||||||
uint32_t pushcount = ctx->pushcount;
|
uint32_t pushcount = ctx->pushcount;
|
||||||
uint32_t code_addr;
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (funcid & 1)
|
|
||||||
{
|
|
||||||
sp_public_t *pubfunc;
|
|
||||||
if ((err=GetPublicByIndex((funcid>>1), &pubfunc)) != SP_ERROR_NONE)
|
|
||||||
{
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
code_addr = pubfunc->code_offs;
|
|
||||||
} else {
|
|
||||||
#if 0
|
|
||||||
code_addr = funcid >> 1;
|
|
||||||
#endif
|
|
||||||
assert(false);
|
|
||||||
return SP_ERROR_INVALID_ADDRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
PushCell(pushcount++);
|
PushCell(pushcount++);
|
||||||
ctx->pushcount = 0;
|
ctx->pushcount = 0;
|
||||||
|
|
||||||
@ -331,25 +314,6 @@ int BaseContext::FindNativeByName(const char *name, uint32_t *index)
|
|||||||
|
|
||||||
high = ctx->plugin->info.natives_num - 1;
|
high = ctx->plugin->info.natives_num - 1;
|
||||||
|
|
||||||
#if 0
|
|
||||||
while (low <= high)
|
|
||||||
{
|
|
||||||
mid = (low + high) / 2;
|
|
||||||
diff = strcmp(ctx->natives[mid].name, name);
|
|
||||||
if (diff == 0)
|
|
||||||
{
|
|
||||||
if (index)
|
|
||||||
{
|
|
||||||
*index = mid;
|
|
||||||
}
|
|
||||||
return SP_ERROR_NONE;
|
|
||||||
} else if (diff < 0) {
|
|
||||||
low = mid + 1;
|
|
||||||
} else {
|
|
||||||
high = mid - 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for (uint32_t i=0; i<ctx->plugin->info.natives_num; i++)
|
for (uint32_t i=0; i<ctx->plugin->info.natives_num; i++)
|
||||||
{
|
{
|
||||||
if (strcmp(ctx->natives[i].name, name) == 0)
|
if (strcmp(ctx->natives[i].name, name) == 0)
|
||||||
@ -361,7 +325,6 @@ int BaseContext::FindNativeByName(const char *name, uint32_t *index)
|
|||||||
return SP_ERROR_NONE;
|
return SP_ERROR_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return SP_ERROR_NOT_FOUND;
|
return SP_ERROR_NOT_FOUND;
|
||||||
}
|
}
|
||||||
@ -863,7 +826,6 @@ int BaseContext::LookupLine(ucell_t addr, uint32_t *line)
|
|||||||
IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
|
IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
|
||||||
{
|
{
|
||||||
CFunction *pFunc = NULL;
|
CFunction *pFunc = NULL;
|
||||||
funcid_t save = func_id;
|
|
||||||
|
|
||||||
if (func_id & 1)
|
if (func_id & 1)
|
||||||
{
|
{
|
||||||
@ -875,10 +837,11 @@ IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
|
|||||||
pFunc = m_pub_funcs[func_id];
|
pFunc = m_pub_funcs[func_id];
|
||||||
if (!pFunc)
|
if (!pFunc)
|
||||||
{
|
{
|
||||||
m_pub_funcs[func_id] = new CFunction(save, this);
|
m_pub_funcs[func_id] = new CFunction(ctx->publics[func_id].code_offs, this);
|
||||||
pFunc = m_pub_funcs[func_id];
|
pFunc = m_pub_funcs[func_id];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/* :TODO: currently not used */
|
||||||
#if 0
|
#if 0
|
||||||
func_id >>= 1;
|
func_id >>= 1;
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
@ -892,7 +855,7 @@ IPluginFunction *BaseContext::GetFunctionById(funcid_t func_id)
|
|||||||
m_priv_funcs[func_id] = new CFunction(save, this);
|
m_priv_funcs[func_id] = new CFunction(save, this);
|
||||||
pFunc = m_priv_funcs[func_id];
|
pFunc = m_priv_funcs[func_id];
|
||||||
}
|
}
|
||||||
#endif
|
#endif 0
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -915,7 +878,7 @@ IPluginFunction *BaseContext::GetFunctionByName(const char *public_name)
|
|||||||
GetPublicByIndex(index, &pub);
|
GetPublicByIndex(index, &pub);
|
||||||
if (pub)
|
if (pub)
|
||||||
{
|
{
|
||||||
m_pub_funcs[index] = new CFunction(pub->funcid, this);
|
m_pub_funcs[index] = new CFunction(pub->code_offs, this);
|
||||||
}
|
}
|
||||||
pFunc = m_pub_funcs[index];
|
pFunc = m_pub_funcs[index];
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ namespace SourcePawn
|
|||||||
virtual int BindNatives(const sp_nativeinfo_t *natives, unsigned int num, int overwrite);
|
virtual int BindNatives(const sp_nativeinfo_t *natives, unsigned int num, int overwrite);
|
||||||
virtual int BindNative(const sp_nativeinfo_t *native);
|
virtual int BindNative(const sp_nativeinfo_t *native);
|
||||||
virtual int BindNativeToAny(SPVM_NATIVE_FUNC native);
|
virtual int BindNativeToAny(SPVM_NATIVE_FUNC native);
|
||||||
virtual int Execute(funcid_t funcid, cell_t *result);
|
virtual int Execute(uint32_t code_addr, cell_t *result);
|
||||||
virtual void ThrowNativeErrorEx(int error, const char *msg, ...);
|
virtual void ThrowNativeErrorEx(int error, const char *msg, ...);
|
||||||
virtual cell_t ThrowNativeError(const char *msg, ...);
|
virtual cell_t ThrowNativeError(const char *msg, ...);
|
||||||
virtual IPluginFunction *GetFunctionByName(const char *public_name);
|
virtual IPluginFunction *GetFunctionByName(const char *public_name);
|
||||||
|
@ -5,9 +5,9 @@
|
|||||||
* FUNCTION CALLING *
|
* FUNCTION CALLING *
|
||||||
********************/
|
********************/
|
||||||
|
|
||||||
void CFunction::Set(funcid_t funcid, IPluginContext *plugin)
|
void CFunction::Set(uint32_t code_addr, IPluginContext *plugin)
|
||||||
{
|
{
|
||||||
m_funcid = funcid;
|
m_codeaddr = code_addr;
|
||||||
m_pContext = plugin;
|
m_pContext = plugin;
|
||||||
m_curparam = 0;
|
m_curparam = 0;
|
||||||
m_errorstate = SP_ERROR_NONE;
|
m_errorstate = SP_ERROR_NONE;
|
||||||
@ -20,7 +20,7 @@ int CFunction::CallFunction(const cell_t *params, unsigned int num_params, cell_
|
|||||||
m_pContext->PushCell(params[num_params]);
|
m_pContext->PushCell(params[num_params]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_pContext->Execute(m_funcid, result);
|
return m_pContext->Execute(m_codeaddr, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
IPluginContext *CFunction::GetParentContext()
|
IPluginContext *CFunction::GetParentContext()
|
||||||
@ -28,8 +28,8 @@ IPluginContext *CFunction::GetParentContext()
|
|||||||
return m_pContext;
|
return m_pContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
CFunction::CFunction(funcid_t funcid, IPluginContext *plugin) :
|
CFunction::CFunction(uint32_t code_addr, IPluginContext *plugin) :
|
||||||
m_funcid(funcid), m_pContext(plugin), m_curparam(0),
|
m_codeaddr(code_addr), m_pContext(plugin), m_curparam(0),
|
||||||
m_errorstate(SP_ERROR_NONE)
|
m_errorstate(SP_ERROR_NONE)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ class CFunction : public IPluginFunction
|
|||||||
{
|
{
|
||||||
friend class SourcePawnEngine;
|
friend class SourcePawnEngine;
|
||||||
public:
|
public:
|
||||||
CFunction(funcid_t funcid, IPluginContext *pContext);
|
CFunction(uint32_t code_addr, IPluginContext *pContext);
|
||||||
public:
|
public:
|
||||||
virtual int PushCell(cell_t cell);
|
virtual int PushCell(cell_t cell);
|
||||||
virtual int PushCellByRef(cell_t *cell, int flags);
|
virtual int PushCellByRef(cell_t *cell, int flags);
|
||||||
@ -34,7 +34,7 @@ public:
|
|||||||
virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result);
|
virtual int CallFunction(const cell_t *params, unsigned int num_params, cell_t *result);
|
||||||
virtual IPluginContext *GetParentContext();
|
virtual IPluginContext *GetParentContext();
|
||||||
public:
|
public:
|
||||||
void Set(funcid_t funcid, IPluginContext *plugin);
|
void Set(uint32_t code_addr, IPluginContext *plugin);
|
||||||
private:
|
private:
|
||||||
int _PushString(const char *string, int sz_flags, int cp_flags, size_t len);
|
int _PushString(const char *string, int sz_flags, int cp_flags, size_t len);
|
||||||
inline int SetError(int err)
|
inline int SetError(int err)
|
||||||
@ -43,7 +43,7 @@ private:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
funcid_t m_funcid;
|
uint32_t m_codeaddr;
|
||||||
IPluginContext *m_pContext;
|
IPluginContext *m_pContext;
|
||||||
cell_t m_params[SP_MAX_EXEC_PARAMS];
|
cell_t m_params[SP_MAX_EXEC_PARAMS];
|
||||||
ParamInfo m_info[SP_MAX_EXEC_PARAMS];
|
ParamInfo m_info[SP_MAX_EXEC_PARAMS];
|
||||||
|
@ -19,6 +19,7 @@ enum AdminFlag
|
|||||||
Admin_Password, /* Set a server password */
|
Admin_Password, /* Set a server password */
|
||||||
Admin_RCON, /* Use RCON */
|
Admin_RCON, /* Use RCON */
|
||||||
Admin_Cheats, /* Change sv_cheats and use its commands */
|
Admin_Cheats, /* Change sv_cheats and use its commands */
|
||||||
|
Admin_Root, /* Root access */
|
||||||
/* --- */
|
/* --- */
|
||||||
AdminFlags_TOTAL,
|
AdminFlags_TOTAL,
|
||||||
};
|
};
|
||||||
|
@ -44,6 +44,7 @@ namespace SourceMod
|
|||||||
Admin_Password, /* Set a server password */
|
Admin_Password, /* Set a server password */
|
||||||
Admin_RCON, /* Use RCON */
|
Admin_RCON, /* Use RCON */
|
||||||
Admin_Cheats, /* Change sv_cheats and use its commands */
|
Admin_Cheats, /* Change sv_cheats and use its commands */
|
||||||
|
Admin_Root, /* All access by default */
|
||||||
/* --- */
|
/* --- */
|
||||||
AdminFlags_TOTAL,
|
AdminFlags_TOTAL,
|
||||||
};
|
};
|
||||||
|
@ -461,12 +461,11 @@ namespace SourcePawn
|
|||||||
/**
|
/**
|
||||||
* @brief Executes a function ID located in this context.
|
* @brief Executes a function ID located in this context.
|
||||||
*
|
*
|
||||||
* @param funcid Function id to execute.
|
* @param code_addr Address to execute at.
|
||||||
* @param result Pointer to store the return value (required).
|
* @param result Pointer to store the return value (required).
|
||||||
* @return Error code (if any) from the VM.
|
* @return Error code (if any) from the VM.
|
||||||
*/
|
*/
|
||||||
virtual int Execute(uint32_t funcid, cell_t *result) =0;
|
virtual int Execute(uint32_t code_addr, cell_t *result) =0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Throws a error and halts any current execution.
|
* @brief Throws a error and halts any current execution.
|
||||||
|
Loading…
Reference in New Issue
Block a user