* Make sure to properly untrack gc objects before freeing them
* style: pre-commit fixes
* Fix lint
* Add comment about where the original track comes from
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* docs: update changelog for v2.10.3
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* chore: bump versions for 2.10.3
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* chore: fix make changelog script with entry is empty
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
* chore: update clang-tidy to 15
* Add git
* Add NOLINTNEXTLINE for assignment in if
* Update CONTRIBUTING.md
* Add NOLINTNEXTLINE where needed
* Add one more NOLINTNEXTLINE
* stl_bind: make more readable
* Another missing NOLINTNEXTLINE
* Match style elsewhere
* Apply reviewer suggestion. Mark false positive
* Create templated abstract classes KeysView, ValuesView and ItemsView, and implement them on-the-fly when wrapping any specific map type
* We don't want to wrap different ValuesView objects for double values and const double, for example, as both wrappers will be named ValuesView[float]
* Fallback to C++ names if key or values types are not wrapped
* Added a test for .keys(), .values() and .items() returning the same types for similarly-typed maps
* Fixed wrong use of auto in a declarator list: the two descriptions might have different types
* Fixes for clang-tidy issues: explicit single-argument constructor, using the 'override' keyword when overriding functions
* Bugfix for old versions of clang++, which seem to have trouble with the struct being defined inside a module, which was also needlessly ugly anyway
* Bugfix for clang++, which doesn't have some of the names in runtime uness they are specified to be static
* A fix for clang-tidy performance-inefficient-string-concatenation issues - I personally think this looks uglier, but it's probably worth it for clang-tidy to be happy
* Possible fix for clang++ linking issues - make the descriptions static constexpr to make sure they are known before linking
* Correct names for previously-wrapped types as keys/values of maps
* Bugfix - typo in type info names which caused things to segfault
* Apply suggestions from code review
Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
* Use detail::remove_cvref_t instead of doing remove_cv and remove_reference separately
* Avoid names with double underscore, as they are reserved
* Improved testing for KeysView, ValuesView and ItemsView: check type names + stricter asserts
* Moved description logic to helper function in type_caster_base.h
* style: pre-commit fixes
* Fix a clang-tidy issue: do not use 'else' after 'return'
* Apply suggestion by @Skylion007, with additional trivial simplification.
Co-authored-by: Amir <aimir@local>
Co-authored-by: aimir <aimir@localhost>
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>
* Use `PyEval_InitThreads()` as intended (actually matters only for Python 3.6).
* Add `if defined(WITH_THREAD)` condition.
https://docs.python.org/3.6/c-api/init.html#c.PyEval_InitThreads
> This function is not available when thread support is disabled at compile time.
* Fix oversight pointed out by @EricCousineau-TRI: Remove condition that is always false.
* Illustrate bug in functional.h
* style: pre-commit fixes
* Make functional casting more robust / add workaround
* Make function_record* casting even more robust
* See if this fixes PyPy issue
* It still fails on PyPy sadly
* Do not make new CTOR just yet
* Fix test
* Add name to ensure correctness
* style: pre-commit fixes
* Clean up tests + remove ifdef guards
* Add comments
* Improve comments, error handling, and safety
* Fix compile error
* Fix magic logic
* Extract helper function
* Fix func signature
* move to local internals
* style: pre-commit fixes
* Switch to simpler design
* style: pre-commit fixes
* Move to function_record
* style: pre-commit fixes
* Switch to internals, update tests and docs
* Fix lint
* Oops, forgot to resolve last comment
* Fix typo
* Update in response to comments
* Implement suggestion to improve test
* Update comment
* Simple fixes
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Aaron Gokaslan <aaronGokaslan@gmail.com>
Background: #2999, #4105, #4283, #4284
In a nutshell:
* Only macOS actually needs `PYBIND11_EXPORT_EXCEPTION` (#4284).
* Evidently (#4283), under macOS `PYBIND11_EXPORT_EXCEPTION` does not run the risk of introducing ODR violations,
* but evidently (#4283) under Linux it does, in the presumably rare/unusual situation that `RTLD_GLOBAL` is used.
* Windows does no have the equivalent of `RTLD_GLOBAL`, therefore `PYBIND11_EXPORT_EXCEPTION` has no practical benefit, on the contrary, noisy warning suppression pragmas are needed, therefore it is best left empty.
* Add option to force the use of the PYPY GIL scoped acquire/release logic to support nested gil access, see https://github.com/pybind/pybind11/issues/1276 and https://github.com/pytorch/pytorch/issues/83101
* Apply suggestions from code review
* Update CMakeLists.txt
* docs: update upgrade guide
* Update docs/upgrade.rst
* All bells & whistles.
* Add Reminder to common.h, so that we will not forget to purge `!WITH_THREAD` branches when dropping Python 3.6
* New sentence instead of semicolon.
* Temporarily pull in snapshot of PR #4246
* Add `test_release_acquire`
* Add more unit tests for nested gil locking
* Add test_report_builtins_internals_keys
* Very minor enhancement: sort list only after filtering.
* Revert change in docs/upgrade.rst
* Add test_multi_acquire_release_cross_module, while also forcing unique PYBIND11_INTERNALS_VERSION for cross_module_gil_utils.cpp
* Hopefully fix apparently new ICC error.
```
2022-10-28T07:57:54.5187728Z -- The CXX compiler identification is Intel 2021.7.0.20220726
...
2022-10-28T07:58:53.6758994Z icpc: remark #10441: The Intel(R) C++ Compiler Classic (ICC) is deprecated and will be removed from product release in the second half of 2023. The Intel(R) oneAPI DPC++/C++ Compiler (ICX) is the recommended compiler moving forward. Please transition to use this compiler. Use '-diag-disable=10441' to disable this message.
2022-10-28T07:58:54.5801597Z In file included from /home/runner/work/pybind11/pybind11/include/pybind11/detail/../detail/type_caster_base.h(15),
2022-10-28T07:58:54.5803794Z from /home/runner/work/pybind11/pybind11/include/pybind11/detail/../cast.h(15),
2022-10-28T07:58:54.5805740Z from /home/runner/work/pybind11/pybind11/include/pybind11/detail/../attr.h(14),
2022-10-28T07:58:54.5809556Z from /home/runner/work/pybind11/pybind11/include/pybind11/detail/class.h(12),
2022-10-28T07:58:54.5812154Z from /home/runner/work/pybind11/pybind11/include/pybind11/pybind11.h(13),
2022-10-28T07:58:54.5948523Z from /home/runner/work/pybind11/pybind11/tests/cross_module_gil_utils.cpp(13):
2022-10-28T07:58:54.5949009Z /home/runner/work/pybind11/pybind11/include/pybind11/detail/../detail/internals.h(177): error #2282: unrecognized GCC pragma
2022-10-28T07:58:54.5949374Z PYBIND11_TLS_KEY_INIT(tstate)
2022-10-28T07:58:54.5949579Z ^
2022-10-28T07:58:54.5949695Z
```
* clang-tidy fixes
* Workaround for PYPY WIN exitcode None
* Revert "Temporarily pull in snapshot of PR #4246"
This reverts commit 23ac16e859150f27fda25ca865cabcb4444e0770.
* Another workaround for PYPY WIN exitcode None
* Clean up how the tests are run "run in process" Part 1: uniformity
* Clean up how the tests are run "run in process" Part 2: use `@pytest.mark.parametrize` and clean up the naming.
* Skip some tests `#if defined(THREAD_SANITIZER)` (tested with TSAN using the Google-internal toolchain).
* Run all tests again but ignore ThreadSanitizer exitcode 66 (this is less likely to mask unrelated ThreadSanitizer issues in the future).
* bug fix: missing common.h include before using `PYBIND11_SIMPLE_GIL_MANAGEMENT`
For the tests in the github CI this does not matter, because
`PYBIND11_SIMPLE_GIL_MANAGEMENT` is always defined from the command line,
but when monkey-patching common.h locally, it matters.
* if process.exitcode is None: assert t_delta > 9.9
* More sophisiticated `_run_in_process()` implementation, clearly reporting `DEADLOCK`, additionally exercised via added `intentional_deadlock()`
* Wrap m.intentional_deadlock in a Python function, for `ForkingPickler` compatibility.
```
> ForkingPickler(file, protocol).dump(obj)
E TypeError: cannot pickle 'PyCapsule' object
```
Observed with all Windows builds including mingw but not PyPy, and macos-latest with Python 3.9, 3.10, 3.11 but not 3.6.
* Add link to potential solution for WOULD-BE-NICE-TO-HAVE feature.
* Add `SKIP_IF_DEADLOCK = True` option, to not pollute the CI results with expected `DEADLOCK` failures while we figure out what to do about them.
* Add COPY-PASTE-THIS: gdb ... command (to be used for debugging the detected deadlock)
* style: pre-commit fixes
* Do better than automatic pre-commit fixes.
* Add `PYBIND11_SIMPLE_GIL_MANAGEMENT` to `pytest_report_header()` (so that we can easily know when harvesting deadlock information from the CI logs).
Co-authored-by: Arnim Balzer <arnim@seechange.ai>
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
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>
Very minor refactoring to ease development and debugging.
Having to declare a local `std::string` has bugged me many times. Nice to get this little nuisance out of the way.
Extracted from PR #4022, where it is used like this:
```
std::fprintf(stdout,
"\nTYPE_CASTER_ODR_GUARD_IMPL %s %s\n",
clean_type_id(intrinsic_type_info.name()).c_str(),
source_file_line_from_sloc.c_str());
```
* 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>
* 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 f1435c7e6b068a1ed13ebd3db597ea3bb15aa398.
* 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 ad146b2a1877e8ba3803f94a7837969835a297a7
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 8dff51d12e4af11aff415ee966070368fe606664
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 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
* 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
* Test out Python 3.11 migration
* Clean up a bit
* Remove todo
* Test workaround
* Fix potential bug uncovered in 3.11
* Try to fix it more
* last ditch fix
* Revert. Tp-traverse isn't the problem
* Test workaround
* Try this hack
* Revert MRO changes
* Use f_back properly
* Qualify auto
* Update include/pybind11/pybind11.h
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* Simplify code slightly
* Ensure co_varnames decref if dict_getitem throws
* Eager decref f_code
Co-authored-by: Henry Schreiner <HenrySchreinerIII@gmail.com>
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>