mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-16 17:01:53 +00:00
Improve handling of pr_argc
It is now set to 0 when progs are loaded and every time PR_ExecuteProgram() returns. This takes care of the default case, but when setting parameters, pr_argc needs to be set correctly in case a vararg function is called.
This commit is contained in:
parent
e3953be8f8
commit
a55b9544ac
16 changed files with 25 additions and 1 deletions
|
@ -23,6 +23,7 @@ call_progs_main (progs_t *pr, int argc, const char **argv)
|
|||
PR_RESET_PARAMS (pr);
|
||||
P_INT (pr, 0) = argc;
|
||||
P_POINTER (pr, 1) = PR_SetPointer (pr, pr_argv);
|
||||
pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (pr, progs_main);
|
||||
PR_PopFrame (pr);
|
||||
PR_Zone_Free (pr, pr_argv);
|
||||
|
|
|
@ -1732,7 +1732,7 @@ struct progs_s {
|
|||
|
||||
/// \name execution state
|
||||
///@{
|
||||
int pr_argc;
|
||||
int pr_argc; //FIXME need a good way to ensure it is correct
|
||||
|
||||
qboolean pr_trace;
|
||||
int pr_trace_depth;
|
||||
|
|
|
@ -130,9 +130,11 @@ bi_inputline_enter (inputline_t *il)
|
|||
P_POINTER (pr, 0) = data->data[0];
|
||||
P_POINTER (pr, 1) = data->data[1];
|
||||
P_STRING (pr, 2) = PR_SetTempString (pr, line);
|
||||
pr->pr_argc = 3;
|
||||
} else {
|
||||
P_STRING (pr, 0) = PR_SetTempString (pr, line);
|
||||
P_POINTER (pr, 1) = data->data[0];
|
||||
pr->pr_argc = 2;
|
||||
}
|
||||
PR_ExecuteProgram (pr, data->enter);
|
||||
PR_PopFrame (pr);
|
||||
|
|
|
@ -439,6 +439,7 @@ bi_Menu_Enter (progs_t *pr)
|
|||
P_STRING (&menu_pr_state, 0) =
|
||||
PR_SetTempString (&menu_pr_state, item->text);
|
||||
P_INT (&menu_pr_state, 1) = 0;
|
||||
pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (&menu_pr_state, item->func);
|
||||
PR_PopFrame (&menu_pr_state);
|
||||
run_menu_post ();
|
||||
|
@ -672,6 +673,7 @@ Menu_Draw (view_t *view)
|
|||
PR_RESET_PARAMS (&menu_pr_state);
|
||||
P_INT (&menu_pr_state, 0) = x;
|
||||
P_INT (&menu_pr_state, 1) = y;
|
||||
menu_pr_state.pr_argc = 2;
|
||||
PR_ExecuteProgram (&menu_pr_state, menu->draw);
|
||||
ret = R_INT (&menu_pr_state);
|
||||
run_menu_post ();
|
||||
|
@ -706,6 +708,7 @@ Menu_Draw (view_t *view)
|
|||
PR_RESET_PARAMS (&menu_pr_state);
|
||||
P_INT (&menu_pr_state, 0) = x + item->x;
|
||||
P_INT (&menu_pr_state, 1) = y + item->y;
|
||||
menu_pr_state.pr_argc = 2;
|
||||
PR_ExecuteProgram (&menu_pr_state, menu->cursor);
|
||||
run_menu_post ();
|
||||
} else {
|
||||
|
@ -738,6 +741,7 @@ Menu_KeyEvent (knum_t key, short unicode, qboolean down)
|
|||
P_INT (&menu_pr_state, 0) = key;
|
||||
P_INT (&menu_pr_state, 1) = unicode;
|
||||
P_INT (&menu_pr_state, 2) = down;
|
||||
menu_pr_state.pr_argc = 3;
|
||||
PR_ExecuteProgram (&menu_pr_state, menu->keyevent);
|
||||
ret = R_INT (&menu_pr_state);
|
||||
run_menu_post ();
|
||||
|
@ -752,6 +756,7 @@ Menu_KeyEvent (knum_t key, short unicode, qboolean down)
|
|||
P_STRING (&menu_pr_state, 0) = PR_SetTempString (&menu_pr_state,
|
||||
item->text);
|
||||
P_INT (&menu_pr_state, 1) = key;
|
||||
menu_pr_state.pr_argc = 2;
|
||||
PR_ExecuteProgram (&menu_pr_state, item->func);
|
||||
PR_PopFrame (&menu_pr_state);
|
||||
ret = R_INT (&menu_pr_state);
|
||||
|
|
|
@ -1640,6 +1640,7 @@ op_call:
|
|||
watch->integer_var);
|
||||
}
|
||||
exit_program:
|
||||
pr->pr_argc = 0;
|
||||
Sys_PopErrorHandler ();
|
||||
Sys_PopSignalHook ();
|
||||
}
|
||||
|
|
|
@ -336,6 +336,7 @@ PR_LoadProgsFile (progs_t *pr, QFile *file, int size)
|
|||
pr->pr_xstatement = 0;
|
||||
pr->pr_depth = 0;
|
||||
pr->localstack_used = 0;
|
||||
pr->pr_argc = 0;
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
|
|
|
@ -524,6 +524,7 @@ ED_LoadFromFile (progs_t *pr, const char *data)
|
|||
PR_PushFrame (pr);
|
||||
PR_RESET_PARAMS (pr);
|
||||
P_INT (pr, 0) = PR_SetTempString (pr, data);
|
||||
pr->pr_argc = 1;
|
||||
PR_ExecuteProgram (pr, pr->edict_parse);
|
||||
PR_PopFrame (pr);
|
||||
return;
|
||||
|
|
|
@ -91,6 +91,7 @@ bi_gib_builtin_f (void)
|
|||
PR_RESET_PARAMS (builtin->pr);
|
||||
P_INT (builtin->pr, 0) = GIB_Argc();
|
||||
P_INT (builtin->pr, 1) = PR_SetPointer (builtin->pr, pr_list);
|
||||
builtin->pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (builtin->pr, builtin->func);
|
||||
PR_PopFrame (builtin->pr);
|
||||
PR_Zone_Free (builtin->pr, pr_list);
|
||||
|
|
|
@ -98,6 +98,7 @@ bi_get_key (const void *key, void *_ht)
|
|||
PR_RESET_PARAMS (ht->pr);
|
||||
P_INT (ht->pr, 0) = (intptr_t) (key);
|
||||
P_INT (ht->pr, 1) = ht->ud;
|
||||
ht->pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (ht->pr, ht->gk);
|
||||
return PR_GetString (ht->pr, R_STRING (ht->pr));
|
||||
}
|
||||
|
@ -109,6 +110,7 @@ bi_get_hash (const void *key, void *_ht)
|
|||
PR_RESET_PARAMS (ht->pr);
|
||||
P_INT (ht->pr, 0) = (intptr_t) (key);
|
||||
P_INT (ht->pr, 1) = ht->ud;
|
||||
ht->pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (ht->pr, ht->gh);
|
||||
return R_INT (ht->pr);
|
||||
}
|
||||
|
@ -121,6 +123,7 @@ bi_compare (const void *key1, const void *key2, void *_ht)
|
|||
P_INT (ht->pr, 0) = (intptr_t) (key1);
|
||||
P_INT (ht->pr, 1) = (intptr_t) (key2);
|
||||
P_INT (ht->pr, 2) = ht->ud;
|
||||
ht->pr->pr_argc = 3;
|
||||
PR_ExecuteProgram (ht->pr, ht->cmp);
|
||||
return R_INT (ht->pr);
|
||||
}
|
||||
|
@ -132,6 +135,7 @@ bi_free (void *key, void *_ht)
|
|||
PR_RESET_PARAMS (ht->pr);
|
||||
P_INT (ht->pr, 0) = (intptr_t) (key);
|
||||
P_INT (ht->pr, 1) = ht->ud;
|
||||
ht->pr->pr_argc = 2;
|
||||
PR_ExecuteProgram (ht->pr, ht->f);
|
||||
}
|
||||
|
||||
|
|
|
@ -950,6 +950,7 @@ SV_SetLocalinfo (const char *key, const char *value)
|
|||
P_STRING (&sv_pr_state, 0) = PR_SetTempString (&sv_pr_state, key);
|
||||
P_STRING (&sv_pr_state, 1) = PR_SetTempString (&sv_pr_state, oldvalue);
|
||||
P_STRING (&sv_pr_state, 2) = PR_SetTempString (&sv_pr_state, value);
|
||||
sv_pr_state.pr_argc = 3;
|
||||
PR_ExecuteProgram (&sv_pr_state, sv_funcs.LocalinfoChanged);
|
||||
PR_PopFrame (&sv_pr_state);
|
||||
}
|
||||
|
|
|
@ -822,6 +822,7 @@ cpqw_user_cmd (void)
|
|||
P_STRING (pr, i) = PR_SetTempString (pr, Cmd_Argv (i - 1));
|
||||
for (; i < 7; i++)
|
||||
P_STRING (pr, i) = 0;
|
||||
pr->pr_argc = 7;
|
||||
PR_ExecuteProgram (pr, cpqw_funcs.ClientCommand);
|
||||
PR_PopFrame (pr);
|
||||
return (int) R_FLOAT (pr);
|
||||
|
|
|
@ -353,6 +353,7 @@ PF_calltimeofday (progs_t *pr)
|
|||
P_FLOAT (pr, 5) = (float) date.year;
|
||||
P_STRING (pr, 6) = PR_SetReturnString (pr, date.str);
|
||||
|
||||
pr->pr_argc = 7;
|
||||
PR_ExecuteProgram (pr, (func_t) (f - sv_pr_state.pr_functions));
|
||||
PR_PopFrame (&sv_pr_state);
|
||||
}
|
||||
|
|
|
@ -1211,6 +1211,7 @@ SV_SetUserinfo (client_t *client, const char *key, const char *value)
|
|||
P_STRING (&sv_pr_state, 0) = PR_SetTempString (&sv_pr_state, key);
|
||||
P_STRING (&sv_pr_state, 1) = PR_SetTempString (&sv_pr_state, oldvalue);
|
||||
P_STRING (&sv_pr_state, 2) = PR_SetTempString (&sv_pr_state, value);
|
||||
sv_pr_state.pr_argc = 3;
|
||||
PR_ExecuteProgram (&sv_pr_state, sv_funcs.UserInfoChanged);
|
||||
PR_PopFrame (&sv_pr_state);
|
||||
send_changes = !R_FLOAT (&sv_pr_state);
|
||||
|
@ -1261,6 +1262,7 @@ SV_SetInfo_f (void *unused)
|
|||
PR_RESET_PARAMS (&sv_pr_state);
|
||||
P_STRING (&sv_pr_state, 0) = PR_SetTempString (&sv_pr_state, key);
|
||||
P_STRING (&sv_pr_state, 1) = PR_SetTempString (&sv_pr_state, value);
|
||||
sv_pr_state.pr_argc = 2;
|
||||
PR_ExecuteProgram (&sv_pr_state, sv_funcs.UserInfoCallback);
|
||||
PR_PopFrame (&sv_pr_state);
|
||||
if (R_FLOAT (&sv_pr_state))
|
||||
|
|
|
@ -266,6 +266,7 @@ main (int argc, char **argv)
|
|||
PR_RESET_PARAMS (&pr);
|
||||
P_INT (&pr, 0) = pr_argc;
|
||||
P_POINTER (&pr, 1) = PR_SetPointer (&pr, pr_argv);
|
||||
pr.pr_argc = 2;
|
||||
PR_ExecuteProgram (&pr, main_func);
|
||||
PR_PopFrame (&pr);
|
||||
if (options.flote)
|
||||
|
|
|
@ -177,6 +177,7 @@ main (int argc, char **argv)
|
|||
PR_RESET_PARAMS (&pr);
|
||||
P_INT (&pr, 0) = pr_argc;
|
||||
P_POINTER (&pr, 1) = PR_SetPointer (&pr, pr_argv);
|
||||
pr.pr_argc = 2;
|
||||
PR_ExecuteProgram (&pr, main_func);
|
||||
PR_PopFrame (&pr);
|
||||
return R_INT (&pr);
|
||||
|
|
|
@ -189,6 +189,7 @@ main (int argc, const char **argv)
|
|||
PR_RESET_PARAMS (&pr);
|
||||
P_INT (&pr, 0) = pr_argc;
|
||||
P_POINTER (&pr, 1) = PR_SetPointer (&pr, pr_argv);
|
||||
pr.pr_argc = 2;
|
||||
PR_ExecuteProgram (&pr, main_func);
|
||||
PR_PopFrame (&pr);
|
||||
return R_INT (&pr);
|
||||
|
|
Loading…
Reference in a new issue