From 3a22d6c1c3bb6c7e2f9eed83902082e41ffe5e0b Mon Sep 17 00:00:00 2001
From: cuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Date: Wed, 20 Apr 2005 09:17:04 +0000
Subject: [PATCH] Improve the assertion check

git-svn-id: svn://svn.cc65.org/cc65/trunk@3472 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
 src/ca65/asserts.c | 52 +++++++++++++++++++++++++++++++++++++++++-----
 src/ca65/asserts.h | 11 ++++++----
 src/ca65/main.c    |  5 +++++
 src/ca65/pseudo.c  | 25 ++--------------------
 4 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/src/ca65/asserts.c b/src/ca65/asserts.c
index a5f8af593..24810e2c8 100644
--- a/src/ca65/asserts.c
+++ b/src/ca65/asserts.c
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003      Ullrich von Bassewitz                                       */
-/*               R�merstra�e 52                                              */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2003-2005, Ullrich von Bassewitz                                      */
+/*                R�merstra�e 52                                             */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -34,14 +34,17 @@
 
 
 /* common */
+#include "assertdefs.h"
 #include "coll.h"
 #include "xmalloc.h"
 
 /* ca65 */
 #include "asserts.h"
+#include "error.h"
 #include "expr.h"
 #include "objfile.h"
 #include "scanner.h"
+#include "spool.h"
 
 
 
@@ -98,12 +101,51 @@ void AddAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
 
 
 
+void CheckAssertions (void)
+/* Check all assertions and evaluate the ones we can evaluate here. */
+{
+    unsigned I;
+
+    /* Get the number of assertions */
+    unsigned Count = CollCount (&Assertions);
+
+    /* Check the assertions */
+    for (I = 0; I < Count; ++I) {
+
+        /* Get the next assertion */
+        Assertion* A = CollAtUnchecked (&Assertions, I);
+
+        /* Can we evaluate the expression? */
+        long Val;
+        if (IsConstExpr (A->Expr, &Val) && Val == 0) {
+            /* Apply the action */
+            const char* Msg = GetString (A->Msg);
+            switch (A->Action) {
+
+                case ASSERT_ACT_WARN:
+                    PWarning (&A->Pos, 0, "%s", Msg);
+                    break;
+
+                case ASSERT_ACT_ERROR:
+                    PError (&A->Pos, "%s", Msg);
+                    break;
+
+                default:
+                    Internal ("Illegal assert action specifier");
+                    break;
+            }
+        }
+    }
+}
+
+
+
 void WriteAssertions (void)
 /* Write the assertion table to the object file */
 {
     unsigned I;
 
-    /* Get the number of strings in the string pool */
+    /* Get the number of assertions */
     unsigned Count = CollCount (&Assertions);
 
     /* Tell the object file module that we're about to start the assertions */
diff --git a/src/ca65/asserts.h b/src/ca65/asserts.h
index 0aef773a8..09824e9af 100644
--- a/src/ca65/asserts.h
+++ b/src/ca65/asserts.h
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003      Ullrich von Bassewitz                                       */
-/*               R�merstrasse 52                                             */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2003-2005, Ullrich von Bassewitz                                      */
+/*                R�merstrasse 52                                            */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -58,6 +58,9 @@ struct ExprNode;
 void AddAssertion (struct ExprNode* Expr, unsigned Action, unsigned Msg);
 /* Add an assertion to the assertion table */
 
+void CheckAssertions (void);
+/* Check all assertions and evaluate the ones we can evaluate here. */
+
 void WriteAssertions (void);
 /* Write the assertion table to the object file */
 
diff --git a/src/ca65/main.c b/src/ca65/main.c
index 26fec98f6..157470314 100644
--- a/src/ca65/main.c
+++ b/src/ca65/main.c
@@ -894,6 +894,11 @@ int main (int argc, char* argv [])
         SegCheck ();
     }
 
+    /* If we didn't have any errors, check the assertions */
+    if (ErrorCount == 0) {
+        CheckAssertions ();
+    }
+
     /* If we didn't have an errors, index the line infos */
     MakeLineInfoIndex ();
 
diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c
index 2522e54c8..3a9caac6d 100644
--- a/src/ca65/pseudo.c
+++ b/src/ca65/pseudo.c
@@ -422,29 +422,8 @@ static void DoAssert (void)
         return;
     }
 
-    /* If we can evaluate the assertion now, there's no need to pass it to the
-     * linker.
-     */
-    if (IsConstExpr (Expr, &Val)) {
-        /* We can evaluate the expression, so handle it in the assembler */
-        switch (Action) {
-
-            case ASSERT_ACT_WARN:
-                Warning (0, "%s", SVal);
-                break;
-
-            case ASSERT_ACT_ERROR:
-                Error ("%s", SVal);
-                break;
-
-            default:
-                Internal ("Illegal assert action specifier");
-                break;
-        }
-    } else {
-        /* Cannot evaluate, add it to the object file */
-        AddAssertion (Expr, Action, GetStringId (SVal));
-    }
+    /* Remember the assertion */
+    AddAssertion (Expr, Action, GetStringId (SVal));
 
     /* Skip the message */
     NextTok ();