#include "quakedef.h"
-/*
-
-*/
-
typedef struct
{
int s;
dfunction_t *f;
} prstack_t;
-#define MAX_STACK_DEPTH 32
+#define MAX_STACK_DEPTH 256
prstack_t pr_stack[MAX_STACK_DEPTH];
int pr_depth = 0;
}
-/*
-============
-PR_RunError
-
-Aborts the currently executing function
-============
-*/
-void PR_RunError (char *error, ...)
+void PR_Crash(void)
{
- int i;
- va_list argptr;
- char string[1024];
-
- va_start (argptr,error);
- vsprintf (string,error,argptr);
- va_end (argptr);
+ int i;
+ if (!pr_depth)
+ {
+ // kill the stack just to be sure
+ pr_depth = 0;
+ localstack_used = 0;
+ return;
+ }
+ Con_Printf("QuakeC crash report:\n");
if (pr_xfunction)
{
for (i = -4;i <= 0;i++)
else
Con_Printf("null function executing??\n");
PR_StackTrace ();
- Con_Printf ("%s\n", string);
-
- pr_depth = 0; // dump the stack so host_error can shutdown functions
- Host_Error ("Program error");
+ // dump the stack so host_error can shutdown functions
+ pr_depth = 0;
+ localstack_used = 0;
}
/*
int i, j, c, o;
if (!f)
- PR_RunError ("PR_EnterFunction: NULL function\n");
+ Host_Error ("PR_EnterFunction: NULL function\n");
pr_stack[pr_depth].s = pr_xstatement;
pr_stack[pr_depth].f = pr_xfunction;
pr_depth++;
if (pr_depth >= MAX_STACK_DEPTH)
- PR_RunError ("stack overflow");
+ Host_Error ("stack overflow");
// save off any locals that the new function steps on
c = f->locals;
if (localstack_used + c > LOCALSTACK_SIZE)
- PR_RunError ("PR_ExecuteProgram: locals stack overflow\n");
+ Host_Error ("PR_ExecuteProgram: locals stack overflow\n");
for (i=0 ; i < c ; i++)
localstack[localstack_used+i] = ((int *)pr_globals)[f->parm_start + i];
Host_Error ("prog stack underflow");
if (!pr_xfunction)
- PR_RunError ("PR_LeaveFunction: NULL function\n");
+ Host_Error ("PR_LeaveFunction: NULL function\n");
// restore locals from the stack
c = pr_xfunction->locals;
localstack_used -= c;
if (localstack_used < 0)
- PR_RunError ("PR_ExecuteProgram: locals stack underflow\n");
+ Host_Error ("PR_ExecuteProgram: locals stack underflow\n");
for (i=0 ; i < c ; i++)
((int *)pr_globals)[pr_xfunction->parm_start + i] = localstack[localstack_used+i];
return pr_stack[pr_depth].s;
}
+void PR_Execute_ProgsLoaded(void)
+{
+ // dump the stack
+ pr_depth = 0;
+ localstack_used = 0;
+}
+
/*
====================
PR_ExecuteProgram
#define OPB ((eval_t *)&pr_globals[(unsigned short) st->b])
#define OPC ((eval_t *)&pr_globals[(unsigned short) st->c])
extern cvar_t pr_boundscheck;
-void PR_ExecuteProgram (func_t fnum, char *errormessage)
+extern cvar_t pr_traceqc;
+void PR_ExecuteProgram (func_t fnum, const char *errormessage)
{
dstatement_t *st;
dfunction_t *f, *newf;
f = &pr_functions[fnum];
- pr_trace = false;
+ pr_trace = pr_traceqc.integer;
// we know we're done when pr_depth drops to this
exitdepth = pr_depth;
}
}
}
+