Fix various errors triggered by fuzzing
This commit is contained in:
parent
5010043fc4
commit
6481e119e4
|
@ -142,11 +142,12 @@ Expression* Expression::LogicInvertExpression(void)
|
||||||
{
|
{
|
||||||
Expression* ex = new Expression(mLocation, EX_LOGICAL_NOT);
|
Expression* ex = new Expression(mLocation, EX_LOGICAL_NOT);
|
||||||
ex->mLeft = this;
|
ex->mLeft = this;
|
||||||
|
ex->mDecType = TheBoolTypeDeclaration;
|
||||||
return ex;
|
return ex;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Expression* Expression::ConstantFold(void)
|
Expression* Expression::ConstantFold(Errors * errors)
|
||||||
{
|
{
|
||||||
if (mType == EX_PREFIX && mLeft->mType == EX_CONSTANT)
|
if (mType == EX_PREFIX && mLeft->mType == EX_CONSTANT)
|
||||||
{
|
{
|
||||||
|
@ -249,7 +250,7 @@ Expression* Expression::ConstantFold(void)
|
||||||
{
|
{
|
||||||
if (mLeft->mDecValue->mType == DT_CONST_INTEGER && mRight->mDecValue->mType == DT_CONST_INTEGER)
|
if (mLeft->mDecValue->mType == DT_CONST_INTEGER && mRight->mDecValue->mType == DT_CONST_INTEGER)
|
||||||
{
|
{
|
||||||
int64 ival, ileft = mLeft->mDecValue->mInteger, iright = mRight->mDecValue->mInteger;
|
int64 ival = 0, ileft = mLeft->mDecValue->mInteger, iright = mRight->mDecValue->mInteger;
|
||||||
|
|
||||||
switch (mToken)
|
switch (mToken)
|
||||||
{
|
{
|
||||||
|
@ -263,10 +264,16 @@ Expression* Expression::ConstantFold(void)
|
||||||
ival = ileft * iright;
|
ival = ileft * iright;
|
||||||
break;
|
break;
|
||||||
case TK_DIV:
|
case TK_DIV:
|
||||||
ival = ileft / iright;
|
if (iright == 0)
|
||||||
|
errors->Error(mLocation, EERR_INVALID_VALUE, "Constant division by zero");
|
||||||
|
else
|
||||||
|
ival = ileft / iright;
|
||||||
break;
|
break;
|
||||||
case TK_MOD:
|
case TK_MOD:
|
||||||
ival = ileft % iright;
|
if (iright == 0)
|
||||||
|
errors->Error(mLocation, EERR_INVALID_VALUE, "Constant division by zero");
|
||||||
|
else
|
||||||
|
ival = ileft % iright;
|
||||||
break;
|
break;
|
||||||
case TK_LEFT_SHIFT:
|
case TK_LEFT_SHIFT:
|
||||||
ival = ileft << iright;
|
ival = ileft << iright;
|
||||||
|
@ -498,6 +505,7 @@ bool Declaration::IsNumericType(void) const
|
||||||
|
|
||||||
Declaration* TheVoidTypeDeclaration, * TheSignedIntTypeDeclaration, * TheUnsignedIntTypeDeclaration, * TheConstCharTypeDeclaration, * TheCharTypeDeclaration, * TheSignedCharTypeDeclaration, * TheUnsignedCharTypeDeclaration;
|
Declaration* TheVoidTypeDeclaration, * TheSignedIntTypeDeclaration, * TheUnsignedIntTypeDeclaration, * TheConstCharTypeDeclaration, * TheCharTypeDeclaration, * TheSignedCharTypeDeclaration, * TheUnsignedCharTypeDeclaration;
|
||||||
Declaration* TheBoolTypeDeclaration, * TheFloatTypeDeclaration, * TheVoidPointerTypeDeclaration, * TheSignedLongTypeDeclaration, * TheUnsignedLongTypeDeclaration;
|
Declaration* TheBoolTypeDeclaration, * TheFloatTypeDeclaration, * TheVoidPointerTypeDeclaration, * TheSignedLongTypeDeclaration, * TheUnsignedLongTypeDeclaration;
|
||||||
|
Declaration* TheVoidFunctionTypeDeclaration, * TheConstVoidValueDeclaration;
|
||||||
|
|
||||||
void InitDeclarations(void)
|
void InitDeclarations(void)
|
||||||
{
|
{
|
||||||
|
@ -510,6 +518,17 @@ void InitDeclarations(void)
|
||||||
TheVoidPointerTypeDeclaration->mSize = 2;
|
TheVoidPointerTypeDeclaration->mSize = 2;
|
||||||
TheVoidPointerTypeDeclaration->mFlags = DTF_DEFINED;
|
TheVoidPointerTypeDeclaration->mFlags = DTF_DEFINED;
|
||||||
|
|
||||||
|
TheVoidFunctionTypeDeclaration = new Declaration(noloc, DT_TYPE_FUNCTION);
|
||||||
|
TheVoidFunctionTypeDeclaration->mBase = TheVoidTypeDeclaration;
|
||||||
|
TheVoidFunctionTypeDeclaration->mSize = 2;
|
||||||
|
TheVoidFunctionTypeDeclaration->mFlags = DTF_DEFINED;
|
||||||
|
|
||||||
|
TheConstVoidValueDeclaration = new Declaration(noloc, DT_CONST_INTEGER);
|
||||||
|
TheVoidFunctionTypeDeclaration->mBase = TheVoidTypeDeclaration;
|
||||||
|
TheVoidFunctionTypeDeclaration->mSize = 2;
|
||||||
|
TheVoidFunctionTypeDeclaration->mInteger = 0;
|
||||||
|
TheVoidFunctionTypeDeclaration->mFlags = DTF_DEFINED;
|
||||||
|
|
||||||
TheSignedIntTypeDeclaration = new Declaration(noloc, DT_TYPE_INTEGER);
|
TheSignedIntTypeDeclaration = new Declaration(noloc, DT_TYPE_INTEGER);
|
||||||
TheSignedIntTypeDeclaration->mSize = 2;
|
TheSignedIntTypeDeclaration->mSize = 2;
|
||||||
TheSignedIntTypeDeclaration->mFlags = DTF_DEFINED | DTF_SIGNED;
|
TheSignedIntTypeDeclaration->mFlags = DTF_DEFINED | DTF_SIGNED;
|
||||||
|
|
|
@ -150,7 +150,7 @@ public:
|
||||||
bool mConst;
|
bool mConst;
|
||||||
|
|
||||||
Expression* LogicInvertExpression(void);
|
Expression* LogicInvertExpression(void);
|
||||||
Expression* ConstantFold(void);
|
Expression* ConstantFold(Errors * errors);
|
||||||
};
|
};
|
||||||
|
|
||||||
class Declaration
|
class Declaration
|
||||||
|
@ -188,3 +188,5 @@ void InitDeclarations(void);
|
||||||
|
|
||||||
extern Declaration* TheVoidTypeDeclaration, * TheSignedIntTypeDeclaration, * TheUnsignedIntTypeDeclaration, * TheConstCharTypeDeclaration, * TheCharTypeDeclaration, * TheSignedCharTypeDeclaration, * TheUnsignedCharTypeDeclaration;
|
extern Declaration* TheVoidTypeDeclaration, * TheSignedIntTypeDeclaration, * TheUnsignedIntTypeDeclaration, * TheConstCharTypeDeclaration, * TheCharTypeDeclaration, * TheSignedCharTypeDeclaration, * TheUnsignedCharTypeDeclaration;
|
||||||
extern Declaration* TheBoolTypeDeclaration, * TheFloatTypeDeclaration, * TheVoidPointerTypeDeclaration, * TheSignedLongTypeDeclaration, * TheUnsignedLongTypeDeclaration;
|
extern Declaration* TheBoolTypeDeclaration, * TheFloatTypeDeclaration, * TheVoidPointerTypeDeclaration, * TheSignedLongTypeDeclaration, * TheUnsignedLongTypeDeclaration;
|
||||||
|
extern Declaration* TheVoidFunctionTypeDeclaration, * TheConstVoidValueDeclaration;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ void Errors::Error(const Location& loc, ErrorID eid, const char* msg, const char
|
||||||
printf("%s(%d, %d) : %s %d: %s\n", loc.mFileName, loc.mLine, loc.mColumn, level, eid, msg);
|
printf("%s(%d, %d) : %s %d: %s\n", loc.mFileName, loc.mLine, loc.mColumn, level, eid, msg);
|
||||||
|
|
||||||
if (mErrorCount > 10)
|
if (mErrorCount > 10)
|
||||||
exit(10);
|
exit(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ enum ErrorID
|
||||||
EERR_CONSTANT_INITIALIZER,
|
EERR_CONSTANT_INITIALIZER,
|
||||||
EERR_CONSTANT_TYPE,
|
EERR_CONSTANT_TYPE,
|
||||||
EERR_VARIABLE_TYPE,
|
EERR_VARIABLE_TYPE,
|
||||||
|
EERR_INVALID_VALUE,
|
||||||
EERR_INCOMPATIBLE_TYPES,
|
EERR_INCOMPATIBLE_TYPES,
|
||||||
EERR_INCOMPATIBLE_OPERATOR,
|
EERR_INCOMPATIBLE_OPERATOR,
|
||||||
EERR_CONST_ASSIGN,
|
EERR_CONST_ASSIGN,
|
||||||
|
|
|
@ -168,7 +168,7 @@ void GlobalAnalyzer::AnalyzeAssembler(Expression* exp, Declaration* procDec)
|
||||||
if (procDec)
|
if (procDec)
|
||||||
procDec->mComplexity += 2;
|
procDec->mComplexity += 2;
|
||||||
|
|
||||||
if (exp->mLeft)
|
if (exp->mLeft && exp->mLeft->mDecValue)
|
||||||
{
|
{
|
||||||
Declaration* adec = exp->mLeft->mDecValue;
|
Declaration* adec = exp->mLeft->mDecValue;
|
||||||
if (adec->mType == DT_LABEL_REF)
|
if (adec->mType == DT_LABEL_REF)
|
||||||
|
@ -306,7 +306,8 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec)
|
||||||
case EX_SEQUENCE:
|
case EX_SEQUENCE:
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
ldec = Analyze(exp->mLeft, procDec);
|
if (exp->mLeft)
|
||||||
|
ldec = Analyze(exp->mLeft, procDec);
|
||||||
exp = exp->mRight;
|
exp = exp->mRight;
|
||||||
} while (exp);
|
} while (exp);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -277,7 +277,9 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
|
||||||
case ASMIM_IMPLIED:
|
case ASMIM_IMPLIED:
|
||||||
break;
|
break;
|
||||||
case ASMIM_IMMEDIATE:
|
case ASMIM_IMMEDIATE:
|
||||||
if (aexp->mType == DT_CONST_INTEGER)
|
if (!aexp)
|
||||||
|
mErrors->Error(cexp->mLocation, EERR_ASM_INVALD_OPERAND, "Missing assembler operand");
|
||||||
|
else if (aexp->mType == DT_CONST_INTEGER)
|
||||||
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
|
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
|
||||||
else if (aexp->mType == DT_LABEL_REF)
|
else if (aexp->mType == DT_LABEL_REF)
|
||||||
{
|
{
|
||||||
|
@ -346,7 +348,9 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
|
||||||
case ASMIM_ZERO_PAGE_X:
|
case ASMIM_ZERO_PAGE_X:
|
||||||
case ASMIM_INDIRECT_X:
|
case ASMIM_INDIRECT_X:
|
||||||
case ASMIM_INDIRECT_Y:
|
case ASMIM_INDIRECT_Y:
|
||||||
if (aexp->mType == DT_VARIABLE_REF)
|
if (!aexp)
|
||||||
|
mErrors->Error(cexp->mLocation, EERR_ASM_INVALD_OPERAND, "Missing assembler operand");
|
||||||
|
else if (aexp->mType == DT_VARIABLE_REF)
|
||||||
{
|
{
|
||||||
if (refvars)
|
if (refvars)
|
||||||
{
|
{
|
||||||
|
@ -405,7 +409,9 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
|
||||||
case ASMIM_INDIRECT:
|
case ASMIM_INDIRECT:
|
||||||
case ASMIM_ABSOLUTE_X:
|
case ASMIM_ABSOLUTE_X:
|
||||||
case ASMIM_ABSOLUTE_Y:
|
case ASMIM_ABSOLUTE_Y:
|
||||||
if (aexp->mType == DT_CONST_INTEGER)
|
if (!aexp)
|
||||||
|
mErrors->Error(cexp->mLocation, EERR_ASM_INVALD_OPERAND, "Missing assembler operand");
|
||||||
|
else if (aexp->mType == DT_CONST_INTEGER)
|
||||||
{
|
{
|
||||||
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
|
d[offset++] = cexp->mLeft->mDecValue->mInteger & 255;
|
||||||
d[offset++] = cexp->mLeft->mDecValue->mInteger >> 8;
|
d[offset++] = cexp->mLeft->mDecValue->mInteger >> 8;
|
||||||
|
@ -535,7 +541,10 @@ void InterCodeGenerator::TranslateAssembler(InterCodeModule* mod, Expression* ex
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ASMIM_RELATIVE:
|
case ASMIM_RELATIVE:
|
||||||
d[offset] = aexp->mInteger - offset - 1;
|
if (!aexp)
|
||||||
|
mErrors->Error(cexp->mLocation, EERR_ASM_INVALD_OPERAND, "Missing assembler operand");
|
||||||
|
else
|
||||||
|
d[offset] = aexp->mInteger - offset - 1;
|
||||||
offset++;
|
offset++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -928,7 +937,7 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
|
||||||
|
|
||||||
case EX_ASSIGNMENT:
|
case EX_ASSIGNMENT:
|
||||||
{
|
{
|
||||||
if (exp->mLeft->mDecType->mType == DT_TYPE_STRUCT)
|
if (exp->mLeft->mDecType && exp->mLeft->mDecType->mType == DT_TYPE_STRUCT)
|
||||||
{
|
{
|
||||||
vl = TranslateExpression(procType, proc, block, exp->mLeft, breakBlock, continueBlock, inlineMapper);
|
vl = TranslateExpression(procType, proc, block, exp->mLeft, breakBlock, continueBlock, inlineMapper);
|
||||||
vr = TranslateExpression(procType, proc, block, exp->mRight, breakBlock, continueBlock, inlineMapper, &vl);
|
vr = TranslateExpression(procType, proc, block, exp->mRight, breakBlock, continueBlock, inlineMapper, &vl);
|
||||||
|
@ -3173,7 +3182,8 @@ InterCodeProcedure* InterCodeGenerator::TranslateProcedure(InterCodeModule * mod
|
||||||
exitBlock->Append(ins);
|
exitBlock->Append(ins);
|
||||||
exitBlock->Close(nullptr, nullptr);
|
exitBlock->Close(nullptr, nullptr);
|
||||||
|
|
||||||
proc->Close();
|
if (mErrors->mErrorCount == 0)
|
||||||
|
proc->Close();
|
||||||
|
|
||||||
return proc;
|
return proc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -891,6 +891,7 @@ Expression* Parser::ParseDeclarationExpression(void)
|
||||||
nexp->mLeft = new Expression(dec->mLocation, EX_VARIABLE);
|
nexp->mLeft = new Expression(dec->mLocation, EX_VARIABLE);
|
||||||
nexp->mLeft->mDecValue = dec;
|
nexp->mLeft->mDecValue = dec;
|
||||||
nexp->mLeft->mDecType = dec->mBase;
|
nexp->mLeft->mDecType = dec->mBase;
|
||||||
|
nexp->mDecType = nexp->mLeft->mDecType;
|
||||||
|
|
||||||
nexp->mRight = dec->mValue;
|
nexp->mRight = dec->mValue;
|
||||||
|
|
||||||
|
@ -1152,7 +1153,7 @@ Expression* Parser::ParseSimpleExpression(void)
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
nexp->mLeft = exp;
|
nexp->mLeft = exp;
|
||||||
nexp->mRight = ParsePrefixExpression();
|
nexp->mRight = ParsePrefixExpression();
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1202,7 +1203,10 @@ Expression* Parser::ParsePostfixExpression(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
mErrors->Error(mScanner->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Function expected for call");
|
mErrors->Error(mScanner->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Function expected for call");
|
||||||
|
exp->mDecType = TheVoidFunctionTypeDeclaration;
|
||||||
|
}
|
||||||
|
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
Expression* nexp = new Expression(mScanner->mLocation, EX_CALL);
|
Expression* nexp = new Expression(mScanner->mLocation, EX_CALL);
|
||||||
|
@ -1332,7 +1336,10 @@ Expression* Parser::ParsePrefixExpression(void)
|
||||||
nexp->mDecType = nexp->mLeft->mDecType->mBase;
|
nexp->mDecType = nexp->mLeft->mDecType->mBase;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
mErrors->Error(nexp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Pointer or array type expected");
|
mErrors->Error(nexp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Pointer or array type expected");
|
||||||
|
nexp->mDecType = TheVoidTypeDeclaration;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (nexp->mToken == TK_BINARY_AND)
|
else if (nexp->mToken == TK_BINARY_AND)
|
||||||
{
|
{
|
||||||
|
@ -1344,7 +1351,7 @@ Expression* Parser::ParsePrefixExpression(void)
|
||||||
else
|
else
|
||||||
nexp->mDecType = nexp->mLeft->mDecType;
|
nexp->mDecType = nexp->mLeft->mDecType;
|
||||||
}
|
}
|
||||||
return nexp->ConstantFold();
|
return nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return ParsePostfixExpression();
|
return ParsePostfixExpression();
|
||||||
|
@ -1367,7 +1374,7 @@ Expression* Parser::ParseMulExpression(void)
|
||||||
else
|
else
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
|
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1407,7 +1414,7 @@ Expression* Parser::ParseAddExpression(void)
|
||||||
else
|
else
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
|
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1426,7 +1433,7 @@ Expression* Parser::ParseShiftExpression(void)
|
||||||
nexp->mRight = ParseAddExpression();
|
nexp->mRight = ParseAddExpression();
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
|
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1445,7 +1452,7 @@ Expression* Parser::ParseRelationalExpression(void)
|
||||||
nexp->mRight = ParseShiftExpression();
|
nexp->mRight = ParseShiftExpression();
|
||||||
nexp->mDecType = TheBoolTypeDeclaration;
|
nexp->mDecType = TheBoolTypeDeclaration;
|
||||||
|
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1464,7 +1471,7 @@ Expression* Parser::ParseBinaryAndExpression(void)
|
||||||
nexp->mRight = ParseRelationalExpression();
|
nexp->mRight = ParseRelationalExpression();
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
|
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1482,7 +1489,7 @@ Expression* Parser::ParseBinaryXorExpression(void)
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseBinaryAndExpression();
|
nexp->mRight = ParseBinaryAndExpression();
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1500,7 +1507,7 @@ Expression* Parser::ParseBinaryOrExpression(void)
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseBinaryXorExpression();
|
nexp->mRight = ParseBinaryXorExpression();
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1518,7 +1525,7 @@ Expression* Parser::ParseLogicAndExpression(void)
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseBinaryOrExpression();
|
nexp->mRight = ParseBinaryOrExpression();
|
||||||
nexp->mDecType = TheBoolTypeDeclaration;
|
nexp->mDecType = TheBoolTypeDeclaration;
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1536,7 +1543,7 @@ Expression* Parser::ParseLogicOrExpression(void)
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseLogicAndExpression();
|
nexp->mRight = ParseLogicAndExpression();
|
||||||
nexp->mDecType = TheBoolTypeDeclaration;
|
nexp->mDecType = TheBoolTypeDeclaration;
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1558,6 +1565,7 @@ Expression* Parser::ParseConditionalExpression(void)
|
||||||
ConsumeToken(TK_COLON);
|
ConsumeToken(TK_COLON);
|
||||||
texp->mRight = ParseConditionalExpression();
|
texp->mRight = ParseConditionalExpression();
|
||||||
|
|
||||||
|
nexp->mDecType = texp->mLeft->mDecType;
|
||||||
exp = nexp;
|
exp = nexp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1599,6 +1607,7 @@ Expression* Parser::ParseAssignmentExpression(void)
|
||||||
nexp->mRight = ParseAssignmentExpression();
|
nexp->mRight = ParseAssignmentExpression();
|
||||||
nexp->mDecType = exp->mDecType;
|
nexp->mDecType = exp->mDecType;
|
||||||
exp = nexp;
|
exp = nexp;
|
||||||
|
assert(exp->mDecType);
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -1796,6 +1805,7 @@ Expression* Parser::ParseStatement(void)
|
||||||
exp = new Expression(mScanner->mLocation, EX_CONTINUE);
|
exp = new Expression(mScanner->mLocation, EX_CONTINUE);
|
||||||
break;
|
break;
|
||||||
case TK_SEMICOLON:
|
case TK_SEMICOLON:
|
||||||
|
exp = new Expression(mScanner->mLocation, EX_VOID);
|
||||||
break;
|
break;
|
||||||
case TK_ASM:
|
case TK_ASM:
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
|
@ -1808,6 +1818,11 @@ Expression* Parser::ParseStatement(void)
|
||||||
else
|
else
|
||||||
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "'}' expected");
|
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "'}' expected");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mErrors->Error(mScanner->mLocation, EERR_SYNTAX, "'{' expected");
|
||||||
|
exp = new Expression(mScanner->mLocation, EX_VOID);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
exp = ParseExpression();
|
exp = ParseExpression();
|
||||||
|
@ -1816,6 +1831,8 @@ Expression* Parser::ParseStatement(void)
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(exp);
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2045,6 +2062,7 @@ Expression* Parser::ParseAssemblerBaseOperand(void)
|
||||||
{
|
{
|
||||||
exp = new Expression(mScanner->mLocation, EX_VOID);
|
exp = new Expression(mScanner->mLocation, EX_VOID);
|
||||||
exp->mDecType = TheVoidTypeDeclaration;
|
exp->mDecType = TheVoidTypeDeclaration;
|
||||||
|
exp->mDecValue = TheConstVoidValueDeclaration;
|
||||||
}
|
}
|
||||||
|
|
||||||
return exp;
|
return exp;
|
||||||
|
@ -2060,7 +2078,7 @@ Expression* Parser::ParseAssemblerMulOperand(void)
|
||||||
nexp->mLeft = exp;
|
nexp->mLeft = exp;
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseAssemblerBaseOperand();
|
nexp->mRight = ParseAssemblerBaseOperand();
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
return exp;
|
return exp;
|
||||||
}
|
}
|
||||||
|
@ -2075,7 +2093,11 @@ Expression* Parser::ParseAssemblerAddOperand(void)
|
||||||
nexp->mLeft = exp;
|
nexp->mLeft = exp;
|
||||||
mScanner->NextToken();
|
mScanner->NextToken();
|
||||||
nexp->mRight = ParseAssemblerMulOperand();
|
nexp->mRight = ParseAssemblerMulOperand();
|
||||||
if (nexp->mLeft->mDecValue->mType == DT_VARIABLE || nexp->mLeft->mDecValue->mType == DT_ARGUMENT)
|
if (!nexp->mLeft->mDecValue || !nexp->mRight->mDecValue)
|
||||||
|
{
|
||||||
|
mErrors->Error(mScanner->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Invalid assembler operand");
|
||||||
|
}
|
||||||
|
else if (nexp->mLeft->mDecValue->mType == DT_VARIABLE || nexp->mLeft->mDecValue->mType == DT_ARGUMENT)
|
||||||
{
|
{
|
||||||
if (nexp->mRight->mDecValue->mType == DT_CONST_INTEGER)
|
if (nexp->mRight->mDecValue->mType == DT_CONST_INTEGER)
|
||||||
{
|
{
|
||||||
|
@ -2115,7 +2137,7 @@ Expression* Parser::ParseAssemblerAddOperand(void)
|
||||||
mErrors->Error(mScanner->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Integer offset expected");
|
mErrors->Error(mScanner->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Integer offset expected");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
exp = nexp->ConstantFold();
|
exp = nexp->ConstantFold(mErrors);
|
||||||
}
|
}
|
||||||
return exp;
|
return exp;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,10 @@ SourceFile::~SourceFile(void)
|
||||||
|
|
||||||
bool SourceFile::Open(const char* name, const char* path)
|
bool SourceFile::Open(const char* name, const char* path)
|
||||||
{
|
{
|
||||||
char fname[200];
|
char fname[220];
|
||||||
|
|
||||||
|
if (strlen(name) + strlen(path) > 200)
|
||||||
|
return false;
|
||||||
|
|
||||||
strcpy_s(fname, path);
|
strcpy_s(fname, path);
|
||||||
int n = strlen(fname);
|
int n = strlen(fname);
|
||||||
|
@ -142,6 +145,12 @@ bool Preprocessor::NextLine(void)
|
||||||
|
|
||||||
bool Preprocessor::OpenSource(const char * reason, const char* name, bool local)
|
bool Preprocessor::OpenSource(const char * reason, const char* name, bool local)
|
||||||
{
|
{
|
||||||
|
if (strlen(name) > 200)
|
||||||
|
{
|
||||||
|
mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Source file path exceeds max path length");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (mSource)
|
if (mSource)
|
||||||
mSource->mLocation = mLocation;
|
mSource->mLocation = mLocation;
|
||||||
|
|
||||||
|
@ -154,7 +163,7 @@ bool Preprocessor::OpenSource(const char * reason, const char* name, bool local)
|
||||||
|
|
||||||
if (!ok && local && mSource)
|
if (!ok && local && mSource)
|
||||||
{
|
{
|
||||||
char lpath[200];
|
char lpath[220];
|
||||||
strcpy_s(lpath, mSource->mFileName);
|
strcpy_s(lpath, mSource->mFileName);
|
||||||
int i = strlen(lpath);
|
int i = strlen(lpath);
|
||||||
while (i > 0 && lpath[i - 1] != '/')
|
while (i > 0 && lpath[i - 1] != '/')
|
||||||
|
|
|
@ -985,7 +985,8 @@ void Scanner::NextRawToken(void)
|
||||||
|
|
||||||
while (NextChar() && IsAlpha(mTokenChar))
|
while (NextChar() && IsAlpha(mTokenChar))
|
||||||
{
|
{
|
||||||
tkprep[n++] = mTokenChar;
|
if (n < 127)
|
||||||
|
tkprep[n++] = mTokenChar;
|
||||||
}
|
}
|
||||||
tkprep[n] = 0;
|
tkprep[n] = 0;
|
||||||
|
|
||||||
|
@ -1070,18 +1071,21 @@ void Scanner::NextRawToken(void)
|
||||||
else if (mTokenChar >= 'A' && mTokenChar <= 'Z' || mTokenChar >= 'a' && mTokenChar <= 'z' || mTokenChar == '_')
|
else if (mTokenChar >= 'A' && mTokenChar <= 'Z' || mTokenChar >= 'a' && mTokenChar <= 'z' || mTokenChar == '_')
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
char tkident[128];
|
char tkident[256];
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (IsIdentChar(mTokenChar))
|
if (IsIdentChar(mTokenChar))
|
||||||
{
|
{
|
||||||
tkident[n++] = mTokenChar;
|
if (n < 255)
|
||||||
|
tkident[n++] = mTokenChar;
|
||||||
NextChar();
|
NextChar();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tkident[n] = 0;
|
tkident[n] = 0;
|
||||||
|
if (n == 256)
|
||||||
|
Error("Identifier exceeds max character limit");
|
||||||
|
|
||||||
if (!strcmp(tkident, "true"))
|
if (!strcmp(tkident, "true"))
|
||||||
mToken = TK_TRUE;
|
mToken = TK_TRUE;
|
||||||
|
|
Loading…
Reference in New Issue