mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-21 18:01:15 +00:00
[gamecode] Add a data pointer passed to builtin functions
This is part of the work for #26 (Record resource pointer with builtin function data). Currently, the data pointer gets as far as the per-instance VM function table (I don't feel like tackling the job of converting all the builtin functions tonight). All the builtin modules that register a resources data block pass that block on to PR_RegisterBuiltins.
This commit is contained in:
parent
a818fa4b8e
commit
9c51c3d2e1
38 changed files with 61 additions and 52 deletions
|
@ -1208,6 +1208,9 @@ typedef struct {
|
|||
/// The encoding is the same as for progs functions, with 3:5 for
|
||||
/// alignment:size (size 0 means 32 words).
|
||||
dparmsize_t params[PR_MAX_PARAMS];
|
||||
|
||||
/// Data passed to builtin functions. Set by PR_RegisterBuiltins
|
||||
void *data;
|
||||
} builtin_t;
|
||||
|
||||
#define PR_PARAM(type) { \
|
||||
|
@ -1238,6 +1241,7 @@ typedef struct {
|
|||
// arugments, or they'll be modified to do the right thing.
|
||||
pr_ushort_t param_offsets[PR_MAX_PARAMS];
|
||||
builtin_proc func;
|
||||
void *data; ///< extra data passed to the builtin
|
||||
};
|
||||
};
|
||||
} bfunction_t;
|
||||
|
@ -1247,8 +1251,10 @@ typedef struct {
|
|||
for the same VM, but redefining a builtin is an error.
|
||||
\param pr pointer to ::progs_t VM struct
|
||||
\param builtins array of builtin_t builtins
|
||||
\param data pointer to builtin-specific data. Usually the resources
|
||||
struct registered with PR_Resources_Register
|
||||
*/
|
||||
void PR_RegisterBuiltins (progs_t *pr, builtin_t *builtins);
|
||||
void PR_RegisterBuiltins (progs_t *pr, builtin_t *builtins, void *data);
|
||||
|
||||
/** Lookup a builtin function referred by name.
|
||||
\param pr pointer to ::progs_t VM struct
|
||||
|
|
|
@ -57,5 +57,5 @@ static builtin_t builtins[] = {
|
|||
VISIBLE void
|
||||
S_Progs_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -328,7 +328,7 @@ InputLine_Progs_Init (progs_t *pr)
|
|||
il_resources_t *res = calloc (1, sizeof (il_resources_t));
|
||||
|
||||
PR_Resources_Register (pr, "InputLine", res, bi_il_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -599,7 +599,7 @@ Menu_Init (void)
|
|||
|
||||
menu_hash = Hash_NewTable (61, menu_get_key, menu_free, 0, 0);
|
||||
|
||||
PR_RegisterBuiltins (&menu_pr_state, builtins);
|
||||
PR_RegisterBuiltins (&menu_pr_state, builtins, 0);
|
||||
|
||||
RUA_Init (&menu_pr_state, 3);
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ bi_no_function (progs_t *pr)
|
|||
}
|
||||
|
||||
VISIBLE void
|
||||
PR_RegisterBuiltins (progs_t *pr, builtin_t *builtins)
|
||||
PR_RegisterBuiltins (progs_t *pr, builtin_t *builtins, void *data)
|
||||
{
|
||||
builtin_t *bi;
|
||||
int count;
|
||||
|
@ -135,21 +135,25 @@ PR_RegisterBuiltins (progs_t *pr, builtin_t *builtins)
|
|||
builtins = bi;
|
||||
|
||||
while (builtins->name) {
|
||||
if (builtins->binum == 0 || builtins->binum >= PR_AUTOBUILTIN)
|
||||
if (builtins->binum == 0 || builtins->binum >= PR_AUTOBUILTIN) {
|
||||
PR_Error (pr, "bad builtin number: %s = #%d", builtins->name,
|
||||
builtins->binum);
|
||||
}
|
||||
|
||||
if (builtins->binum < 0)
|
||||
if (builtins->binum < 0) {
|
||||
builtins->binum = builtin_next (pr);
|
||||
}
|
||||
|
||||
if ((bi = Hash_Find (pr->builtin_hash, builtins->name))
|
||||
|| (bi = Hash_FindElement (pr->builtin_num_hash, builtins)))
|
||||
|| (bi = Hash_FindElement (pr->builtin_num_hash, builtins))) {
|
||||
PR_Error (pr, "builtin %s = #%d already defined (%s = #%d)",
|
||||
builtins->name, builtins->binum,
|
||||
bi->name, bi->binum);
|
||||
}
|
||||
|
||||
Hash_Add (pr->builtin_hash, builtins);
|
||||
Hash_AddElement (pr->builtin_num_hash, builtins);
|
||||
builtins->data = data;
|
||||
|
||||
builtins++;
|
||||
}
|
||||
|
@ -231,6 +235,9 @@ PR_RelocateBuiltins (progs_t *pr)
|
|||
}
|
||||
func->first_statement = desc->first_statement;
|
||||
func->func = proc;
|
||||
if (bi) {
|
||||
func->data = bi->data;
|
||||
}
|
||||
}
|
||||
if (bad) {
|
||||
Sys_Printf ("PR_RelocateBuiltins: %s: progs may not work due to "
|
||||
|
|
|
@ -193,11 +193,10 @@ GIB_Progs_Init (progs_t *pr)
|
|||
bi_gib_resources_t *res = malloc (sizeof (bi_gib_resources_t));
|
||||
res->builtins = 0;
|
||||
|
||||
PR_Resources_Register (pr, "GIB", res, bi_gib_builtin_clear);
|
||||
|
||||
bi_gib_builtins = Hash_NewTable (1021, bi_gib_builtin_get_key,
|
||||
bi_gib_builtin_free, 0,
|
||||
pr->hashlink_freelist);
|
||||
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_Resources_Register (pr, "GIB", res, bi_gib_builtin_clear);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -628,5 +628,5 @@ static builtin_t builtins[] = {
|
|||
VISIBLE void
|
||||
PR_Cmds_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -109,7 +109,7 @@ RUA_Cbuf_Init (progs_t *pr, int secure)
|
|||
{
|
||||
cbuf_resources_t *res = calloc (sizeof (cbuf_resources_t), 1);
|
||||
PR_Resources_Register (pr, "Cbuf", res, bi_cbuf_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -161,11 +161,11 @@ RUA_Cmd_Init (progs_t *pr, int secure)
|
|||
cmd_resources_t *res = calloc (1, sizeof (cmd_resources_t));
|
||||
|
||||
res->cmds = 0;
|
||||
PR_Resources_Register (pr, "Cmd", res, bi_cmd_clear);
|
||||
|
||||
if (!bi_cmds)
|
||||
bi_cmds = Hash_NewTable (1021, bi_cmd_get_key, bi_cmd_free, 0,
|
||||
pr->hashlink_freelist);
|
||||
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_Resources_Register (pr, "Cmd", res, bi_cmd_clear);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -257,6 +257,5 @@ RUA_Cvar_Init (progs_t *pr, int secure)
|
|||
|
||||
res->aliases = 0;
|
||||
PR_Resources_Register (pr, "Cvar", res, bi_cvar_clear);
|
||||
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -389,5 +389,5 @@ RUA_Hash_Init (progs_t *pr, int secure)
|
|||
res->tabs = 0;
|
||||
|
||||
PR_Resources_Register (pr, "Hash", res, bi_hash_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -497,17 +497,17 @@ void
|
|||
RUA_Input_Init (progs_t *pr, int secure)
|
||||
{
|
||||
input_resources_t *res = calloc (sizeof (input_resources_t), 1);
|
||||
PR_Resources_Register (pr, "input", res, bi_input_clear);
|
||||
|
||||
res->cookie_super = new_memsuper ();
|
||||
res->cookies = Hash_NewTable (251, 0, rua_in_free_cookie, res,
|
||||
&res->hash_links);
|
||||
Hash_SetHashCompare (res->cookies, rua_in_hash_cookie, rua_in_cmp_cookies);
|
||||
|
||||
PR_Resources_Register (pr, "input", res, bi_input_clear);
|
||||
if (secure & 2) {
|
||||
PR_RegisterBuiltins (pr, secure_builtins);
|
||||
PR_RegisterBuiltins (pr, secure_builtins, res);
|
||||
} else {
|
||||
PR_RegisterBuiltins (pr, insecure_builtins);
|
||||
PR_RegisterBuiltins (pr, insecure_builtins, res);
|
||||
}
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -181,5 +181,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_Key_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -375,5 +375,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_Math_Init (progs_t *pr, int secure)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -163,5 +163,5 @@ RUA_Mersenne_Init (progs_t *pr, int secure)
|
|||
mtwist_resources_t *res = calloc (1, sizeof (mtwist_resources_t));
|
||||
|
||||
PR_Resources_Register (pr, "Mersenne Twister", res, bi_mtwist_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -448,5 +448,5 @@ RUA_MsgBuf_Init (progs_t *pr, int secure)
|
|||
msgbuf_resources_t *res = calloc (sizeof (msgbuf_resources_t), 1);
|
||||
|
||||
PR_Resources_Register (pr, "MsgBuf", res, bi_msgbuf_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -2245,8 +2245,7 @@ RUA_Obj_Init (progs_t *pr, int secure)
|
|||
load_methods_compare);
|
||||
|
||||
PR_Resources_Register (pr, "RUA_ObjectiveQuakeC", probj, rua_obj_cleanup);
|
||||
|
||||
PR_RegisterBuiltins (pr, obj_methods);
|
||||
PR_RegisterBuiltins (pr, obj_methods, probj);
|
||||
|
||||
PR_AddLoadFunc (pr, rua_obj_init_runtime);
|
||||
}
|
||||
|
|
|
@ -479,5 +479,5 @@ RUA_Plist_Init (progs_t *pr, int secure)
|
|||
Hash_SetHashCompare (res->plist_tab, plist_get_hash, plist_compare);
|
||||
|
||||
PR_Resources_Register (pr, "plist", res, bi_plist_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -390,9 +390,9 @@ RUA_QFile_Init (progs_t *pr, int secure)
|
|||
|
||||
PR_Resources_Register (pr, "QFile", res, bi_qfile_clear);
|
||||
if (secure) {
|
||||
PR_RegisterBuiltins (pr, secure_builtins);
|
||||
PR_RegisterBuiltins (pr, secure_builtins, res);
|
||||
} else {
|
||||
PR_RegisterBuiltins (pr, insecure_builtins);
|
||||
PR_RegisterBuiltins (pr, insecure_builtins, res);
|
||||
}
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -206,5 +206,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_QFS_Init (progs_t *pr, int secure)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -80,5 +80,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_Runtime_Init (progs_t *pr, int secure)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -207,6 +207,5 @@ RUA_Script_Init (progs_t *pr, int secure)
|
|||
script_resources_t *res = calloc (1, sizeof (script_resources_t));
|
||||
|
||||
PR_Resources_Register (pr, "Script", res, bi_script_clear);
|
||||
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -747,5 +747,5 @@ RUA_Set_Init (progs_t *pr, int secure)
|
|||
res->sets = 0;
|
||||
|
||||
PR_Resources_Register (pr, "Set", res, res_set_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -171,5 +171,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_Stdlib_Init (progs_t *pr, int secure)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -309,5 +309,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
RUA_String_Init (progs_t *pr, int secure)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -353,5 +353,5 @@ R_Progs_Init (progs_t *pr)
|
|||
pr->hashlink_freelist);
|
||||
|
||||
PR_Resources_Register (pr, "Draw", res, bi_draw_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -1564,5 +1564,5 @@ SV_PR_Cmds_Init ()
|
|||
|
||||
PR_Cmds_Init (&sv_pr_state);
|
||||
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins);
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -2070,5 +2070,5 @@ SV_PR_Cmds_Init ()
|
|||
bi = PR_FindBuiltin (&sv_pr_state, "cvar");
|
||||
bi->proc = PF_sv_cvar;
|
||||
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins);
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins, 0);
|
||||
}
|
||||
|
|
|
@ -855,6 +855,6 @@ cpqw_load (progs_t *pr)
|
|||
void
|
||||
SV_PR_CPQW_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
PR_AddLoadFunc (pr, cpqw_load);
|
||||
}
|
||||
|
|
|
@ -589,6 +589,6 @@ qwe_load (progs_t *pr)
|
|||
void
|
||||
SV_PR_QWE_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
PR_AddLoadFunc (pr, qwe_load);
|
||||
}
|
||||
|
|
|
@ -2012,7 +2012,7 @@ SV_UserInit (void)
|
|||
{
|
||||
ucmd_table = Hash_NewTable (251, ucmds_getkey, ucmds_free, 0, 0);
|
||||
Hash_SetHashCompare (ucmd_table, ucmd_get_hash, ucmd_compare);
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins);
|
||||
PR_RegisterBuiltins (&sv_pr_state, builtins, 0);
|
||||
cl_rollspeed = Cvar_Get ("cl_rollspeed", "200", CVAR_NONE, NULL,
|
||||
"How quickly a player straightens out after "
|
||||
"strafing");
|
||||
|
|
|
@ -1957,6 +1957,6 @@ BI_Curses_Init (progs_t *pr)
|
|||
qwaq_init_pipe (&res->results);
|
||||
|
||||
PR_Resources_Register (pr, "curses", res, bi_curses_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
Sys_RegisterShutdown (bi_shutdown, pr);
|
||||
}
|
||||
|
|
|
@ -688,7 +688,7 @@ QWAQ_Debug_Init (progs_t *pr)
|
|||
|
||||
PR_AddLoadFunc (pr, qwaq_debug_load);
|
||||
PR_Resources_Register (pr, "qwaq-debug", debug, qwaq_debug_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, debug);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1066,5 +1066,5 @@ QWAQ_EditBuffer_Init (progs_t *pr)
|
|||
res->pr = pr;
|
||||
|
||||
PR_Resources_Register (pr, "qwaq-editbuffer", res, qwaq_ebresources_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
}
|
||||
|
|
|
@ -151,7 +151,7 @@ BI_Graphics_Init (progs_t *pr)
|
|||
qwaq_thread_t *thread = PR_Resources_Find (pr, "qwaq_thread");
|
||||
byte *basepal, *colormap;
|
||||
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
|
||||
QFS_Init (thread->hunk, "nq");
|
||||
PI_Init ();
|
||||
|
|
|
@ -184,7 +184,7 @@ static builtin_t common_builtins[] = {
|
|||
static void
|
||||
common_builtins_init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, common_builtins);
|
||||
PR_RegisterBuiltins (pr, common_builtins, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -916,6 +916,6 @@ BI_TermInput_Init (progs_t *pr)
|
|||
qwaq_init_cond (&res->events.cond);
|
||||
|
||||
PR_Resources_Register (pr, "input", res, bi_input_clear);
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, res);
|
||||
Sys_RegisterShutdown (bi_input_shutdown, pr);
|
||||
}
|
||||
|
|
|
@ -110,5 +110,5 @@ static builtin_t builtins[] = {
|
|||
void
|
||||
BI_Init (progs_t *pr)
|
||||
{
|
||||
PR_RegisterBuiltins (pr, builtins);
|
||||
PR_RegisterBuiltins (pr, builtins, 0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue