1. 24 Sep, 2021 1 commit
    • CMake: react to python version changes · 409be833
      The new FindPython-based variant of the CMake scripts caches information
      about the chosen Python version that can become stale. For example,
      suppose I configure a simple pybind11-based project as follows
      
      ```
      cmake -S . -B build -GNinja -DPython_ROOT=<path to python 3.8>
      ```
      
      which will generate `my_extension.cpython-38-x86_64-linux-gnu.so`.
      A subsequent change to the python version like
      
      ```
      cmake -S . -B build -GNinja -DPython_ROOT=<path to python 3.9>
      ```
      
      does not update all necessary build system information. In particular,
      the compiled file is still called
      `my_extension.cpython-38-x86_64-linux-gnu.so`.
      
      This commit fixes the problem by detecting changes in
      `Python_EXECUTABLE` and re-running Python as needed.
      
      Note that the previous way of detecting Python does not seem to be
      affected, it always specifies the right suffix.
      Wenzel Jakob committed
  2. 23 Sep, 2021 6 commits
    • feat: reapply fixed version of #3271 (#3293) · 21282e64
      * Add make_value_iterator (#3271)
      
      * Add make_value_iterator
      
      This is the counterpart to make_key_iterator, and will allow
      implementing a `value` method in `bind_map` (although doing so is left
      for a subsequent PR).
      
      I made a few design changes to reduce copy-and-paste boilerplate.
      Previously detail::iterator_state had a boolean template parameter to
      indicate whether it was being used for make_iterator or
      make_key_iterator. I replaced the boolean with a class that determines
      how to dereference the iterator. This allows for a generic
      implementation of `__next__`.
      
      I also added the ValueType and Extra... parameters to the iterator_state
      template args, because I think it was a bug that they were missing: if
      make_iterator is called twice with different values of these, only the
      first set has effect (because the state class is only registered once).
      There is still a potential issue in that the *values* of the extra
      arguments are latched on the first call, but since most policies are
      empty classes this should be even less common.
      
      * Add some remove_cv_t to appease clang-tidy
      
      * Make iterator_access and friends take reference
      
      For some reason I'd accidentally made it take a const value, which
      caused some issues with third-party packages.
      
      * Another attempt to remove remove_cv_t from iterators
      
      Some of the return types were const (non-reference) types because of the
      pecularities of decltype: `decltype((*it).first)` is the *declared* type
      of the member of the pair, rather than the type of the expression. So if
      the reference type of the iterator is `pair<const int, int> &`, then the
      decltype is `const int`. Wrapping an extra set of parentheses to form
      `decltype(((*it).first))` would instead give `const int &`.
      
      This means that the existing make_key_iterator actually returns by value
      from `__next__`, rather than by reference. Since for mapping types, keys
      are always const, this probably hasn't been noticed, but it will affect
      make_value_iterator if the Python code tries to mutate the returned
      objects. I've changed things to use double parentheses so that
      make_iterator, make_key_iterator and make_value_iterator should now all
      return the reference type of the iterator. I'll still need to add a test
      for that; for now I'm just checking whether I can keep Clang-Tidy happy.
      
      * Add back some NOLINTNEXTLINE to appease Clang-Tidy
      
      This is favoured over using remove_cv_t because in some cases a const
      value return type is deliberate (particularly for Eigen).
      
      * Add a unit test for iterator referencing
      
      Ensure that make_iterator, make_key_iterator and make_value_iterator
      return references to the container elements, rather than copies. The
      test for make_key_iterator fails to compile on master, which gives me
      confidence that this branch has fixed it.
      
      * Make the iterator_access etc operator() const
      
      I'm actually a little surprised it compiled at all given that the
      operator() is called on a temporary, but I don't claim to fully
      understand all the different value types in C++11.
      
      * Attempt to work around compiler bugs
      
      https://godbolt.org/ shows an example where ICC gets the wrong result
      for a decltype used as the default for a template argument, and CI also
      showed problems with PGI. This is a shot in the dark to see if it fixes
      things.
      
      * Make a test constructor explicit (Clang-Tidy)
      
      * Fix unit test on GCC 4.8.5
      
      It seems to require the arguments to the std::pair constructor to be
      implicitly convertible to the types in the pair, rather than just
      requiring is_constructible.
      
      * Remove DOXYGEN_SHOULD_SKIP_THIS guards
      
      Now that a complex decltype expression has been replaced by a simpler
      nested type, I'm hoping Doxygen will be able to build it without issues.
      
      * Add comment to explain iterator_state template params
      
      * fix: regression in #3271
      
      Co-authored-by: Bruce Merry <1963944+bmerry@users.noreply.github.com>
      Henry Schreiner committed
    • Revert "Add make_value_iterator (#3271)" · 2fa3fcfd
      This reverts commit ee0c5ee4.
      Henry Schreiner committed
    • chore(deps): bump jwlawson/actions-setup-cmake from 1.10 to 1.11 (#3294) · 1dc9a23c
      Bumps [jwlawson/actions-setup-cmake](https://github.com/jwlawson/actions-setup-cmake) from 1.10 to 1.11.
      - [Release notes](https://github.com/jwlawson/actions-setup-cmake/releases)
      - [Commits](https://github.com/jwlawson/actions-setup-cmake/compare/v1.10...v1.11)
      
      ---
      updated-dependencies:
      - dependency-name: jwlawson/actions-setup-cmake
        dependency-type: direct:production
        update-type: version-update:semver-minor
      ...
      
      Signed-off-by: dependabot[bot] <support@github.com>
      
      Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
      dependabot[bot] committed
  3. 22 Sep, 2021 2 commits
  4. 21 Sep, 2021 1 commit
    • Add make_value_iterator (#3271) · ee0c5ee4
      * Add make_value_iterator
      
      This is the counterpart to make_key_iterator, and will allow
      implementing a `value` method in `bind_map` (although doing so is left
      for a subsequent PR).
      
      I made a few design changes to reduce copy-and-paste boilerplate.
      Previously detail::iterator_state had a boolean template parameter to
      indicate whether it was being used for make_iterator or
      make_key_iterator. I replaced the boolean with a class that determines
      how to dereference the iterator. This allows for a generic
      implementation of `__next__`.
      
      I also added the ValueType and Extra... parameters to the iterator_state
      template args, because I think it was a bug that they were missing: if
      make_iterator is called twice with different values of these, only the
      first set has effect (because the state class is only registered once).
      There is still a potential issue in that the *values* of the extra
      arguments are latched on the first call, but since most policies are
      empty classes this should be even less common.
      
      * Add some remove_cv_t to appease clang-tidy
      
      * Make iterator_access and friends take reference
      
      For some reason I'd accidentally made it take a const value, which
      caused some issues with third-party packages.
      
      * Another attempt to remove remove_cv_t from iterators
      
      Some of the return types were const (non-reference) types because of the
      pecularities of decltype: `decltype((*it).first)` is the *declared* type
      of the member of the pair, rather than the type of the expression. So if
      the reference type of the iterator is `pair<const int, int> &`, then the
      decltype is `const int`. Wrapping an extra set of parentheses to form
      `decltype(((*it).first))` would instead give `const int &`.
      
      This means that the existing make_key_iterator actually returns by value
      from `__next__`, rather than by reference. Since for mapping types, keys
      are always const, this probably hasn't been noticed, but it will affect
      make_value_iterator if the Python code tries to mutate the returned
      objects. I've changed things to use double parentheses so that
      make_iterator, make_key_iterator and make_value_iterator should now all
      return the reference type of the iterator. I'll still need to add a test
      for that; for now I'm just checking whether I can keep Clang-Tidy happy.
      
      * Add back some NOLINTNEXTLINE to appease Clang-Tidy
      
      This is favoured over using remove_cv_t because in some cases a const
      value return type is deliberate (particularly for Eigen).
      
      * Add a unit test for iterator referencing
      
      Ensure that make_iterator, make_key_iterator and make_value_iterator
      return references to the container elements, rather than copies. The
      test for make_key_iterator fails to compile on master, which gives me
      confidence that this branch has fixed it.
      
      * Make the iterator_access etc operator() const
      
      I'm actually a little surprised it compiled at all given that the
      operator() is called on a temporary, but I don't claim to fully
      understand all the different value types in C++11.
      
      * Attempt to work around compiler bugs
      
      https://godbolt.org/ shows an example where ICC gets the wrong result
      for a decltype used as the default for a template argument, and CI also
      showed problems with PGI. This is a shot in the dark to see if it fixes
      things.
      
      * Make a test constructor explicit (Clang-Tidy)
      
      * Fix unit test on GCC 4.8.5
      
      It seems to require the arguments to the std::pair constructor to be
      implicitly convertible to the types in the pair, rather than just
      requiring is_constructible.
      
      * Remove DOXYGEN_SHOULD_SKIP_THIS guards
      
      Now that a complex decltype expression has been replaced by a simpler
      nested type, I'm hoping Doxygen will be able to build it without issues.
      
      * Add comment to explain iterator_state template params
      Bruce Merry committed
  5. 20 Sep, 2021 4 commits
  6. 17 Sep, 2021 1 commit
  7. 15 Sep, 2021 1 commit
  8. 13 Sep, 2021 2 commits
  9. 10 Sep, 2021 4 commits
    • Fix capsule bug (#3261) · 9978ed58
      Thanks Aaron for jumping in fixing this!
      Aaron Gokaslan committed
    • Fix thread safety for pybind11 loader_life_support (#3237) · 0e599589
      * Fix thread safety for pybind11 loader_life_support
      
      Fixes issue: https://github.com/pybind/pybind11/issues/2765
      
      This converts the vector of PyObjects to either a single void* or
      a per-thread void* depending on the WITH_THREAD define.
      
      The new field is used by each thread to construct a stack
      of loader_life_support frames that can extend the life of python
      objects.
      
      The pointer is updated when the loader_life_support object is allocated
      (which happens before a call) as well as on release.
      
      Each loader_life_support maintains a set of PyObject references
      that need to be lifetime extended; this is done by storing them
      in a c++ std::unordered_set and clearing the references when the
      method completes.
      
      * Also update the internals version as the internal struct is no longer compatible
      
      * Add test demonstrating threading works correctly.
      
      It may be appropriate to run this under msan/tsan/etc.
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * Update test to use lifetime-extended references rather than
      std::string_view, as that's a C++ 17 feature.
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * Make loader_life_support members private
      
      * Update version to dev2
      
      * Update test to use python threading rather than concurrent.futures
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * Remove unnecessary env in test
      
      * Remove unnecessary pytest in test
      
      * Use native C++ thread_local in place of python per-thread data structures to retain compatability
      
      * clang-format test_thread.cpp
      
      * Add a note about debugging the py::cast() error
      
      * thread_test.py now propagates exceptions on join() calls.
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * remove unused sys / merge
      
      * Update include order in test_thread.cpp
      
      * Remove spurious whitespace
      
      * Update comment / whitespace.
      
      * Address review comments
      
      * lint cleanup
      
      * Fix test IntStruct constructor.
      
      * Add explicit to constructor
      
      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>
      Laramie Leavitt committed
    • Fixing NOLINT mishap (#3260) · 121b91f9
      * Removing NOLINT pointed out by Aaron.
      
      * Removing another NOLINT.
      Ralf W. Grosse-Kunstleve committed
    • maint(Clang-Tidy): readability-const-return (#3254) · ae07d4c6
      * Enable clang-tidy readability-const-return
      
      * PyTest functional
      
      * Fix regression
      
      * Fix actual regression
      
      * Remove one more NOLINT
      
      * Update comment
      Aaron Gokaslan committed
  10. 09 Sep, 2021 3 commits
    • fix: Set __file__ constant when using eval_file (#1300) (#3233) · 4c6bee35
      * Set __file__ constant when using eval_file
      
      * Use const ref
      
      * Use a move instead
      
      * Revert
      
      * Improve test
      
      * Guard test with Python version
      
      * Fix tests
      
      * Dont support Python2 API
      
      * Drop Python2 eval __file__ support
      
      * Hack
      
      * Semisupport Python2
      
      * Take2
      
      * Remove Python2 support
      Aaron Gokaslan committed
    • CodeHealth: Enabling clang-tidy google-explicit-constructor (#3250) · 6abf2baa
      * Adding google-explicit-constructor to .clang-tidy
      
      * clang-tidy explicit attr.h (all automatic)
      
      * clang-tidy explicit cast.h (all automatic)
      
      * clang-tidy detail/init.h (1 NOLINT)
      
      * clang-tidy detail/type_caster_base.h (2 NOLINT)
      
      * clang-tidy pybind11.h (7 NOLINT)
      
      * clang-tidy detail/common.h (3 NOLINT)
      
      * clang-tidy detail/descr.h (2 NOLINT)
      
      * clang-tidy pytypes.h (23 NOLINT, only 1 explicit)
      
      * clang-tidy eigen.h (7 NOLINT, 0 explicit)
      
      * Adding 2 explicit in functional.h
      
      * Adding 4 explicit in iostream.h
      
      * clang-tidy numpy.h (1 NOLINT, 1 explicit)
      
      * clang-tidy embed.h (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/local_bindings.h (0 NOLINT, 4 explicit)
      
      * clang-tidy tests/pybind11_cross_module_tests.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/pybind11_tests.h (0 NOLINT, 2 explicit)
      
      * clang-tidy tests/test_buffers.cpp (0 NOLINT, 2 explicit)
      
      * clang-tidy tests/test_builtin_casters.cpp (0 NOLINT, 4 explicit)
      
      * clang-tidy tests/test_class.cpp (0 NOLINT, 6 explicit)
      
      * clang-tidy tests/test_copy_move.cpp (0 NOLINT, 7 explicit)
      
      * clang-tidy tests/test_embed/external_module.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/test_embed/test_interpreter.cpp (0 NOLINT, 1 explicit)
      
      * clang-tidy tests/object.h (0 NOLINT, 2 explicit)
      
      * clang-tidy batch of fully automatic fixes.
      
      * Workaround for MSVC 19.16.27045.0 C++17 Python 2 C++ syntax error.
      Ralf W. Grosse-Kunstleve committed
  11. 08 Sep, 2021 1 commit
  12. 02 Sep, 2021 1 commit
  13. 31 Aug, 2021 3 commits
    • Minor follow-on to PR #1334 (Fix enum value's __int__ returning non-int when… · 49173e47
      Minor follow-on to PR #1334 (Fix enum value's __int__ returning non-int when underlying type is bool or of char type) (#3232)
      
      * Minor tweaks.
      
      * Restoring tests/pybind11_tests.h version from master, removing just the comment and empty line that was added in PR #3087; those were made obsolete by the pragma cleanup that concluded with PR #3186.
      
      * More-to-the-point test for Python 3.
      Ralf W. Grosse-Kunstleve committed
    • Minor tweaks. (#3230) · a46f6237
      * Minor tweaks.
      
      * Restoring tests/pybind11_tests.h version from master, removing just the comment and empty line that was added in PR #3087; those were made obsolete by the pragma cleanup that concluded with PR #3186.
      
      * [ci skip] Restoring tests/test_enum.py from master.
      Ralf W. Grosse-Kunstleve committed
    • fix: memory leak in cpp_function (#3228) (#3229) · d6474ed7
      * fix: memory leak in cpp_function (#3228)
      
      * add a test case to check objects are deconstructed in cpp_function
      
      * update the test case about cpp_function
      
      * fix the test case about cpp_function: remove "noexcept"
      
      * Actually calling func. CHECK(stat.alive() == 2); Manually verified that the new tests fails without the change in pybind11.h
      
      * Moving new test to test_callbacks.cpp,py, with small enhancements.
      
      * Removing new test from test_interpreter.cpp (after it was moved to test_callbacks.cpp,py). This restores test_interpreter.cpp to the current state on master.
      
      * Using py::detail::silence_unused_warnings(py_func); to make the intent clear.
      
      Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
      Tailing Yuan committed
  14. 30 Aug, 2021 1 commit
  15. 28 Aug, 2021 1 commit
    • Adding `ssize_t_cast` to support passing `size_t` or `ssize_t` values where… · 777352fc
      Adding `ssize_t_cast` to support passing `size_t` or `ssize_t` values where `ssize_t` is needed. (#3219)
      
      * Trivial change to avoid (ssize_t) cast.
      
      * Demo for safe_ssize_t idea.
      
      * Removing safe_ssize_t.cpp (proof-of-concept code) to not upset the GHA Format workflow.
      
      * Completing changes in pytypes.h
      
      * New ssize_t_cast (better replacement for safe_ssize_t).
      
      * clang-format-diff (no manual changes).
      
      * bytes_ssize_t -Wnarrowing reproducer (see PR #2692).
      
      * Backing out tuple(), list() ssize_t support, for compatibility with older compilers (to resolve link failures).
      
      * Bug fix: missing `py::` for `py::ssize_t`
      
      * Restoring tuple(), list() ssize_t support, but passing `size` by value, for compatibility with older compilers (to resolve link failures).
      
      * Full test coverage of all functions with modified signatures.
      Ralf W. Grosse-Kunstleve committed
  16. 26 Aug, 2021 6 commits
    • Fix enum value's __int__ returning non-int when underlying type is bool or of char type (#1334) · cb60ed49
      * Use equivalent_integer for enum's Scalar decision
      
      * Add test for char underlying enum
      
      * Support translating bool type in enum's Scalar
      
      * Add test for bool underlying enum
      
      * Fix comment in test
      
      * Switch from `PYBIND11_CPP20` macro to `PYBIND11_HAS_U8STRING`
      
      * Refine tests
      
      Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
      Ye Zhihao committed
    • Call PySys_SetArgv when initializing interpreter. (#2341) · 930bb16c
      * Call PySys_SetArgv when initializing interpreter.
      
      * Document argc/argv parameters in initialize_interpreter.
      
      * Remove manual memory management from set_interpreter_argv in favor of smart pointers.
      
      * Use size_t for indexers in set_interpreter_argv.
      
      * Minimize macros for flow control in set_interpreter_argv.
      
      * Fix 'unused variable' warning on Py2
      
      * whitespace
      
      * Define wide_char_arg_deleter outside set_interpreter_argv.
      
      * Do sys.path workaround in C++ rather than eval.
      
      * Factor out wchar conversion to a separate function.
      
      * Restore widened_argv variable declaration.
      
      * Fix undeclared widened_arg variable on some paths.
      
      * Use delete[] to match new wchar_t[].
      
      * Fix compiler errors
      
      * Use PY_VERSION_HEX for a cleaner CVE-2008-5983 mode check.
      
      * Fix typo
      
      * Use explicit type for deleter so delete[] works cross-compiler.
      
      * Always use PySys_SetArgvEx because pybind11 doesn't support pythons that don't include it.
      
      * Remove pointless ternary operator.
      
      * Use unique_ptr.reset instead of a second initialization.
      
      * Rename add_program_dir_to_path parameter to clarify intent.
      
      * Add defined() check before evaluating HAVE_BROKEN_MBSTOWCS.
      
      * Apply clang-tidy fixes
      
      * Pre-commit
      
      * refactor: use const for set_interpreter_argv
      
      * Try to fix const issue and allocate vector properly
      
      * fix: copy strings on Python 2
      
      * Applying clang-format-diff relative to master.
      
      The only manual change is an added empty line between pybind11 and system `#include`s.
      
      ```
      git diff -U0 --no-color master | python3 $HOME/clone/llvm-project/clang/tools/clang-format/clang-format-diff.py -p1 -style=file -i
      ```
      
      Co-authored-by: Boris Staletic <boris.staletic@gmail.com>
      Co-authored-by: Aaron Gokaslan <skylion.aaron@gmail.com>
      Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
      Co-authored-by: Ralf W. Grosse-Kunstleve <rwgk@google.com>
      Dan committed
    • view for numpy arrays (#987) · 503ff2a6
      * reshape
      
      * more tests
      
      * Update numpy.h
      
      * Update test_numpy_array.py
      
      * array view
      
      * test
      
      * Update test_numpy_array.cpp
      
      * Update numpy.h
      
      * Update numpy.h
      
      * Update test_numpy_array.cpp
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * Fix merge bug
      
      * Make clang-tidy happy
      
      * Add xfail for PyPy
      
      * Fix casting issue
      
      * Fix formatting
      
      * Apply clang-tidy
      
      * Address reviews on additional tests
      
      * Fix ordering
      
      * Do a little more reordering
      
      * Fix typo
      
      * Try improving tests
      
      * Fix error in reshape
      
      * Add one more reshape test
      
      * Fix bugs and add test
      
      * Relax test
      
      * streamlining new tests; removing a few stray msg
      
      * Fix style revert
      
      * Fix clang-tidy
      
      * Misc tweaks:
      * Comment: matching style in file (///), responsibility sentence, consistent punctuation.
      * Replacing `unsigned char` with `uint8_t` for max consistency.
      * Removing `1` from `array_view1` because there is only one.
      
      * Partial clang-format-diff.
      
      Co-authored-by: ncullen93 <ncullen.th@dartmouth.edu>
      Co-authored-by: NC Cullen <nicholas.c.cullen.th@dartmouth.edu>
      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 Grosse-Kunstleve <rwgk@google.com>
      Nick Cullen committed
    • reshape for numpy arrays (#984) · 59ad1e7d
      * reshape
      
      * more tests
      
      * Update numpy.h
      
      * Update test_numpy_array.py
      
      * Update numpy.h
      
      * Update numpy.h
      
      * Update test_numpy_array.cpp
      
      * [pre-commit.ci] auto fixes from pre-commit.com hooks
      
      for more information, see https://pre-commit.ci
      
      * Fix merge bug
      
      * Make clang-tidy happy
      
      * Add xfail for PyPy
      
      * Fix casting issue
      
      * Address reviews on additional tests
      
      * Fix ordering
      
      * Do a little more reordering
      
      * Fix typo
      
      * Try improving tests
      
      * Fix error in reshape
      
      * Add one more reshape test
      
      * streamlining new tests; removing a few stray msg
      
      Co-authored-by: ncullen93 <ncullen.th@dartmouth.edu>
      Co-authored-by: NC Cullen <nicholas.c.cullen.th@dartmouth.edu>
      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 Grosse-Kunstleve <rwgk@google.com>
      Nick Cullen committed
    • Add make_simple_namespace function and tests (#2840) · 031a700d
      Co-authored-by: Jouke Witteveen <j.witteveen@cosine.nl>
      Jouke Witteveen committed
  17. 24 Aug, 2021 1 commit
  18. 23 Aug, 2021 1 commit