1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 20:29:34 +00:00

Improve the assertion check

git-svn-id: svn://svn.cc65.org/cc65/trunk@3472 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2005-04-20 09:17:04 +00:00
parent 05ab8714d2
commit 3a22d6c1c3
4 changed files with 61 additions and 32 deletions

View File

@ -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 */

View File

@ -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 */

View File

@ -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 ();

View File

@ -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 ();