fixing a couple of bugs.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@229 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2004-09-21 03:22:55 +00:00
parent 9c59fafc3e
commit 74397d5368
3 changed files with 99 additions and 17 deletions

View file

@ -545,6 +545,7 @@ enum {
WARN_MISSINGRETURN, WARN_MISSINGRETURN,
WARN_DUPLICATEDEFINITION, WARN_DUPLICATEDEFINITION,
WARN_PRECOMPILERMESSAGE, WARN_PRECOMPILERMESSAGE,
WARN_TOOMANYPARAMETERSFORFUNC,
WARN_STRINGTOOLONG, WARN_STRINGTOOLONG,
WARN_BADTARGET, WARN_BADTARGET,
WARN_BADPRAGMA, WARN_BADPRAGMA,
@ -596,7 +597,6 @@ enum {
ERR_TOOMANYLABELS, ERR_TOOMANYLABELS,
ERR_TOOMANYOPENFILES, ERR_TOOMANYOPENFILES,
ERR_TOOMANYPARAMETERSVARARGS, ERR_TOOMANYPARAMETERSVARARGS,
ERR_TOOMANYPARAMETERSFORFUNC,
ERR_TOOMANYTOTALPARAMETERS, ERR_TOOMANYTOTALPARAMETERS,
//these are probably yours, or qcc being fussy. //these are probably yours, or qcc being fussy.

View file

@ -2408,7 +2408,10 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
else if (arg >= MAX_PARMS+MAX_EXTRA_PARMS) else if (arg >= MAX_PARMS+MAX_EXTRA_PARMS)
QCC_PR_ParseErrorPrintDef (ERR_TOOMANYTOTALPARAMETERS, func, "More than %i parameters", MAX_PARMS+MAX_EXTRA_PARMS); QCC_PR_ParseErrorPrintDef (ERR_TOOMANYTOTALPARAMETERS, func, "More than %i parameters", MAX_PARMS+MAX_EXTRA_PARMS);
if (!extraparms && arg >= t->num_parms) if (!extraparms && arg >= t->num_parms)
QCC_PR_ParseErrorPrintDef (ERR_TOOMANYPARAMETERSFORFUNC, func, "too many parameters"); {
QCC_PR_ParseWarning (WARN_TOOMANYPARAMETERSFORFUNC, "too many parameters");
QCC_PR_ParsePrintDef(WARN_TOOMANYPARAMETERSFORFUNC, func);
}
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY);
@ -4164,6 +4167,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect (")"); //after the line number is noted.. QCC_PR_Expect (")"); //after the line number is noted..
QCC_PR_ParseStatement (); QCC_PR_ParseStatement ();
junkdef.ofs = patch2 - &statements[numstatements]; junkdef.ofs = patch2 - &statements[numstatements];
junkdef.type = type_float;
QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_GOTO], &junkdef, 0, (QCC_dstatement_t **)0xffffffff)); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_GOTO], &junkdef, 0, (QCC_dstatement_t **)0xffffffff));
if (patch1) if (patch1)
patch1->b = &statements[numstatements] - patch1; patch1->b = &statements[numstatements] - patch1;
@ -4172,8 +4176,8 @@ void QCC_PR_ParseStatement (void)
{ {
for(i = breaks; i < num_breaks; i++) for(i = breaks; i < num_breaks; i++)
{ {
patch2 = &statements[pr_breaks[i]]; patch1 = &statements[pr_breaks[i]];
statements[pr_breaks[i]].a = &statements[numstatements] - patch2; statements[pr_breaks[i]].a = &statements[numstatements] - patch1;
} }
num_breaks = breaks; num_breaks = breaks;
} }
@ -4181,7 +4185,7 @@ void QCC_PR_ParseStatement (void)
{ {
for(i = continues; i < num_continues; i++) for(i = continues; i < num_continues; i++)
{ {
patch2 = &statements[pr_continues[i]]; patch1 = &statements[pr_continues[i]];
statements[pr_continues[i]].a = patch1 - patch2; statements[pr_continues[i]].a = patch1 - patch2;
} }
num_continues = continues; num_continues = continues;
@ -4271,6 +4275,7 @@ void QCC_PR_ParseStatement (void)
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY);
conditional = false; conditional = false;
junkdef.ofs = patch1 - &statements[numstatements]; junkdef.ofs = patch1 - &statements[numstatements];
junkdef.type = type_float;
if (e->type == type_string) if (e->type == type_string)
QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_IFS], e, &junkdef, (QCC_dstatement_t **)0xffffffff)); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_IFS], e, &junkdef, (QCC_dstatement_t **)0xffffffff));
else else
@ -4905,34 +4910,34 @@ QCC_dstatement_t *patch1;
{ {
if (pr_opcodes[op].type_a==NULL) if (pr_opcodes[op].type_a==NULL)
{ {
p = (short)pr_immediate._float; p = (int)pr_immediate._float;
QCC_PR_Lex(); QCC_PR_Lex();
patch1 = &statements[numstatements]; patch1 = &statements[numstatements];
QCC_PR_Statement3(&pr_opcodes[op], NULL, NULL, NULL); QCC_PR_Statement3(&pr_opcodes[op], NULL, NULL, NULL);
patch1->a = (short)(int)p; patch1->a = (int)p;
} }
else if (pr_opcodes[op].type_b==NULL) else if (pr_opcodes[op].type_b==NULL)
{ {
a = QCC_PR_ParseValue(pr_classtype); a = QCC_PR_ParseValue(pr_classtype);
p = (short)pr_immediate._float; p = (int)pr_immediate._float;
QCC_PR_Lex(); QCC_PR_Lex();
patch1 = &statements[numstatements]; patch1 = &statements[numstatements];
QCC_PR_Statement3(&pr_opcodes[op], a, NULL, NULL); QCC_PR_Statement3(&pr_opcodes[op], a, NULL, NULL);
patch1->b = (short)(int)p; patch1->b = (int)p;
} }
else else
{ {
a = QCC_PR_ParseValue(pr_classtype); a = QCC_PR_ParseValue(pr_classtype);
b = QCC_PR_ParseValue(pr_classtype); b = QCC_PR_ParseValue(pr_classtype);
p = (short)pr_immediate._float; p = (int)pr_immediate._float;
QCC_PR_Lex(); QCC_PR_Lex();
patch1 = &statements[numstatements]; patch1 = &statements[numstatements];
QCC_PR_Statement3(&pr_opcodes[op], a, b, NULL); QCC_PR_Statement3(&pr_opcodes[op], a, b, NULL);
patch1->c = (short)(int)p; patch1->c = (int)p;
} }
} }
else else
@ -5062,6 +5067,7 @@ pbool QCC_FuncJumpsToRange(int first, int last, int firstr, int lastr)
return false; return false;
} }
#if 0
void QCC_CompoundJumps(int first, int last) void QCC_CompoundJumps(int first, int last)
{ {
//jumps to jumps are reordered so they become jumps to the final target. //jumps to jumps are reordered so they become jumps to the final target.
@ -5082,7 +5088,7 @@ void QCC_CompoundJumps(int first, int last)
} }
while (statements[statement].op == OP_GOTO) while (statements[statement].op == OP_GOTO)
{ {
*(signed*)&statements[st].a = statement+statements[statement].a - st; statements[st].a = statement+statements[statement].a - st;
statement = st + (signed)statements[st].a; statement = st + (signed)statements[st].a;
optres_compound_jumps++; optres_compound_jumps++;
} }
@ -5092,7 +5098,7 @@ void QCC_CompoundJumps(int first, int last)
statement = st + (signed)statements[st].b; statement = st + (signed)statements[st].b;
while (statements[statement].op == OP_GOTO) while (statements[statement].op == OP_GOTO)
{ {
*(signed*)&statements[st].b = statement+statements[statement].a - st; statements[st].b = statement+statements[statement].a - st;
statement = st + (signed)statements[st].b; statement = st + (signed)statements[st].b;
optres_compound_jumps++; optres_compound_jumps++;
} }
@ -5102,13 +5108,62 @@ void QCC_CompoundJumps(int first, int last)
statement = st + (signed)statements[st].c; statement = st + (signed)statements[st].c;
while (statements[statement].op == OP_GOTO) while (statements[statement].op == OP_GOTO)
{ {
*(signed*)&statements[st].c = statement+statements[statement].a - st; statements[st].c = statement+statements[statement].a - st;
statement = st + (signed)statements[st].c; statement = st + (signed)statements[st].c;
optres_compound_jumps++; optres_compound_jumps++;
} }
} }
} }
} }
#else
void QCC_CompoundJumps(int first, int last)
{
//jumps to jumps are reordered so they become jumps to the final target.
int statement;
int st;
for (st = first; st < last; st++)
{
if (pr_opcodes[statements[st].op].type_a == NULL)
{
statement = st + (signed)statements[st].a;
if (statements[statement].op == OP_RETURN || statements[statement].op == OP_DONE)
{ //goto leads to return. Copy the command out to remove the goto.
statements[st].op = statements[statement].op;
statements[st].a = statements[statement].a;
statements[st].b = statements[statement].b;
statements[st].c = statements[statement].c;
optres_compound_jumps++;
}
while (statements[statement].op == OP_GOTO)
{
statements[st].a = (statement+statements[statement].a - st);
statement = st + (signed)statements[st].a;
optres_compound_jumps++;
}
}
if (pr_opcodes[statements[st].op].type_b == NULL)
{
statement = st + (signed)statements[st].b;
while (statements[statement].op == OP_GOTO)
{
statements[st].b = (statement+statements[statement].a - st);
statement = st + (signed)statements[st].b;
optres_compound_jumps++;
}
}
if (pr_opcodes[statements[st].op].type_c == NULL)
{
statement = st + (signed)statements[st].c;
while (statements[statement].op == OP_GOTO)
{
statements[st].c = (statement+statements[statement].a - st);
statement = st + (signed)statements[st].c;
optres_compound_jumps++;
}
}
}
}
#endif
/* /*
//goes through statements, if it sees a matching statement earlier, it'll strim out the current. //goes through statements, if it sees a matching statement earlier, it'll strim out the current.
void QCC_CommonSubExpressionRemoval(int first, int last) void QCC_CommonSubExpressionRemoval(int first, int last)
@ -5415,6 +5470,7 @@ QCC_function_t *QCC_PR_ParseImmediateStatements (QCC_type_t *type)
e2->ofs = QCC_GetFreeOffsetSpace(3); e2->ofs = QCC_GetFreeOffsetSpace(3);
extra_parms[i - MAX_PARMS] = e2; extra_parms[i - MAX_PARMS] = e2;
} }
extra_parms[i - MAX_PARMS]->type = defs[i]->type;
if (defs[i]->type->type != ev_vector) if (defs[i]->type->type != ev_vector)
QCC_PR_Statement (&pr_opcodes[OP_STORE_F], extra_parms[i - MAX_PARMS], defs[i], NULL); QCC_PR_Statement (&pr_opcodes[OP_STORE_F], extra_parms[i - MAX_PARMS], defs[i], NULL);
else else
@ -5479,7 +5535,7 @@ QCC_function_t *QCC_PR_ParseImmediateStatements (QCC_type_t *type)
{ {
if (!strcmp(pr_gotos[i].name, pr_labels[j].name)) if (!strcmp(pr_gotos[i].name, pr_labels[j].name))
{ {
*(signed int*)&statements[pr_gotos[i].statementno].a += pr_labels[j].statementno - pr_gotos[i].statementno; statements[pr_gotos[i].statementno].a += pr_labels[j].statementno - pr_gotos[i].statementno;
break; break;
} }
} }
@ -6502,8 +6558,26 @@ void QCC_PR_ParseDefs (char *classname)
} }
continue; continue;
} }
if (pr_token_type == tt_name)
{
unsigned int i;
if (def->arraysize>1)
QCC_PR_ParseError(ERR_ARRAYNEEDSBRACES, "Array initialisation requires curly braces");
d = QCC_PR_GetDef(NULL, pr_token, pr_scope, false, 0);
if (!d)
QCC_PR_ParseError(ERR_NOTDEFINED, "%s was not defined\n", name);
if (typecmp(def->type, d->type))
QCC_PR_ParseError (ERR_BADIMMEDIATETYPE, "wrong immediate type for %s", name);
for (i = 0; i < d->type->size; i++)
G_INT(def->ofs) = G_INT(d->ofs);
}
if (type->type == ev_function) else if (type->type == ev_function)
{ {
def->constant = constant; def->constant = constant;
if (QCC_PR_Check("0")) if (QCC_PR_Check("0"))

View file

@ -856,6 +856,14 @@ void QCC_PR_LexString (void)
{ {
if (len >= sizeof(pr_immediate_string)-1) if (len >= sizeof(pr_immediate_string)-1)
QCC_Error(ERR_INVALIDSTRINGIMMEDIATE, "String length exceeds %i", sizeof(pr_immediate_string)-1); QCC_Error(ERR_INVALIDSTRINGIMMEDIATE, "String length exceeds %i", sizeof(pr_immediate_string)-1);
while(*pr_file_p && *pr_file_p <= ' ')
pr_file_p++;
if (*pr_file_p == '\"') //have annother go
{
pr_file_p++;
continue;
}
pr_token[len] = 0; pr_token[len] = 0;
pr_token_type = tt_immediate; pr_token_type = tt_immediate;
pr_immediate_type = type_string; pr_immediate_type = type_string;
@ -2429,7 +2437,7 @@ QCC_type_t *QCC_PR_ParseFunctionType (int newtype, QCC_type_t *returntype)
do do
{ {
if (ftype->num_parms>=MAX_PARMS+MAX_EXTRA_PARMS) if (ftype->num_parms>=MAX_PARMS+MAX_EXTRA_PARMS)
QCC_PR_ParseError(ERR_TOOMANYPARAMETERSFORFUNC, "Too many parameters. Sorry. (limit is %i)\n", MAX_PARMS+MAX_EXTRA_PARMS); QCC_PR_ParseError(ERR_TOOMANYTOTALPARAMETERS, "Too many parameters. Sorry. (limit is %i)\n", MAX_PARMS+MAX_EXTRA_PARMS);
if (QCC_PR_Check ("...")) if (QCC_PR_Check ("..."))
{ {