Commit cdddd5d4 authored by Peter Eisentraut's avatar Peter Eisentraut

Add compiler hints to PLy_elog()

Decorate PLy_elog() in a similar way as elog(), to give compilers and
static analyzers hints in which cases it does not return.
Reviewed-by: default avatarJohn Naylor <jcnaylor@gmail.com>
parent eaedf0df
......@@ -44,7 +44,7 @@ static bool set_string_attr(PyObject *obj, char *attrname, char *str);
* in the context.
*/
void
PLy_elog(int elevel, const char *fmt,...)
PLy_elog_impl(int elevel, const char *fmt,...)
{
char *xmsg;
char *tbmsg;
......
......@@ -10,7 +10,33 @@ extern PyObject *PLy_exc_error;
extern PyObject *PLy_exc_fatal;
extern PyObject *PLy_exc_spi_error;
extern void PLy_elog(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
/*
* PLy_elog()
*
* See comments at elog() about the compiler hinting.
*/
#ifdef HAVE__VA_ARGS
#ifdef HAVE__BUILTIN_CONSTANT_P
#define PLy_elog(elevel, ...) \
do { \
PLy_elog_impl(elevel, __VA_ARGS__); \
if (__builtin_constant_p(elevel) && (elevel) >= ERROR) \
pg_unreachable(); \
} while(0)
#else /* !HAVE__BUILTIN_CONSTANT_P */
#define PLy_elog(elevel, ...) \
do { \
const int elevel_ = (elevel); \
PLy_elog_impl(elevel_, __VA_ARGS__); \
if (elevel_ >= ERROR) \
pg_unreachable(); \
} while(0)
#endif /* HAVE__BUILTIN_CONSTANT_P */
#else /* !HAVE__VA_ARGS */
#define PLy_elog PLy_elog_impl
#endif /* HAVE__VA_ARGS */
extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment