SDKTools Fixathon!
authorScott Ehlert <ds@alliedmods.net>
Thu Jul 19 15:24:15 2007 +0000 (2007-07-19)
changeset 11351a04a48f0788
parent 1134 68e8b8d386ff
child 1136 022c6dfdb3c0
SDKTools Fixathon!

Fixed amb647 - Returning objects by reference wasn't working
Various fixes for byref/pointer params and return values (including working copyback)
extensions/sdktools/vcallbuilder.cpp
extensions/sdktools/vcaller.cpp
extensions/sdktools/vdecoder.cpp
     1.1 --- a/extensions/sdktools/vcallbuilder.cpp	Thu Jul 19 03:22:10 2007 +0000
     1.2 +++ b/extensions/sdktools/vcallbuilder.cpp	Thu Jul 19 15:24:15 2007 +0000
     1.3 @@ -97,10 +97,6 @@
     1.4  			return NULL;
     1.5  		}
     1.6  		retBufSize = retBuf.size;
     1.7 -		if (retbuf_needs_extra)
     1.8 -		{
     1.9 -			retBufSize += size;
    1.10 -		}
    1.11  	}
    1.12  
    1.13  	/* Get parameter info */
    1.14 @@ -255,10 +251,6 @@
    1.15  			return NULL;
    1.16  		}
    1.17  		retBufSize = retBuf.size;
    1.18 -		if (retbuf_needs_extra)
    1.19 -		{
    1.20 -			retBufSize += size;
    1.21 -		}
    1.22  	}
    1.23  
    1.24  	/* Get parameter info */
     2.1 --- a/extensions/sdktools/vcaller.cpp	Thu Jul 19 03:22:10 2007 +0000
     2.2 +++ b/extensions/sdktools/vcaller.cpp	Thu Jul 19 15:24:15 2007 +0000
     2.3 @@ -49,14 +49,14 @@
     2.4  
     2.5  inline void DecodePassMethod(ValveType vtype, SDKPassMethod method, PassType &type, unsigned int &flags)
     2.6  {
     2.7 -	if (method == SDKPass_Pointer)
     2.8 +	if (method == SDKPass_Pointer || method == SDKPass_ByRef)
     2.9  	{
    2.10  		type = PassType_Basic;
    2.11  		if (vtype == Valve_POD
    2.12  			|| vtype == Valve_Float
    2.13  			|| vtype == Valve_Bool)
    2.14  		{
    2.15 -			flags = PASSFLAG_ASPOINTER;
    2.16 +			flags = PASSFLAG_BYVAL | PASSFLAG_ASPOINTER;
    2.17  		} else {
    2.18  			flags = PASSFLAG_BYVAL;
    2.19  		}
    2.20 @@ -72,15 +72,6 @@
    2.21  			type = PassType_Basic;
    2.22  		}
    2.23  		flags = PASSFLAG_BYVAL;
    2.24 -	} else if (method == SDKPass_ByRef) {
    2.25 -		if (vtype == Valve_Vector
    2.26 -			|| vtype == Valve_QAngle)
    2.27 -		{
    2.28 -			type = PassType_Object;
    2.29 -		} else {
    2.30 -			type = PassType_Basic;
    2.31 -		}
    2.32 -		flags = PASSFLAG_BYREF;
    2.33  	}
    2.34  }
    2.35  
    2.36 @@ -193,10 +184,17 @@
    2.37  
    2.38  	ValvePassInfo *info = &s_params[s_numparams++];
    2.39  	info->vtype = (ValveType)params[1];
    2.40 -	DecodePassMethod(info->vtype, (SDKPassMethod)params[2], info->type, info->flags);
    2.41 +	SDKPassMethod method = (SDKPassMethod)params[2];
    2.42 +	DecodePassMethod(info->vtype, method, info->type, info->flags);
    2.43  	info->decflags = params[3] | VDECODE_FLAG_BYREF;
    2.44  	info->encflags = params[4];
    2.45  
    2.46 +	/* Since SDKPass_ByRef acts like SDKPass_Pointer we can't allow NULL, just in case */
    2.47 +	if (method == SDKPass_ByRef)
    2.48 +	{
    2.49 +		info->decflags &= ~VDECODE_FLAG_ALLOWNULL;
    2.50 +	}
    2.51 +
    2.52  	return 1;
    2.53  }
    2.54  
    2.55 @@ -406,14 +404,14 @@
    2.56  			return engine->IndexOfEdict(pEdict);
    2.57  		} else if (vc->retinfo->vtype == Valve_Bool) {
    2.58  			bool *addr = (bool  *)vc->retbuf;
    2.59 -			if (vc->retinfo->flags & PASSFLAG_BYREF)
    2.60 +			if (vc->retinfo->flags & PASSFLAG_ASPOINTER)
    2.61  			{
    2.62  				addr = *(bool **)addr;
    2.63  			}
    2.64  			return *addr ? 1 : 0;
    2.65  		} else {
    2.66  			cell_t *addr = (cell_t *)vc->retbuf;
    2.67 -			if (vc->retinfo->flags & PASSFLAG_BYREF)
    2.68 +			if (vc->retinfo->flags & PASSFLAG_ASPOINTER)
    2.69  			{
    2.70  				addr = *(cell_t **)addr;
    2.71  			}
     3.1 --- a/extensions/sdktools/vdecoder.cpp	Thu Jul 19 03:22:10 2007 +0000
     3.2 +++ b/extensions/sdktools/vdecoder.cpp	Thu Jul 19 15:24:15 2007 +0000
     3.3 @@ -114,6 +114,7 @@
     3.4  			info->flags = flags;
     3.5  			if (flags & PASSFLAG_ASPOINTER)
     3.6  			{
     3.7 +				needs_extra = true;
     3.8  				info->size = sizeof(int *);
     3.9  				return sizeof(int *) + sizeof(int);
    3.10  			} else {
    3.11 @@ -127,6 +128,7 @@
    3.12  			info->flags = flags;
    3.13  			if (flags & PASSFLAG_ASPOINTER)
    3.14  			{
    3.15 +				needs_extra = true;
    3.16  				info->size = sizeof(bool *);
    3.17  				return sizeof(bool *) + sizeof(bool);
    3.18  			} else {
    3.19 @@ -136,13 +138,15 @@
    3.20  		}
    3.21  	case Valve_Float:
    3.22  		{
    3.23 -			info->type = PassType_Float;
    3.24  			info->flags = flags;
    3.25  			if (flags & PASSFLAG_ASPOINTER)
    3.26  			{
    3.27 +				needs_extra = true;
    3.28 +				info->type = PassType_Basic;
    3.29  				info->size = sizeof(float *);
    3.30  				return sizeof(float *) + sizeof(float);
    3.31  			} else {
    3.32 +				info->type = PassType_Float;
    3.33  				info->size = sizeof(float);
    3.34  				return sizeof(float);
    3.35  			}
    3.36 @@ -167,7 +171,7 @@
    3.37  
    3.38  			if (data->type == PassType_Basic)
    3.39  			{
    3.40 -				v = *(Vector **)((unsigned char *)buffer + sizeof(Vector *));
    3.41 +				v = *(Vector **)buffer;
    3.42  			} else if (data->type == PassType_Object) {
    3.43  				v = (Vector *)buffer;
    3.44  			}
    3.45 @@ -187,7 +191,7 @@
    3.46  
    3.47  			if (data->type == PassType_Basic)
    3.48  			{
    3.49 -				q = *(QAngle **)((unsigned char *)buffer + sizeof(QAngle *));
    3.50 +				q = *(QAngle **)buffer;
    3.51  			} else if (data->type == PassType_Object) {
    3.52  				q = (QAngle *)buffer;
    3.53  			}
    3.54 @@ -241,7 +245,7 @@
    3.55  
    3.56  			if (data->flags & PASSFLAG_ASPOINTER)
    3.57  			{
    3.58 -				buffer = (char *)buffer + sizeof(void *);
    3.59 +				buffer = *(cell_t **)buffer;
    3.60  			}
    3.61  
    3.62  			*addr = *(cell_t *)buffer;
    3.63 @@ -255,7 +259,7 @@
    3.64  
    3.65  			if (data->flags & PASSFLAG_ASPOINTER)
    3.66  			{
    3.67 -				buffer = (char *)buffer + sizeof(bool *);
    3.68 +				buffer = *(bool **)buffer;
    3.69  			}
    3.70  
    3.71  			*addr = *(bool *)buffer ? 1 : 0;
    3.72 @@ -565,7 +569,7 @@
    3.73  			}
    3.74  			if (data->flags & PASSFLAG_ASPOINTER)
    3.75  			{
    3.76 -				*(void **)buffer = (char *)buffer + sizeof(void *);
    3.77 +				*(void **)buffer = (unsigned char *)_buffer + pCall->stackEnd + data->obj_offset;
    3.78  				buffer = *(void **)buffer;
    3.79  			}
    3.80  			*(cell_t *)buffer = param;
    3.81 @@ -581,7 +585,7 @@
    3.82  			}
    3.83  			if (data->flags & PASSFLAG_ASPOINTER)
    3.84  			{
    3.85 -				*(bool **)buffer = (bool *)((char *)buffer + sizeof(bool *));
    3.86 +				*(bool **)buffer = (bool *)((unsigned char *)_buffer + pCall->stackEnd + data->obj_offset);
    3.87  				buffer = *(bool **)buffer;
    3.88  			}
    3.89  			*(bool *)buffer = param ? true : false;