File tree Expand file tree Collapse file tree 2 files changed +19
-0
lines changed Expand file tree Collapse file tree 2 files changed +19
-0
lines changed Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff 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 }
You can’t perform that action at this time.
0 commit comments