From e11263d3ea167699c332c40802df925881d8a58d Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 2 Feb 2004 02:21:52 +0000 Subject: [PATCH] changed a lot of progs errors to warnings, and it prints QC status for warnings git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3849 d7cf8633-e32d-0410-b094-e92efae38249 --- pr_cmds.c | 120 +++++++++++++++++++++++++++++----------------------- pr_exec.c | 21 +++++---- progs.h | 1 + progsvm.h | 1 + prvm_exec.c | 26 +++++++----- 5 files changed, 93 insertions(+), 76 deletions(-) diff --git a/pr_cmds.c b/pr_cmds.c index 74872ab1..7eaa915f 100644 --- a/pr_cmds.c +++ b/pr_cmds.c @@ -39,7 +39,9 @@ static char *PR_GetTempString(void) return s; } -#define RETURN_EDICT(e) (((int *)pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e)) +#define RETURN_EDICT(e) (G_INT(OFS_RETURN) = EDICT_TO_PROG(e)) +#define PF_WARNING(s) do{Con_Printf(s);PR_PrintState();return;}while(0) +#define PF_ERROR(s) do{Host_Error(s);return;}while(0) /* @@ -201,7 +203,7 @@ void PF_error (void) ed = PROG_TO_EDICT(pr_global_struct->self); ED_Print (ed); - Host_Error ("Program error"); + PF_ERROR("Program error"); } /* @@ -270,9 +272,9 @@ void PF_setorigin (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setorigin: can not modify world entity\n"); + PF_WARNING("setorigin: can not modify world entity\n"); if (e->e->free) - Host_Error("setorigin: can not modify free entity\n"); + PF_WARNING("setorigin: can not modify free entity\n"); org = G_VECTOR(OFS_PARM1); VectorCopy (org, e->v->origin); SV_LinkEdict (e, false); @@ -285,7 +287,7 @@ void SetMinMaxSize (edict_t *e, float *min, float *max, qboolean rotate) for (i=0 ; i<3 ; i++) if (min[i] > max[i]) - Host_Error ("backwards mins/maxs"); + PF_ERROR("SetMinMaxSize: backwards mins/maxs\n"); // set derived values VectorCopy (min, e->v->mins); @@ -312,9 +314,9 @@ void PF_setsize (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setsize: can not modify world entity\n"); + PF_WARNING("setsize: can not modify world entity\n"); if (e->e->free) - Host_Error("setsize: can not modify free entity\n"); + PF_WARNING("setsize: can not modify free entity\n"); min = G_VECTOR(OFS_PARM1); max = G_VECTOR(OFS_PARM2); SetMinMaxSize (e, min, max, false); @@ -337,9 +339,9 @@ void PF_setmodel (void) e = G_EDICT(OFS_PARM0); if (e == sv.edicts) - Host_Error("setmodel: can not modify world entity\n"); + PF_WARNING("setmodel: can not modify world entity\n"); if (e->e->free) - Host_Error("setmodel: can not modify free entity\n"); + PF_WARNING("setmodel: can not modify free entity\n"); m = G_STRING(OFS_PARM1); // check to see if model was properly precached @@ -348,7 +350,7 @@ void PF_setmodel (void) break; if (!*check) - Host_Error ("no precache: %s\n", m); + PF_WARNING("setmodel: no precache\n"); e->v->model = PR_SetString(*check); @@ -691,13 +693,13 @@ void PF_sound (void) attenuation = G_FLOAT(OFS_PARM4); if (volume < 0 || volume > 255) - Host_Error ("SV_StartSound: volume = %i", volume); + PF_WARNING("SV_StartSound: volume must be in range 0-1\n"); if (attenuation < 0 || attenuation > 4) - Host_Error ("SV_StartSound: attenuation = %f", attenuation); + PF_WARNING("SV_StartSound: attenuation must be in range 0-4\n"); if (channel < 0 || channel > 7) - Host_Error ("SV_StartSound: channel = %i", channel); + PF_WARNING("SV_StartSound: channel must be in range 0-7\n"); SV_StartSound (entity, channel, sample, volume, attenuation); } @@ -711,7 +713,7 @@ break() */ void PF_break (void) { - Host_Error ("break statement"); + PF_ERROR("break: break statement\n"); } /* @@ -812,7 +814,7 @@ void PF_TraceToss (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("tracetoss: can not use world entity\n"); + PF_WARNING("tracetoss: can not use world entity\n"); ignore = G_EDICT(OFS_PARM1); trace = SV_Trace_Toss (ent, ignore); @@ -1127,12 +1129,12 @@ void PF_Remove (void) ed = G_EDICT(OFS_PARM0); if (ed == sv.edicts) - Host_Error("remove: tried to remove world\n"); + PF_WARNING("remove: tried to remove world\n"); if (NUM_FOR_EDICT(ed) <= svs.maxclients) - Host_Error("remove: tried to remove a client\n"); + PF_WARNING("remove: tried to remove a client\n"); // LordHavoc: not an error because id1 progs did this in some cases (killtarget removes entities, even if they are already removed in some cases...) if (ed->e->free && developer.integer) - Con_Printf("remove: tried to remove an entity that was already removed\n"); + PF_WARNING("remove: tried to remove an entity that was already removed\n"); ED_Free (ed); } @@ -1272,7 +1274,7 @@ void PF_findchainfloat (void) void PR_CheckEmptyString (char *s) { if (s[0] <= ' ') - Host_Error ("Bad string"); + PF_ERROR("Bad string"); } void PF_precache_file (void) @@ -1286,7 +1288,7 @@ void PF_precache_sound (void) int i; if (sv.state != ss_loading) - Host_Error ("PF_Precache_*: Precache can only be done in spawn functions"); + PF_ERROR("PF_Precache_*: Precache can only be done in spawn functions"); s = G_STRING(OFS_PARM0); G_INT(OFS_RETURN) = G_INT(OFS_PARM0); @@ -1302,7 +1304,7 @@ void PF_precache_sound (void) if (!strcmp(sv.sound_precache[i], s)) return; } - Host_Error ("PF_precache_sound: overflow"); + PF_ERROR("PF_precache_sound: overflow"); } void PF_precache_model (void) @@ -1311,7 +1313,7 @@ void PF_precache_model (void) int i; if (sv.state != ss_loading) - Host_Error ("PF_Precache_*: Precache can only be done in spawn functions"); + PF_ERROR("PF_Precache_*: Precache can only be done in spawn functions"); s = G_STRING(OFS_PARM0); if (sv.worldmodel->brush.ishlbsp && ((!s) || (!s[0]))) @@ -1330,7 +1332,7 @@ void PF_precache_model (void) if (!strcmp(sv.model_precache[i], s)) return; } - Host_Error ("PF_precache_model: overflow"); + PF_ERROR("PF_precache_model: overflow"); } @@ -1369,19 +1371,19 @@ void PF_walkmove (void) mfunction_t *oldf; int oldself; + // assume failure if it returns early + G_FLOAT(OFS_RETURN) = 0; + ent = PROG_TO_EDICT(pr_global_struct->self); if (ent == sv.edicts) - Host_Error("walkmove: can not modify world entity\n"); + PF_WARNING("walkmove: can not modify world entity\n"); if (ent->e->free) - Host_Error("walkmove: can not modify free entity\n"); + PF_WARNING("walkmove: can not modify free entity\n"); yaw = G_FLOAT(OFS_PARM0); dist = G_FLOAT(OFS_PARM1); if ( !( (int)ent->v->flags & (FL_ONGROUND|FL_FLY|FL_SWIM) ) ) - { - G_FLOAT(OFS_RETURN) = 0; return; - } yaw = yaw*M_PI*2 / 360; @@ -1414,20 +1416,21 @@ void PF_droptofloor (void) vec3_t end; trace_t trace; + // assume failure if it returns early + G_FLOAT(OFS_RETURN) = 0; + ent = PROG_TO_EDICT(pr_global_struct->self); if (ent == sv.edicts) - Host_Error("droptofloor: can not modify world entity\n"); + PF_WARNING("droptofloor: can not modify world entity\n"); if (ent->e->free) - Host_Error("droptofloor: can not modify free entity\n"); + PF_WARNING("droptofloor: can not modify free entity\n"); VectorCopy (ent->v->origin, end); end[2] -= 256; trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent); - if (trace.fraction == 1) - G_FLOAT(OFS_RETURN) = 0; - else + if (trace.fraction != 1) { VectorCopy (trace.endpos, ent->v->origin); SV_LinkEdict (ent, false); @@ -1561,11 +1564,14 @@ void PF_aim (void) float dist, bestdist; float speed; + // assume failure if it returns early + VectorClear(G_VECTOR(OFS_RETURN)); + ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("aim: can not use world entity\n"); + PF_WARNING("aim: can not use world entity\n"); if (ent->e->free) - Host_Error("aim: can not use free entity\n"); + PF_WARNING("aim: can not use free entity\n"); speed = G_FLOAT(OFS_PARM1); VectorCopy (ent->v->origin, start); @@ -1643,9 +1649,9 @@ void PF_changeyaw (void) ent = PROG_TO_EDICT(pr_global_struct->self); if (ent == sv.edicts) - Host_Error("changeyaw: can not modify world entity\n"); + PF_WARNING("changeyaw: can not modify world entity\n"); if (ent->e->free) - Host_Error("changeyaw: can not modify free entity\n"); + PF_WARNING("changeyaw: can not modify free entity\n"); current = ANGLEMOD(ent->v->angles[1]); ideal = ent->v->ideal_yaw; speed = ent->v->yaw_speed; @@ -1690,22 +1696,22 @@ void PF_changepitch (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("changepitch: can not modify world entity\n"); + PF_WARNING("changepitch: can not modify world entity\n"); if (ent->e->free) - Host_Error("changepitch: can not modify free entity\n"); + PF_WARNING("changepitch: can not modify free entity\n"); current = ANGLEMOD( ent->v->angles[0] ); if ((val = GETEDICTFIELDVALUE(ent, eval_idealpitch))) ideal = val->_float; else { - Host_Error ("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch"); + PF_WARNING("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n"); return; } if ((val = GETEDICTFIELDVALUE(ent, eval_pitch_speed))) speed = val->_float; else { - Host_Error ("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch"); + PF_WARNING("PF_changepitch: .float idealpitch and .float pitch_speed must be defined to use changepitch\n"); return; } @@ -1775,7 +1781,7 @@ sizebuf_t *WriteDest (void) return &sv.signon; default: - Host_Error ("WriteDest: bad destination"); + Host_Error("WriteDest: bad destination"); break; } @@ -1832,9 +1838,9 @@ void PF_makestatic (void) ent = G_EDICT(OFS_PARM0); if (ent == sv.edicts) - Host_Error("makestatic: can not modify world entity\n"); + PF_WARNING("makestatic: can not modify world entity\n"); if (ent->e->free) - Host_Error("makestatic: can not modify free entity\n"); + PF_WARNING("makestatic: can not modify free entity\n"); large = false; if (ent->v->modelindex >= 256 || ent->v->frame >= 256) @@ -1995,7 +2001,7 @@ void PF_registercvar (void) } if (currentqc_cvar >= MAX_QC_CVARS) - Host_Error ("PF_registercvar: ran out of cvar slots (%i)\n", MAX_QC_CVARS); + PF_ERROR("PF_registercvar: ran out of cvar slots\n"); // copy the name and value variable = &qc_cvar[currentqc_cvar++]; @@ -2033,7 +2039,10 @@ void PF_min (void) G_FLOAT(OFS_RETURN) = f; } else - Host_Error("min: must supply at least 2 floats\n"); + { + G_FLOAT(OFS_RETURN) = 0; + PF_WARNING("min: must supply at least 2 floats\n"); + } } /* @@ -2060,7 +2069,10 @@ void PF_max (void) G_FLOAT(OFS_RETURN) = f; } else - Host_Error("max: must supply at least 2 floats\n"); + { + G_FLOAT(OFS_RETURN) = 0; + PF_WARNING("max: must supply at least 2 floats\n"); + } } /* @@ -2105,14 +2117,14 @@ void PF_copyentity (void) edict_t *in, *out; in = G_EDICT(OFS_PARM0); if (in == sv.edicts) - Host_Error("copyentity: can not read world entity\n"); + PF_WARNING("copyentity: can not read world entity\n"); if (in->e->free) - Host_Error("copyentity: can not read free entity\n"); + PF_WARNING("copyentity: can not read free entity\n"); out = G_EDICT(OFS_PARM1); if (out == sv.edicts) - Host_Error("copyentity: can not modify world entity\n"); + PF_WARNING("copyentity: can not modify world entity\n"); if (out->e->free) - Host_Error("copyentity: can not modify free entity\n"); + PF_WARNING("copyentity: can not modify free entity\n"); memcpy(out->v, in->v, progs->entityfields * 4); } @@ -2164,7 +2176,7 @@ void PF_effect (void) char *s; s = G_STRING(OFS_PARM1); if (!s || !s[0]) - Host_Error("effect: no model specified\n"); + PF_WARNING("effect: no model specified\n"); SV_StartEffect(G_VECTOR(OFS_PARM0), SV_ModelIndex(s), G_FLOAT(OFS_PARM2), G_FLOAT(OFS_PARM3), G_FLOAT(OFS_PARM4)); } @@ -3008,9 +3020,9 @@ void PF_setattachment (void) model_t *model; if (e == sv.edicts) - Host_Error("setattachment: can not modify world entity\n"); + PF_WARNING("setattachment: can not modify world entity\n"); if (e->e->free) - Host_Error("setattachment: can not modify free entity\n"); + PF_WARNING("setattachment: can not modify free entity\n"); if (tagentity == NULL) tagentity = sv.edicts; diff --git a/pr_exec.c b/pr_exec.c index ad83e34d..c2f13019 100644 --- a/pr_exec.c +++ b/pr_exec.c @@ -243,19 +243,9 @@ void PR_Profile_f (void) } while (best); } - -void PR_Crash(void) +void PR_PrintState(void) { int i; - if (pr_depth < 1) - { - // 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++) @@ -265,6 +255,15 @@ void PR_Crash(void) else Con_Printf("null function executing??\n"); PR_StackTrace (); +} + +void PR_Crash(void) +{ + if (pr_depth > 0) + { + Con_Printf("QuakeC crash report:\n"); + PR_PrintState(); + } // dump the stack so host_error can shutdown functions pr_depth = 0; diff --git a/progs.h b/progs.h index b6fb5d2b..1483c3b4 100644 --- a/progs.h +++ b/progs.h @@ -155,6 +155,7 @@ void PR_LoadProgs (void); void PR_Profile_f (void); +void PR_PrintState(void); void PR_Crash (void); void SV_IncreaseEdicts(void); diff --git a/progsvm.h b/progsvm.h index 181939d9..2bd376a4 100644 --- a/progsvm.h +++ b/progsvm.h @@ -364,6 +364,7 @@ void PRVM_LoadProgs (const char *filename, int numrequiredfunc, char **required_ void PRVM_Profile_f (void); +void PRVM_PrintState(void); void PRVM_CrashAll (void); void PRVM_Crash (void); diff --git a/prvm_exec.c b/prvm_exec.c index f6401c03..9816450c 100644 --- a/prvm_exec.c +++ b/prvm_exec.c @@ -246,19 +246,9 @@ void PRVM_CrashAll() prog = oldprog; } -void PRVM_Crash() +void PRVM_PrintState(void) { int i; - - if (prog->depth < 1) - { - // kill the stack just to be sure - prog->depth = 0; - prog->localstack_used = 0; - return; - } - - Con_Printf("QuakeC crash report for %s:\n", PRVM_NAME); if (prog->xfunction) { for (i = -4;i <= 0;i++) @@ -268,6 +258,20 @@ void PRVM_Crash() else Con_Printf("null function executing??\n"); PRVM_StackTrace (); +} + +void PRVM_Crash() +{ + if (prog->depth < 1) + { + // kill the stack just to be sure + prog->depth = 0; + prog->localstack_used = 0; + return; + } + + Con_Printf("QuakeC crash report for %s:\n", PRVM_NAME); + PRVM_PrintState(); // dump the stack so host_error can shutdown functions prog->depth = 0; -- 2.39.2