* Placeholder commit for 3.11 testing
* Does this fix it?
* Try suggestion
* Placeholder commit for 3.11 testing
* Does this fix it?
* Try suggestion
* fix: try using modern init for embedded interp
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* fix: error message changed in 3.11
* fix: apply logic in Python manually
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* fix autodetect dynamic attrs in 3.11
* fix: include error message if possible in error
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* ci: enable standard Python 3.11 testing
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* Make dynamic attrs condtiion exclusive to ver.
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
When converting an array to an Eigen matrix, ignore the strides if any
dimension size is 0. If the array is empty, the strides aren't relevant,
and especially numpy ≥ 1.23 explicitly sets the strides to 0 in this
case. (See numpy commit dd5ab7b11520.)
Update tests to verify that this works, and continues to work.
* error_already_set::what() is now constructed lazily
Prior to this commit throwing error_already_set was expensive due to the
eager construction of the error string (which required traversing the
Python stack). See #1853 for more context and an alternative take on the
issue.
Note that error_already_set no longer inherits from std::runtime_error
because the latter has no default constructor.
* Do not attempt to normalize if no exception occurred
This is not supported on PyPy-2.7 5.8.0.
* Extract exception name via tp_name
This is faster than dynamically looking up __name__ via GetAttrString.
Note though that the runtime of the code throwing an error_already_set
will be dominated by stack unwinding so the improvement will not be
noticeable.
Before:
396 ns ± 0.913 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
After:
277 ns ± 0.549 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
Benchmark:
const std::string foo() {
PyErr_SetString(PyExc_KeyError, "");
const std::string &s = py::detail::error_string();
PyErr_Clear();
return s;
}
PYBIND11_MODULE(foo, m) {
m.def("foo", &::foo);
}
* Reverted error_already_set to subclass std::runtime_error
* Revert "Extract exception name via tp_name"
The implementation of __name__ is slightly more complex than that.
It handles the module name prefix, and heap-allocated types. We could
port it to pybind11 later on but for now it seems like an overkill.
This reverts commit f1435c7e6b.
* Cosmit following @YannickJadoul's comments
Note that detail::error_string() no longer calls PyException_SetTraceback
as it is unncessary for pretty-printing the exception.
* Fixed PyPy build
* Moved normalization to error_already_set ctor
* Fix merge bugs
* Fix more merge errors
* Improve formatting
* Improve error message in rare case
* Revert back if statements
* Fix clang-tidy
* Try removing mutable
* Does build_mode release fix it
* Set to Debug to expose segfault
* Fix remove set error string
* Do not run error_string() more than once
* Trying setting the tracebackk to the value
* guard if m_type is null
* Try to debug PGI
* One last try for PGI
* Does reverting this fix PyPy
* Reviewer suggestions
* Remove unnecessary initialization
* Add noexcept move and explicit fail throw
* Optimize error_string creation
* Fix typo
* Revert noexcept
* Fix merge conflict error
* Abuse assignment operator
* Revert operator abuse
* See if we still need debug
* Remove unnecessary mutable
* Report "FATAL failure building pybind11::error_already_set error_string" and terminate process.
* Try specifying noexcept again
* Try explicit ctor
* default ctor is noexcept too
* Apply reviewer suggestions, simplify code, and make helper method private
* Remove unnecessary include
* Clang-Tidy fix
* detail::obj_class_name(), fprintf with [STDERR], [STDOUT] tags, polish comments
* consistently check m_lazy_what.empty() also in production builds
* Make a comment slightly less ambiguous.
* Bug fix: Remove `what();` from `restore()`.
It sure would need to be guarded by `if (m_type)`, otherwise `what()` fails and masks that no error was set (see update unit test). But since `error_already_set` is copyable, there is no point in releasing m_type, m_value, m_trace, therefore we can just as well avoid the runtime overhead of force-building `m_lazy_what`, it may never be used.
* Replace extremely opaque (unhelpful) error message with a truthful reflection of what we know.
* Fix clang-tidy error [performance-move-constructor-init].
* Make expected error message less specific.
* Various changes.
* bug fix: error_string(PyObject **, ...)
* Putting back the two eager PyErr_NormalizeException() calls.
* Change error_already_set() to call pybind11_fail() if the Python error indicator not set. The net result is that a std::runtime_error is thrown instead of error_already_set, but all tests pass as is.
* Remove mutable (fixes oversight in the previous commit).
* Normalize the exception only locally in error_string(). Python 3.6 & 3.7 test failures expected. This is meant for benchmarking, to determine if it is worth the trouble looking into the failures.
* clang-tidy: use auto
* Use `gil_scoped_acquire_local` in `error_already_set` destructor. See long comment.
* For Python < 3.8: `PyErr_NormalizeException` before `PyErr_WriteUnraisable`
* Go back to replacing the held Python exception with then normalized exception, if & when needed. Consistently document the side-effect.
* Slightly rewording comment. (There were also other failures.)
* Add 1-line comment for obj_class_name()
* Benchmark code, with results in this commit message.
function #calls test time [s] μs / call
master pure_unwind 729540 1.061 14.539876
err_set_unwind_err_clear 681476 1.040 15.260282
err_set_error_already_set 508038 1.049 20.640525
error_already_set_restore 555578 1.052 18.933288
pr1895_original_foo 244113 1.050 43.018168
PR / master
PR #1895 pure_unwind 736981 1.054 14.295685 98.32%
err_set_unwind_err_clear 685820 1.045 15.237399 99.85%
err_set_error_already_set 661374 1.046 15.811879 76.61%
error_already_set_restore 669881 1.048 15.645176 82.63%
pr1895_original_foo 318243 1.059 33.290806 77.39%
master @ commit ad146b2a18
Running tests in directory "/usr/local/google/home/rwgk/forked/pybind11/tests":
============================= test session starts ==============================
platform linux -- Python 3.9.10, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /usr/local/google/home/rwgk/forked/pybind11/tests, configfile: pytest.ini
collecting ... collected 5 items
test_perf_error_already_set.py::test_perf[pure_unwind]
PERF pure_unwind,729540,1.061,14.539876
PASSED
test_perf_error_already_set.py::test_perf[err_set_unwind_err_clear]
PERF err_set_unwind_err_clear,681476,1.040,15.260282
PASSED
test_perf_error_already_set.py::test_perf[err_set_error_already_set]
PERF err_set_error_already_set,508038,1.049,20.640525
PASSED
test_perf_error_already_set.py::test_perf[error_already_set_restore]
PERF error_already_set_restore,555578,1.052,18.933288
PASSED
test_perf_error_already_set.py::test_perf[pr1895_original_foo]
PERF pr1895_original_foo,244113,1.050,43.018168
PASSED
============================== 5 passed in 12.38s ==============================
pr1895 @ commit 8dff51d12e
Running tests in directory "/usr/local/google/home/rwgk/forked/pybind11/tests":
============================= test session starts ==============================
platform linux -- Python 3.9.10, pytest-6.2.3, py-1.10.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /usr/local/google/home/rwgk/forked/pybind11/tests, configfile: pytest.ini
collecting ... collected 5 items
test_perf_error_already_set.py::test_perf[pure_unwind]
PERF pure_unwind,736981,1.054,14.295685
PASSED
test_perf_error_already_set.py::test_perf[err_set_unwind_err_clear]
PERF err_set_unwind_err_clear,685820,1.045,15.237399
PASSED
test_perf_error_already_set.py::test_perf[err_set_error_already_set]
PERF err_set_error_already_set,661374,1.046,15.811879
PASSED
test_perf_error_already_set.py::test_perf[error_already_set_restore]
PERF error_already_set_restore,669881,1.048,15.645176
PASSED
test_perf_error_already_set.py::test_perf[pr1895_original_foo]
PERF pr1895_original_foo,318243,1.059,33.290806
PASSED
============================== 5 passed in 12.40s ==============================
clang++ -o pybind11/tests/test_perf_error_already_set.os -c -std=c++17 -fPIC -fvisibility=hidden -Os -flto -Wall -Wextra -Wconversion -Wcast-qual -Wdeprecated -Wnon-virtual-dtor -Wunused-result -isystem /usr/include/python3.9 -isystem /usr/include/eigen3 -DPYBIND11_STRICT_ASSERTS_CLASS_HOLDER_VS_TYPE_CASTER_MIX -DPYBIND11_TEST_BOOST -Ipybind11/include -I/usr/local/google/home/rwgk/forked/pybind11/include -I/usr/local/google/home/rwgk/clone/pybind11/include /usr/local/google/home/rwgk/forked/pybind11/tests/test_perf_error_already_set.cpp
clang++ -o lib/pybind11_tests.so -shared -fPIC -Os -flto -shared ...
Debian clang version 13.0.1-3+build2
Target: x86_64-pc-linux-gnu
Thread model: posix
* Changing call_repetitions_target_elapsed_secs to 0.1 for regular unit testing.
* Adding in `recursion_depth`
* Optimized ctor
* Fix silly bug in recurse_first_then_call()
* Add tests that have equivalent PyErr_Fetch(), PyErr_Restore() but no try-catch.
* Add call_error_string to tests. Sample only recursion_depth 0, 100.
* Show lazy-what speed-up in percent.
* Include real_work in benchmarks.
* Replace all PyErr_SetString() with generate_python_exception_with_traceback()
* Better organization of test loops.
* Add test_error_already_set_copy_move
* Fix bug in newly added test (discovered by clang-tidy): actually use move ctor
* MSVC detects the unreachable return
* change test_perf_error_already_set.py back to quick mode
* Inherit from std::exception (instead of std::runtime_error, which does not make sense anymore with the lazy what)
* Special handling under Windows.
* print with leading newline
* Removing test_perf_error_already_set (copies are under 7765113fbb).
* Avoid gil and scope overhead if there is nothing to release.
* Restore default move ctor. "member function" instead of "function" (note that "method" is Python terminology).
* Delete error_already_set copy ctor.
* Make restore() non-const again to resolve clang-tidy failure (still experimenting).
* Bring back error_already_set copy ctor, to see if that resolves the 4 MSVC test failures.
* Add noexcept to error_already_set copy & move ctors (as suggested by @skylion007 IIUC).
* Trying one-by-one noexcept copy ctor for old compilers.
* Add back test covering copy ctor. Add another simple test that exercises the copy ctor.
* Exclude more older compilers from using the noexcept = default ctors. (The tests in the previous commit exposed that those are broken.)
* Factor out & reuse gil_scoped_acquire_local as gil_scoped_acquire_simple
* Guard gil_scoped_acquire_simple by _Py_IsFinalizing() check.
* what() GIL safety
* clang-tidy & Python 3.6 fixes
* Use `gil_scoped_acquire` in dtor, copy ctor, `what()`. Remove `_Py_IsFinalizing()` checks (they are racy: https://github.com/python/cpython/pull/28525).
* Remove error_scope from copy ctor.
* Add `error_scope` to `get_internals()`, to cover the situation that `get_internals()` is called from the `error_already_set` dtor while a new Python error is in flight already. Also backing out `gil_scoped_acquire_simple` change.
* Add `FlakyException` tests with failure triggers in `__init__` and `__str__`
THIS IS STILL A WORK IN PROGRESS. This commit is only an important resting point.
This commit is a first attempt at addressing the observation that `PyErr_NormalizeException()` completely replaces the original exception if `__init__` fails. This can be very confusing even in small applications, and extremely confusing in large ones.
* Tweaks to resolve Py 3.6 and PyPy CI failures.
* Normalize Python exception immediately in error_already_set ctor.
For background see: https://github.com/pybind/pybind11/pull/1895#issuecomment-1135304081
* Fix oversights based on CI failures (copy & move ctor initialization).
* Move @pytest.mark.xfail("env.PYPY") after @pytest.mark.parametrize(...)
* Use @pytest.mark.skipif (xfail does not work for segfaults, of course).
* Remove unused obj_class_name_or() function (it was added only under this PR).
* Remove already obsolete C++ comments and code that were added only under this PR.
* Slightly better (newly added) comments.
* Factor out detail::error_fetch_and_normalize. Preparation for producing identical results from error_already_set::what() and detail::error_string(). Note that this is a very conservative refactoring. It would be much better to first move detail::error_string into detail/error_string.h
* Copy most of error_string() code to new error_fetch_and_normalize::complete_lazy_error_string()
* Remove all error_string() code from detail/type_caster_base.h. Note that this commit includes a subtle bug fix: previously error_string() restored the Python error, which will upset pybind11_fail(). This never was a problem in practice because the two PyType_Ready() calls in detail/class.h do not usually fail.
* Return const std::string& instead of const char * and move error_string() to pytypes.h
* Remove gil_scope_acquire from error_fetch_and_normalize, add back to error_already_set
* Better handling of FlakyException __str__ failure.
* Move error_fetch_and_normalize::complete_lazy_error_string() implementation from pybind11.h to pytypes.h
* Add error_fetch_and_normalize::release_py_object_references() and use from error_already_set dtor.
* Use shared_ptr for m_fetched_error => 1. non-racy, copy ctor that does not need the GIL; 2. enables guard against duplicate restore() calls.
* Add comments.
* Trivial renaming of a newly introduced member function.
* Workaround for PyPy
* Bug fix (oversight). Only valgrind got this one.
* Use shared_ptr custom deleter for m_fetched_error in error_already_set. This enables removing the dtor, copy ctor, move ctor completely.
* Further small simplification. With the GIL held, simply deleting the raw_ptr takes care of everything.
* IWYU cleanup
```
iwyu version: include-what-you-use 0.17 based on Debian clang version 13.0.1-3+build2
```
Command used:
```
iwyu -c -std=c++17 -DPYBIND11_TEST_BOOST -Iinclude/pybind11 -I/usr/include/python3.9 -I/usr/include/eigen3 include/pybind11/pytypes.cpp
```
pytypes.cpp is a temporary file: `#include "pytypes.h"`
The raw output is very long and noisy.
I decided to use `#include <cstddef>` instead of `#include <cstdio>` for `std::size_t` (iwyu sticks to the manual choice).
I ignored all iwyu suggestions that are indirectly covered by `#include <Python.h>`.
I manually verified that all added includes are actually needed.
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
* Add test_perf_accessors (to be merged into test_pytypes).
* Python < 3.8 f-string compatibility
* Use thread_local in inc_ref_counter()
* Intentional breakage, brute-force way to quickly find out how many platforms reach the PYBIND11_HANDLE_REF_DEBUG code, with and without threads.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Remove Intentional breakage
* Drop perf test, move inc_refs tests to test_pytypes
* Fold in PR #3970 with `#ifdef`s
* Complete test coverage for all newly added code.
* Condense new unit tests via a simple local helper macro.
* Remove PYBIND11_PR3970 define. See https://github.com/pybind/pybind11/pull/3977#issuecomment-1142526417
* Move static keyword first (fixes silly oversight).
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add missing error handling to module_::def_submodule
* Add test_def_submodule_failures
* PyPy only: Skip test with trigger for PyModule_GetName() failure.
* Reapply minor fix that accidentally got lost in transfer from PR #3964
* Add error_already_set_what what tests, asserting the status quo.
* Move PyErr_NormalizeException() up a few lines.
* @pytest.mark.skipif("env.PYPY") from PR #1895 is required even for this much simpler PR
* Move PyException_SetTraceback() with PyErr_NormalizeException() as suggested by @skylion007
* Insert a std::move() as suggested by @skylion007
* Don't return pointers to static objects with return_value_policy::take_ownership.
This fixes -Wfree-nonheap-object warnings produced by GCC.
* Use return value policy fix instead
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* Fix py::cast from pytype rvalue to pytype
Previously, py::cast blindly assumed that the destination type was a C++
type rather than a python type when the source type was an rvalue.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add frozenset, and allow it cast to std::set
For the reverse direction, std::set still casts to set. This is in concordance with the behavior for sequence containers, where e.g. tuple casts to std::vector but std::vector casts to list.
Extracted from #3886.
* Rename set_base to any_set to match Python C API
since this will be part of pybind11 public API
* PR: static_cast, anyset
* Add tests for frozenset
and rename anyset methods
* Remove frozenset default ctor, add tests
Making frozenset non-default constructible means that we need to adjust pyobject_caster to not require that its value is default constructible, by initializing value to a nil handle. This also allows writing C++ functions taking anyset, and is arguably a performance improvement, since there is no need to allocate an object that will just be replaced by load.
Add some more tests, including anyset::empty, anyset::size, set::add and set::clear.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Add rationale to `pyobject_caster` default ctor
* Remove ineffectual protected: access control
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Test pickling a simple callable (does not work).
Currently only documents that it does not work. Starting point for future fix.
* Use re.search to accommodate variations of the TypeError message.
* PyPy: exercise full dumps/loads cycle.
* Adding explicit "broken" comment.
* Update cast.h
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Move definition to detail/common, change name, apply everywhere
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Rename debug_enabled in tests to detailed_error_messages_enabled
* Added constructor based on typenum, based on PyArray_DescrFromType
Added accessors for typenum, alignment, byteorder and flags fields of
PyArray_Descr struct.
* Added tests for new py::dtype constructor, and for accessors
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Fixed the comment for alignment method
* Update include/pybind11/numpy.h
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* Adds set_name method of pybind11::capsule class
This calls PyCapsule_SetName on the underlying capsule object.
modified destructors to query capsules's Name
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Handle possible exception thrown by PyCapsule_GetName
Also removed accidentally reintroduced use of `const char *&`.
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Fixed function name
* Introduced private static function to reuse get_name_or_throw
* added tests for capsule renaming
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* handle python error in flight
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Initialized PyObject * variables to nullptr
* use write-unraisable if PyCapsule_GetName raises
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* get_name_or_throw->get_name_no_throw
If PyCapsule_GetName raises an error we should write as unraisable
to consume it and notify user, and then restore the error in flight if any.
This way this method called from destructor would not modify interpreter
error state.
* used error_scope struct
* Renamed get_name_no_throw->get_name_in_error_scope
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add type_caster<std::monostate> for std::variant
Add type_caster<std::monostate>, allowing std::variant<std::monostate, ...>
* Add variant<std::monostate, ...> test methods
* Add std::monostate tests
* Update test_stl.py
Remove erroneous extra tests
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Update test fn name
* And update the doc() test
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* PYBIND11_OBJECT_CVT should use namespace for error_already_set()
This change makes the macro usable outside of pybind11 namespace.
* added test for use of PYBIND11_OBJECT_CVT for classes in external to pybind11 namespaces
* Extended test_pytypes.cpp and test_pytest.py
The added test defines a dummy function that takes a custom-defined class external::float_
that uses PYBIND11_OBJECT_CVT
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* fixed issues pointed out by CI
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* fixed memory leak in default constructor
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add bytearray to string cast, testcase and rename load_bytes to load_raw
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* New bytearray test case and convert failure to pybind11_fail
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Fix merge comments
* Actually fix merge comments
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Assert early if AsString fails
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Porras Huang <pohuang@jackx-vm-1.nvidia.com>
* Clear local internals after finalizing interpreter
* Add descriptive comments
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Clear Python error state if pybind11::weakref() fails.
The weakref() constructor calls pybind11_fail() without clearing any
Python interpreter error state. If a client catches the C++ exception
thrown by pybind11_fail(), the Python interpreter will be left in an
error state.
* Add test case for failing to create weakref
* Add Debug asserts for pybind11 fail
* Make error handling more pythonic
* Does this fix PyPy?
* Adapt test to PyPy differences
* Simplify test to remove redundancy
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* chore: drop Python 3.5 support
* chore: more fstrings with flynt's help
* ci: drop Python 3.5
* chore: bump dependency versions
* docs: touch up py::args
* tests: remove deprecation warning
* Ban smartquotes
* Very minor tweaks (by-product of reviewing PR #3719).
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
* `#error BYE_BYE_GOLDEN_SNAKE`
* Removing everything related to 2.7 from ci.yml
* Commenting-out Centos7
* Removing `PYTHON: 27` from .appveyor.yml
* "PY2" removal, mainly from tests. C++ code is not touched.
* Systematic removal of `u` prefix from `u"..."` and `u'...'` literals. Collateral cleanup of a couple minor other things.
* Cleaning up around case-insensitive hits for `[^a-z]py.*2` in tests/.
* Removing obsolete Python 2 mention in compiling.rst
* Proper `#error` for Python 2.
* Using PY_VERSION_HEX to guard `#error "PYTHON 2 IS NO LONGER SUPPORTED.`
* chore: bump pre-commit
* style: run pre-commit for pyupgrade 3+
* tests: use sys.version_info, not PY
* chore: more Python 2 removal
* Uncommenting Centos7 block (PR #3691 showed that it is working again).
* Update pre-commit hooks
* Fix pre-commit hook
* refactor: remove Python 2 from CMake
* refactor: remove Python 2 from setup code
* refactor: simplify, better static typing
* feat: fail with nice messages
* refactor: drop Python 2 C++ code
* docs: cleanup for Python 3
* revert: intree
revert: intree
* docs: minor touchup to py2 statement
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* Manual line breaks to pre-empt undesired `clang-format`ing.
Informed by work under https://github.com/pybind/pybind11/pull/3683:
60b7eb410f59572e6559
* Manual curation of clang-format diffs involving source code comments.
Very labor-intensive and dull.
* Pulling .clang-format change from @henryiii's 9057962d40
* Adding commonly used .clang-format `CommentPragmas:`
* Ensure short lambdas are allowed
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* Adding readability-qualified-auto to .clang-tidy
Ported from @henryiii's 287527f705
* fix: support Python < 3.6
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
* Download catch for MinGw
* Fix rest of MinGW
* fix: update catch to 2.13.5 to fix glibc 2.34 failures
Update the downloaded Catch version to 2.13.5, in order to fix build
failure on glibc 2.34:
```
In file included from /usr/include/signal.h:328,
from /tmp/pybind11/.nox/tests-3-9/tmp/tests/catch/catch.hpp:8030,
from /tmp/pybind11/tests/test_embed/catch.cpp:13:
/tmp/pybind11/.nox/tests-3-9/tmp/tests/catch/catch.hpp:10818:58: error: call to non-‘constexpr’ function ‘long int sysconf(int)’
10818 | static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ;
| ^~~~~~~~~~~
In file included from /usr/include/python3.9/Python.h:36,
from /tmp/pybind11/include/pybind11/detail/common.h:215,
from /tmp/pybind11/include/pybind11/pytypes.h:12,
from /tmp/pybind11/include/pybind11/cast.h:13,
from /tmp/pybind11/include/pybind11/attr.h:13,
from /tmp/pybind11/include/pybind11/pybind11.h:13,
from /tmp/pybind11/include/pybind11/embed.h:12,
from /tmp/pybind11/tests/test_embed/catch.cpp:4:
/usr/include/unistd.h:640:17: note: ‘long int sysconf(int)’ declared here
640 | extern long int sysconf (int __name) __THROW;
| ^~~~~~~
In file included from /tmp/pybind11/tests/test_embed/catch.cpp:13:
/tmp/pybind11/.nox/tests-3-9/tmp/tests/catch/catch.hpp:10877:45: error: size of array ‘altStackMem’ is not an integral constant-expression
10877 | char FatalConditionHandler::altStackMem[sigStackSize] = {};
| ^~~~~~~~~~~~
```
The newest Catch version cannot be used yet because of regression:
https://github.com/catchorg/Catch2/pull/2364
* fix: add option for _ check, only define on pybind11
* Revert "fix: add option for _ check, only define on pybind11"
This reverts commit 86817db488.
* fix: only undef _ for catch cpp creation.
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
* test: Strip whitespace when comparing numpy dtypes for 1.22 compat
Strip whitespace when comparing numpy dtype str() in order to preserve
test compatibility with both numpy 1.22 and older versions whose output
differ by whitespace.
Fixes#3680
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Add tests demonstrating smart_holder issues with multiple inheritance
* Propagate C++ multiple inheritance markers to all children
- Makes py::multiple_inheritance only needed in base classes hidden from pybind11
* Add support for nested C++11 exceptions
* Remove wrong include
* Fix if directive
* Fix missing skipif
* Simplify code and try to work around MSVC bug
* Clarify comment
* Further simplify code
* Remove the last extra throw statement
* Qualify auto
* Fix typo
* Add missing return for consistency
* Fix clang-tidy complaint
* Fix python2 stub
* Make clang-tidy happy
* Fix compile error
* Fix python2 function signature
* Extract C++20 utility and backport
* Cleanup code a bit more
* Improve test case
* Consolidate code and fix signature
* Fix typo
* A way to register additional test targets.
* Support specifying tests with extension.
* Ensure TEST_OVERRIDE is backwards compatible.
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Ensure regex is non greedy.
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Replacing ICC C++14 with C++17
* ICPC: -diag-disable:conversion
Try to suppress the `-Werror-all` promotion in `#include <variant>`
* Trying `-DPYBIND11_WERROR=OFF`
* Trying `-Wno-conversion` (todo: make specific to C++17 if it works)
* Inserting -Wno-conversion only for C++17
Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
* Expand string_view support to str, bytes, memoryview
1. Allows constructing a str or bytes implicitly from a string_view;
this is essentially a small shortcut allowing a caller to write
`py::bytes{sv}` rather than `py::bytes{sv.data(), sv.size()}`.
2. Allows implicit conversion *to* string_view from py::bytes -- this
saves a fair bit more as currently there is no simple way to get such
a view of the bytes without copying it (or resorting to Python API
calls).
(This is not done for `str` because when the str contains unicode we
have to allocate to a temporary and so there might not be some string
data we can properly view without owning.)
3. Allows `memoryview::from_memory` to accept a string_view. As with
the other from_memory calls, it's entirely your responsibility to
keep it alive.
This also required moving the string_view availability detection into
detail/common.h because this PR needs it in pytypes.h, which is higher
up the include chain than cast.h where it was being detected currently.
* Move string_view include to pytypes.h
* CI-testing a fix for the "ambiguous conversion" issue.
This change is known to fix the `tensorflow::tstring` issue reported under https://github.com/pybind/pybind11/pull/3521#issuecomment-985100965
TODO: Minimal reproducer for the `tensorflow::tstring` issue.
* Make clang-tidy happy (hopefully).
* Adding minimal reproducer for the `tensorflow::tstring` issue.
Error without the enable_if trick:
```
/usr/local/google/home/rwgk/forked/pybind11/tests/test_builtin_casters.cpp:169:16: error: ambiguous conversion for functional-style cast from 'TypeWithBothOperatorStringAndStringView' to 'py::bytes'
return py::bytes(TypeWithBothOperatorStringAndStringView());
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../pytypes.h:1174:5: note: candidate constructor
bytes(const std::string &s) : bytes(s.data(), s.size()) { }
^
/usr/local/google/home/rwgk/forked/pybind11/include/pybind11/detail/../pytypes.h:1191:5: note: candidate constructor
bytes(std::string_view s) : bytes(s.data(), s.size()) { }
^
```
* Adding missing NOLINTNEXTLINE
* Also apply ambiguous conversion workaround to str()
Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
* Fix py::kw_only when used before the first arg of a method
The implicit space for the `self` argument isn't added until we hit the
first argument, but this wasn't being done for kw_only or pos_only, and
so a kw_only before the first argument would break.
This fixes it by properly checking whether we need to add the self arg.
(The pos_only issue here was extremely mild -- you didn't get the `/` in
the docstring, but AFAICT it has no other effect since there are no
meaningful arguments before it anyway).
* Style changes
- rename check_have_self_arg -> append_self_arg_if_needed
- move the argument name inline comments before the args instead of
after
* ci: support development releases of Python
* fix: better PyPy support
* fix: patch over a few more pypy issues
* Try to patch
* Properly follow pep667
* Fix typo
* Whoops, 667 not in yet
* For testing
* More testing
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Try to backport
* Try to simplify fix
* Nail down the fix
* Try pypy workaround
* Typo
* one last typo
* Replacing 0x03110000 with 0x030B0000
* Add TODO. Drop PyPy
* Fix typo
* Revert catch upgrade
* fix: minor cleanup, try pypy again
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
* override: Fix wrong caching of the overrides
There was a problem when the python type, which was stored in override
cache for C++ functions, was destroyed and the record wasn't removed from the
override cache. Therefor, dangling pointer was stored there. Then when the
memory was reused and new type was allocated at the given address and the
method with the same name (as previously stored in the cache) was actually
overridden in python, it would wrongly find it in the override cache for C++
functions and therefor override from python wouldn't be called.
The fix is to erase the type from the override cache when the type is destroyed.
* test: Pass by const ref instead of by value (clang-tidy)
* test: Rename classes and move to different files
Rename the classes and files so they're no too generic. Also, better place to
test the stuff is in test_virtual_functions.cpp/.py as we're basically testing
the virtual functions/trampolines.
* Add TODO for erasure code
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
On Unix, setuptools prepends $CFLAGS and $CPPFLAGS to the compiler flags
(they always come before extra_compile_args and anything else; see
distutils.sysconfig.customize_compiler). In practice, the environment
variables are useful e.g. to quickly generate a debug build (e.g. by
setting CFLAGS=-g), but Pybind11Extension currently unconditionally
overwrites this with -g0.
Instead, check the environment variables and only insert -g0 if not
overridden by them.
* fix: add missing std::forward calls
Two of the four cpp_function overloads are missing std::forward calls, which seems like a simple oversight.
* add test for https://github.com/pybind/pybind11/pull/3443
* add py tests
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* fix test
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Simply has_kw_only_args handling
This simplifies tracking the number of kw-only args by instead tracking
the number of positional arguments (which is really what we care about
everywhere this is used).
* Allow keyword-only arguments to follow py::args
This removes the constraint that py::args has to be last (or
second-last, with py::kwargs) and instead makes py::args imply
py::kw_only for any remaining arguments, allowing you to bind a function
that works the same way as a Python function such as:
def f(a, *args, b):
return a * b + sum(args)
f(10, 1, 2, 3, b=20) # == 206
With this change, you can bind such a function using:
m.def("f", [](int a, py::args args, int b) { /* ... */ },
"a"_a, "b"_a);
Or, to be more explicit about the keyword-only arguments:
m.def("g", [](int a, py::args args, int b) { /* ... */ },
"a"_a, py::kw_only{}, "b"_a);
(The only difference between the two is that the latter will fail at
binding time if the `kw_only{}` doesn't match the `py::args` position).
This doesn't affect backwards compatibility at all because, currently,
you can't have a py::args anywhere except the end/2nd-last.
* Take args/kwargs by const lvalue ref
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
* ci: support Python 3.11-dev
Also update 3.10 to final, better PyPy usage
* fix: use PyFrame_GetCode on Python 3.9+
* ci: some bitiness of pypy not supported on win
* chore: update CMake support to 3.22rc1 to quiet warning
* fix: use dev version of py to fix Py 3.11
* tests: print proper Eigen version
* ci: include pypy2, not sure why
* ci: avoid running on Python 3.11 for now
* ci: fix runs
* ci: simpler PyPy usage, drop unmaintained scipy + pypy index
* ci: only binary numpy, wait on pypy 3.8
* refactor: address review
* fix: the types for return_value_policy_override in optional_caster
`return_value_policy_override` was not being applied correctly in
`optional_caster` in two ways:
- The `is_lvalue_reference` condition referenced `T`, which was the
`optional<T>` type parameter from the class, when it should have used `T_`,
which was the parameter to the `cast` function. `T_` can potentially be a
reference type, but `T` will never be.
- The type parameter passed to `return_value_policy_override` should be
`T::value_type`, not `T`. This matches the way that the other STL container
type casters work.
The result of these issues was that a method/property definition which used a
`reference` or `reference_internal` return value policy would create a Python
value that's bound by reference to a temporary C++ object, resulting in
undefined behavior. For reasons that I was not able to figure out fully, it
seems like this causes problems when using old versions of `boost::optional`,
but not with recent versions of `boost::optional` or the `libstdc++`
implementation of `std::optional`. The issue (that the override to
`return_value_policy::move` is never being applied) is present for all
implementations, it just seems like that somehow doesn't result in problems for
the some implementation of `optional`. This change includes a regression type
with a custom optional-like type which was able to reproduce the issue.
Part of the issue with using the wrong types may have stemmed from the type
variables `T` and `T_` having very similar names. This also changes the type
variables in `optional_caster` to use slightly more descriptive names, which
also more closely follow the naming convention used by the other STL casters.
Fixes#3330
* Fix clang-tidy complaints
* Add missing NOLINT
* Apply a couple more fixes
* fix: support GCC 4.8
* tests: avoid warning about unknown compiler for compilers missing C++17
* Remove unneeded test module attribute
* Change test enum to have more unique int values
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>