/* */
/* */
/* */
-/* (C) 2003-2008, Ullrich von Bassewitz */
+/* (C) 2003-2011, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* common */
-#include "assertdefs.h"
+#include "assertion.h"
#include "coll.h"
#include "xmalloc.h"
#include "error.h"
#include "expr.h"
#include "fileio.h"
+#include "lineinfo.h"
#include "objdata.h"
#include "spool.h"
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
+/* Assertion struct decl */
+struct Assertion {
+ Collection LineInfos; /* File position of assertion */
+ ExprNode* Expr; /* Expression to evaluate */
+ AssertAction Action; /* What to do */
+ unsigned Msg; /* Message to print */
+ ObjData* Obj; /* Object file containing the assertion */
+};
+
/* List with all assertions */
static Collection Assertions = STATIC_COLLECTION_INITIALIZER;
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
Assertion* A = xmalloc (sizeof (Assertion));
/* Read the fields from the file */
- A->Expr = ReadExpr (F, O);
- A->Action = ReadVar (F);
- A->Msg = MakeGlobalStringId (O, ReadVar (F));
- ReadFilePos (F, &A->Pos);
+ A->LineInfos = EmptyCollection;
+ A->Expr = ReadExpr (F, O);
+ A->Action = (AssertAction) ReadVar (F);
+ A->Msg = MakeGlobalStringId (O, ReadVar (F));
+ ReadLineInfoList (F, O, &A->LineInfos);
/* Set remaining fields */
A->Obj = O;
/* Walk over all assertions */
for (I = 0; I < CollCount (&Assertions); ++I) {
+ const LineInfo* LI;
+ const char* Module;
+ unsigned Line;
+
/* Get the assertion */
Assertion* A = CollAtUnchecked (&Assertions, I);
+ /* Ignore assertions that shouldn't be handled at link time */
+ if (!AssertAtLinkTime (A->Action)) {
+ continue;
+ }
+
+ /* Retrieve the relevant line info for this assertion */
+ LI = CollConstAt (&A->LineInfos, 0);
+
+ /* Get file name and line number from the source */
+ Module = GetSourceName (LI);
+ Line = GetSourceLine (LI);
+
/* If the expression is not constant, we're not able to handle it */
if (!IsConstExpr (A->Expr)) {
- Warning ("Cannot evaluate assertion in module `%s', line %lu",
- GetSourceFileName (A->Obj, A->Pos.Name), A->Pos.Line);
+ Warning ("Cannot evaluate assertion in module `%s', line %u",
+ Module, Line);
} else if (GetExprVal (A->Expr) == 0) {
/* Assertion failed */
- const char* Module = GetSourceFileName (A->Obj, A->Pos.Name);
const char* Message = GetString (A->Msg);
switch (A->Action) {
case ASSERT_ACT_WARN:
- Warning ("%s(%lu): %s", Module, A->Pos.Line, Message);
+ case ASSERT_ACT_LDWARN:
+ Warning ("%s(%u): %s", Module, Line, Message);
break;
case ASSERT_ACT_ERROR:
- Error ("%s(%lu): %s", Module, A->Pos.Line, Message);
+ case ASSERT_ACT_LDERROR:
+ Error ("%s(%u): %s", Module, Line, Message);
break;
default:
Internal ("Invalid assertion action (%u) in module `%s', "
- "line %lu (file corrupt?)",
- A->Action, Module, A->Pos.Line);
+ "line %u (file corrupt?)",
+ A->Action, Module, Line);
break;
}
}