diff --git a/expression.c b/expression.c index 6f4f701..9cef20f 100644 --- a/expression.c +++ b/expression.c @@ -1134,7 +1134,7 @@ void ExpressionParseFunctionCall(struct ParseState *Parser, struct ExpressionSta TopStackFrame->NumParams = ArgCount; TopStackFrame->ReturnValue = ReturnValue; for (Count = 0; Count < FuncValue->Val->FuncDef.NumParams; Count++) - VariableDefine(Parser, FuncValue->Val->FuncDef.ParamName[Count], ParamArray[Count]); + VariableDefine(Parser, FuncValue->Val->FuncDef.ParamName[Count], ParamArray[Count], TRUE); if (!ParseStatement(&FuncParser)) ProgramFail(&FuncParser, "function body expected"); diff --git a/parse.c b/parse.c index 6a80744..3ecfae8 100644 --- a/parse.c +++ b/parse.c @@ -127,14 +127,14 @@ int ParseDeclaration(struct ParseState *Parser, enum LexToken Token) ProgramFail(Parser, "can't define a void variable"); if (LexGetToken(Parser, NULL, FALSE) != TokenAssign) - VariableDefine(Parser, Identifier, VariableAllocValueFromType(Parser, Typ, TRUE, NULL)); + VariableDefine(Parser, Identifier, VariableAllocValueFromType(Parser, Typ, TRUE, NULL), TRUE); else { /* we're assigning an initial value */ LexGetToken(Parser, NULL, TRUE); if (!ExpressionParse(Parser, &CValue)) ProgramFail(Parser, "expression expected"); - VariableDefine(Parser, Identifier, CValue); + VariableDefine(Parser, Identifier, CValue, TRUE); if (Parser->Mode == RunModeRun) VariableStackPop(Parser, CValue); } diff --git a/picoc.h b/picoc.h index 8c3b359..741f15d 100644 --- a/picoc.h +++ b/picoc.h @@ -350,7 +350,7 @@ struct Value *VariableAllocValueAndCopy(struct ParseState *Parser, struct Value struct Value *VariableAllocValueFromType(struct ParseState *Parser, struct ValueType *Typ, int IsLValue, struct Value *LValueFrom); struct Value *VariableAllocValueFromExistingData(struct ParseState *Parser, struct ValueType *Typ, union AnyValue *FromValue, int IsLValue, struct Value *LValueFrom); struct Value *VariableAllocValueShared(struct ParseState *Parser, struct Value *FromValue); -void VariableDefine(struct ParseState *Parser, char *Ident, struct Value *InitValue); +void VariableDefine(struct ParseState *Parser, char *Ident, struct Value *InitValue, int MakeWritable); int VariableDefined(const char *Ident); void VariableGet(struct ParseState *Parser, const char *Ident, struct Value **LVal); void VariableDefinePlatformVar(struct ParseState *Parser, char *Ident, struct ValueType *Typ, union AnyValue *FromValue, int IsWritable); diff --git a/type.c b/type.c index ded7b93..c882317 100644 --- a/type.c +++ b/type.c @@ -270,7 +270,7 @@ void TypeParseEnum(struct ParseState *Parser, struct ValueType **Typ) EnumValue = ExpressionParseInt(Parser); } - VariableDefine(Parser, EnumIdentifier, &InitValue); + VariableDefine(Parser, EnumIdentifier, &InitValue, FALSE); Token = LexGetToken(Parser, NULL, TRUE); if (Token != TokenComma && Token != TokenRightBrace) diff --git a/variable.c b/variable.c index ff5f9a8..e47ca97 100644 --- a/variable.c +++ b/variable.c @@ -145,9 +145,14 @@ struct Value *VariableAllocValueShared(struct ParseState *Parser, struct Value * } /* define a variable. Ident must be registered */ -void VariableDefine(struct ParseState *Parser, char *Ident, struct Value *InitValue) +void VariableDefine(struct ParseState *Parser, char *Ident, struct Value *InitValue, int MakeWritable) { - if (!TableSet((TopStackFrame == NULL) ? &GlobalTable : &TopStackFrame->LocalTable, Ident, VariableAllocValueAndCopy(Parser, InitValue, TopStackFrame == NULL))) + struct Value *AssignValue = VariableAllocValueAndCopy(Parser, InitValue, TopStackFrame == NULL); + + if (MakeWritable) + AssignValue->IsLValue = TRUE; + + if (!TableSet((TopStackFrame == NULL) ? &GlobalTable : &TopStackFrame->LocalTable, Ident, AssignValue)) ProgramFail(Parser, "'%s' is already defined", Ident); }