Three bugs fixed, and I was only aiming for 2! Should go faster even without the effects of these bugs.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@40 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2004-08-25 03:41:27 +00:00
parent b88c2dc2b9
commit f0aef8bb6e
1 changed files with 26 additions and 11 deletions

View File

@ -903,6 +903,7 @@ static void QCC_UnFreeTemp(QCC_def_t *t)
//We've just parsed a statement. //We've just parsed a statement.
//We can gaurentee that any used temps are now not used. //We can gaurentee that any used temps are now not used.
#ifdef _DEBUG
static void QCC_FreeTemps(void) static void QCC_FreeTemps(void)
{ {
temp_t *t; temp_t *t;
@ -911,10 +912,15 @@ static void QCC_FreeTemps(void)
while(t) while(t)
{ {
if (t->used) if (t->used)
t->used = false; {
QCC_PR_ParseWarning(ERR_INTERNAL, "Temp was used\n");
}
t = t->next; t = t->next;
} }
} }
#else
#define QCC_FreeTemps()
#endif
//temps that are still in use over a function call can be considered dodgy. //temps that are still in use over a function call can be considered dodgy.
//we need to remap these to locally defined temps, on return from the function so we know we got them all. //we need to remap these to locally defined temps, on return from the function so we know we got them all.
@ -1249,7 +1255,7 @@ QCC_def_t *QCC_PR_Statement ( QCC_opcode_t *op, QCC_def_t *var_a, QCC_def_t *var
{ {
case OP_AND: case OP_AND:
if (var_a->ofs == var_b->ofs) if (var_a->ofs == var_b->ofs)
QCC_PR_ParseWarning(0, "Parameters for && are the same"); QCC_PR_ParseWarning(0, "Parameter offsets for && are the same");
if (var_a->constant || var_b->constant) if (var_a->constant || var_b->constant)
QCC_PR_ParseWarning(0, "Result of comparison is constant"); QCC_PR_ParseWarning(0, "Result of comparison is constant");
break; break;
@ -4268,18 +4274,20 @@ void QCC_PR_ParseStatement (void)
{ {
int hcstyle; int hcstyle;
int defaultcase = -1; int defaultcase = -1;
int oldallowtemps; temp_t *et;
breaks = num_breaks; breaks = num_breaks;
cases = num_cases; cases = num_cases;
QCC_PR_Expect ("("); QCC_PR_Expect ("(");
oldallowtemps = opt_overlaptemps; //disable temp reuse for now.
opt_overlaptemps = 0;
conditional = true; conditional = true;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY);
conditional = false; conditional = false;
opt_overlaptemps = oldallowtemps;
et = e->temp;
e->temp = NULL; //so noone frees it until we finish this loop
hcstyle = QCC_OPCodeValid(&pr_opcodes[OP_SWITCH_F]); hcstyle = QCC_OPCodeValid(&pr_opcodes[OP_SWITCH_F]);
@ -4413,14 +4421,14 @@ void QCC_PR_ParseStatement (void)
QCC_PR_ParseError(ERR_BADSWITCHTYPE, "Bad switch type"); QCC_PR_ParseError(ERR_BADSWITCHTYPE, "Bad switch type");
break; break;
} }
QCC_PR_Statement (&pr_opcodes[OP_IF], e2, 0, &patch3); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_IF], e2, 0, &patch3));
} }
else else
{ {
if (e->type->type == ev_string) if (e->type->type == ev_string)
QCC_PR_Statement (&pr_opcodes[OP_IFNOTS], e, 0, &patch3); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_IFNOTS], e, 0, &patch3));
else else
QCC_PR_Statement (&pr_opcodes[OP_IFNOT], e, 0, &patch3); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_IFNOT], e, 0, &patch3));
} }
patch3->b = &statements[pr_cases[i]] - patch3; patch3->b = &statements[pr_cases[i]] - patch3;
} }
@ -4449,6 +4457,8 @@ void QCC_PR_ParseStatement (void)
num_breaks = breaks; num_breaks = breaks;
} }
e->temp = et;
QCC_FreeTemp(e);
return; return;
} }
@ -4645,8 +4655,6 @@ void QCC_PR_ParseStatement (void)
QCC_FreeTemp(e); QCC_FreeTemp(e);
// qcc_functioncalled=false; // qcc_functioncalled=false;
QCC_FreeTemps();
} }
@ -5073,6 +5081,9 @@ void QCC_Marshal_Locals(int first, int laststatement)
QCC_def_t *local; QCC_def_t *local;
unsigned int newofs; unsigned int newofs;
if (!opt_overlaptemps) //clear these after each function. we arn't overlapping them so why do we need to keep track of them?
functemps = NULL;
if (!pr.localvars) //nothing to marshal if (!pr.localvars) //nothing to marshal
{ {
locals_start = numpr_globals; locals_start = numpr_globals;
@ -5323,8 +5334,12 @@ QCC_function_t *QCC_PR_ParseImmediateStatements (QCC_type_t *type)
QCC_PR_Expect ("{"); QCC_PR_Expect ("{");
while (!QCC_PR_Check("}")) while (!QCC_PR_Check("}"))
{
QCC_PR_ParseStatement (); QCC_PR_ParseStatement ();
QCC_FreeTemps();
}
} }
QCC_FreeTemps();
// this is cheap // this is cheap
if (type->aux_type->type) if (type->aux_type->type)