[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:
Bill Currie 2022-01-24 00:20:05 +09:00
parent a818fa4b8e
commit 9c51c3d2e1
38 changed files with 61 additions and 52 deletions

View file

@ -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

View file

@ -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);
}

View file

@ -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

View file

@ -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);

View file

@ -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 "

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -181,5 +181,5 @@ static builtin_t builtins[] = {
void
RUA_Key_Init (progs_t *pr)
{
PR_RegisterBuiltins (pr, builtins);
PR_RegisterBuiltins (pr, builtins, 0);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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");

View file

@ -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);
}

View file

@ -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

View file

@ -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);
}

View file

@ -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 ();

View file

@ -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

View file

@ -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);
}

View file

@ -110,5 +110,5 @@ static builtin_t builtins[] = {
void
BI_Init (progs_t *pr)
{
PR_RegisterBuiltins (pr, builtins);
PR_RegisterBuiltins (pr, builtins, 0);
}