Fixed a bug which was causing declarations in functions to run even when just scanning.
git-svn-id: http://picoc.googlecode.com/svn/trunk@315 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
825c393240
commit
f4b2bdcc64
15
parse.c
15
parse.c
|
@ -36,6 +36,9 @@ struct Value *ParseFunctionDefinition(struct ParseState *Parser, struct ValueTyp
|
||||||
struct ParseState FuncBody;
|
struct ParseState FuncBody;
|
||||||
int ParamCount = 0;
|
int ParamCount = 0;
|
||||||
|
|
||||||
|
if (TopStackFrame != NULL)
|
||||||
|
ProgramFail(Parser, "nested function definitions are not allowed");
|
||||||
|
|
||||||
LexGetToken(Parser, NULL, TRUE); /* open bracket */
|
LexGetToken(Parser, NULL, TRUE); /* open bracket */
|
||||||
ParamParser = *Parser;
|
ParamParser = *Parser;
|
||||||
Token = LexGetToken(Parser, NULL, TRUE);
|
Token = LexGetToken(Parser, NULL, TRUE);
|
||||||
|
@ -60,15 +63,18 @@ struct Value *ParseFunctionDefinition(struct ParseState *Parser, struct ValueTyp
|
||||||
FuncValue->Val->FuncDef.ParamName = (void *)FuncValue->Val->FuncDef.ParamType + sizeof(struct ValueType *) * ParamCount;
|
FuncValue->Val->FuncDef.ParamName = (void *)FuncValue->Val->FuncDef.ParamType + sizeof(struct ValueType *) * ParamCount;
|
||||||
|
|
||||||
for (ParamCount = 0; ParamCount < FuncValue->Val->FuncDef.NumParams; ParamCount++)
|
for (ParamCount = 0; ParamCount < FuncValue->Val->FuncDef.NumParams; ParamCount++)
|
||||||
{ /* harvest the parameters into the function definition */
|
{
|
||||||
|
/* harvest the parameters into the function definition */
|
||||||
if (ParamCount == FuncValue->Val->FuncDef.NumParams-1 && LexGetToken(&ParamParser, NULL, FALSE) == TokenEllipsis)
|
if (ParamCount == FuncValue->Val->FuncDef.NumParams-1 && LexGetToken(&ParamParser, NULL, FALSE) == TokenEllipsis)
|
||||||
{ /* ellipsis at end */
|
{
|
||||||
|
/* ellipsis at end */
|
||||||
FuncValue->Val->FuncDef.NumParams--;
|
FuncValue->Val->FuncDef.NumParams--;
|
||||||
FuncValue->Val->FuncDef.VarArgs = TRUE;
|
FuncValue->Val->FuncDef.VarArgs = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* add a parameter */
|
{
|
||||||
|
/* add a parameter */
|
||||||
TypeParse(&ParamParser, &ParamType, &ParamIdentifier);
|
TypeParse(&ParamParser, &ParamType, &ParamIdentifier);
|
||||||
FuncValue->Val->FuncDef.ParamType[ParamCount] = ParamType;
|
FuncValue->Val->FuncDef.ParamType[ParamCount] = ParamType;
|
||||||
FuncValue->Val->FuncDef.ParamName[ParamCount] = ParamIdentifier;
|
FuncValue->Val->FuncDef.ParamName[ParamCount] = ParamIdentifier;
|
||||||
|
@ -127,7 +133,8 @@ int ParseDeclaration(struct ParseState *Parser, enum LexToken Token)
|
||||||
if (Token == TokenVoidType && Identifier != StrEmpty)
|
if (Token == TokenVoidType && Identifier != StrEmpty)
|
||||||
ProgramFail(Parser, "can't define a void variable");
|
ProgramFail(Parser, "can't define a void variable");
|
||||||
|
|
||||||
NewVariable = VariableDefine(Parser, Identifier, NULL, Typ, TRUE);
|
if (Parser->Mode == RunModeRun)
|
||||||
|
NewVariable = VariableDefine(Parser, Identifier, NULL, Typ, TRUE);
|
||||||
|
|
||||||
if (LexGetToken(Parser, NULL, FALSE) == TokenAssign)
|
if (LexGetToken(Parser, NULL, FALSE) == TokenAssign)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue