mirror of
https://github.com/postgres/postgres.git
synced 2026-02-03 20:40:14 -05:00
Change StaticAssertVariableIsOfType to be a declaration
This allows moving the uses to more natural and useful positions. Also, a declaration is the more native use of static assertions in C. Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/2273bc2a-045d-4a75-8584-7cd9396e5534%40eisentraut.org
This commit is contained in:
parent
137d05df2f
commit
955e507668
5 changed files with 28 additions and 23 deletions
|
|
@ -21,6 +21,13 @@ static hstoreCheckKeyLen_t hstoreCheckKeyLen_p;
|
|||
typedef size_t (*hstoreCheckValLen_t) (size_t len);
|
||||
static hstoreCheckValLen_t hstoreCheckValLen_p;
|
||||
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t);
|
||||
StaticAssertVariableIsOfType(&hstoreUniquePairs, hstoreUniquePairs_t);
|
||||
StaticAssertVariableIsOfType(&hstorePairs, hstorePairs_t);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckKeyLen, hstoreCheckKeyLen_t);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckValLen, hstoreCheckValLen_t);
|
||||
|
||||
|
||||
/*
|
||||
* Module initialize function: fetch function pointers for cross-module calls.
|
||||
|
|
@ -28,24 +35,18 @@ static hstoreCheckValLen_t hstoreCheckValLen_p;
|
|||
void
|
||||
_PG_init(void)
|
||||
{
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t);
|
||||
hstoreUpgrade_p = (hstoreUpgrade_t)
|
||||
load_external_function("$libdir/hstore", "hstoreUpgrade",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreUniquePairs, hstoreUniquePairs_t);
|
||||
hstoreUniquePairs_p = (hstoreUniquePairs_t)
|
||||
load_external_function("$libdir/hstore", "hstoreUniquePairs",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstorePairs, hstorePairs_t);
|
||||
hstorePairs_p = (hstorePairs_t)
|
||||
load_external_function("$libdir/hstore", "hstorePairs",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckKeyLen, hstoreCheckKeyLen_t);
|
||||
hstoreCheckKeyLen_p = (hstoreCheckKeyLen_t)
|
||||
load_external_function("$libdir/hstore", "hstoreCheckKeyLen",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckValLen, hstoreCheckValLen_t);
|
||||
hstoreCheckValLen_p = (hstoreCheckValLen_t)
|
||||
load_external_function("$libdir/hstore", "hstoreCheckValLen",
|
||||
true, NULL);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,15 @@ static hstoreCheckKeyLen_t hstoreCheckKeyLen_p;
|
|||
typedef size_t (*hstoreCheckValLen_t) (size_t len);
|
||||
static hstoreCheckValLen_t hstoreCheckValLen_p;
|
||||
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyObject_AsString, PLyObject_AsString_t);
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
StaticAssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t);
|
||||
StaticAssertVariableIsOfType(&hstoreUniquePairs, hstoreUniquePairs_t);
|
||||
StaticAssertVariableIsOfType(&hstorePairs, hstorePairs_t);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckKeyLen, hstoreCheckKeyLen_t);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckValLen, hstoreCheckValLen_t);
|
||||
|
||||
|
||||
/*
|
||||
* Module initialize function: fetch function pointers for cross-module calls.
|
||||
|
|
@ -35,32 +44,24 @@ static hstoreCheckValLen_t hstoreCheckValLen_p;
|
|||
void
|
||||
_PG_init(void)
|
||||
{
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyObject_AsString, PLyObject_AsString_t);
|
||||
PLyObject_AsString_p = (PLyObject_AsString_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreUpgrade, hstoreUpgrade_t);
|
||||
hstoreUpgrade_p = (hstoreUpgrade_t)
|
||||
load_external_function("$libdir/hstore", "hstoreUpgrade",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreUniquePairs, hstoreUniquePairs_t);
|
||||
hstoreUniquePairs_p = (hstoreUniquePairs_t)
|
||||
load_external_function("$libdir/hstore", "hstoreUniquePairs",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstorePairs, hstorePairs_t);
|
||||
hstorePairs_p = (hstorePairs_t)
|
||||
load_external_function("$libdir/hstore", "hstorePairs",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckKeyLen, hstoreCheckKeyLen_t);
|
||||
hstoreCheckKeyLen_p = (hstoreCheckKeyLen_t)
|
||||
load_external_function("$libdir/hstore", "hstoreCheckKeyLen",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&hstoreCheckValLen, hstoreCheckValLen_t);
|
||||
hstoreCheckValLen_p = (hstoreCheckValLen_t)
|
||||
load_external_function("$libdir/hstore", "hstoreCheckValLen",
|
||||
true, NULL);
|
||||
|
|
|
|||
|
|
@ -33,22 +33,24 @@ typedef PyObject *(*PLyUnicode_FromStringAndSize_t)
|
|||
(const char *s, Py_ssize_t size);
|
||||
static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
|
||||
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyObject_AsString, PLyObject_AsString_t);
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
StaticAssertVariableIsOfType(&PLy_elog_impl, PLy_elog_impl_t);
|
||||
|
||||
|
||||
/*
|
||||
* Module initialize function: fetch function pointers for cross-module calls.
|
||||
*/
|
||||
void
|
||||
_PG_init(void)
|
||||
{
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyObject_AsString, PLyObject_AsString_t);
|
||||
PLyObject_AsString_p = (PLyObject_AsString_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyObject_AsString",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
|
||||
true, NULL);
|
||||
StaticAssertVariableIsOfType(&PLy_elog_impl, PLy_elog_impl_t);
|
||||
PLy_elog_impl_p = (PLy_elog_impl_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLy_elog_impl",
|
||||
true, NULL);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ PG_MODULE_MAGIC_EXT(
|
|||
typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size);
|
||||
static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
|
||||
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
|
||||
|
||||
/*
|
||||
* Module initialize function: fetch function pointers for cross-module calls.
|
||||
|
|
@ -20,8 +23,6 @@ static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p;
|
|||
void
|
||||
_PG_init(void)
|
||||
{
|
||||
/* Static asserts verify that typedefs above match original declarations */
|
||||
StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t);
|
||||
PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t)
|
||||
load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize",
|
||||
true, NULL);
|
||||
|
|
|
|||
|
|
@ -955,7 +955,7 @@ pg_noreturn extern void ExceptionalCondition(const char *conditionName,
|
|||
/*
|
||||
* Compile-time checks that a variable (or expression) has the specified type.
|
||||
*
|
||||
* StaticAssertVariableIsOfType() can be used as a statement.
|
||||
* StaticAssertVariableIsOfType() can be used as a declaration.
|
||||
* StaticAssertVariableIsOfTypeMacro() is intended for use in macros, eg
|
||||
* #define foo(x) (StaticAssertVariableIsOfTypeMacro(x, int), bar(x))
|
||||
*
|
||||
|
|
@ -965,14 +965,14 @@ pg_noreturn extern void ExceptionalCondition(const char *conditionName,
|
|||
*/
|
||||
#ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P
|
||||
#define StaticAssertVariableIsOfType(varname, typename) \
|
||||
StaticAssertStmt(__builtin_types_compatible_p(__typeof__(varname), typename), \
|
||||
StaticAssertDecl(__builtin_types_compatible_p(__typeof__(varname), typename), \
|
||||
CppAsString(varname) " does not have type " CppAsString(typename))
|
||||
#define StaticAssertVariableIsOfTypeMacro(varname, typename) \
|
||||
(StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname), typename), \
|
||||
CppAsString(varname) " does not have type " CppAsString(typename)))
|
||||
#else /* !HAVE__BUILTIN_TYPES_COMPATIBLE_P */
|
||||
#define StaticAssertVariableIsOfType(varname, typename) \
|
||||
StaticAssertStmt(sizeof(varname) == sizeof(typename), \
|
||||
StaticAssertDecl(sizeof(varname) == sizeof(typename), \
|
||||
CppAsString(varname) " does not have type " CppAsString(typename))
|
||||
#define StaticAssertVariableIsOfTypeMacro(varname, typename) \
|
||||
(StaticAssertExpr(sizeof(varname) == sizeof(typename), \
|
||||
|
|
|
|||
Loading…
Reference in a new issue