mirror of
https://github.com/pocketpy/pocketpy
synced 2026-03-23 21:50:17 +00:00
Compare commits
1 Commits
abb7e3ed80
...
8237a3da69
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8237a3da69 |
@ -70,7 +70,6 @@ args_proxy interface<Derived>::operator* () const {
|
|||||||
template <typename Derived>
|
template <typename Derived>
|
||||||
template <return_value_policy policy, typename... Args>
|
template <return_value_policy policy, typename... Args>
|
||||||
object interface<Derived>::operator() (Args&&... args) const {
|
object interface<Derived>::operator() (Args&&... args) const {
|
||||||
py_StackRef p0 = py_peek(0); // checkpoint before pushing so py_clearexc can safely rewind
|
|
||||||
py_push(ptr());
|
py_push(ptr());
|
||||||
py_pushnil();
|
py_pushnil();
|
||||||
|
|
||||||
@ -109,13 +108,7 @@ object interface<Derived>::operator() (Args&&... args) const {
|
|||||||
|
|
||||||
(foreach(std::forward<Args>(args)), ...);
|
(foreach(std::forward<Args>(args)), ...);
|
||||||
|
|
||||||
if(!py_vectorcall(argc, kwargsc)) {
|
raise_call<py_vectorcall>(argc, kwargsc);
|
||||||
py_matchexc(tp_Exception);
|
|
||||||
object e = object::from_ret();
|
|
||||||
auto what = py_formatexc();
|
|
||||||
py_clearexc(p0);
|
|
||||||
throw python_error(what, std::move(e));
|
|
||||||
}
|
|
||||||
|
|
||||||
return object::from_ret();
|
return object::from_ret();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,18 +79,3 @@ TEST_F(PYBIND11_TEST, exception_cpp_to_python) {
|
|||||||
TEST_EXCEPTION(attribute_error, AttributeError);
|
TEST_EXCEPTION(attribute_error, AttributeError);
|
||||||
TEST_EXCEPTION(runtime_error, RuntimeError);
|
TEST_EXCEPTION(runtime_error, RuntimeError);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regression test: operator() must throw python_error instead of crashing when Python raises (#469)
|
|
||||||
TEST_F(PYBIND11_TEST, operator_call_propagates_python_error) {
|
|
||||||
py::exec("def f(x):\n raise ValueError('intentional error')");
|
|
||||||
py::object fn = py::eval("f");
|
|
||||||
|
|
||||||
bool caught = false;
|
|
||||||
try {
|
|
||||||
fn(py::int_(1));
|
|
||||||
} catch(py::python_error& e) {
|
|
||||||
caught = true;
|
|
||||||
EXPECT_TRUE(e.match(tp_ValueError));
|
|
||||||
}
|
|
||||||
EXPECT_TRUE(caught);
|
|
||||||
}
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user