mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-25 14:45:12 +00:00
690a115d84
* Copy clang 17 compatibility fixes from PR #4762 to a separate PR. * static py::exception<> -> static py::handle * Add `py::set_error()` but also try the suggestion of @malfet (https://github.com/pytorch/pytorch/pull/106401#pullrequestreview-1559961407). * clang 17 compatibility fixes (#4767) * Copy clang 17 compatibility fixes from PR #4762 to a separate PR. * Add gcc:13 C++20 * Add silkeh/clang:16-bullseye C++20 * chore(deps): update pre-commit hooks (#4770) updates: - [github.com/psf/black: 23.3.0 → 23.7.0](https://github.com/psf/black/compare/23.3.0...23.7.0) - [github.com/astral-sh/ruff-pre-commit: v0.0.276 → v0.0.281](https://github.com/astral-sh/ruff-pre-commit/compare/v0.0.276...v0.0.281) - [github.com/asottile/blacken-docs: 1.14.0 → 1.15.0](https://github.com/asottile/blacken-docs/compare/1.14.0...1.15.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * docs: Remove upper bound on pybind11 in example pyproject.toml for setuptools (#4774) * docs: Remove upper bound on pybind11 in example pyproject.toml for setuptools * Update docs/compiling.rst --------- Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com> * Provide better type hints for a variety of generic types (#4259) * Provide better type hints for a variety of generic types * Makes better documentation * tuple, dict, list, set, function * Move to py::typing * style: pre-commit fixes * Update copyright line with correct year and actual author. The author information was copy-pasted from the git log output. --------- Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> * Use `py::set_error()` everywhere possible (only one special case, in common.h). Overload `py::set_error(py::handle, py::handle)`. Change back to `static py::handle exc = ... .release();` Deprecate `py::exception<>::operator()` * Add `PYBIND11_WARNING_DISABLE` for INTEL and MSVC (and sort alphabetically). * `PYBIND11_WARNING_DISABLE_INTEL(10441)` does not work. For ICC only, falling back to the recommended `py::set_error()` to keep the testing simple. It is troublesome to add `--diag-disable=10441` specifically for test_exceptions.cpp, even that is non-ideal because it covers the entire file, not just the one line we need it for, and the value of exercising the trivial deprecated `operator()` on this one extra platform is practically zero. * Fix silly oversight. * NVHPC 23.5.0 generates deprecation warnings. They are currently not treated as errors, but falling back to using `py::set_error()` to not have to deal with that distraction. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Keto D. Zhang <keto.zhang@gmail.com> Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com> Co-authored-by: Dustin Spicuzza <dustin@virtualroadside.com>
52 lines
1.7 KiB
C++
52 lines
1.7 KiB
C++
/*
|
|
Copyright (c) 2022 Google LLC
|
|
|
|
All rights reserved. Use of this source code is governed by a
|
|
BSD-style license that can be found in the LICENSE file.
|
|
*/
|
|
|
|
#include <pybind11/pybind11.h>
|
|
|
|
// This file mimics a DSO that makes pybind11 calls but does not define a PYBIND11_MODULE,
|
|
// so that the first call of cross_module_error_already_set() triggers the first call of
|
|
// pybind11::detail::get_internals().
|
|
|
|
namespace {
|
|
|
|
namespace py = pybind11;
|
|
|
|
void interleaved_error_already_set() {
|
|
py::set_error(PyExc_RuntimeError, "1st error.");
|
|
try {
|
|
throw py::error_already_set();
|
|
} catch (const py::error_already_set &) {
|
|
// The 2nd error could be conditional in a real application.
|
|
py::set_error(PyExc_RuntimeError, "2nd error.");
|
|
} // Here the 1st error is destroyed before the 2nd error is fetched.
|
|
// The error_already_set dtor triggers a pybind11::detail::get_internals()
|
|
// call via pybind11::gil_scoped_acquire.
|
|
if (PyErr_Occurred()) {
|
|
throw py::error_already_set();
|
|
}
|
|
}
|
|
|
|
constexpr char kModuleName[] = "cross_module_interleaved_error_already_set";
|
|
|
|
struct PyModuleDef moduledef = {
|
|
PyModuleDef_HEAD_INIT, kModuleName, nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr};
|
|
|
|
} // namespace
|
|
|
|
extern "C" PYBIND11_EXPORT PyObject *PyInit_cross_module_interleaved_error_already_set() {
|
|
PyObject *m = PyModule_Create(&moduledef);
|
|
if (m != nullptr) {
|
|
static_assert(sizeof(&interleaved_error_already_set) == sizeof(void *),
|
|
"Function pointer must have the same size as void *");
|
|
PyModule_AddObject(
|
|
m,
|
|
"funcaddr",
|
|
PyLong_FromVoidPtr(reinterpret_cast<void *>(&interleaved_error_already_set)));
|
|
}
|
|
return m;
|
|
}
|