Skip to content

Commit 0739d4c

Browse files
committed
Add error_fetch_and_normalize::release_py_object_references() and use from error_already_set dtor.
1 parent 71f33a8 commit 0739d4c

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

include/pybind11/pybind11.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2626,15 +2626,12 @@ void print(Args &&...args) {
26262626
}
26272627

26282628
inline error_already_set::~error_already_set() {
2629-
auto e = m_fetched_error;
2630-
if (!(e.m_type || e.m_value || e.m_trace)) {
2629+
if (!m_fetched_error.has_py_object_references()) {
26312630
return; // Avoid gil and scope overhead if there is nothing to release.
26322631
}
26332632
gil_scoped_acquire gil;
26342633
error_scope scope;
2635-
e.m_type.release().dec_ref();
2636-
e.m_value.release().dec_ref();
2637-
e.m_trace.release().dec_ref();
2634+
m_fetched_error.release_py_object_references();
26382635
}
26392636

26402637
inline error_already_set::error_already_set(const error_already_set &other)

include/pybind11/pytypes.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,14 @@ struct error_fetch_and_normalize {
531531
return (PyErr_GivenExceptionMatches(m_type.ptr(), exc.ptr()) != 0);
532532
}
533533

534+
bool has_py_object_references() const { return m_type || m_value || m_trace; }
535+
536+
void release_py_object_references() {
537+
m_type.release().dec_ref();
538+
m_value.release().dec_ref();
539+
m_trace.release().dec_ref();
540+
}
541+
534542
object m_type, m_value, m_trace;
535543
mutable std::string m_lazy_error_string;
536544
mutable bool m_lazy_error_string_completed = false;

0 commit comments

Comments
 (0)