mirror of
https://github.com/cc65/cc65.git
synced 2025-01-11 11:30:13 +00:00
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
This commit is contained in:
parent
c1bbf69d72
commit
5693df8bf2
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user