SDKTools Fixathon!

Fixed amb647 - Returning objects by reference wasn't working
Various fixes for byref/pointer params and return values (including working copyback)

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401141
This commit is contained in:
Scott Ehlert 2007-07-19 15:24:15 +00:00
parent 59f47dfd17
commit 8e5a1d58be
3 changed files with 23 additions and 29 deletions

View File

@ -97,10 +97,6 @@ ValveCall *CreateValveCall(void *addr,
return NULL; return NULL;
} }
retBufSize = retBuf.size; retBufSize = retBuf.size;
if (retbuf_needs_extra)
{
retBufSize += size;
}
} }
/* Get parameter info */ /* Get parameter info */
@ -255,10 +251,6 @@ ValveCall *CreateValveVCall(unsigned int vtableIdx,
return NULL; return NULL;
} }
retBufSize = retBuf.size; retBufSize = retBuf.size;
if (retbuf_needs_extra)
{
retBufSize += size;
}
} }
/* Get parameter info */ /* Get parameter info */

View File

@ -49,14 +49,14 @@ ValvePassInfo s_params[SP_MAX_EXEC_PARAMS];
inline void DecodePassMethod(ValveType vtype, SDKPassMethod method, PassType &type, unsigned int &flags) inline void DecodePassMethod(ValveType vtype, SDKPassMethod method, PassType &type, unsigned int &flags)
{ {
if (method == SDKPass_Pointer) if (method == SDKPass_Pointer || method == SDKPass_ByRef)
{ {
type = PassType_Basic; type = PassType_Basic;
if (vtype == Valve_POD if (vtype == Valve_POD
|| vtype == Valve_Float || vtype == Valve_Float
|| vtype == Valve_Bool) || vtype == Valve_Bool)
{ {
flags = PASSFLAG_ASPOINTER; flags = PASSFLAG_BYVAL | PASSFLAG_ASPOINTER;
} else { } else {
flags = PASSFLAG_BYVAL; flags = PASSFLAG_BYVAL;
} }
@ -72,15 +72,6 @@ inline void DecodePassMethod(ValveType vtype, SDKPassMethod method, PassType &ty
type = PassType_Basic; type = PassType_Basic;
} }
flags = PASSFLAG_BYVAL; flags = PASSFLAG_BYVAL;
} else if (method == SDKPass_ByRef) {
if (vtype == Valve_Vector
|| vtype == Valve_QAngle)
{
type = PassType_Object;
} else {
type = PassType_Basic;
}
flags = PASSFLAG_BYREF;
} }
} }
@ -193,10 +184,17 @@ static cell_t PrepSDKCall_AddParameter(IPluginContext *pContext, const cell_t *p
ValvePassInfo *info = &s_params[s_numparams++]; ValvePassInfo *info = &s_params[s_numparams++];
info->vtype = (ValveType)params[1]; info->vtype = (ValveType)params[1];
DecodePassMethod(info->vtype, (SDKPassMethod)params[2], info->type, info->flags); SDKPassMethod method = (SDKPassMethod)params[2];
DecodePassMethod(info->vtype, method, info->type, info->flags);
info->decflags = params[3] | VDECODE_FLAG_BYREF; info->decflags = params[3] | VDECODE_FLAG_BYREF;
info->encflags = params[4]; info->encflags = params[4];
/* Since SDKPass_ByRef acts like SDKPass_Pointer we can't allow NULL, just in case */
if (method == SDKPass_ByRef)
{
info->decflags &= ~VDECODE_FLAG_ALLOWNULL;
}
return 1; return 1;
} }
@ -406,14 +404,14 @@ static cell_t SDKCall(IPluginContext *pContext, const cell_t *params)
return engine->IndexOfEdict(pEdict); return engine->IndexOfEdict(pEdict);
} else if (vc->retinfo->vtype == Valve_Bool) { } else if (vc->retinfo->vtype == Valve_Bool) {
bool *addr = (bool *)vc->retbuf; bool *addr = (bool *)vc->retbuf;
if (vc->retinfo->flags & PASSFLAG_BYREF) if (vc->retinfo->flags & PASSFLAG_ASPOINTER)
{ {
addr = *(bool **)addr; addr = *(bool **)addr;
} }
return *addr ? 1 : 0; return *addr ? 1 : 0;
} else { } else {
cell_t *addr = (cell_t *)vc->retbuf; cell_t *addr = (cell_t *)vc->retbuf;
if (vc->retinfo->flags & PASSFLAG_BYREF) if (vc->retinfo->flags & PASSFLAG_ASPOINTER)
{ {
addr = *(cell_t **)addr; addr = *(cell_t **)addr;
} }

View File

@ -114,6 +114,7 @@ size_t ValveParamToBinParam(ValveType type,
info->flags = flags; info->flags = flags;
if (flags & PASSFLAG_ASPOINTER) if (flags & PASSFLAG_ASPOINTER)
{ {
needs_extra = true;
info->size = sizeof(int *); info->size = sizeof(int *);
return sizeof(int *) + sizeof(int); return sizeof(int *) + sizeof(int);
} else { } else {
@ -127,6 +128,7 @@ size_t ValveParamToBinParam(ValveType type,
info->flags = flags; info->flags = flags;
if (flags & PASSFLAG_ASPOINTER) if (flags & PASSFLAG_ASPOINTER)
{ {
needs_extra = true;
info->size = sizeof(bool *); info->size = sizeof(bool *);
return sizeof(bool *) + sizeof(bool); return sizeof(bool *) + sizeof(bool);
} else { } else {
@ -136,13 +138,15 @@ size_t ValveParamToBinParam(ValveType type,
} }
case Valve_Float: case Valve_Float:
{ {
info->type = PassType_Float;
info->flags = flags; info->flags = flags;
if (flags & PASSFLAG_ASPOINTER) if (flags & PASSFLAG_ASPOINTER)
{ {
needs_extra = true;
info->type = PassType_Basic;
info->size = sizeof(float *); info->size = sizeof(float *);
return sizeof(float *) + sizeof(float); return sizeof(float *) + sizeof(float);
} else { } else {
info->type = PassType_Float;
info->size = sizeof(float); info->size = sizeof(float);
return sizeof(float); return sizeof(float);
} }
@ -167,7 +171,7 @@ DataStatus EncodeValveParam(IPluginContext *pContext,
if (data->type == PassType_Basic) if (data->type == PassType_Basic)
{ {
v = *(Vector **)((unsigned char *)buffer + sizeof(Vector *)); v = *(Vector **)buffer;
} else if (data->type == PassType_Object) { } else if (data->type == PassType_Object) {
v = (Vector *)buffer; v = (Vector *)buffer;
} }
@ -187,7 +191,7 @@ DataStatus EncodeValveParam(IPluginContext *pContext,
if (data->type == PassType_Basic) if (data->type == PassType_Basic)
{ {
q = *(QAngle **)((unsigned char *)buffer + sizeof(QAngle *)); q = *(QAngle **)buffer;
} else if (data->type == PassType_Object) { } else if (data->type == PassType_Object) {
q = (QAngle *)buffer; q = (QAngle *)buffer;
} }
@ -241,7 +245,7 @@ DataStatus EncodeValveParam(IPluginContext *pContext,
if (data->flags & PASSFLAG_ASPOINTER) if (data->flags & PASSFLAG_ASPOINTER)
{ {
buffer = (char *)buffer + sizeof(void *); buffer = *(cell_t **)buffer;
} }
*addr = *(cell_t *)buffer; *addr = *(cell_t *)buffer;
@ -255,7 +259,7 @@ DataStatus EncodeValveParam(IPluginContext *pContext,
if (data->flags & PASSFLAG_ASPOINTER) if (data->flags & PASSFLAG_ASPOINTER)
{ {
buffer = (char *)buffer + sizeof(bool *); buffer = *(bool **)buffer;
} }
*addr = *(bool *)buffer ? 1 : 0; *addr = *(bool *)buffer ? 1 : 0;
@ -565,7 +569,7 @@ DataStatus DecodeValveParam(IPluginContext *pContext,
} }
if (data->flags & PASSFLAG_ASPOINTER) if (data->flags & PASSFLAG_ASPOINTER)
{ {
*(void **)buffer = (char *)buffer + sizeof(void *); *(void **)buffer = (unsigned char *)_buffer + pCall->stackEnd + data->obj_offset;
buffer = *(void **)buffer; buffer = *(void **)buffer;
} }
*(cell_t *)buffer = param; *(cell_t *)buffer = param;
@ -581,7 +585,7 @@ DataStatus DecodeValveParam(IPluginContext *pContext,
} }
if (data->flags & PASSFLAG_ASPOINTER) if (data->flags & PASSFLAG_ASPOINTER)
{ {
*(bool **)buffer = (bool *)((char *)buffer + sizeof(bool *)); *(bool **)buffer = (bool *)((unsigned char *)_buffer + pCall->stackEnd + data->obj_offset);
buffer = *(bool **)buffer; buffer = *(bool **)buffer;
} }
*(bool *)buffer = param ? true : false; *(bool *)buffer = param ? true : false;