]> git.sur5r.net Git - cc65/commitdiff
Do not try to dump an expression that has errors (circular references in this
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 22 Aug 2012 21:24:54 +0000 (21:24 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 22 Aug 2012 21:24:54 +0000 (21:24 +0000)
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
src/ca65/studyexpr.h

index 76d56359443448a3f62a78c880008fa1352811cf..e5141702f548187e35d9dad71b1ee0c8d0f9d945 100644 (file)
@@ -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;
         }
index 6bac754f5796d6d88e766180f9235396806fb410..56e1a8f61338f4206a398cec687f827a5ae86973 100644 (file)
@@ -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;