1. 29 Jul, 2017 6 commits
    • Remove debugging · 12be4cd4
      The "z" wasn't meant to be committed; it meant the C++17 optimization
      here was never being used.
      Jason Rhinelander committed
    • Simplify error_already_set · 1682b673
      `error_already_set` is more complicated than it needs to be, partly
      because it manages reference counts itself rather than using
      `py::object`, and partly because it tries to do more exception clearing
      than is needed.  This commit greatly simplifies it, and fixes #927.
      
      Using `py::object` instead of `PyObject *` means we can rely on
      implicit copy/move constructors.
      
      The current logic did both a `PyErr_Clear` on deletion *and* a
      `PyErr_Fetch` on creation.  I can't see how the `PyErr_Clear` on
      deletion is ever useful: the `Fetch` on creation itself clears the
      error, so the only way doing a `PyErr_Clear` on deletion could do
      anything if is some *other* exception was raised while the
      `error_already_set` object was alive--but in that case, clearing some
      other exception seems wrong.  (Code that is worried about an exception
      handler raising another exception would already catch a second
      `error_already_set` from exception code).
      
      The destructor itself called `clear()`, but `clear()` was a little bit
      more paranoid that needed: it called `restore()` to restore the
      currently captured error, but then immediately cleared it, using the
      `PyErr_Restore` to release the references.  That's unnecessary: it's
      valid for us to release the references manually.  This updates the code
      to simply release the references on the three objects (preserving the
      gil acquire).
      
      `clear()`, however, also had the side effect of clearing the current
      error, even if the current `error_already_set` didn't have a current
      error (e.g. because of a previous `restore()` or `clear()` call).  I
      don't really see how clearing the error here can ever actually be
      useful: the only way the current error could be set is if you called
      `restore()` (in which case the current stored error-related members have
      already been released), or if some *other* code raised the error, in
      which case `clear()` on *this* object is clearing an error for which it
      shouldn't be responsible.
      
      Neither of those seem like intentional or desirable features, and
      manually requesting deletion of the stored references similarly seems
      pointless, so I've just made `clear()` an empty method and marked it
      deprecated.
      
      This also fixes a minor potential issue with the destruction: it is
      technically possible for `value` to be null (though this seems likely to
      be rare in practice); this updates the check to look at `type` which
      will always be non-null for a `Fetch`ed exception.
      
      This also adds error_already_set round-trip throw tests to the test
      suite.
      Jason Rhinelander committed
    • Make `init_holder` do registration, and rename to `init_instance` · 353615f7
      The instance registration for offset base types fails (under macOS, with
      a segfault) in the presense of virtual base types.  The issue occurs
      when trying to `static_cast<Base *>(derived_ptr)` when `derived_ptr` has
      been allocated (via `operator new`) but not initialized.
      
      This commit fixes the issue by moving the addition to
      `registered_instances` into `init_holder` rather than immediately after
      value pointer allocation.
      
      This also renames it to `init_instance` since it does more than holder
      initialization now.  (I also further renamed `init_holder_helper` to
      `init_holder` since `init_holder` isn't used anymore).
      
      Fixes #959.
      Jason Rhinelander committed
    • Convert test_multiple_inheritance to new style · 44a17e1f
      Significant rearrangement, but no new tests added.
      Jason Rhinelander committed
    • Detect std::pair non-copyability · 79372601
      Pre-C++17, std::pair can technically have an copy constructor even
      though it can't actually be invoked without a compilation failure (due
      to the underlying types being non-copyable).  Most stls, including
      libc++ since ~3.4, use the C++17 behaviour of not exposing an uncallable
      copy constructor, but FreeBSD deliberately broke their libc++ to
      preserve the nonsensical behaviour
      (https://svnweb.freebsd.org/base?view=revision&revision=261801).
      
      This updates pybind's internal `is_copy_constructible` to also detect
      the std::pair case under pre-C++17.
      
      This also everything (except for a couple cases in the internal version)
      to use the internal `is_copy_constructible` rather than
      `std::is_copy_constructible`.
      Jason Rhinelander committed
  2. 23 Jul, 2017 4 commits
  3. 20 Jul, 2017 1 commit
  4. 16 Jul, 2017 3 commits
    • Support `take_ownership` for custom type casters given a pointer · 60526d46
      This changes the pointer `cast()` in `PYBIND11_TYPE_CASTER` to recognize
      the `take_ownership` policy: if casting a pointer with take-ownership,
      the `cast()` now recalls `cast()` with a dereferenced rvalue (rather
      than the previous code, which was always calling it with a const lvalue
      reference), and deletes the pointer after the chained `cast()` is
      complete.
      
      This makes code like:
      
          m.def("f", []() { return new std::vector<int>(100, 1); },
              py::return_value_policy::take_ownership);
      
      do the expected thing by taking over ownership of the returned pointer
      (which is deleted once the chained cast completes).
      Jason Rhinelander committed
    • Fix regression: container pointers not castable · 67a0cc4e
      PR #936 broke the ability to return a pointer to a stl container (and,
      likewise, to a tuple) because the added deduced type matched a
      non-const pointer argument: the pointer-accepting `cast` in
      PYBIND11_TYPE_CASTER had a `const type *`, which is a worse match for a
      non-const pointer than the universal reference template #936 added.
      
      This changes the provided TYPE_CASTER cast(ptr) to take the pointer by
      template arg (so that it will accept either const or non-const pointer).
      It has two other effects: it slightly reduces .so size (because many
      type casters never actually need the pointer cast at all), and it allows
      type casters to provide their untemplated pointer `cast()` that will
      take precedence over the templated version provided in the macro.
      Jason Rhinelander committed
    • Detect c++ standard unconditionally · fad5d338
      Currently select_cxx_standard(), which sets PYBIND11_CPP_STANDARD when
      not externally set, is only called from pybind11_add_module(), but the
      embed target setup (which runs unconditionally) makes use of
      ${PYBIND11_CPP_STANDARD}, which isn't set yet.  This commit removes the
      `select_cxx_standard` function completely and just always runs the
      standard detection code.
      
      This also tweaks the detection code to not bothering checking for the
      `-std=c++11` flag when the `-std=c++14` detection succeeded.
      Jason Rhinelander committed
  5. 12 Jul, 2017 2 commits
    • Fix test suite under MSVC/Debug · 6b51619a
      In a Debug build, MSVC doesn't apply copy/move elision as often,
      triggering a test failure.  This relaxes the test count requirements
      to let the test suite pass.
      Jason Rhinelander committed
    • Fix past-the-end dereference in values_and_holders · a403d0e6
      The value and holder iterator code had a past-the-end iterator
      dereference.  While of course invalid, the dereference didn't actually
      cause any problems (which is why it wasn't caught before) because the
      dereferenced value is never actually used and `vector` implementations
      appear to allow dereferencing the past-the-end iterator.  Under a MSVC
      debug build, however, it fails a debug assertion and aborts.
      
      This amends the iterator to just store and use a pointer to the vector
      (rather than adding a second past-the-end iterator member), checking the
      type index against the type vector size.
      Jason Rhinelander committed
  6. 06 Jul, 2017 2 commits
  7. 05 Jul, 2017 2 commits
    • Use rvalue subcasting when casting an rvalue container · b57281bb
      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.
      Jason Rhinelander committed
    • Combine std::tuple/std::pair logic · 897d7168
      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.
      Jason Rhinelander committed
  8. 03 Jul, 2017 1 commit
    • Override deduced Base class when defining Derived methods · 23bf8945
      When defining method from a member function pointer (e.g. `.def("f",
      &Derived::f)`) we run into a problem if `&Derived::f` is actually
      implemented in some base class `Base` when `Base` isn't
      pybind-registered.
      
      This happens because the class type is deduced from the member function
      pointer, which then becomes a lambda with first argument this deduced
      type.  For a base class implementation, the deduced type is `Base`, not
      `Derived`, and so we generate and registered an overload which takes a
      `Base *` as first argument.  Trying to call this fails if `Base` isn't
      registered (e.g.  because it's an implementation detail class that isn't
      intended to be exposed to Python) because the type caster for an
      unregistered type always fails.
      
      This commit adds a `method_adaptor` function that rebinds a member
      function to a derived type member function and otherwise (i.e. regular
      functions/lambda) leaves the argument as-is.  This is now used for class
      definitions so that they are bound with type being registered rather
      than a potential base type.
      
      A closely related fix in this commit is to similarly update the lambdas
      used for `def_readwrite` (and related) to bind to the class type being
      registered rather than the deduced type so that registering a property
      that resolves to a base class member similarly generates a usable
      function.
      
      Fixes #854, #910.
      
      Co-Authored-By: Dean Moldovan <dean0x7d@gmail.com>
      Jason Rhinelander committed
  9. 02 Jul, 2017 1 commit
    • Fix unsigned error value casting · 259b2faf
      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.
      Jason Rhinelander committed
  10. 29 Jun, 2017 2 commits
  11. 28 Jun, 2017 1 commit
  12. 27 Jun, 2017 5 commits
  13. 26 Jun, 2017 1 commit
  14. 25 Jun, 2017 1 commit
  15. 24 Jun, 2017 7 commits
  16. 23 Jun, 2017 1 commit