1. 04 Aug, 2017 3 commits
    • Jason Rhinelander's avatar
      Fix builtin exception handlers to work across modules · d5981729
      Jason Rhinelander authored
      The builtin exception handler currently doesn't work across modules
      under clang/libc++ for builtin pybind exceptions like
      `pybind11::error_already_set` or `pybind11::stop_iteration`: under
      RTLD_LOCAL module loading clang considers each module's exception
      classes distinct types.  This then means that the base exception
      translator fails to catch the exceptions and the fall through to the
      generic `std::exception` handler, which completely breaks things like
      `stop_iteration`: only the `stop_iteration` of the first module loaded
      actually works properly; later modules raise a RuntimeError with no
      message when trying to invoke their iterators.
      
      For example, two modules defined like this exhibit the behaviour under
      clang++/libc++:
      
      z1.cpp:
          #include <pybind11/pybind11.h>
          #include <pybind11/stl_bind.h>
          namespace py = pybind11;
          PYBIND11_MODULE(z1, m) {
              py::bind_vector<std::vector<long>>(m, "IntVector");
          }
      
      z2.cpp:
          #include <pybind11/pybind11.h>
          #include <pybind11/stl_bind.h>
          namespace py = pybind11;
          PYBIND11_MODULE(z2, m) {
              py::bind_vector<std::vector<double>>(m, "FloatVector");
          }
      
      Python:
          import z1, z2
          for i in z2.FloatVector():
              pass
      
      results in:
          Traceback (most recent call last):
            File "zs.py", line 2, in <module>
              for i in z2.FloatVector():
          RuntimeError
      
      This commit fixes the issue by adding a new exception translator each
      time the internals pointer is initialized from python builtins: this
      generally means the internals data was initialized by some other
      module.  (The extra translator(s) are skipped under libstdc++).
      d5981729
    • Jason Rhinelander's avatar
      Force hidden visibility on functions needing distinct static locals · e98d31d6
      Jason Rhinelander authored
      This commit adds a PYBIND11_UNSHARED_STATIC_LOCALS macro that forces a
      function to have hidden visibility under gcc and gcc-compatible
      compilers.  gcc, in particular, needs this to to avoid sharing static
      local variables across modules (which happens even under a RTLD_LOCAL
      dlopen()!).  clang doesn't appear to have this issue, but the forced
      visibility on internal pybind functions certainly won't hurt it and icc.
      
      This updates the workaround from #862 to use this rather than the
      version-specific template.
      e98d31d6
    • Jason Rhinelander's avatar
      Make PYBIND11_OBJECT_CVT only convert if the type check fails · 373da824
      Jason Rhinelander authored
      Currently types that are capable of conversion always call their convert
      function when invoked with a `py::object` which is actually the correct
      type.  This means that code such as `py::cast<py::list>(obj)` and
      `py::list l(obj.attr("list"))` make copies, which was an oversight
      rather than an intentional feature.
      
      While at first glance there might be something behind having
      `py::list(obj)` make a copy (as it would in Python), this would be
      inconsistent when you dig a little deeper because `py::list(l)`
      *doesn't* make a copy for an existing `py::list l`, and having an
      inconsistency within C++ would be worse than a C++ <-> Python
      inconsistency.
      
      It is possible to get around the copying using a
      `reinterpret_borrow<list>(o)` (and this commit fixes one place, in
      `embed.h`, that does so), but that seems a misuse of
      `reinterpret_borrow`, which is really supposed to be just for dealing
      with raw python-returned values, not `py::object`-derived wrappers which
      are supposed to be higher level.
      
      This changes the constructor of such converting types (i.e. anything
      using PYBIND11_OBJECT_CVT -- `str`, `bool_`, `int_`, `float_`, `tuple`,
      `dict`, `list`, `set`, `memoryview`) to reference rather than copy when
      the check function passes.
      
      It also adds an `object &&` constructor that is slightly more efficient
      by avoiding an inc_ref when the check function passes.
      373da824
  2. 29 Jul, 2017 5 commits
    • Jason Rhinelander's avatar
      Fix occassional segfault introduced by #960 · cca20a7f
      Jason Rhinelander authored
      The fix for #960 could result a type being registered multiple times if
      its `__init__` is called multiple times.  This can happen perfectly
      ordinarily when python-side multiple inheritance is involved: for
      example, with a diamond inheritance pattern with each intermediate
      classes invoking the parent constructor.
      
      With the change in #960, the multiple `__init__` calls meant
      `register_instance` was called multiple times, but the deletion only
      deleted it once.  Thus, if a future instance of the same type was
      allocated at the same location, pybind would pick it up as a registered
      type.
      
      This fixes the issue by tracking whether a value pointer has been
      registered to avoid both double-registering it.  (There's also a slight
      optimization of not needing to do a registered_instances lookup when the
      type is known not registered, but this is secondary).
      cca20a7f
    • Jason Rhinelander's avatar
      Remove debugging · 12be4cd4
      Jason Rhinelander authored
      The "z" wasn't meant to be committed; it meant the C++17 optimization
      here was never being used.
      12be4cd4
    • Jason Rhinelander's avatar
      Simplify error_already_set · 1682b673
      Jason Rhinelander authored
      `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.
      1682b673
    • Jason Rhinelander's avatar
      Make `init_holder` do registration, and rename to `init_instance` · 353615f7
      Jason Rhinelander authored
      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.
      353615f7
    • Jason Rhinelander's avatar
      Detect std::pair non-copyability · 79372601
      Jason Rhinelander authored
      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`.
      79372601
  3. 23 Jul, 2017 2 commits
    • Ivan Smirnov's avatar
      Implicit conversions to bool + np.bool_ conversion (#925) · e07f7583
      Ivan Smirnov authored
      This adds support for implicit conversions to bool from Python types
      with `__bool__` (Python 3) or `__nonzero__` (Python 2) attributes, and
      adds direct (i.e. non-converting) support for numpy bools.
      e07f7583
    • Jason Rhinelander's avatar
      Add support custom sized operator deletes (#952) · a03408c8
      Jason Rhinelander authored
      If a class doesn't provide a `T::operator delete(void *)` but does have
      a `T::operator delete(void *, size_t)` the latter is invoked by a
      `delete someT`.  Pybind currently only look for and call the former;
      this commit adds detection and calling of the latter when the former
      doesn't exist.
      a03408c8
  4. 20 Jul, 2017 1 commit
  5. 16 Jul, 2017 2 commits
    • Jason Rhinelander's avatar
      Support `take_ownership` for custom type casters given a pointer · 60526d46
      Jason Rhinelander authored
      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).
      60526d46
    • Jason Rhinelander's avatar
      Fix regression: container pointers not castable · 67a0cc4e
      Jason Rhinelander authored
      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.
      67a0cc4e
  6. 12 Jul, 2017 1 commit
    • Jason Rhinelander's avatar
      Fix past-the-end dereference in values_and_holders · a403d0e6
      Jason Rhinelander authored
      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.
      a403d0e6
  7. 06 Jul, 2017 1 commit
    • Dean Moldovan's avatar
      Fix compilation with Intel's compiler · 706a7d96
      Dean Moldovan authored
      ICC was reporting that `try_direct_conversions()` cannot be `constexpr`
      because `handle` is not a literal type. The fix removes `constexpr`
      from the function since it isn't strictly needed.
      
      This commit also suppresses new false positive warnings which mostly
      appear in constexpr contexts (where the compiler knows conversions are
      safe).
      706a7d96
  8. 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
  9. 03 Jul, 2017 1 commit
    • Jason Rhinelander's avatar
      Override deduced Base class when defining Derived methods · 23bf8945
      Jason Rhinelander authored
      
      
      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: default avatarDean Moldovan <dean0x7d@gmail.com>
      23bf8945
  10. 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
  11. 29 Jun, 2017 2 commits
  12. 24 Jun, 2017 4 commits
    • Bruce Merry's avatar
      Hold strong references to keep_alive patients · 9d698f7f
      Bruce Merry authored
      This fixes #856. Instead of the weakref trick, the internals structure
      holds an unordered_map from PyObject* to a vector of references. To
      avoid the cost of the unordered_map lookup for objects that don't have
      any keep_alive patients, a flag is added to each instance to indicate
      whether there is anything to do.
      9d698f7f
    • Jason Rhinelander's avatar
      Use std::type_info::name() for type lookups outside stdlibc++ · 21966967
      Jason Rhinelander authored
      Using `std::type_info::operator==` fails under libc++ because the .so
      is loaded with RTLD_LOCAL.  libc++ considers types under such .sos
      distinct, and so comparing typeid() values directly isn't going to work.
      
      This adds a custom hasher and equality class for the type lookup maps
      when not under stdlibc++, and adds a `detail::same_type` function to
      perform the equality test.  It also converts a few pointer arguments to
      const lvalue references, particularly since doing the pointer
      comparison wasn't technically valid to being with (though in practice,
      appeared to work everywhere).
      
      This fixes #912.
      21966967
    • Dean Moldovan's avatar
      Fix GIL release and acquire when embedding the interpreter · 2d6116b5
      Dean Moldovan authored
      Fixes a race condition when multiple threads try to acquire the GIL
      before `detail::internals` have been initialized. `gil_scoped_release`
      is now tasked with initializing `internals` (guaranteed single-threaded)
      to ensure the safety of subsequent `acquire` calls from multiple threads.
      2d6116b5
    • Jason Rhinelander's avatar
      f42af24a
  13. 23 Jun, 2017 2 commits
  14. 15 Jun, 2017 1 commit
  15. 12 Jun, 2017 1 commit
    • Jason Rhinelander's avatar
      Support multiple inheritance from python · e45c2114
      Jason Rhinelander authored
      This commit allows multiple inheritance of pybind11 classes from
      Python, e.g.
      
          class MyType(Base1, Base2):
              def __init__(self):
                  Base1.__init__(self)
                  Base2.__init__(self)
      
      where Base1 and Base2 are pybind11-exported classes.
      
      This requires collapsing the various builtin base objects
      (pybind11_object_56, ...) introduced in 2.1 into a single
      pybind11_object of a fixed size; this fixed size object allocates enough
      space to contain either a simple object (one base class & small* holder
      instance), or a pointer to a new allocation that can contain an
      arbitrary number of base classes and holders, with holder size
      unrestricted.
      
      * "small" here means having a sizeof() of at most 2 pointers, which is
      enough to fit unique_ptr (sizeof is 1 ptr) and shared_ptr (sizeof is 2
      ptrs).
      
      To minimize the performance impact, this repurposes
      `internals::registered_types_py` to store a vector of pybind-registered
      base types.  For direct-use pybind types (e.g. the `PyA` for a C++ `A`)
      this is simply storing the same thing as before, but now in a vector;
      for Python-side inherited types, the map lets us avoid having to do a
      base class traversal as long as we've seen the class before.  The
      change to vector is needed for multiple inheritance: Python types
      inheriting from multiple registered bases have one entry per base.
      e45c2114
  16. 10 Jun, 2017 2 commits
    • Dean Moldovan's avatar
      Fix py::make_iterator's __next__() for past-the-end calls · caedf74a
      Dean Moldovan authored
      Fixes #896.
      
      From Python docs: "Once an iterator’s `__next__()` method raises
      `StopIteration`, it must continue to do so on subsequent calls.
      Implementations that do not obey this property are deemed broken."
      caedf74a
    • Ben Frederickson's avatar
      Fix passing in utf8 encoded strings with python 2 · 74b501cd
      Ben Frederickson authored
      Passing utf8 encoded strings from python to a C++ function taking a
      std::string was broken.  The previous version was trying to call
      'PyUnicode_FromObject' on this data, which failed to convert the string
      to unicode with the default ascii codec. Also this incurs an unnecessary
      conversion to unicode for data this is immediately converted back to
      utf8.
      
      Fix by treating python 2 strings the same python 3 bytes objects, and just
      copying over the data if possible.
      74b501cd
  17. 08 Jun, 2017 3 commits
    • Jason Rhinelander's avatar
      Remove feature macro for <experimental/optional> · 0365d491
      Jason Rhinelander authored
      libc++ 3.8 (and possibly others--including the derived version on OS X),
      doesn't define the macro, but does support std::experimental::optional.
      This removes the extra macro check and just assumes the header existing
      is enough, which is what we do for <optional> and <variant>.
      0365d491
    • Dean Moldovan's avatar
      Enable detection of private operator new on MSVC · e27ea47c
      Dean Moldovan authored
      MSVC 2015 Update 3 and 2017 can handle enough expression SFINAE
      to make this work now.
      e27ea47c
    • Jason Rhinelander's avatar
      Destroy internals if created during Py_Finalize() · 4edb1ce2
      Jason Rhinelander authored
      Py_Finalize could potentially invoke code that calls `get_internals()`,
      which could create a new internals object if one didn't exist.
      `finalize_interpreter()` didn't catch this because it only used the
      pre-finalize interpreter pointer status; if this happens, it results in
      the internals pointer not being properly destroyed with the interpreter,
      which leaks, and also causes a `get_internals()` under a future
      interpreter to return an internals object that is wrong in various ways.
      4edb1ce2
  18. 07 Jun, 2017 1 commit
  19. 06 Jun, 2017 1 commit
    • eirrgang's avatar
      Explicitly define copy/move constructors for accessor · 91bbe2f2
      eirrgang authored
      `accessor` currently relies on an implicit default copy constructor, but that is deprecated in C++11 when a copy assignment operator is present and can, in some cases, raise deprecation warnings (see #888).  This commit explicitly specifies the default copy constructor and also adds a default move constructor.
      91bbe2f2
  20. 30 May, 2017 1 commit
    • Jason Rhinelander's avatar
      std::reference_wrapper: non-generic types; no None · acedd6c7
      Jason Rhinelander authored
      This reimplements the std::reference_wrapper<T> caster to be a shell
      around the underlying T caster (rather than assuming T is a generic
      type), which lets it work for things like `std::reference_wrapper<int>`
      or anything else custom type caster with a lvalue cast operator.
      
      This also makes it properly fail when None is provided, just as an
      ordinary lvalue reference argument would similarly fail.
      
      This also adds a static assert to test that T has an appropriate type
      caster.  It triggers for casters like `std::pair`, which have
      return-by-value cast operators.  (In theory this could be supported by
      storing a local temporary for such types, but that's beyond the scope
      of this PR).
      
      This also replaces `automatic` or `take_ownership` return value policies
      with `automatic_reference` as taking ownership of a reference inside a
      reference_wrapper is not valid.
      acedd6c7
  21. 29 May, 2017 3 commits
    • Dean Moldovan's avatar
      Replace PYBIND11_PLUGIN with PYBIND11_MODULE · 443ab594
      Dean Moldovan authored
      This commit also adds `doc()` to `object_api` as a shortcut for the
      `attr("__doc__")` accessor.
      
      The module macro changes from:
      ```c++
      PYBIND11_PLUGIN(example) {
          pybind11::module m("example", "pybind11 example plugin");
          m.def("add", [](int a, int b) { return a + b; });
          return m.ptr();
      }
      ```
      
      to:
      
      ```c++
      PYBIND11_MODULE(example, m) {
          m.doc() = "pybind11 example plugin";
          m.def("add", [](int a, int b) { return a + b; });
      }
      ```
      
      Using the old macro results in a deprecation warning. The warning
      actually points to the `pybind11_init` function (since attributes
      don't bind to macros), but the message should be quite clear:
      "PYBIND11_PLUGIN is deprecated, use PYBIND11_MODULE".
      443ab594
    • Yannick Jadoul's avatar
      Convenience constructor templates for buffer_info (#860) · b700c5d6
      Yannick Jadoul authored
      * Added template constructors to buffer_info that can deduce the item size, format string, and number of dimensions from the pointer type and the shape container
      
      * Implemented actual buffer_info constructor as private delegate constructor taking rvalue reference as a workaround for the evaluation order move problem on GCC 4.8
      b700c5d6
    • Dean Moldovan's avatar
      Fix buffer protocol inheritance · 427e4afc
      Dean Moldovan authored
      Fixes #878.
      427e4afc