From 5693df8bf263807e3a3f8c35d8459e21c3665add Mon Sep 17 00:00:00 2001 From: uz Date: Wed, 22 Aug 2012 21:24:54 +0000 Subject: [PATCH] Do not try to dump an expression that has errors (circular references in this case) because the dump routine doesn't detect this and runs into an endless recursion. git-svn-id: svn://svn.cc65.org/cc65/trunk@5811 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/studyexpr.c | 36 +++++++++++++++++++++++++++--------- src/ca65/studyexpr.h | 11 ++++++----- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/ca65/studyexpr.c b/src/ca65/studyexpr.c index 76d563594..e5141702f 100644 --- a/src/ca65/studyexpr.c +++ b/src/ca65/studyexpr.c @@ -106,11 +106,19 @@ int ED_IsConst (const ExprDesc* D) static int ED_IsValid (const ExprDesc* D) -/* Return true if the expression is valid, that is, the TOO_COMPLEX flag is - * not set +/* Return true if the expression is valid, that is, neither the ERROR nor the + * TOO_COMPLEX flags are set. */ { - return ((D->Flags & ED_TOO_COMPLEX) == 0); + return ((D->Flags & (ED_ERROR | ED_TOO_COMPLEX)) == 0); +} + + + +static int ED_HasError (const ExprDesc* D) +/* Return true if the expression has an error. */ +{ + return ((D->Flags & ED_ERROR) != 0); } @@ -123,6 +131,14 @@ static void ED_Invalidate (ExprDesc* D) +static void ED_SetError (ExprDesc* D) +/* Set the TOO_COMPLEX and ERROR flags for D */ +{ + D->Flags |= (ED_ERROR | ED_TOO_COMPLEX); +} + + + static void ED_UpdateAddrSize (ExprDesc* ED, unsigned char AddrSize) /* Update the address size of the expression */ { @@ -507,13 +523,10 @@ static void StudySymbol (ExprNode* Expr, ExprDesc* D) if (SymHasExpr (Sym)) { if (SymHasUserMark (Sym)) { - if (Verbosity > 0) { - DumpExpr (Expr, SymResolve); - } LIError (&Sym->DefLines, "Circular reference in definition of symbol `%m%p'", GetSymName (Sym)); - ED_Invalidate (D); + ED_SetError (D); } else { unsigned char AddrSize; @@ -523,6 +536,11 @@ static void StudySymbol (ExprNode* Expr, ExprDesc* D) StudyExprInternal (GetSymExpr (Sym), D); SymUnmarkUser (Sym); + /* If requested and if the expression is valid, dump it */ + if (Verbosity > 0 && !ED_HasError (D)) { + DumpExpr (Expr, SymResolve); + } + /* If the symbol has an explicit address size, use it. This may * lead to range errors later (maybe even in the linker stage), if * the user lied about the address size, but for now we trust him. @@ -733,7 +751,7 @@ static void StudyDiv (ExprNode* Expr, ExprDesc* D) if (ED_IsValid (D)) { if (D->Right == 0) { Error ("Division by zero"); - ED_Invalidate (D); + ED_SetError (D); } else { D->Val /= D->Right; } @@ -752,7 +770,7 @@ static void StudyMod (ExprNode* Expr, ExprDesc* D) if (ED_IsValid (D)) { if (D->Right == 0) { Error ("Modulo operation with zero"); - ED_Invalidate (D); + ED_SetError (D); } else { D->Val %= D->Right; } diff --git a/src/ca65/studyexpr.h b/src/ca65/studyexpr.h index 6bac754f5..56e1a8f61 100644 --- a/src/ca65/studyexpr.h +++ b/src/ca65/studyexpr.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2003 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 2003-2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -36,7 +36,7 @@ #ifndef STUDYEXPR_H #define STUDYEXPR_H - + /* common */ #include "exprdefs.h" @@ -52,6 +52,7 @@ /* Flags */ #define ED_OK 0x00 /* Nothing special */ #define ED_TOO_COMPLEX 0x01 /* Expression is too complex */ +#define ED_ERROR 0x02 /* Error evaluating the expression */ /* Symbol reference */ typedef struct ED_SymRef ED_SymRef; -- 2.39.5