Skip to content

Commit 2a78abf

Browse files
authored
Ensure PYBIND11_TLS_REPLACE_VALUE evaluates its arguments only once (#3290)
1 parent 5f46e47 commit 2a78abf

File tree

1 file changed

+5
-4
lines changed

1 file changed

+5
-4
lines changed

include/pybind11/detail/internals.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,13 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass);
8484
// On CPython < 3.4 and on PyPy, `PyThread_set_key_value` strangely does not set
8585
// the value if it has already been set. Instead, it must first be deleted and
8686
// then set again.
87+
inline void tls_replace_value(PYBIND11_TLS_KEY_REF key, void *value) {
88+
PyThread_delete_key_value(key);
89+
PyThread_set_key_value(key, value);
90+
}
8791
# define PYBIND11_TLS_DELETE_VALUE(key) PyThread_delete_key_value(key)
8892
# define PYBIND11_TLS_REPLACE_VALUE(key, value) \
89-
do { \
90-
PyThread_delete_key_value((key)); \
91-
PyThread_set_key_value((key), (value)); \
92-
} while (false)
93+
::pybind11::detail::tls_replace_value((key), (value))
9394
# else
9495
# define PYBIND11_TLS_DELETE_VALUE(key) PyThread_set_key_value((key), nullptr)
9596
# define PYBIND11_TLS_REPLACE_VALUE(key, value) PyThread_set_key_value((key), (value))

0 commit comments

Comments
 (0)