From 3a22d6c1c3bb6c7e2f9eed83902082e41ffe5e0b Mon Sep 17 00:00:00 2001 From: cuz 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 (); -- 2.39.5