mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 13:15:12 +00:00
fix: throwing repr caused a segfault (#2389)
* fix: throwing repr caused a segfault * fixup! ci: include Python 3.9 RC1 (#2387)
This commit is contained in:
parent
7dd2bdb0b3
commit
cf0a64596e
@ -776,7 +776,11 @@ protected:
|
||||
for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
|
||||
if (!some_args) some_args = true;
|
||||
else msg += ", ";
|
||||
msg += pybind11::repr(args_[ti]);
|
||||
try {
|
||||
msg += pybind11::repr(args_[ti]);
|
||||
} catch (const error_already_set&) {
|
||||
msg += "<repr raised Error>";
|
||||
}
|
||||
}
|
||||
if (kwargs_in) {
|
||||
auto kwargs = reinterpret_borrow<dict>(kwargs_in);
|
||||
@ -787,7 +791,12 @@ protected:
|
||||
for (auto kwarg : kwargs) {
|
||||
if (first) first = false;
|
||||
else msg += ", ";
|
||||
msg += pybind11::str("{}={!r}").format(kwarg.first, kwarg.second);
|
||||
msg += pybind11::str("{}=").format(kwarg.first);
|
||||
try {
|
||||
msg += pybind11::repr(kwarg.second);
|
||||
} catch (const error_already_set&) {
|
||||
msg += "<repr raised Error>";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -218,4 +218,7 @@ TEST_SUBMODULE(exceptions, m) {
|
||||
}
|
||||
});
|
||||
|
||||
// Test repr that cannot be displayed
|
||||
m.def("simple_bool_passthrough", [](bool x) {return x;});
|
||||
|
||||
}
|
||||
|
@ -178,3 +178,14 @@ def test_nested_throws(capture):
|
||||
with pytest.raises(m.MyException5) as excinfo:
|
||||
m.try_catch(m.MyException, pycatch, m.MyException, m.throws5)
|
||||
assert str(excinfo.value) == "this is a helper-defined translated exception"
|
||||
|
||||
|
||||
# This can often happen if you wrap a pybind11 class in a Python wrapper
|
||||
def test_invalid_repr():
|
||||
|
||||
class MyRepr(object):
|
||||
def __repr__(self):
|
||||
raise AttributeError("Example error")
|
||||
|
||||
with pytest.raises(TypeError):
|
||||
m.simple_bool_passthrough(MyRepr())
|
||||
|
Loading…
Reference in New Issue
Block a user