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:
Bill Currie 2020-02-25 17:28:32 +09:00
parent e3953be8f8
commit a55b9544ac
16 changed files with 25 additions and 1 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -1640,6 +1640,7 @@ op_call:
watch->integer_var);
}
exit_program:
pr->pr_argc = 0;
Sys_PopErrorHandler ();
Sys_PopSignalHook ();
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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