1. 08 Oct, 2021 1 commit
  2. 13 Aug, 2021 1 commit
    • Aaron Gokaslan's avatar
      maint(precommit): Apply isort (#3195) · 9df2f1ff
      Aaron Gokaslan authored
      * Apply isort
      
      * Tweak isort config
      
      * Add env.py as a known_first_party
      
      * Add one missing known first party
      
      * Make config compat with older isort versions
      
      * Add another comment
      
      * Revert pyproject setting
      9df2f1ff
  3. 13 Jul, 2021 1 commit
  4. 04 Jul, 2021 1 commit
  5. 02 Apr, 2021 1 commit
  6. 01 Feb, 2021 1 commit
  7. 25 Jan, 2021 1 commit
    • Yannick Jadoul's avatar
      Always call PyNumber_Index when casting from Python to a C++ integral type, also pre-3.8 (#2801) · 0bb8ca26
      Yannick Jadoul authored
      * Always call PyNumber_Index when casting from Python to a C++ integral type, also pre-3.8
      
      * Fixed on PyPy
      
      * Simplify use of PyNumber_Index, following @rwgk's idea, and ignore warnings in >=3.8
      
      * Reproduce mismatch between pre-3.8 and post-3.8 behavior on __index__ throwing TypeError
      
      * Fix tests on 3.6 <= Python < 3.8
      
      * No, I don't have an uninitialized variable
      
      * Fix use of __index__ on Python 2
      
      * Make types in test_int_convert more ~boring~ descriptive
      0bb8ca26
  8. 17 Jan, 2021 1 commit
    • Yannick Jadoul's avatar
      fix: only allow integer type_caster to call __int__ method when conversion is... · 8449a808
      Yannick Jadoul authored
      fix: only allow integer type_caster to call __int__ method when conversion is allowed; always call __index__ (#2698)
      
      * Only allow integer type_caster to call __int__ or __index__ method when conversion is allowed
      
      * Remove tests for __index__ as this seems to only be used to convert to int in 3.8+
      
      * Take both `int` and `long` types into account for Python 2
      
      * Add test_numpy_int_convert to assert tests currently fail, even though np.intc has an __index__ method
      
      * Also consider __index__ as noconvert to a C++ integer
      
      * New-style classes for Python 2.7; sigh
      
      * Add some tests on types with custom __index__ method
      
      * Ignore some tests in Python <3.8
      
      * Update comment about conversion from np.float32 to C++ int
      
      * Workaround difference between CPython and PyPy's different PyIndex_Check (unnoticed because we currently don't have PyPy >= 3.8)
      
      * Avoid ICC segfault with py::arg()
      8449a808
  9. 16 Dec, 2020 1 commit
    • Laramie Leavitt's avatar
      Adjusting `type_caster<std::reference_wrapper<T>>` to support const/non-const... · 5469c238
      Laramie Leavitt authored
      Adjusting `type_caster<std::reference_wrapper<T>>` to support const/non-const propagation in `cast_op`. (#2705)
      
      
      * Allow type_caster of std::reference_wrapper<T> to be the same as a native reference.
      
      Before, both std::reference_wrapper<T> and std::reference_wrapper<const T> would
      invoke cast_op<type>. This doesn't allow the type_caster<> specialization for T
      to distinguish reference_wrapper types from value types.
      
      After, the type_caster<> specialization invokes cast_op<type&>, which allows
      reference_wrapper to behave in the same way as a native reference type.
      
      * Add tests/examples for std::reference_wrapper<const T>
      
      * Add tests which use mutable/immutable variants
      
      This test is a chimera; it blends the pybind11 casters with a custom
      pytype implementation that supports immutable and mutable calls.
      
      In order to detect the immutable/mutable state, the cast_op needs
      to propagate it, even through e.g. std::reference<const T>
      
      Note: This is still a work in progress; some things are crashing,
      which likely means that I have a refcounting bug or something else
      missing.
      
      * Add/finish tests that distinguish const& from &
      
      Fixes the bugs in my custom python type implementation,
      demonstrate test that requires const& and reference_wrapper<const T>
      being treated differently from Non-const.
      
      * Add passing a const to non-const method.
      
      * Demonstrate non-const conversion of reference_wrapper in tests.
      
      Apply formatting presubmit check.
      
      * Fix build errors from presubmit checks.
      
      * Try and fix a few more CI errors
      
      * More CI fixes.
      
      * More CI fixups.
      
      * Try and get PyPy to work.
      
      * Additional minor fixups. Getting close to CI green.
      
      * More ci fixes?
      
      * fix clang-tidy warnings from presubmit
      
      * fix more clang-tidy warnings
      
      * minor comment and consistency cleanups
      
      * PyDECREF -> Py_DECREF
      
      * copy/move constructors
      
      * Resolve codereview comments
      
      * more review comment fixes
      
      * review comments: remove spurious &
      
      * Make the test fail even when the static_assert is commented out.
      
      This expands the test_freezable_type_caster a bit by:
      1/ adding accessors .is_immutable and .addr to compare identity
      from python.
      2/ Changing the default cast_op of the type_caster<> specialization
      to return a non-const value. In normal codepaths this is a reasonable
      default.
      3/ adding roundtrip variants to exercise the by reference, by pointer
      and by reference_wrapper in all call paths.  In conjunction with 2/, this
      demonstrates the failure case of the existing std::reference_wrpper conversion,
      which now loses const in a similar way that happens when using the default cast_op_type<>.
      
      * apply presubmit formatting
      
      * Revert inclusion of test_freezable_type_caster
      
      There's some concern that this test is a bit unwieldly because of the use
      of the raw <Python.h> functions. Removing for now.
      
      * Add a test that validates const references propagation.
      
      This test verifies that cast_op may be used to correctly detect
      const reference types when used with std::reference_wrapper.
      
      * mend
      
      * Review comments based changes.
      
      1. std::add_lvalue_reference<type> -> type&
      2. Simplify the test a little more; we're never returning the ConstRefCaster
      type so the class_ definition can be removed.
      
      * formatted files again.
      
      * Move const_ref_caster test to builtin_casters
      
      * Review comments: use cast_op and adjust some comments.
      
      * Simplify ConstRefCasted test
      
      I like this version better as it moves the assertion that matters
      back into python.
      5469c238
  10. 16 Oct, 2020 1 commit
  11. 16 Aug, 2020 1 commit
    • Henry Schreiner's avatar
      tests: cleanup and ci hardening (#2397) · 4d9024ec
      Henry Schreiner authored
      * tests: refactor and cleanup
      
      * refactor: more consistent
      
      * tests: vendor six
      
      * tests: more xfails, nicer system
      
      * tests: simplify to info
      
      * tests: suggestions from @YannickJadoul and @bstaletic
      
      * tests: restore some pypy tests that now pass
      
      * tests: rename info to env
      
      * tests: strict False/True
      
      * tests: drop explicit strict=True again
      
      * tests: reduce minimum PyTest to 3.1
      4d9024ec
  12. 14 Aug, 2020 1 commit
  13. 28 Jul, 2020 1 commit
  14. 22 Jul, 2020 1 commit
  15. 20 Jul, 2020 1 commit
  16. 19 Dec, 2019 1 commit
  17. 14 Nov, 2019 1 commit
  18. 11 Nov, 2018 1 commit
    • Wenzel Jakob's avatar
      fix py::cast<void *> (#1605) · cea42467
      Wenzel Jakob authored
      Pybind11 provides a cast operator between opaque void* pointers on the
      C++ side and capsules on the Python side. The py::cast<void *>
      expression was not aware of this possibility and incorrectly triggered a
      compile-time assertion ("Unable to cast type to reference: value is
      local to type caster") that is now fixed.
      cea42467
  19. 30 Nov, 2017 1 commit
    • Henry Schreiner's avatar
      Matching Python 2 int behavior on Python 2 (#1186) · cf0d0f9d
      Henry Schreiner authored
      Pybind11's default conversion to int always produces a long on Python 2 (`int`s and `long`s were unified in Python 3). This patch fixes `int` handling to match Python 2 on Python 2; for short types (`size_t` or smaller), the number will be returned as an `int` if possible, otherwise `long`. Requires Python 2.5+.
      
      This is needed for things like `sys.exit`, which refuse to accept a `long`.
      cf0d0f9d
  20. 12 Oct, 2017 1 commit
    • Jason Rhinelander's avatar
      Fix `char &` arguments being non-bindable · 1b08df58
      Jason Rhinelander authored
      This changes the caster to return a reference to a (new) local `CharT`
      type caster member so that binding lvalue-reference char arguments
      works (currently it results in a compilation failure).
      
      Fixes #1116
      1b08df58
  21. 05 Aug, 2017 1 commit
  22. 23 Jul, 2017 1 commit
  23. 05 Jul, 2017 2 commits
    • Jason Rhinelander's avatar
      Use rvalue subcasting when casting an rvalue container · b57281bb
      Jason Rhinelander authored
      This updates the std::tuple, std::pair and `stl.h` type casters to
      forward their contained value according to whether the container being
      cast is an lvalue or rvalue reference.  This fixes an issue where
      subcaster casts were always called with a const lvalue which meant
      nested type casters didn't have the desired `cast()` overload invoked.
      For example, this caused Eigen values in a tuple to end up with a
      readonly flag (issue #935) and made it impossible to return a container
      of move-only types (issue #853).
      
      This fixes both issues by adding templated universal reference `cast()`
      methods to the various container types that forward container elements
      according to the container reference type.
      b57281bb
    • Jason Rhinelander's avatar
      Combine std::tuple/std::pair logic · 897d7168
      Jason Rhinelander authored
      The std::pair caster can be written as a special case of the std::tuple
      caster; this combines them via a base `tuple_caster` class (which is
      essentially identical to the previous std::tuple caster).
      
      This also removes the special empty tuple base case: returning an empty
      tuple is relatively rare, and the base case still works perfectly well
      even when the tuple types is an empty list.
      897d7168
  24. 02 Jul, 2017 1 commit
    • Jason Rhinelander's avatar
      Fix unsigned error value casting · 259b2faf
      Jason Rhinelander authored
      When casting to an unsigned type from a python 2 `int`, we currently
      cast using `(unsigned long long) PyLong_AsUnsignedLong(src.ptr())`.
      If the Python cast fails, it returns (unsigned long) -1, but then we
      cast this to `unsigned long long`, which means we get 4294967295, but
      because that isn't equal to `(unsigned long long) -1`, we don't detect
      the failure.
      
      This commit moves the unsigned casting into a `detail::as_unsigned`
      function which, upon error, casts -1 to the final type, and otherwise
      casts the return value to the final type to avoid the problematic double
      cast when an error occurs.
      
      The error most commonly shows up wherever `long` is 32-bits (e.g. under
      both 32- and 64-bit Windows, and under 32-bit linux) when passing a
      negative value to a bound function taking an `unsigned long`.
      
      Fixes #929.
      
      The added tests also trigger a latent segfault under PyPy: when casting
      to an integer smaller than `long` (e.g. casting to a `uint32_t` on a
      64-bit `long` architecture) we check both for a Python error and also
      that the resulting intermediate value will fit in the final type.  If
      there is no conversion error, but we get a value that would overflow, we
      end up calling `PyErr_ExceptionMatches()` illegally: that call is only
      allowed when there is a current exception.  Under PyPy, this segfaults
      the test suite.  It doesn't appear to segfault under CPython, but the
      documentation suggests that it *could* do so.  The fix is to only check
      for the exception match if we actually got an error.
      259b2faf
  25. 27 Jun, 2017 1 commit