mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-18 06:51:47 +00:00
make a common call function and fix pr_trace such that it autoclears only when the execution session it's set in is exited
This is an imperfect revision of history.
This commit is contained in:
parent
201252c1c0
commit
780fb41858
5 changed files with 64 additions and 64 deletions
|
@ -330,6 +330,7 @@ static void
|
|||
PF_traceon (progs_t *pr)
|
||||
{
|
||||
pr->pr_trace = true;
|
||||
pr->pr_trace_depth = pr->pr_depth;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -112,12 +112,15 @@ PR_PopFrame (progs_t *pr)
|
|||
pr->pr_xtstr = frame->tstr;
|
||||
}
|
||||
|
||||
/*
|
||||
PR_EnterFunction
|
||||
|
||||
Returns the new program statement counter
|
||||
/** Setup the stackframe prior to calling a progs function. Saves all local
|
||||
data the called function will trample on and copies the parameters used
|
||||
by the function into the function's local data space.
|
||||
\param pr pointer to progs_t VM struct
|
||||
\param f pointer to the descriptor for the called function
|
||||
\note Passing a descriptor for a builtin function will result in
|
||||
undefined behavior.
|
||||
*/
|
||||
void
|
||||
static void
|
||||
PR_EnterFunction (progs_t *pr, dfunction_t *f)
|
||||
{
|
||||
int i, j, c, o;
|
||||
|
@ -242,6 +245,24 @@ signal_hook (int sig, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
PR_CallFunction (progs_t *pr, func_t fnum)
|
||||
{
|
||||
dfunction_t *f;
|
||||
|
||||
if (!fnum)
|
||||
PR_RunError (pr, "NULL function");
|
||||
f = pr->pr_functions + fnum;
|
||||
if (f->first_statement < 0) {
|
||||
// negative statements are built in functions
|
||||
((bfunction_t *) f)->func (pr);
|
||||
return 0;
|
||||
} else {
|
||||
PR_EnterFunction (pr, f);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
PR_ExecuteProgram
|
||||
|
||||
|
@ -252,31 +273,23 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum)
|
|||
{
|
||||
int exitdepth, profile, startprofile;
|
||||
unsigned int pointer;
|
||||
dfunction_t *f;
|
||||
dstatement_t *st;
|
||||
edict_t *ed;
|
||||
pr_type_t *ptr;
|
||||
|
||||
if (!fnum || fnum >= pr->progs->numfunctions) {
|
||||
if (*pr->globals.self)
|
||||
ED_Print (pr, PROG_TO_EDICT (pr, *pr->globals.self));
|
||||
PR_RunError (pr, "PR_ExecuteProgram: NULL function");
|
||||
}
|
||||
|
||||
f = &pr->pr_functions[fnum];
|
||||
//Sys_Printf("%s:\n", PR_GetString(pr,f->s_name));
|
||||
|
||||
pr->pr_trace = false;
|
||||
|
||||
// make a stack frame
|
||||
exitdepth = pr->pr_depth;
|
||||
|
||||
PR_EnterFunction (pr, f);
|
||||
st = pr->pr_statements + pr->pr_xstatement;
|
||||
startprofile = profile = 0;
|
||||
|
||||
Sys_PushSignalHook (signal_hook, pr);
|
||||
|
||||
if (!PR_CallFunction (pr, fnum)) {
|
||||
// called a builtin instead of progs code
|
||||
Sys_PopSignalHook ();
|
||||
return;
|
||||
}
|
||||
st = pr->pr_statements + pr->pr_xstatement;
|
||||
|
||||
while (1) {
|
||||
pr_type_t *op_a, *op_b, *op_c;
|
||||
|
||||
|
@ -771,15 +784,7 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum)
|
|||
pr->pr_xfunction->profile += profile - startprofile;
|
||||
startprofile = profile;
|
||||
pr->pr_argc = st->op - OP_CALL0;
|
||||
if (!OPA.func_var)
|
||||
PR_RunError (pr, "NULL function");
|
||||
f = &pr->pr_functions[OPA.func_var];
|
||||
// negative statements are built in functions
|
||||
if (f->first_statement < 0) {
|
||||
((bfunction_t *) f)->func (pr);
|
||||
} else {
|
||||
PR_EnterFunction (pr, f);
|
||||
}
|
||||
PR_CallFunction (pr, OPA.func_var);
|
||||
st = pr->pr_statements + pr->pr_xstatement;
|
||||
break;
|
||||
case OP_DONE:
|
||||
|
@ -795,6 +800,8 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum)
|
|||
PR_LeaveFunction (pr);
|
||||
st = pr->pr_statements + pr->pr_xstatement;
|
||||
if (pr->pr_depth == exitdepth) {
|
||||
if (pr->pr_trace && pr->pr_depth <= pr->pr_trace_depth)
|
||||
pr->pr_trace = false;
|
||||
Sys_PopSignalHook ();
|
||||
return; // all done
|
||||
}
|
||||
|
|
|
@ -52,18 +52,9 @@ static __attribute__ ((unused)) const char rcsid[] =
|
|||
#include "rua_internal.h"
|
||||
|
||||
static void
|
||||
call_function (progs_t *pr, func_t func)
|
||||
{
|
||||
dfunction_t *f;
|
||||
|
||||
if (!func)
|
||||
PR_RunError (pr, "NULL function");
|
||||
f = pr->pr_functions + func;
|
||||
if (f->first_statement < 0) {
|
||||
// negative statements are built in functions
|
||||
((bfunction_t *) f)->func (pr);
|
||||
} else {
|
||||
PR_EnterFunction (pr, f);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -418,8 +409,8 @@ rua_obj_msg_lookup (progs_t *pr)
|
|||
{
|
||||
pr_id_t *receiver = &P_STRUCT (pr, pr_id_t, 0);
|
||||
pr_sel_t *op = &P_STRUCT (pr, pr_sel_t, 1);
|
||||
pr_method_t *method = obj_msg_lookup (pr, receiver, op);
|
||||
R_INT (pr) = method ? method->method_imp : 0;
|
||||
|
||||
R_INT (pr) = obj_msg_lookup (pr, receiver, op);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -427,8 +418,8 @@ rua_obj_msg_lookup_super (progs_t *pr)
|
|||
{
|
||||
pr_super_t *super = &P_STRUCT (pr, pr_super_t, 0);
|
||||
pr_sel_t *_cmd = &P_STRUCT (pr, pr_sel_t, 1);
|
||||
pr_method_t *method = obj_msg_lookup_super (pr, super, _cmd);
|
||||
R_INT (pr) = method ? method->method_imp : 0;
|
||||
|
||||
R_INT (pr) = obj_msg_lookup_super (pr, super, _cmd);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -436,18 +427,19 @@ rua_obj_msg_sendv (progs_t *pr)
|
|||
{
|
||||
pr_id_t *receiver = &P_STRUCT (pr, pr_id_t, 0);
|
||||
pr_sel_t *op = &P_STRUCT (pr, pr_sel_t, 1);
|
||||
pr_va_list_t args = P_STRUCT (pr, pr_va_list_t, 2);
|
||||
pr_method_t *method = obj_msg_lookup (pr, receiver, op);
|
||||
pr_va_list_t *args = (pr_va_list_t *) &P_POINTER (pr, 2);
|
||||
pr_type_t *params = G_GPOINTER (pr, args->list);
|
||||
int count = args->count;
|
||||
func_t imp = obj_msg_lookup (pr, receiver, op);
|
||||
|
||||
if (!method)
|
||||
if (!imp)
|
||||
PR_RunError (pr, "%s does not respond to %s",
|
||||
PR_GetString (pr, object_get_class_name (pr, receiver)),
|
||||
PR_GetString (pr, op->sel_id));
|
||||
if (args.count > 6)
|
||||
args.count = 6;
|
||||
memcpy (pr->pr_params[2], G_GPOINTER (pr, args.list),
|
||||
args.count * 4 * pr->pr_param_size);
|
||||
call_function (pr, method->method_imp);
|
||||
PR_GetString (pr, pr->selector_names[op->sel_id]));
|
||||
if (count > 6)
|
||||
count = 6;
|
||||
memcpy (pr->pr_params[2], params, count * 4 * pr->pr_param_size);
|
||||
PR_CallFunction (pr, imp);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -517,7 +509,7 @@ rua_obj_msgSend (progs_t *pr)
|
|||
{
|
||||
pr_id_t *self = &P_STRUCT (pr, pr_id_t, 0);
|
||||
pr_sel_t *_cmd = &P_STRUCT (pr, pr_sel_t, 1);
|
||||
pr_method_t *method;
|
||||
func_t imp;
|
||||
|
||||
if (!self) {
|
||||
R_INT (pr) = R_INT (pr);
|
||||
|
@ -525,13 +517,13 @@ rua_obj_msgSend (progs_t *pr)
|
|||
}
|
||||
if (!_cmd)
|
||||
PR_RunError (pr, "null selector");
|
||||
method = obj_msg_lookup (pr, self, _cmd);
|
||||
if (!method)
|
||||
imp = obj_msg_lookup (pr, self, _cmd);
|
||||
if (!imp)
|
||||
PR_RunError (pr, "%s does not respond to %s",
|
||||
PR_GetString (pr, object_get_class_name (pr, self)),
|
||||
PR_GetString (pr, _cmd->sel_id));
|
||||
PR_GetString (pr, pr->selector_names[_cmd->sel_id]));
|
||||
|
||||
call_function (pr, method->method_imp);
|
||||
PR_CallFunction (pr, imp);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -539,17 +531,17 @@ rua_obj_msgSend_super (progs_t *pr)
|
|||
{
|
||||
pr_super_t *super = &P_STRUCT (pr, pr_super_t, 0);
|
||||
pr_sel_t *_cmd = &P_STRUCT (pr, pr_sel_t, 1);
|
||||
pr_method_t *method;
|
||||
func_t imp;
|
||||
|
||||
method = obj_msg_lookup_super (pr, super, _cmd);
|
||||
if (!method) {
|
||||
imp = obj_msg_lookup_super (pr, super, _cmd);
|
||||
if (!imp) {
|
||||
pr_id_t *self = &G_STRUCT (pr, pr_id_t, super->self);
|
||||
PR_RunError (pr, "%s does not respond to %s",
|
||||
PR_GetString (pr, object_get_class_name (pr, self)),
|
||||
PR_GetString (pr, _cmd->sel_id));
|
||||
PR_GetString (pr, pr->selector_names[_cmd->sel_id]));
|
||||
}
|
||||
P_POINTER (pr, 0) = super->self;
|
||||
call_function (pr, method->method_imp);
|
||||
PR_CallFunction (pr, imp);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -126,13 +126,14 @@ bi_seek (progs_t *pr)
|
|||
static void
|
||||
bi_traceon (progs_t *pr)
|
||||
{
|
||||
pr->pr_trace = true;
|
||||
pr->pr_trace = true;
|
||||
pr->pr_trace_depth = pr->pr_depth;
|
||||
}
|
||||
|
||||
static void
|
||||
bi_traceoff (progs_t *pr)
|
||||
{
|
||||
pr->pr_trace = false;
|
||||
pr->pr_trace = false;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
void (string str) print = #1;
|
||||
void () garbage_collect = #2;
|
||||
integer () errno = #3;
|
||||
string (integer err) strerror = #4;
|
||||
integer (...) open = #5; // string path, float flags[, float mode]
|
||||
|
|
Loading…
Reference in a new issue