]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - pr_exec.c
The new video menu is clean now (or at least cleaner). Updated Transfusion map list
[xonotic/darkplaces.git] / pr_exec.c
index 1db112819c19c121a32bacaae609c2a3b2a12a29..40cceb0233b0121e8f32d872c1888721bea2731a 100644 (file)
--- a/pr_exec.c
+++ b/pr_exec.c
@@ -21,17 +21,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #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;
 
@@ -244,23 +240,18 @@ void PR_Profile_f (void)
 }
 
 
-/*
-============
-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++)
@@ -270,11 +261,10 @@ void PR_RunError (char *error, ...)
        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;
 }
 
 /*
@@ -297,18 +287,18 @@ int PR_EnterFunction (dfunction_t *f)
        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];
@@ -342,12 +332,12 @@ int PR_LeaveFunction (void)
                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];
@@ -358,6 +348,13 @@ int PR_LeaveFunction (void)
        return pr_stack[pr_depth].s;
 }
 
+void PR_Execute_ProgsLoaded(void)
+{
+       // dump the stack
+       pr_depth = 0;
+       localstack_used = 0;
+}
+
 /*
 ====================
 PR_ExecuteProgram
@@ -368,7 +365,8 @@ 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;
@@ -385,7 +383,7 @@ void PR_ExecuteProgram (func_t fnum, char *errormessage)
 
        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;
@@ -425,3 +423,4 @@ chooseexecprogram:
                }
        }
 }
+