comma operator.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2038 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2006-03-01 18:53:31 +00:00
parent 7d09a3efdc
commit a906ad0326

View file

@ -716,7 +716,7 @@ pbool QCC_OPCodeValid(QCC_opcode_t *op)
return false; return false;
} }
QCC_def_t *QCC_PR_Expression (int priority); QCC_def_t *QCC_PR_Expression (int priority, pbool allowcomma);
int QCC_AStatementJumpsTo(int targ, int first, int last); int QCC_AStatementJumpsTo(int targ, int first, int last);
pbool QCC_StatementIsAJump(int stnum, int notifdest); pbool QCC_StatementIsAJump(int stnum, int notifdest);
@ -2141,13 +2141,13 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
func->references++; func->references++;
if (!QCC_PR_CheckToken(")")) if (!QCC_PR_CheckToken(")"))
{ {
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
if (e->type->type != ev_float) if (e->type->type != ev_float)
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 1); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 1);
if (!QCC_PR_CheckToken(")")) if (!QCC_PR_CheckToken(")"))
{ {
QCC_PR_Expect(","); QCC_PR_Expect(",");
d = QCC_PR_Expression (TOP_PRIORITY); d = QCC_PR_Expression (TOP_PRIORITY, false);
if (d->type->type != ev_float) if (d->type->type != ev_float)
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 2); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 2);
QCC_PR_Expect(")"); QCC_PR_Expect(")");
@ -2262,13 +2262,13 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
func->references++; func->references++;
if (!QCC_PR_CheckToken(")")) if (!QCC_PR_CheckToken(")"))
{ {
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
if (e->type->type != ev_vector) if (e->type->type != ev_vector)
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 1); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 1);
if (!QCC_PR_CheckToken(")")) if (!QCC_PR_CheckToken(")"))
{ {
QCC_PR_Expect(","); QCC_PR_Expect(",");
d = QCC_PR_Expression (TOP_PRIORITY); d = QCC_PR_Expression (TOP_PRIORITY, false);
if (d->type->type != ev_vector) if (d->type->type != ev_vector)
QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 2); QCC_PR_ParseErrorPrintDef (ERR_TYPEMISMATCHPARM, func, "type mismatch on parm %i", 2);
QCC_PR_Expect(")"); QCC_PR_Expect(")");
@ -2474,7 +2474,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
//t = (a/%1) / (nextent(world)/%1) //t = (a/%1) / (nextent(world)/%1)
//a/%1 does a (int)entity to float conversion type thing //a/%1 does a (int)entity to float conversion type thing
e = QCC_PR_Expression(TOP_PRIORITY); e = QCC_PR_Expression(TOP_PRIORITY, false);
QCC_PR_Expect(")"); QCC_PR_Expect(")");
e = QCC_PR_Statement(&pr_opcodes[OP_DIV_F], e, QCC_MakeIntDef(1), (QCC_dstatement_t **)0xffffffff); e = QCC_PR_Statement(&pr_opcodes[OP_DIV_F], e, QCC_MakeIntDef(1), (QCC_dstatement_t **)0xffffffff);
@ -2554,7 +2554,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
} }
else else
{ //bum { //bum
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
if (e->type->type != ev_vector) if (e->type->type != ev_vector)
{ {
if (flag_laxcasts) if (flag_laxcasts)
@ -2571,7 +2571,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
} }
else else
{ //bother { //bother
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
if (e->type->type != ev_vector) if (e->type->type != ev_vector)
{ {
if (flag_laxcasts) if (flag_laxcasts)
@ -2603,7 +2603,7 @@ QCC_def_t *QCC_PR_ParseFunctionCall (QCC_def_t *func) //warning, the func could
QCC_PR_ParsePrintDef(WARN_TOOMANYPARAMETERSFORFUNC, func); QCC_PR_ParsePrintDef(WARN_TOOMANYPARAMETERSFORFUNC, func);
} }
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
if (arg == 0 && func->name) if (arg == 0 && func->name)
{ {
@ -3335,7 +3335,7 @@ reloop:
{ {
numstatements--; //remove the last statement numstatements--; //remove the last statement
nd = QCC_PR_Expression (TOP_PRIORITY); nd = QCC_PR_Expression (TOP_PRIORITY, true);
QCC_PR_Expect("]"); QCC_PR_Expect("]");
if (d->type->size != 1) //we need to multiply it to find the offset. if (d->type->size != 1) //we need to multiply it to find the offset.
@ -3375,7 +3375,7 @@ reloop:
} }
else else
{ {
ao = QCC_PR_Expression (TOP_PRIORITY); ao = QCC_PR_Expression (TOP_PRIORITY, true);
QCC_PR_Expect("]"); QCC_PR_Expect("]");
if (QCC_OPCodeValid(&pr_opcodes[OP_LOADA_F]) && d->type->size != 1) //we need to multiply it to find the offset. if (QCC_OPCodeValid(&pr_opcodes[OP_LOADA_F]) && d->type->size != 1) //we need to multiply it to find the offset.
@ -3453,7 +3453,7 @@ reloop:
QCC_PR_ParseWarning(0, "RETURN VALUE ALREADY IN USE"); QCC_PR_ParseWarning(0, "RETURN VALUE ALREADY IN USE");
funcretr = QCC_PR_GetDef(type_function, qcva("ArraySet*%s", d->name), NULL, true, 1); funcretr = QCC_PR_GetDef(type_function, qcva("ArraySet*%s", d->name), NULL, true, 1);
nd = QCC_PR_Expression(TOP_PRIORITY); nd = QCC_PR_Expression(TOP_PRIORITY, true);
if (nd->type->type != d->type->type) if (nd->type->type != d->type->type)
QCC_PR_ParseErrorPrintDef(ERR_TYPEMISMATCH, d, "Type Mismatch on array assignment"); QCC_PR_ParseErrorPrintDef(ERR_TYPEMISMATCH, d, "Type Mismatch on array assignment");
@ -3518,7 +3518,7 @@ reloop:
if (QCC_PR_CheckToken("=")) if (QCC_PR_CheckToken("="))
{ {
funcretr = QCC_PR_GetDef(type_function, qcva("ArraySet*%s", d->name), NULL, true, 1); funcretr = QCC_PR_GetDef(type_function, qcva("ArraySet*%s", d->name), NULL, true, 1);
nd = QCC_PR_Expression(TOP_PRIORITY); nd = QCC_PR_Expression(TOP_PRIORITY, true);
if (nd->type->type != d->type->type) if (nd->type->type != d->type->type)
QCC_PR_ParseErrorPrintDef(ERR_TYPEMISMATCH, d, "Type Mismatch on array assignment"); QCC_PR_ParseErrorPrintDef(ERR_TYPEMISMATCH, d, "Type Mismatch on array assignment");
@ -3799,7 +3799,7 @@ reloop:
QCC_def_t *field; QCC_def_t *field;
if (QCC_PR_CheckToken("(")) if (QCC_PR_CheckToken("("))
{ {
field = QCC_PR_Expression(TOP_PRIORITY); field = QCC_PR_Expression(TOP_PRIORITY, true);
QCC_PR_Expect(")"); QCC_PR_Expect(")");
} }
else else
@ -3921,7 +3921,7 @@ QCC_def_t *QCC_PR_Term (void)
if (QCC_PR_CheckToken ("!")) if (QCC_PR_CheckToken ("!"))
{ {
e = QCC_PR_Expression (NOT_PRIORITY); e = QCC_PR_Expression (NOT_PRIORITY, false);
t = e->type->type; t = e->type->type;
if (t == ev_float) if (t == ev_float)
e2 = QCC_PR_Statement (&pr_opcodes[OP_NOT_F], e, 0, NULL); e2 = QCC_PR_Statement (&pr_opcodes[OP_NOT_F], e, 0, NULL);
@ -3948,7 +3948,7 @@ QCC_def_t *QCC_PR_Term (void)
else if (QCC_PR_CheckToken ("&")) else if (QCC_PR_CheckToken ("&"))
{ {
int st = numstatements; int st = numstatements;
e = QCC_PR_Expression (NOT_PRIORITY); e = QCC_PR_Expression (NOT_PRIORITY, false);
t = e->type->type; t = e->type->type;
if (st != numstatements) if (st != numstatements)
@ -3978,7 +3978,7 @@ QCC_def_t *QCC_PR_Term (void)
} }
else if (QCC_PR_CheckToken ("*")) else if (QCC_PR_CheckToken ("*"))
{ {
e = QCC_PR_Expression (NOT_PRIORITY); e = QCC_PR_Expression (NOT_PRIORITY, false);
t = e->type->type; t = e->type->type;
if (t != ev_pointer) if (t != ev_pointer)
@ -4022,7 +4022,7 @@ QCC_def_t *QCC_PR_Term (void)
} }
else if (QCC_PR_CheckToken ("-")) else if (QCC_PR_CheckToken ("-"))
{ {
e = QCC_PR_Expression (NOT_PRIORITY); e = QCC_PR_Expression (NOT_PRIORITY, false);
switch(e->type->type) switch(e->type->type)
{ {
@ -4041,7 +4041,7 @@ QCC_def_t *QCC_PR_Term (void)
} }
else if (QCC_PR_CheckToken ("+")) else if (QCC_PR_CheckToken ("+"))
{ {
e = QCC_PR_Expression (NOT_PRIORITY); e = QCC_PR_Expression (NOT_PRIORITY, false);
switch(e->type->type) switch(e->type->type)
{ {
@ -4126,7 +4126,7 @@ QCC_def_t *QCC_PR_Term (void)
{ {
pbool oldcond = conditional; pbool oldcond = conditional;
conditional = conditional?2:0; conditional = conditional?2:0;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, false);
QCC_PR_Expect (")"); QCC_PR_Expect (")");
conditional = oldcond; conditional = oldcond;
} }
@ -4171,7 +4171,7 @@ PR_Expression
============== ==============
*/ */
QCC_def_t *QCC_PR_Expression (int priority) QCC_def_t *QCC_PR_Expression (int priority, pbool allowcomma)
{ {
QCC_dstatement32_t *st; QCC_dstatement32_t *st;
QCC_opcode_t *op, *oldop; QCC_opcode_t *op, *oldop;
@ -4187,34 +4187,42 @@ QCC_def_t *QCC_PR_Expression (int priority)
if (priority == 0) if (priority == 0)
return QCC_PR_Term (); return QCC_PR_Term ();
e = QCC_PR_Expression (priority-1); e = QCC_PR_Expression (priority-1, allowcomma);
while (1) while (1)
{ {
if (priority == 1 && QCC_PR_CheckToken ("(") ) if (priority == 1)
{ {
qcc_usefulstatement=true; if (QCC_PR_CheckToken ("(") )
return QCC_PR_ParseFunctionCall (e); {
} qcc_usefulstatement=true;
if (priority == 1 && QCC_PR_CheckToken ("?")) return QCC_PR_ParseFunctionCall (e);
{ }
QCC_dstatement32_t *fromj, *elsej; if (QCC_PR_CheckToken ("?"))
QCC_PR_Statement(&pr_opcodes[OP_IFNOT], e, NULL, fromj); {
e = QCC_PR_Expression(TOP_PRIORITY); QCC_dstatement32_t *fromj, *elsej;
e2 = QCC_GetTemp(e->type); QCC_PR_Statement(&pr_opcodes[OP_IFNOT], e, NULL, &fromj);
QCC_PR_Statement(&pr_opcodes[(e2->size>=3)?OP_STORE_V:OP_STORE_F], e, e2); e = QCC_PR_Expression(TOP_PRIORITY, true);
e2 = QCC_GetTemp(e->type);
QCC_PR_Statement(&pr_opcodes[(e2->type->size>=3)?OP_STORE_V:OP_STORE_F], e, e2, NULL);
QCC_PR_Expect(":"); QCC_PR_Expect(":");
QCC_PR_Statement(&pr_opcodes[OP_GOTO], NULL, NULL, elsej); QCC_PR_Statement(&pr_opcodes[OP_GOTO], NULL, NULL, &elsej);
fromj->b = &statements[numstatements] - fromj; fromj->b = &statements[numstatements] - fromj;
e = QCC_PR_Expression(TOP_PRIORITY); e = QCC_PR_Expression(TOP_PRIORITY, true);
if (typecmp(e, e2) != 0) if (typecmp(e->type, e2->type) != 0)
QCC_PR_ParseError(0, "Ternary operator with mismatching types\n") QCC_PR_ParseError(0, "Ternary operator with mismatching types\n");
QCC_PR_Statement(&pr_opcodes[(e2->size>=3)?OP_STORE_V:OP_STORE_F], e, e2); QCC_PR_Statement(&pr_opcodes[(e2->type->size>=3)?OP_STORE_V:OP_STORE_F], e, e2, NULL);
elsej->a = &statements[numstatements] - elsej; elsej->a = &statements[numstatements] - elsej;
return e2; return e2;
}
if (allowcomma && QCC_PR_CheckToken (","))
{
QCC_FreeTemp(e);
return QCC_PR_Expression(TOP_PRIORITY, true);
}
} }
opnum=0; opnum=0;
@ -4271,12 +4279,12 @@ QCC_def_t *QCC_PR_Expression (int priority)
e->type = type_string; e->type = type_string;
//now we want to make sure that string = float can't work without it being a dereferenced pointer. (we don't want to allow storep_c without dereferece) //now we want to make sure that string = float can't work without it being a dereferenced pointer. (we don't want to allow storep_c without dereferece)
e2 = QCC_PR_Expression (priority); e2 = QCC_PR_Expression (priority, allowcomma);
if (e2->type->type == ev_float) if (e2->type->type == ev_float)
op = &pr_opcodes[OP_STOREP_C]; op = &pr_opcodes[OP_STOREP_C];
} }
else else
e2 = QCC_PR_Expression (priority); e2 = QCC_PR_Expression (priority, allowcomma);
} }
else else
{ {
@ -4290,7 +4298,7 @@ QCC_def_t *QCC_PR_Expression (int priority)
QCC_PR_Statement3(&pr_opcodes[OP_IF], e, NULL, NULL, false); QCC_PR_Statement3(&pr_opcodes[OP_IF], e, NULL, NULL, false);
} }
e2 = QCC_PR_Expression (priority-1); e2 = QCC_PR_Expression (priority-1, allowcomma);
} }
// type check // type check
@ -4664,7 +4672,7 @@ void QCC_PR_ParseStatement (void)
QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_RETURN], 0, 0, NULL)); QCC_FreeTemp(QCC_PR_Statement (&pr_opcodes[OP_RETURN], 0, 0, NULL));
return; return;
} }
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
QCC_PR_Expect (";"); QCC_PR_Expect (";");
if (pr_scope->type->aux_type->type != e->type->type) if (pr_scope->type->aux_type->type != e->type->type)
QCC_PR_ParseWarning(WARN_WRONGRETURNTYPE, "\'%s\' returned %s, expected %s", pr_scope->name, e->type->name, pr_scope->type->aux_type->name); QCC_PR_ParseWarning(WARN_WRONGRETURNTYPE, "\'%s\' returned %s, expected %s", pr_scope->name, e->type->name, pr_scope->type->aux_type->name);
@ -4686,7 +4694,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect ("("); QCC_PR_Expect ("(");
patch2 = &statements[numstatements]; patch2 = &statements[numstatements];
conditional = 1; conditional = 1;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
conditional = 0; conditional = 0;
if (((e->constant && !e->temp) || !STRCMP(e->name, "IMMEDIATE")) && opt_compound_jumps) if (((e->constant && !e->temp) || !STRCMP(e->name, "IMMEDIATE")) && opt_compound_jumps)
{ {
@ -4764,10 +4772,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect("("); QCC_PR_Expect("(");
if (!QCC_PR_CheckToken(";")) if (!QCC_PR_CheckToken(";"))
{ {
do QCC_FreeTemp(QCC_PR_Expression(TOP_PRIORITY, true));
{
QCC_FreeTemp(QCC_PR_Expression(TOP_PRIORITY));
} while (QCC_PR_CheckToken(","));
QCC_PR_Expect(";"); QCC_PR_Expect(";");
} }
@ -4775,11 +4780,7 @@ void QCC_PR_ParseStatement (void)
if (!QCC_PR_CheckToken(";")) if (!QCC_PR_CheckToken(";"))
{ {
conditional = 1; conditional = 1;
e = QCC_PR_Expression(TOP_PRIORITY); e = QCC_PR_Expression(TOP_PRIORITY, true);
while (QCC_PR_CheckToken(",")) //logicops, string ops?
{
e = QCC_PR_Statement(pr_opcodes+OP_AND, e, QCC_PR_Expression(TOP_PRIORITY), NULL);
}
conditional = 0; conditional = 0;
QCC_PR_Expect(";"); QCC_PR_Expect(";");
} }
@ -4789,10 +4790,7 @@ void QCC_PR_ParseStatement (void)
if (!QCC_PR_CheckToken(")")) if (!QCC_PR_CheckToken(")"))
{ {
old_numstatements = numstatements; old_numstatements = numstatements;
do QCC_FreeTemp(QCC_PR_Expression(TOP_PRIORITY, true));
{
QCC_FreeTemp(QCC_PR_Expression(TOP_PRIORITY));
} while (QCC_PR_CheckToken(","));
numtemp = numstatements - old_numstatements; numtemp = numstatements - old_numstatements;
if (numtemp > sizeof(linenum)/sizeof(linenum[0])) if (numtemp > sizeof(linenum)/sizeof(linenum[0]))
@ -4856,7 +4854,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect ("while"); QCC_PR_Expect ("while");
QCC_PR_Expect ("("); QCC_PR_Expect ("(");
conditional = 1; conditional = 1;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
conditional = 0; conditional = 0;
if (e->constant && !e->temp) if (e->constant && !e->temp)
@ -4958,7 +4956,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect ("("); QCC_PR_Expect ("(");
conditional = 1; conditional = 1;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
conditional = 0; conditional = 0;
// negate = negate != 0; // negate = negate != 0;
@ -5033,7 +5031,7 @@ void QCC_PR_ParseStatement (void)
QCC_PR_Expect ("("); QCC_PR_Expect ("(");
conditional = 1; conditional = 1;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
conditional = 0; conditional = 0;
if (e == &def_ret) if (e == &def_ret)
@ -5384,10 +5382,10 @@ void QCC_PR_ParseStatement (void)
pr_casesdef2 = realloc(pr_casesdef2, sizeof(*pr_casesdef2)*max_cases); pr_casesdef2 = realloc(pr_casesdef2, sizeof(*pr_casesdef2)*max_cases);
} }
pr_cases[num_cases] = numstatements; pr_cases[num_cases] = numstatements;
pr_casesdef[num_cases] = QCC_PR_Expression (TOP_PRIORITY); pr_casesdef[num_cases] = QCC_PR_Expression (TOP_PRIORITY, false);
if (QCC_PR_CheckToken("..")) if (QCC_PR_CheckToken(".."))
{ {
pr_casesdef2[num_cases] = QCC_PR_Expression (TOP_PRIORITY); pr_casesdef2[num_cases] = QCC_PR_Expression (TOP_PRIORITY, false);
if (pr_casesdef[num_cases]->constant && pr_casesdef2[num_cases]->constant && if (pr_casesdef[num_cases]->constant && pr_casesdef2[num_cases]->constant &&
!pr_casesdef[num_cases]->temp && !pr_casesdef2[num_cases]->temp) !pr_casesdef[num_cases]->temp && !pr_casesdef2[num_cases]->temp)
if (G_FLOAT(pr_casesdef[num_cases]->ofs) >= G_FLOAT(pr_casesdef2[num_cases]->ofs)) if (G_FLOAT(pr_casesdef[num_cases]->ofs) >= G_FLOAT(pr_casesdef2[num_cases]->ofs))
@ -5423,9 +5421,9 @@ void QCC_PR_ParseStatement (void)
{ {
QCC_def_t *nextthink; QCC_def_t *nextthink;
QCC_def_t *time; QCC_def_t *time;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
QCC_PR_Expect(":"); QCC_PR_Expect(":");
e2 = QCC_PR_Expression (TOP_PRIORITY); e2 = QCC_PR_Expression (TOP_PRIORITY, true);
if (e->type->type != ev_entity || e2->type->type != ev_float) if (e->type->type != ev_entity || e2->type->type != ev_float)
QCC_PR_ParseError(ERR_THINKTIMETYPEMISMATCH, "thinktime type mismatch"); QCC_PR_ParseError(ERR_THINKTIMETYPEMISMATCH, "thinktime type mismatch");
@ -5458,7 +5456,7 @@ void QCC_PR_ParseStatement (void)
// qcc_functioncalled=0; // qcc_functioncalled=0;
qcc_usefulstatement = false; qcc_usefulstatement = false;
e = QCC_PR_Expression (TOP_PRIORITY); e = QCC_PR_Expression (TOP_PRIORITY, true);
QCC_PR_Expect (";"); QCC_PR_Expect (";");
if (e->type->type != ev_void && !qcc_usefulstatement) if (e->type->type != ev_void && !qcc_usefulstatement)
@ -7820,7 +7818,7 @@ void QCC_PR_ParseDefs (char *classname)
} }
else else
{ {
def = QCC_PR_Expression(TOP_PRIORITY); def = QCC_PR_Expression(TOP_PRIORITY, true);
if (!def->constant) if (!def->constant)
QCC_PR_ParseError(ERR_BADARRAYSIZE, "Array size is not a constant value"); QCC_PR_ParseError(ERR_BADARRAYSIZE, "Array size is not a constant value");
else if (def->type->type == ev_integer) else if (def->type->type == ev_integer)