mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-30 08:20:40 +00:00
Allow nested use of PR_SaveParams()
PR_SaveParams() is required for implementing the +initialize diversion used by Objective-QuakeC because builtins do not have local def spaces (of course, a normal stack calling convention would help). However, it is entirely possible for a call to +initialize to trigger another call to +initialize, thus the need for stacking parameter stashes. As a bonus, this implementation cleans up some fields in progs_t.
This commit is contained in:
parent
99c818adcc
commit
9bb68f2d8c
4 changed files with 71 additions and 27 deletions
|
@ -72,37 +72,40 @@ PR_RunError (progs_t * pr, const char *error, ...)
|
|||
PR_Error (pr, "Program error: %s", string->str);
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
PR_SaveParams (progs_t *pr)
|
||||
VISIBLE pr_stashed_params_t *
|
||||
_PR_SaveParams (progs_t *pr, pr_stashed_params_t *params)
|
||||
{
|
||||
int i;
|
||||
int size = pr->pr_param_size * sizeof (pr_type_t);
|
||||
|
||||
pr->pr_param_ptrs[0] = pr->pr_params[0];
|
||||
pr->pr_param_ptrs[1] = pr->pr_params[1];
|
||||
params->param_ptrs[0] = pr->pr_params[0];
|
||||
params->param_ptrs[1] = pr->pr_params[1];
|
||||
pr->pr_params[0] = pr->pr_real_params[0];
|
||||
pr->pr_params[1] = pr->pr_real_params[1];
|
||||
for (i = 0; i < pr->pr_argc; i++) {
|
||||
memcpy (pr->pr_saved_params + i * pr->pr_param_size,
|
||||
memcpy (params->params + i * pr->pr_param_size,
|
||||
pr->pr_real_params[i], size);
|
||||
if (i < 2)
|
||||
memcpy (pr->pr_real_params[i], pr->pr_param_ptrs[0], size);
|
||||
if (i < 2) { //XXX FIXME what the what?!?
|
||||
memcpy (pr->pr_real_params[i], params->param_ptrs[0], size);
|
||||
}
|
||||
}
|
||||
pr->pr_saved_argc = pr->pr_argc;
|
||||
params->argc = pr->pr_argc;
|
||||
return params;
|
||||
}
|
||||
|
||||
VISIBLE void
|
||||
PR_RestoreParams (progs_t *pr)
|
||||
PR_RestoreParams (progs_t *pr, pr_stashed_params_t *params)
|
||||
{
|
||||
int i;
|
||||
int size = pr->pr_param_size * sizeof (pr_type_t);
|
||||
|
||||
pr->pr_params[0] = pr->pr_param_ptrs[0];
|
||||
pr->pr_params[1] = pr->pr_param_ptrs[1];
|
||||
pr->pr_argc = pr->pr_saved_argc;
|
||||
for (i = 0; i < pr->pr_argc; i++)
|
||||
pr->pr_params[0] = params->param_ptrs[0];
|
||||
pr->pr_params[1] = params->param_ptrs[1];
|
||||
pr->pr_argc = params->argc;
|
||||
for (i = 0; i < pr->pr_argc; i++) {
|
||||
memcpy (pr->pr_real_params[i],
|
||||
pr->pr_saved_params + i * pr->pr_param_size, size);
|
||||
params->params + i * pr->pr_param_size, size);
|
||||
}
|
||||
}
|
||||
|
||||
VISIBLE inline void
|
||||
|
|
|
@ -139,10 +139,6 @@ PR_ResolveGlobals (progs_t *pr)
|
|||
goto error;
|
||||
pr->pr_param_alignment = G_INT (pr, def->ofs);
|
||||
}
|
||||
if (pr->pr_saved_params)
|
||||
free (pr->pr_saved_params);
|
||||
pr->pr_saved_params = calloc (pr->pr_param_size * MAX_PARMS,
|
||||
sizeof (pr_type_t));
|
||||
memcpy (pr->pr_real_params, pr->pr_params, sizeof (pr->pr_params));
|
||||
if (!pr->globals.time) {
|
||||
if ((def = PR_FindGlobal (pr, "time")))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue