diff options
Diffstat (limited to '3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp')
-rw-r--r-- | 3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp | 90 |
1 files changed, 58 insertions, 32 deletions
diff --git a/3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp b/3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp index f705e310..9379f3f2 100644 --- a/3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp +++ b/3rdparty/pybind11/tests/pybind11_cross_module_tests.cpp @@ -7,10 +7,14 @@ BSD-style license that can be found in the LICENSE file. */ -#include "pybind11_tests.h" -#include "local_bindings.h" #include <pybind11/stl_bind.h> + +#include "local_bindings.h" +#include "pybind11_tests.h" +#include "test_exceptions.h" + #include <numeric> +#include <utility> PYBIND11_MODULE(pybind11_cross_module_tests, m) { m.doc() = "pybind11 cross-module test module"; @@ -25,17 +29,46 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { bind_local<ExternalType2>(m, "ExternalType2", py::module_local()); // test_exceptions.py - m.def("raise_runtime_error", []() { PyErr_SetString(PyExc_RuntimeError, "My runtime error"); throw py::error_already_set(); }); - m.def("raise_value_error", []() { PyErr_SetString(PyExc_ValueError, "My value error"); throw py::error_already_set(); }); + py::register_local_exception<LocalSimpleException>(m, "LocalSimpleException"); + m.def("raise_runtime_error", []() { + PyErr_SetString(PyExc_RuntimeError, "My runtime error"); + throw py::error_already_set(); + }); + m.def("raise_value_error", []() { + PyErr_SetString(PyExc_ValueError, "My value error"); + throw py::error_already_set(); + }); m.def("throw_pybind_value_error", []() { throw py::value_error("pybind11 value error"); }); m.def("throw_pybind_type_error", []() { throw py::type_error("pybind11 type error"); }); m.def("throw_stop_iteration", []() { throw py::stop_iteration(); }); + m.def("throw_local_error", []() { throw LocalException("just local"); }); + m.def("throw_local_simple_error", []() { throw LocalSimpleException("external mod"); }); + py::register_exception_translator([](std::exception_ptr p) { + try { + if (p) { + std::rethrow_exception(p); + } + } catch (const shared_exception &e) { + PyErr_SetString(PyExc_KeyError, e.what()); + } + }); + + // translate the local exception into a key error but only in this module + py::register_local_exception_translator([](std::exception_ptr p) { + try { + if (p) { + std::rethrow_exception(p); + } + } catch (const LocalException &e) { + PyErr_SetString(PyExc_KeyError, e.what()); + } + }); // test_local_bindings.py // Local to both: - bind_local<LocalType, 1>(m, "LocalType", py::module_local()) - .def("get2", [](LocalType &t) { return t.i + 2; }) - ; + bind_local<LocalType, 1>(m, "LocalType", py::module_local()).def("get2", [](LocalType &t) { + return t.i + 2; + }); // Can only be called with our python type: m.def("local_value", [](LocalType &l) { return l.i; }); @@ -43,9 +76,7 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { // test_nonlocal_failure // This registration will fail (global registration when LocalFail is already registered // globally in the main test module): - m.def("register_nonlocal", [m]() { - bind_local<NonLocalType, 0>(m, "NonLocalType"); - }); + m.def("register_nonlocal", [m]() { bind_local<NonLocalType, 0>(m, "NonLocalType"); }); // test_stl_bind_local // stl_bind.h binders defaults to py::module_local if the types are local or converting: @@ -55,27 +86,21 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { // test_stl_bind_global // and global if the type (or one of the types, for the map) is global (so these will fail, // assuming pybind11_tests is already loaded): - m.def("register_nonlocal_vec", [m]() { - py::bind_vector<NonLocalVec>(m, "NonLocalVec"); - }); - m.def("register_nonlocal_map", [m]() { - py::bind_map<NonLocalMap>(m, "NonLocalMap"); - }); + m.def("register_nonlocal_vec", [m]() { py::bind_vector<NonLocalVec>(m, "NonLocalVec"); }); + m.def("register_nonlocal_map", [m]() { py::bind_map<NonLocalMap>(m, "NonLocalMap"); }); // The default can, however, be overridden to global using `py::module_local()` or // `py::module_local(false)`. // Explicitly made local: py::bind_vector<NonLocalVec2>(m, "NonLocalVec2", py::module_local()); // Explicitly made global (and so will fail to bind): - m.def("register_nonlocal_map2", [m]() { - py::bind_map<NonLocalMap2>(m, "NonLocalMap2", py::module_local(false)); - }); + m.def("register_nonlocal_map2", + [m]() { py::bind_map<NonLocalMap2>(m, "NonLocalMap2", py::module_local(false)); }); // test_mixed_local_global // We try this both with the global type registered first and vice versa (the order shouldn't // matter). - m.def("register_mixed_global_local", [m]() { - bind_local<MixedGlobalLocal, 200>(m, "MixedGlobalLocal", py::module_local()); - }); + m.def("register_mixed_global_local", + [m]() { bind_local<MixedGlobalLocal, 200>(m, "MixedGlobalLocal", py::module_local()); }); m.def("register_mixed_local_global", [m]() { bind_local<MixedLocalGlobal, 2000>(m, "MixedLocalGlobal", py::module_local(false)); }); @@ -83,25 +108,26 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { m.def("get_mixed_lg", [](int i) { return MixedLocalGlobal(i); }); // test_internal_locals_differ - m.def("local_cpp_types_addr", []() { return (uintptr_t) &py::detail::registered_local_types_cpp(); }); + m.def("local_cpp_types_addr", + []() { return (uintptr_t) &py::detail::get_local_internals().registered_types_cpp; }); // test_stl_caster_vs_stl_bind py::bind_vector<std::vector<int>>(m, "VectorInt"); - m.def("load_vector_via_binding", [](std::vector<int> &v) { - return std::accumulate(v.begin(), v.end(), 0); - }); + m.def("load_vector_via_binding", + [](std::vector<int> &v) { return std::accumulate(v.begin(), v.end(), 0); }); // test_cross_module_calls m.def("return_self", [](LocalVec *v) { return v; }); m.def("return_copy", [](const LocalVec &v) { return LocalVec(v); }); - class Dog : public pets::Pet { public: Dog(std::string name) : Pet(name) {}; }; - py::class_<pets::Pet>(m, "Pet", py::module_local()) - .def("name", &pets::Pet::name); + class Dog : public pets::Pet { + public: + explicit Dog(std::string name) : Pet(std::move(name)) {} + }; + py::class_<pets::Pet>(m, "Pet", py::module_local()).def("name", &pets::Pet::name); // Binding for local extending class: - py::class_<Dog, pets::Pet>(m, "Dog") - .def(py::init<std::string>()); + py::class_<Dog, pets::Pet>(m, "Dog").def(py::init<std::string>()); m.def("pet_name", [](pets::Pet &p) { return p.name(); }); py::class_<MixGL>(m, "MixGL", py::module_local()).def(py::init<int>()); @@ -118,6 +144,6 @@ PYBIND11_MODULE(pybind11_cross_module_tests, m) { // test_missing_header_message // The main module already includes stl.h, but we need to test the error message // which appears when this header is missing. - m.def("missing_header_arg", [](std::vector<float>) { }); + m.def("missing_header_arg", [](const std::vector<float> &) {}); m.def("missing_header_return", []() { return std::vector<float>(); }); } |