]> git.sur5r.net Git - cc65/blobdiff - src/ca65/asserts.c
Added cc65_line_bysource
[cc65] / src / ca65 / asserts.c
index 25f5178fcc4808ce816172f181a59b55411f3ce6..d70f8f6023e230ff3dc33aa2270479ddd0ce1589 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2003      Ullrich von Bassewitz                                       */
-/*               Römerstrasse 52                                             */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 2003-2011, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 /* ca65 */
 #include "asserts.h"
+#include "error.h"
 #include "expr.h"
+#include "lineinfo.h"
 #include "objfile.h"
-#include "scanner.h"
+#include "spool.h"
 
 
 
 /* An assertion entry */
 typedef struct Assertion Assertion;
 struct Assertion {
-    ExprNode*   Expr;           /* Expression to evaluate */
-    unsigned    Action;         /* Action to take */
-    unsigned    Msg;            /* Message to print (if any) */
-    FilePos     Pos;            /* File position of assertion */
+    ExprNode*       Expr;       /* Expression to evaluate */
+    AssertAction    Action;     /* Action to take */
+    unsigned        Msg;        /* Message to print (if any) */
+    Collection      LI;         /* Line infos for the assertion */
 };
 
 /* Collection with all assertions for a module */
@@ -71,7 +73,7 @@ static Collection Assertions = STATIC_COLLECTION_INITIALIZER;
 
 
 
-static Assertion* NewAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
+static Assertion* NewAssertion (ExprNode* Expr, AssertAction Action, unsigned Msg)
 /* Create a new Assertion struct and return it */
 {
     /* Allocate memory */
@@ -81,7 +83,8 @@ static Assertion* NewAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
     A->Expr     = Expr;
     A->Action   = Action;
     A->Msg      = Msg;
-    A->Pos      = CurPos;
+    A->LI       = EmptyCollection;
+    GetFullLineInfo (&A->LI, 1);
 
     /* Return the new struct */
     return A;
@@ -89,7 +92,7 @@ static Assertion* NewAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
 
 
 
-void AddAssertion (ExprNode* Expr, unsigned Action, unsigned Msg)
+void AddAssertion (ExprNode* Expr, AssertAction Action, unsigned Msg)
 /* Add an assertion to the assertion table */
 {
     /* Add an assertion object to the table */
@@ -98,12 +101,57 @@ 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) {
+
+        long Val;
+
+        /* Get the next assertion */
+        Assertion* A = CollAtUnchecked (&Assertions, I);
+
+        /* Ignore it, if it should only be evaluated by the linker */
+        if (!AssertAtAsmTime (A->Action)) {
+            continue;
+        }
+
+        /* Can we evaluate the expression? */
+        if (IsConstExpr (A->Expr, &Val) && Val == 0) {
+            /* Apply the action */
+            const char* Msg = GetString (A->Msg);
+            switch (A->Action) {
+
+                case ASSERT_ACT_WARN:
+                    LIWarning (&A->LI, 0, "%s", Msg);
+                    break;
+
+                case ASSERT_ACT_ERROR:
+                    LIError (&A->LI, "%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 */
@@ -118,14 +166,11 @@ void WriteAssertions (void)
         /* Get the next assertion */
         Assertion* A = CollAtUnchecked (&Assertions, I);
 
-        /* Finalize the expression */
-        A->Expr = FinalizeExpr (A->Expr);
-
         /* Write it to the file */
         WriteExpr (A->Expr);
-        ObjWriteVar (A->Action);
+        ObjWriteVar ((unsigned) A->Action);
         ObjWriteVar (A->Msg);
-        ObjWritePos (&A->Pos);
+        WriteLineInfo (&A->LI);
     }
 
     /* Done writing the assertions */
@@ -134,4 +179,5 @@ void WriteAssertions (void)
 
 
 
-                 
+
+