Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions include/pybind11/pybind11.h
Original file line number Diff line number Diff line change
Expand Up @@ -1987,12 +1987,12 @@ class gil_scoped_release { };
#endif

error_already_set::~error_already_set() {
if (type) {
if (m_type) {
error_scope scope;
gil_scoped_acquire gil;
type.release().dec_ref();
value.release().dec_ref();
trace.release().dec_ref();
m_type.release().dec_ref();
m_value.release().dec_ref();
m_trace.release().dec_ref();
}
}

Expand Down
12 changes: 8 additions & 4 deletions include/pybind11/pytypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ class error_already_set : public std::runtime_error {
/// Constructs a new exception from the current Python error indicator, if any. The current
/// Python error indicator will be cleared.
error_already_set() : std::runtime_error(detail::error_string()) {
PyErr_Fetch(&type.ptr(), &value.ptr(), &trace.ptr());
PyErr_Fetch(&m_type.ptr(), &m_value.ptr(), &m_trace.ptr());
}

error_already_set(const error_already_set &) = default;
Expand All @@ -335,7 +335,7 @@ class error_already_set : public std::runtime_error {
/// Give the currently-held error back to Python, if any. If there is currently a Python error
/// already set it is cleared first. After this call, the current object no longer stores the
/// error variables (but the `.what()` string is still available).
void restore() { PyErr_Restore(type.release().ptr(), value.release().ptr(), trace.release().ptr()); }
void restore() { PyErr_Restore(m_type.release().ptr(), m_value.release().ptr(), m_trace.release().ptr()); }

// Does nothing; provided for backwards compatibility.
PYBIND11_DEPRECATED("Use of error_already_set.clear() is deprecated")
Expand All @@ -344,10 +344,14 @@ class error_already_set : public std::runtime_error {
/// Check if the currently trapped error type matches the given Python exception class (or a
/// subclass thereof). May also be passed a tuple to search for any exception class matches in
/// the given tuple.
bool matches(handle ex) const { return PyErr_GivenExceptionMatches(ex.ptr(), type.ptr()); }
bool matches(handle ex) const { return PyErr_GivenExceptionMatches(ex.ptr(), m_type.ptr()); }

const object& type() const { return m_type; }
const object& value() const { return m_value; }
const object& trace() const { return m_trace; }

private:
object type, value, trace;
object m_type, m_value, m_trace;
};

/** \defgroup python_builtins _
Expand Down