X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fca65%2Fasserts.c;h=d70f8f6023e230ff3dc33aa2270479ddd0ce1589;hb=115db5974355a73ae486019c78779d24049e6513;hp=25f5178fcc4808ce816172f181a59b55411f3ce6;hpb=0d27afb21f17fd02fdd2806cf43ff56f4c5c5414;p=cc65 diff --git a/src/ca65/asserts.c b/src/ca65/asserts.c index 25f5178fc..d70f8f602 100644 --- a/src/ca65/asserts.c +++ b/src/ca65/asserts.c @@ -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 */ @@ -39,9 +39,11 @@ /* ca65 */ #include "asserts.h" +#include "error.h" #include "expr.h" +#include "lineinfo.h" #include "objfile.h" -#include "scanner.h" +#include "spool.h" @@ -54,10 +56,10 @@ /* 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) - + +