]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_exec.c
experimental makefile option make DP_LINK_TO_JPEG=1 - use libjpeg.h instead of dynami...
[xonotic/darkplaces.git] / prvm_exec.c
index b866ed27f40e4756d2c61341047f6ca84b8ccffd..55a91d92d9438d148fe6312b951aa5181bfd7a86 100644 (file)
@@ -276,7 +276,7 @@ void PRVM_ShortStackTrace(char *buf, size_t bufsize)
        }
        else
        {
-               strlcpy(buf, "<NO PROG>", sizeof(buf));
+               strlcpy(buf, "<NO PROG>", bufsize);
                return;
        }
 
@@ -443,6 +443,10 @@ void PRVM_CrashAll()
 void PRVM_PrintState(void)
 {
        int i;
+       if(prog->statestring)
+       {
+               Con_Printf("Caller-provided information: %s\n", prog->statestring);
+       }
        if (prog->xfunction)
        {
                for (i = -7; i <= 0;i++)
@@ -455,6 +459,8 @@ void PRVM_PrintState(void)
 }
 
 extern sizebuf_t vm_tempstringsbuf;
+extern cvar_t prvm_errordump;
+void Host_Savegame_to (const char *name);
 void PRVM_Crash(void)
 {
        if (prog == NULL)
@@ -468,6 +474,12 @@ void PRVM_Crash(void)
                PRVM_PrintState();
        }
 
+       if(prvm_errordump.integer)
+       {
+               // make a savegame
+               Host_Savegame_to(va("crash-%s.dmp", PRVM_NAME));
+       }
+
        // dump the stack so host_error can shutdown functions
        prog->depth = 0;
        prog->localstack_used = 0;
@@ -578,12 +590,11 @@ PRVM_ExecuteProgram
 #define OPA ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->a])
 #define OPB ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->b])
 #define OPC ((prvm_eval_t *)&prog->globals.generic[(unsigned short) st->c])
-#ifdef PRVM_BOUNDSCHECK_CVAR
-extern cvar_t prvm_boundscheck;
-#endif
 extern cvar_t prvm_traceqc;
 extern cvar_t prvm_statementprofiling;
 extern sizebuf_t vm_tempstringsbuf;
+extern qboolean prvm_runawaycheck;
+extern qboolean prvm_boundscheck;
 void PRVM_ExecuteProgram (func_t fnum, const char *errormessage)
 {
        dstatement_t    *st, *startst;
@@ -626,77 +637,141 @@ void PRVM_ExecuteProgram (func_t fnum, const char *errormessage)
 
 chooseexecprogram:
        cachedpr_trace = prog->trace;
-       if (prvm_statementprofiling.integer)
+       if (prvm_runawaycheck)
        {
-#define PRVMSTATEMENTPROFILING 1
-#ifdef PRVM_BOUNDSCHECK_CVAR
-               if (prvm_boundscheck.integer)
-#endif
+#define PRVMRUNAWAYCHECK 1
+               if (prvm_statementprofiling.integer)
                {
-#define PRVMBOUNDSCHECK 1
-                       if (prog->trace)
+#define PRVMSTATEMENTPROFILING 1
+                       if (prvm_boundscheck)
                        {
+#define PRVMBOUNDSCHECK 1
+                               if (prog->trace)
+                               {
 #define PRVMTRACE 1
 #include "prvm_execprogram.h"
 #undef PRVMTRACE
+                               }
+                               else
+                               {
+#include "prvm_execprogram.h"
+                               }
+#undef PRVMBOUNDSCHECK
                        }
                        else
                        {
+                               if (prog->trace)
+                               {
+#define PRVMTRACE 1
+#include "prvm_execprogram.h"
+#undef PRVMTRACE
+                               }
+                               else
+                               {
 #include "prvm_execprogram.h"
+                               }
                        }
-#undef PRVMBOUNDSCHECK
+#undef PRVMSTATEMENTPROFILING
                }
-#ifdef PRVM_BOUNDSCHECK_CVAR
                else
                {
-                       if (prog->trace)
+                       if (prvm_boundscheck)
                        {
+#define PRVMBOUNDSCHECK 1
+                               if (prog->trace)
+                               {
 #define PRVMTRACE 1
 #include "prvm_execprogram.h"
 #undef PRVMTRACE
+                               }
+                               else
+                               {
+#include "prvm_execprogram.h"
+                               }
+#undef PRVMBOUNDSCHECK
                        }
                        else
                        {
+                               if (prog->trace)
+                               {
+#define PRVMTRACE 1
 #include "prvm_execprogram.h"
+#undef PRVMTRACE
+                               }
+                               else
+                               {
+#include "prvm_execprogram.h"
+                               }
                        }
                }
-#endif
-#undef PRVMSTATEMENTPROFILING
+#undef PRVMRUNAWAYCHECK
        }
        else
        {
-#ifdef PRVM_BOUNDSCHECK_CVAR
-               if (prvm_boundscheck.integer)
-#endif
+               if (prvm_statementprofiling.integer)
                {
-#define PRVMBOUNDSCHECK 1
-                       if (prog->trace)
+#define PRVMSTATEMENTPROFILING 1
+                       if (prvm_boundscheck)
                        {
+#define PRVMBOUNDSCHECK 1
+                               if (prog->trace)
+                               {
 #define PRVMTRACE 1
 #include "prvm_execprogram.h"
 #undef PRVMTRACE
+                               }
+                               else
+                               {
+#include "prvm_execprogram.h"
+                               }
+#undef PRVMBOUNDSCHECK
                        }
                        else
                        {
+                               if (prog->trace)
+                               {
+#define PRVMTRACE 1
+#include "prvm_execprogram.h"
+#undef PRVMTRACE
+                               }
+                               else
+                               {
 #include "prvm_execprogram.h"
+                               }
                        }
-#undef PRVMBOUNDSCHECK
+#undef PRVMSTATEMENTPROFILING
                }
-#ifdef PRVM_BOUNDSCHECK_CVAR
                else
                {
-                       if (prog->trace)
+                       if (prvm_boundscheck)
                        {
+#define PRVMBOUNDSCHECK 1
+                               if (prog->trace)
+                               {
 #define PRVMTRACE 1
 #include "prvm_execprogram.h"
 #undef PRVMTRACE
+                               }
+                               else
+                               {
+#include "prvm_execprogram.h"
+                               }
+#undef PRVMBOUNDSCHECK
                        }
                        else
                        {
+                               if (prog->trace)
+                               {
+#define PRVMTRACE 1
+#include "prvm_execprogram.h"
+#undef PRVMTRACE
+                               }
+                               else
+                               {
 #include "prvm_execprogram.h"
+                               }
                        }
                }
-#endif
        }
 
 cleanup: