diff libinterp/corefcn/error.h @ 30723:08b08b7f05b2

Replace direct calls to C library assert() with Octave specialty functions in libinterp/ (bug #61753) Define 4 new inline functions in error.h (panic_if, panic_unless, error_if, error_unless) that call either assert() or Octave's own error() function. Replace calls to assert() in code that maintains state and for which no recovery on detection of a problem is possible with calls to panic_XXX. Replace calls to assert() in interpreter code which could simply return to the Octave prompt when a problem is detected with calls to error_XXX. * error.h (panic_if, panic_unless): New functions which eventually call can call assert(). panic_if (COND) calls assert if COND is true. panic_unless (COND) calls assert if COND is false. * error.h (error_if, error_unless): New functions which eventually call can call Octave's error() function. error_if (COND) calls assert if COND is true. error_unless (COND) calls assert if COND is false. * cellfun.cc, daspk.cc, dasrt.cc, dassl.cc, data.cc, dot.cc, error.cc, graphics.cc, kron.cc, mex.cc, oct-map.cc, oct-stream.cc, pr-output.cc, schur.cc, stack-frame.cc, typecast.cc, variables.cc, ov-base.cc, ov-class.cc, ov-fcn-handle.cc, ov-struct.cc, ov-usr-fcn.cc, ov.h, ovl.cc, ops.h, profiler.cc, pt-classdef.cc, pt-eval.cc, pt-idx.cc, pt-pr-code.cc, pt-tm-const.cc, token.cc: Replace direct calls to C library assert() with Octave specialty functions.
author Arun Giridhar <arungiridhar@gmail.com> and Rik <rik@octave.org>
date Mon, 07 Feb 2022 21:47:53 -0800
parents 83f9f8bda883
children 53b125563b49
line wrap: on
line diff
--- a/libinterp/corefcn/error.h	Mon Feb 07 10:46:17 2022 +0900
+++ b/libinterp/corefcn/error.h	Mon Feb 07 21:47:53 2022 -0800
@@ -410,9 +410,6 @@
 // not deprecated and eventually removed, does it make sense to also
 // define them inside the octave namespace?
 
-#define panic_impossible()                                              \
-  panic ("impossible state reached in file '%s' at line %d", __FILE__, __LINE__)
-
 extern OCTINTERP_API void
 vmessage (const char *name, const char *fmt, va_list args);
 
@@ -508,6 +505,46 @@
 OCTAVE_NORETURN
 extern OCTINTERP_API void panic (const char *fmt, ...);
 
+#define panic_impossible()                                              \
+  panic ("impossible state reached in file '%s' at line %d", __FILE__, __LINE__)
+
+OCTINTERP_API inline
+void panic_if (bool cond)
+{
+#ifndef NDEBUG
+  if (cond)
+    panic_impossible ();
+  else
+    return;
+#endif
+}
+
+OCTINTERP_API inline
+void panic_unless (bool cond)
+{
+  panic_if (! cond);
+}
+
+#define error_impossible()                                              \
+  error ("impossible state reached in file '%s' at line %d", __FILE__, __LINE__)
+
+OCTINTERP_API inline
+void error_if (bool cond)
+{
+#ifndef NDEBUG
+  if (cond)
+    error_impossible ();
+  else
+    return;
+#endif
+}
+
+OCTINTERP_API inline
+void error_unless (bool cond)
+{
+  error_if (! cond);
+}
+
 OCTAVE_NAMESPACE_BEGIN
 
 //! Helper function for print_usage defined in defun.cc.