SDKTools Fixathon!
Fixed
amb647 - Returning objects by reference wasn't working
Various fixes for byref/pointer params and return values (including working copyback)
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;