X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=prvm_exec.c;h=40b19d44c9b3c91a4628134ec1963c660a094b93;hp=49142b727a32db211c9737a7fdab7c118e1c065c;hb=48dd658f8bbfa60efbd5f56d1c208727c4418078;hpb=31b56153447af9209e7e4fba607b6ec574eddf23 diff --git a/prvm_exec.c b/prvm_exec.c index 49142b72..40b19d44 100644 --- a/prvm_exec.c +++ b/prvm_exec.c @@ -129,7 +129,12 @@ static void PRVM_PrintStatement(prvm_prog_t *prog, mstatement_t *s) Con_Printf("s%i: ", opnum); if( prog->statement_linenums ) - Con_Printf( "%s:%i: ", PRVM_GetString( prog, prog->xfunction->s_file ), prog->statement_linenums[ opnum ] ); + { + if ( prog->statement_columnnums ) + Con_Printf( "%s:%i:%i: ", PRVM_GetString( prog, prog->xfunction->s_file ), prog->statement_linenums[ opnum ], prog->statement_columnnums[ opnum ] ); + else + Con_Printf( "%s:%i: ", PRVM_GetString( prog, prog->xfunction->s_file ), prog->statement_linenums[ opnum ] ); + } if (prvm_statementprofiling.integer) Con_Printf("%7.0f ", prog->statement_profile[s - prog->statements]); @@ -224,7 +229,17 @@ void PRVM_StackTrace (prvm_prog_t *prog) if (!f) Con_Print("\n"); else - Con_Printf("%12s : %s : statement %i\n", PRVM_GetString(prog, f->s_file), PRVM_GetString(prog, f->s_name), prog->stack[i].s - f->first_statement); + { + if (prog->statement_linenums) + { + if (prog->statement_columnnums) + Con_Printf("%12s:%i:%i : %s : statement %i\n", PRVM_GetString(prog, f->s_file), prog->statement_linenums[prog->stack[i].s], prog->statement_columnnums[prog->stack[i].s], PRVM_GetString(prog, f->s_name), prog->stack[i].s - f->first_statement); + else + Con_Printf("%12s:%i : %s : statement %i\n", PRVM_GetString(prog, f->s_file), prog->statement_linenums[prog->stack[i].s], PRVM_GetString(prog, f->s_name), prog->stack[i].s - f->first_statement); + } + else + Con_Printf("%12s : %s : statement %i\n", PRVM_GetString(prog, f->s_file), PRVM_GetString(prog, f->s_name), prog->stack[i].s - f->first_statement); + } } } @@ -475,21 +490,26 @@ void PRVM_ChildProfile_f (void) PRVM_Profile(prog, howmany, 0, 1); } -void PRVM_PrintState(prvm_prog_t *prog) +void PRVM_PrintState(prvm_prog_t *prog, int stack_index) { int i; + mfunction_t *func = prog->xfunction; + int st = prog->xstatement; + if (stack_index > 0 && stack_index <= prog->depth) + { + func = prog->stack[prog->depth - stack_index].f; + st = prog->stack[prog->depth - stack_index].s; + } if (prog->statestring) { Con_Printf("Caller-provided information: %s\n", prog->statestring); } - if (prog->xfunction) + if (func) { for (i = -7; i <= 0;i++) - if (prog->xstatement + i >= prog->xfunction->first_statement) - PRVM_PrintStatement(prog, prog->statements + prog->xstatement + i); + if (st + i >= func->first_statement) + PRVM_PrintStatement(prog, prog->statements + st + i); } - else - Con_Print("null function executing??\n"); PRVM_StackTrace(prog); } @@ -507,7 +527,7 @@ void PRVM_Crash(prvm_prog_t *prog) if( prog->depth > 0 ) { Con_Printf("QuakeC crash report for %s:\n", prog->name); - PRVM_PrintState(prog); + PRVM_PrintState(prog, 0); } if(prvm_errordump.integer) @@ -564,7 +584,7 @@ static int PRVM_EnterFunction (prvm_prog_t *prog, mfunction_t *f) prog->error_cmd("PRVM_ExecuteProgram: locals stack overflow in %s", prog->name); for (i=0 ; i < c ; i++) - prog->localstack[prog->localstack_used+i] = ((int *)prog->globals.generic)[f->parm_start + i]; + prog->localstack[prog->localstack_used+i] = prog->globals.ip[f->parm_start + i]; prog->localstack_used += c; // copy parameters @@ -573,7 +593,7 @@ static int PRVM_EnterFunction (prvm_prog_t *prog, mfunction_t *f) { for (j=0 ; jparm_size[i] ; j++) { - ((int *)prog->globals.generic)[o] = ((int *)prog->globals.generic)[OFS_PARM0+i*3+j]; + prog->globals.ip[o] = prog->globals.ip[OFS_PARM0+i*3+j]; o++; } } @@ -605,7 +625,7 @@ static int PRVM_LeaveFunction (prvm_prog_t *prog) prog->error_cmd("PRVM_ExecuteProgram: locals stack underflow in %s", prog->name); for (i=0 ; i < c ; i++) - ((int *)prog->globals.generic)[prog->xfunction->parm_start + i] = prog->localstack[prog->localstack_used+i]; + prog->globals.ip[prog->xfunction->parm_start + i] = prog->localstack[prog->localstack_used+i]; // up stack prog->depth--; @@ -644,14 +664,15 @@ void PRVM_Init_Exec(prvm_prog_t *prog) // nothing here yet } -#define OPA ((prvm_eval_t *)&prog->globals.generic[st->operand[0]]) -#define OPB ((prvm_eval_t *)&prog->globals.generic[st->operand[1]]) -#define OPC ((prvm_eval_t *)&prog->globals.generic[st->operand[2]]) +#define OPA ((prvm_eval_t *)&prog->globals.fp[st->operand[0]]) +#define OPB ((prvm_eval_t *)&prog->globals.fp[st->operand[1]]) +#define OPC ((prvm_eval_t *)&prog->globals.fp[st->operand[2]]) extern cvar_t prvm_traceqc; extern cvar_t prvm_statementprofiling; extern qboolean prvm_runawaycheck; #ifdef PROFILING +#ifdef CONFIG_MENU /* ==================== MVM_ExecuteProgram @@ -667,6 +688,20 @@ void MVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessag int restorevm_tempstringsbuf_cursize; double calltime; double tm, starttm; + prvm_vec_t tempfloat; + // these may become out of date when a builtin is called, and are updated accordingly + prvm_vec_t *cached_edictsfields = prog->edictsfields; + unsigned int cached_entityfields = prog->entityfields; + unsigned int cached_entityfields_3 = prog->entityfields - 3; + unsigned int cached_entityfieldsarea = prog->entityfieldsarea; + unsigned int cached_entityfieldsarea_entityfields = prog->entityfieldsarea - prog->entityfields; + unsigned int cached_entityfieldsarea_3 = prog->entityfieldsarea - 3; + unsigned int cached_entityfieldsarea_entityfields_3 = prog->entityfieldsarea - prog->entityfields - 3; + unsigned int cached_max_edicts = prog->max_edicts; + // these do not change + mstatement_t *cached_statements = prog->statements; + qboolean cached_allowworldwrites = prog->allowworldwrites; + unsigned int cached_flag = prog->flag; calltime = Sys_DirtyTime(); @@ -701,7 +736,7 @@ void MVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessag chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_statementprofiling.integer || prog->trace) + if (prvm_statementprofiling.integer || prog->trace || prog->watch_global >= 0 || prog->watch_edict >= 0 || prog->break_statement >= 0) { #define PRVMSLOWINTERPRETER 1 if (prvm_timeprofiling.integer) @@ -742,6 +777,7 @@ cleanup: if (prog == SVVM_prog) SV_FlushBroadcastMessages(); } +#endif /* ==================== @@ -758,6 +794,20 @@ void CLVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessa int restorevm_tempstringsbuf_cursize; double calltime; double tm, starttm; + prvm_vec_t tempfloat; + // these may become out of date when a builtin is called, and are updated accordingly + prvm_vec_t *cached_edictsfields = prog->edictsfields; + unsigned int cached_entityfields = prog->entityfields; + unsigned int cached_entityfields_3 = prog->entityfields - 3; + unsigned int cached_entityfieldsarea = prog->entityfieldsarea; + unsigned int cached_entityfieldsarea_entityfields = prog->entityfieldsarea - prog->entityfields; + unsigned int cached_entityfieldsarea_3 = prog->entityfieldsarea - 3; + unsigned int cached_entityfieldsarea_entityfields_3 = prog->entityfieldsarea - prog->entityfields - 3; + unsigned int cached_max_edicts = prog->max_edicts; + // these do not change + mstatement_t *cached_statements = prog->statements; + qboolean cached_allowworldwrites = prog->allowworldwrites; + unsigned int cached_flag = prog->flag; calltime = Sys_DirtyTime(); @@ -792,7 +842,7 @@ void CLVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessa chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_statementprofiling.integer || prog->trace) + if (prvm_statementprofiling.integer || prog->trace || prog->watch_global >= 0 || prog->watch_edict >= 0 || prog->break_statement >= 0) { #define PRVMSLOWINTERPRETER 1 if (prvm_timeprofiling.integer) @@ -854,6 +904,20 @@ void PRVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessa int restorevm_tempstringsbuf_cursize; double calltime; double tm, starttm; + prvm_vec_t tempfloat; + // these may become out of date when a builtin is called, and are updated accordingly + prvm_vec_t *cached_edictsfields = prog->edictsfields; + unsigned int cached_entityfields = prog->entityfields; + unsigned int cached_entityfields_3 = prog->entityfields - 3; + unsigned int cached_entityfieldsarea = prog->entityfieldsarea; + unsigned int cached_entityfieldsarea_entityfields = prog->entityfieldsarea - prog->entityfields; + unsigned int cached_entityfieldsarea_3 = prog->entityfieldsarea - 3; + unsigned int cached_entityfieldsarea_entityfields_3 = prog->entityfieldsarea - prog->entityfields - 3; + unsigned int cached_max_edicts = prog->max_edicts; + // these do not change + mstatement_t *cached_statements = prog->statements; + qboolean cached_allowworldwrites = prog->allowworldwrites; + unsigned int cached_flag = prog->flag; calltime = Sys_DirtyTime(); @@ -888,7 +952,7 @@ void PRVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessa chooseexecprogram: cachedpr_trace = prog->trace; - if (prvm_statementprofiling.integer || prog->trace) + if (prvm_statementprofiling.integer || prog->trace || prog->watch_global >= 0 || prog->watch_edict >= 0 || prog->break_statement >= 0) { #define PRVMSLOWINTERPRETER 1 if (prvm_timeprofiling.integer)