David Graf has proposed merging lp:~zorba-coders/zorba/ordpathmsgs into 
lp:zorba.

Requested reviews:
  Till Westmann (tillw)
  Markos Zaharioudakis (markos-za)

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/ordpathmsgs/+merge/101520

Introduced ZORBA_ASSERT_WITH_MSG macro to give additional debugging information 
in case an assertion fails. Currently used in Ordpath functions.
-- 
https://code.launchpad.net/~zorba-coders/zorba/ordpathmsgs/+merge/101520
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/diagnostics/assert.cpp'
--- src/diagnostics/assert.cpp	2012-03-28 05:19:57 +0000
+++ src/diagnostics/assert.cpp	2012-04-11 09:44:20 +0000
@@ -59,10 +59,16 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-void assertion_failed( char const *condition, char const *file, int line ) {
+void assertion_failed( char const *condition, 
+                       char const *file, 
+                       int line,
+                       char const *msg) {
   print_stack_trace( cerr );
   throw make_zorba_exception(
-    file, line, zerr::ZXQP0002_ASSERT_FAILED, ERROR_PARAMS( condition )
+    file, 
+    line, 
+    zerr::ZXQP0002_ASSERT_FAILED, 
+    ( msg ? ERROR_PARAMS( condition, msg ) : ERROR_PARAMS( condition ))
   );
 }
 

=== modified file 'src/diagnostics/assert.h'
--- src/diagnostics/assert.h	2012-03-28 05:19:57 +0000
+++ src/diagnostics/assert.h	2012-04-11 09:44:20 +0000
@@ -29,12 +29,18 @@
  * @param condition The string representation of the condition that failed.
  * @param file The C++ source-code file name where the assertion failed.
  * @param line The C++ source-code line number where the assertion failed.
+ * @param msg An optional message that is output if the assertion fails.
  * @throws ZXQP0002_ASSERT_FAILED
  */
-void assertion_failed( char const *condition, char const *file, int line );
+void assertion_failed( char const *condition,
+                       char const *file, 
+                       int line, 
+                       char const *msg = 0);
 
 /**
  * Zorba version of the standard assert(3) macro.
+ * Is checked in RELEASE mode as well. And outputs a special
+ * error code with the failing condition.
  */
 #define ZORBA_ASSERT(COND)                                  \
   do {                                                      \
@@ -44,6 +50,22 @@
     }                                                       \
   } while (0)
 
+/**
+ * Zorba version of the standard assert(3) macro.
+ * Is checked in RELEASE mode as well. And outputs a special
+ * error code with the failing condition as well as potentially
+ * useful information for further debugging.
+ */
+#define ZORBA_ASSERT_WITH_MSG(COND,MSG)                                        \
+  do {                                                                         \
+    if ( !(COND) ) {                                                           \
+      std::ostringstream oss;                                                  \
+      oss << MSG;                                                              \
+      zorba::assertion_failed( #COND, __FILE__, __LINE__, oss.str().c_str() ); \
+      throw 0; /* never gets here but suppresses warning */                    \
+    }                                                                          \
+  } while (0)
+
 } // namespace zorba
 #endif /* ZORBA_ASSERT_H */
 /* vim:set et sw=2 ts=2: */

=== modified file 'src/diagnostics/diagnostic_en.xml'
--- src/diagnostics/diagnostic_en.xml	2012-03-28 05:19:57 +0000
+++ src/diagnostics/diagnostic_en.xml	2012-04-11 09:44:20 +0000
@@ -1589,7 +1589,7 @@
        A Zorba programming assertion failed.  If this error occurs, it is a bug
        and should be reported.
       </comment>
-      <value>"$1": assertion failed</value>
+      <value>"$1": assertion failed.${ The following information might help: 2}</value>
     </diagnostic>
 
     <diagnostic code="ZXQP0003" name="INTERNAL_ERROR">

=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
--- src/diagnostics/pregenerated/dict_en.cpp	2012-03-28 05:19:57 +0000
+++ src/diagnostics/pregenerated/dict_en.cpp	2012-04-11 09:44:20 +0000
@@ -392,7 +392,7 @@
   { "ZXQD0006", "\"$1\": invalid UTF-8 byte sequence" },
   { "ZXQP0000", "no error" },
   { "ZXQP0001", "dynamic runtime error${: 1}" },
-  { "ZXQP0002", "\"$1\": assertion failed" },
+  { "ZXQP0002", "\"$1\": assertion failed.${ The following information might help: 2}" },
   { "ZXQP0003", "internal error${: 1}" },
   { "ZXQP0004", "not yet implemented: $1" },
   { "ZXQP0005", "\"$1\": feature not enabled" },

=== modified file 'src/store/naive/ordpath.cpp'
--- src/store/naive/ordpath.cpp	2012-03-28 23:58:23 +0000
+++ src/store/naive/ordpath.cpp	2012-04-11 09:44:20 +0000
@@ -960,7 +960,14 @@
   while (dewey1[compPos] == dewey2[compPos])
   {
     ++compPos;
-    ZORBA_ASSERT(compPos < numComps1 && compPos < numComps2);
+    ZORBA_ASSERT_WITH_MSG(compPos < numComps1 && compPos < numComps2,      \
+                          "Involved Parameters: "                          \
+                       << "Parent: " << parent.show().c_str() << ", "      \
+                       << "Sib1: " << sib1.show().c_str() << ", "          \
+                       << "Sib2: " << sib2.show().c_str() << ", "          \
+                       << "compPos: " << compPos << ", "                   \
+                       << "numComps1: " << numComps1 << ", "               \
+                       << "numComps2: " << numComps2 << ".");
   }
 
   int32_t comp1 = dewey1[compPos];
@@ -968,7 +975,14 @@
   bool odd1 = (comp1 % 2 != 0);
   bool odd2 = (comp2 % 2 != 0);
 
-  ZORBA_ASSERT(comp1 < comp2);
+  ZORBA_ASSERT_WITH_MSG(comp1 < comp2,                                  \
+                       "Involved Parameters: "                          \
+                    << "Parent: " << parent.show().c_str() << ", "      \
+                    << "Sib1: " << sib1.show().c_str() << ", "          \
+                    << "Sib2: " << sib2.show().c_str() << ", "          \
+                    << "comp1: " << comp1 << ", "                       \
+                    << "comp2: " << comp2 << ", "                       \
+                    << "compPos: " << compPos << ".");
 
   ulong diff = comp2 - comp1;
 

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to