fixed up a callfunc issue and added copyback parameter

This commit is contained in:
David Anderson 2006-09-10 02:30:10 +00:00
parent 418efa4088
commit 77e4d85002
3 changed files with 47 additions and 14 deletions

View File

@ -3055,6 +3055,7 @@ struct CallFunc_ParamInfo
cell byrefAddr; // byref address in caller plugin cell byrefAddr; // byref address in caller plugin
cell size; // byref size cell size; // byref size
cell *alloc; // allocated block cell *alloc; // allocated block
bool copyback; // copy back?
}; };
#if !defined CALLFUNC_MAXPARAMS #if !defined CALLFUNC_MAXPARAMS
@ -3262,17 +3263,20 @@ static cell AMX_NATIVE_CALL callfunc_end(AMX *amx, cell *params)
if (gparamInfo[i].flags & CALLFUNC_FLAG_BYREF) if (gparamInfo[i].flags & CALLFUNC_FLAG_BYREF)
{ {
// copy back so that references work // copy back so that references work
AMX *amxCaller = curPlugin->getAMX();
AMX *amxCalled = plugin->getAMX(); AMX *amxCalled = plugin->getAMX();
AMX_HEADER *hdrCaller = (AMX_HEADER *)amxCaller->base;
AMX_HEADER *hdrCalled = (AMX_HEADER *)amxCalled->base; if (gparamInfo[i].copyback)
{
memcpy( /** DEST ADDR **/ AMX *amxCaller = curPlugin->getAMX();
(amxCaller->data ? amxCaller->data : (amxCaller->base + hdrCaller->dat)) + gparamInfo[i].byrefAddr, AMX_HEADER *hdrCaller = (AMX_HEADER *)amxCaller->base;
/** SOURCE ADDR **/ AMX_HEADER *hdrCalled = (AMX_HEADER *)amxCalled->base;
(amxCalled->data ? amxCalled->data : (amxCalled->base + hdrCalled->dat)) + gparams[i], memcpy( /** DEST ADDR **/
/** SIZE **/ (amxCaller->data ? amxCaller->data : (amxCaller->base + hdrCaller->dat)) + gparamInfo[i].byrefAddr,
gparamInfo[i].size * sizeof(cell)); /** SOURCE ADDR **/
(amxCalled->data ? amxCalled->data : (amxCalled->base + hdrCalled->dat)) + gparams[i],
/** SIZE **/
gparamInfo[i].size * sizeof(cell));
}
// free memory used for params passed by reference // free memory used for params passed by reference
amx_Release(amxCalled, gparams[i]); amx_Release(amxCalled, gparams[i]);
@ -3334,6 +3338,7 @@ static cell AMX_NATIVE_CALL callfunc_push_byref(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = true;
g_CallFunc_Params[g_CallFunc_CurParam++] = i; /* referenced parameter */ g_CallFunc_Params[g_CallFunc_CurParam++] = i; /* referenced parameter */
return 0; return 0;
} }
@ -3351,12 +3356,13 @@ static cell AMX_NATIVE_CALL callfunc_push_byref(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = true;
g_CallFunc_Params[g_CallFunc_CurParam++] = 0; g_CallFunc_Params[g_CallFunc_CurParam++] = 0;
return 0; return 0;
} }
// native callfunc_push_array(array[], size) // native callfunc_push_array(array[], size, [copyback])
static cell AMX_NATIVE_CALL callfunc_push_array(AMX *amx, cell *params) static cell AMX_NATIVE_CALL callfunc_push_array(AMX *amx, cell *params)
{ {
if (!g_CallFunc_Plugin) if (!g_CallFunc_Plugin)
@ -3382,6 +3388,7 @@ static cell AMX_NATIVE_CALL callfunc_push_array(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = g_CallFunc_ParamInfo[i].copyback;
g_CallFunc_Params[g_CallFunc_CurParam++] = i; /* referenced parameter */ g_CallFunc_Params[g_CallFunc_CurParam++] = i; /* referenced parameter */
return 0; return 0;
} }
@ -3402,6 +3409,14 @@ static cell AMX_NATIVE_CALL callfunc_push_array(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = array_size; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = array_size;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr;
if (params[0] / sizeof(cell) >= 3)
{
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = params[3] ? true : false;
} else {
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = true;
}
g_CallFunc_Params[g_CallFunc_CurParam++] = 0; g_CallFunc_Params[g_CallFunc_CurParam++] = 0;
return 0; return 0;
@ -3433,6 +3448,7 @@ static cell AMX_NATIVE_CALL callfunc_push_str(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = 1;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = NULL;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = g_CallFunc_ParamInfo[i].copyback;
g_CallFunc_Params[g_CallFunc_CurParam++] = i; g_CallFunc_Params[g_CallFunc_CurParam++] = i;
// we are done // we are done
return 0; return 0;
@ -3457,6 +3473,14 @@ static cell AMX_NATIVE_CALL callfunc_push_str(AMX *amx, cell *params)
g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1]; g_CallFunc_ParamInfo[g_CallFunc_CurParam].byrefAddr = params[1];
g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = len + 1; g_CallFunc_ParamInfo[g_CallFunc_CurParam].size = len + 1;
g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr; g_CallFunc_ParamInfo[g_CallFunc_CurParam].alloc = phys_addr;
if (params[0] / sizeof(cell) >= 3)
{
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = params[3] ? true : false;
} else {
g_CallFunc_ParamInfo[g_CallFunc_CurParam].copyback = true;
}
g_CallFunc_Params[g_CallFunc_CurParam++] = 0; g_CallFunc_Params[g_CallFunc_CurParam++] = 0;
return 0; return 0;

View File

@ -649,11 +649,16 @@ native get_func_id(const funcName[], pluginId = -1);
* can be modified by the called function. * can be modified by the called function.
*/ */
native callfunc_push_int(value); native callfunc_push_int(value);
native callfunc_push_str(VALUE[]);
native callfunc_push_float(Float: value); native callfunc_push_float(Float: value);
native callfunc_push_intrf(&value); native callfunc_push_intrf(&value);
native callfunc_push_floatrf(& Float: value); native callfunc_push_floatrf(& Float: value);
native callfunc_push_array(VALUE[], array_size);
/* If copyback is 1 (default), any changes are copied back.
* Note that this will defy the 'const' specifier for push_str(),
* which is only kept for special backwards compatibility.
*/
native callfunc_push_str(const VALUE[], bool:copyback=true);
native callfunc_push_array(VALUE[], array_size, bool:copyback=true);
/* Make the actual call. /* Make the actual call.
* Return value of the function called. */ * Return value of the function called. */

View File

@ -7,7 +7,7 @@ public plugin_init()
register_srvcmd("test_callfunc", "Command_Callfunc") register_srvcmd("test_callfunc", "Command_Callfunc")
} }
public OnCallfuncReceived(num, str[], &val, array[], array2[], size) public OnCallfuncReceived(num, str[], &val, array[], array2[], size, hello2[1])
{ {
server_print("num = %d (expected: %d)", num, 5) server_print("num = %d (expected: %d)", num, 5)
server_print("str[] = ^"%s^" (expected: %s)", str, "Gaben") server_print("str[] = ^"%s^" (expected: %s)", str, "Gaben")
@ -25,12 +25,14 @@ public OnCallfuncReceived(num, str[], &val, array[], array2[], size)
} }
array[0] = 5 array[0] = 5
array2[1] = 6 array2[1] = 6
hello2[0] = 25
} }
public Command_Callfunc() public Command_Callfunc()
{ {
new a = 62 new a = 62
new hello[] = {0,1,2,3,4,5} new hello[] = {0,1,2,3,4,5}
new hello2[] = {9}
new pm = 6 new pm = 6
new err new err
@ -46,11 +48,13 @@ public Command_Callfunc()
callfunc_push_array(hello, pm) callfunc_push_array(hello, pm)
callfunc_push_array(hello, pm) callfunc_push_array(hello, pm)
callfunc_push_int(pm) callfunc_push_int(pm)
callfunc_push_array(hello2, 1, false)
callfunc_end() callfunc_end()
server_print("a = %d (expected: %d)", a, 15) server_print("a = %d (expected: %d)", a, 15)
server_print("hello[0] = %d (expected: %d)", hello[0], 5) server_print("hello[0] = %d (expected: %d)", hello[0], 5)
server_print("hello[1] = %d (expected: %d)", hello[1], 6) server_print("hello[1] = %d (expected: %d)", hello[1], 6)
server_print("hello2[0] = %d (expected: %d)", hello2[0], 9)
return PLUGIN_HANDLED return PLUGIN_HANDLED
} }