Skip to content

Commit 23ac16e

Browse files
committed
Temporarily pull in snapshot of PR pybind#4246
1 parent 8081def commit 23ac16e

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

include/pybind11/detail/common.h

+9
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,15 @@
265265
# define PYBIND11_HAS_U8STRING
266266
#endif
267267

268+
// See description of PR #4246:
269+
#if !defined(NDEBUG) && !defined(PY_ASSERT_GIL_HELD_INCREF_DECREF) \
270+
&& !(defined(PYPY_VERSION) \
271+
&& defined(_MSC_VER)) /* PyPy Windows: pytest hangs indefinitely at the end of the \
272+
process (see PR #4268) */ \
273+
&& !defined(PYBIND11_ASSERT_GIL_HELD_INCREF_DECREF)
274+
# define PYBIND11_ASSERT_GIL_HELD_INCREF_DECREF
275+
#endif
276+
268277
// #define PYBIND11_STR_LEGACY_PERMISSIVE
269278
// If DEFINED, pybind11::str can hold PyUnicodeObject or PyBytesObject
270279
// (probably surprising and never documented, but this was the

include/pybind11/pytypes.h

+10
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ class handle : public detail::object_api<handle> {
246246
const handle &inc_ref() const & {
247247
#ifdef PYBIND11_HANDLE_REF_DEBUG
248248
inc_ref_counter(1);
249+
#endif
250+
#if defined(PYBIND11_ASSERT_GIL_HELD_INCREF_DECREF)
251+
if (m_ptr != nullptr && !PyGILState_Check()) {
252+
throw std::runtime_error("pybind11::handle::inc_ref() PyGILState_Check() failure.");
253+
}
249254
#endif
250255
Py_XINCREF(m_ptr);
251256
return *this;
@@ -257,6 +262,11 @@ class handle : public detail::object_api<handle> {
257262
this function automatically. Returns a reference to itself.
258263
\endrst */
259264
const handle &dec_ref() const & {
265+
#if defined(PYBIND11_ASSERT_GIL_HELD_INCREF_DECREF)
266+
if (m_ptr != nullptr && !PyGILState_Check()) {
267+
throw std::runtime_error("pybind11::handle::dec_ref() PyGILState_Check() failure.");
268+
}
269+
#endif
260270
Py_XDECREF(m_ptr);
261271
return *this;
262272
}

0 commit comments

Comments
 (0)