1. 25 Aug, 2017 2 commits
  2. 24 Aug, 2017 2 commits
  3. 23 Aug, 2017 9 commits
  4. 22 Aug, 2017 4 commits
  5. 21 Aug, 2017 1 commit
  6. 20 Aug, 2017 2 commits
  7. 19 Aug, 2017 2 commits
    • Fix typos in Eigen documentation · d265933d
      Fixes one small variable name typo, and two instances where `py::arg().nocopy()` is used, where I think it should be `py::arg().noconvert()` instead. Probably `nocopy()` was the old/original name for it and then it was changed.
      Patrik Huber committed
    • Allow module-local classes to be loaded externally · 5e14aa6a
      The main point of `py::module_local` is to make the C++ -> Python cast
      unique so that returning/casting a C++ instance is well-defined.
      Unfortunately it also makes loading unique, but this isn't particularly
      desirable: when an instance contains `Type` instance there's no reason
      it shouldn't be possible to pass that instance to a bound function
      taking a `Type` parameter, even if that function is in another module.
      
      This commit solves the issue by allowing foreign module (and global)
      type loaders have a chance to load the value if the local module loader
      fails.  The implementation here does this by storing a module-local
      loading function in a capsule in the python type, which we can then call
      if the local (and possibly global, if the local type is masking a global
      type) version doesn't work.
      Jason Rhinelander committed
  8. 17 Aug, 2017 10 commits
    • Remove PYBIND11_UNSHARED_STATIC_LOCALS macro · 39498b2b
      The macro isn't doing anything useful now that hidden visibility is
      applied to all pybind11 code.
      Jason Rhinelander committed
    • Reimplement py::init<...> to use common factory code · c4e18008
      This reimplements the py::init<...> implementations using the various
      functions added to support `py::init(...)`, and moves the implementing
      structs into `detail/init.h` from `pybind11.h`.  It doesn't simply use a
      factory directly, as this is a very common case and implementation
      without an extra lambda call is a small but useful optimization.
      
      This, combined with the previous lazy initialization, also avoids
      needing placement new for `py::init<...>()` construction: such
      construction now occurs via an ordinary `new Type(...)`.
      
      A consequence of this is that it also fixes a potential bug when using
      multiple inheritance from Python: it was very easy to write classes
      that double-initialize an existing instance which had the potential to
      leak for non-pod classes.  With the new implementation, an attempt to
      call `__init__` on an already-initialized object is now ignored.  (This
      was already done in the previous commit for factory constructors).
      
      This change exposed a few warnings (fixed here) from deleting a pointer
      to a base class with virtual functions but without a virtual destructor.
      These look like legitimate warnings that we shouldn't suppress; this
      adds virtual destructors to the appropriate classes.
      Jason Rhinelander committed
    • Allow binding factory functions as constructors · 464d9896
      This allows you to use:
      
          cls.def(py::init(&factory_function));
      
      where `factory_function` returns a pointer, holder, or value of the
      class type (or a derived type).  Various compile-time checks
      (static_asserts) are performed to ensure the function is valid, and
      various run-time type checks where necessary.
      
      Some other details of this feature:
      - The `py::init` name doesn't conflict with the templated no-argument
        `py::init<...>()`, but keeps the naming consistent: the existing
        templated, no-argument one wraps constructors, the no-template,
        function-argument one wraps factory functions.
      - If returning a CppClass (whether by value or pointer) when an CppAlias
        is required (i.e. python-side inheritance and a declared alias), a
        dynamic_cast to the alias is attempted (for the pointer version); if
        it fails, or if returned by value, an Alias(Class &&) constructor
        is invoked.  If this constructor doesn't exist, a runtime error occurs.
      - for holder returns when an alias is required, we try a dynamic_cast of
        the wrapped pointer to the alias to see if it is already an alias
        instance; if it isn't, we raise an error.
      - `py::init(class_factory, alias_factory)` is also available that takes
        two factories: the first is called when an alias is not needed, the
        second when it is.
      - Reimplement factory instance clearing.  The previous implementation
        failed under python-side multiple inheritance: *each* inherited
        type's factory init would clear the instance instead of only setting
        its own type value.  The new implementation here clears just the
        relevant value pointer.
      - dealloc is updated to explicitly set the leftover value pointer to
        nullptr and the `holder_constructed` flag to false so that it can be
        used to clear preallocated value without needing to rebuild the
        instance internals data.
      - Added various tests to test out new allocation/deallocation code.
      - With preallocation now done lazily, init factory holders can
        completely avoid the extra overhead of needing an extra
        allocation/deallocation.
      - Updated documentation to make factory constructors the default
        advanced constructor style.
      - If an `__init__` is called a second time, we have two choices: we can
        throw away the first instance, replacing it with the second; or we can
        ignore the second call.  The latter is slightly easier, so do that.
      Jason Rhinelander committed
    • Add a polymorphic static assert when using an alias · 42e5ddc5
      An alias can be used for two main purposes: to override virtual methods,
      and to add some extra data to a class needed for the pybind-wrapper.
      Both of these absolutely require that the wrapped class be polymorphic
      so that virtual dispatch and destruction, respectively, works.
      Jason Rhinelander committed
    • Added metatypes for dealing with functions/lambdas · b4bf5ed5
      `function_signature_t` extracts the function type from a function,
      function pointer, or lambda.
      
      `is_lambda` (which is really
      `is_not_a_function_or_pointer_or_member_pointer`, but that name is a
      bit too long) checks whether the type is (in the approprate context) a
      lambda.
      
      `is_function_pointer` checks whether the type is a pointer to a
      function.
      Jason Rhinelander committed
    • Lazy instance value pointer allocation · fd81a03e
      We currently allocate instance values when creating the instance itself
      (except when constructing the instance for a `cast()`), but there is no
      particular reason to do so: the instance itself and the internals (for
      a non-simple layout) are allocated via Python, with no reason to
      expect better locality from the invoked `operator new`.  Moreover, it
      makes implementation of factory function constructors trickier and
      slightly less efficient: they don't use the pre-eallocate the memory,
      which means there is a pointless allocation and free.
      
      This commit makes the allocation lazy: instead of preallocating when
      creating the instance, the allocation happens when the instance is
      first loaded (if null at that time).
      
      In addition to making it more efficient to deal with cases that don't
      need preallocation, this also allows for a very slight performance
      increase by not needing to look up the instances types during
      allocation.  (There is a lookup during the eventual load, of course, but
      that is happening already).
      Jason Rhinelander committed
    • Fix documentation build · 8665ee81
      * Doxygen needs `RECURSIVE = YES` in order to parse the `detail` subdir.
      
      * The `-W` warnings-as-errors option for sphinx doesn't work with the
        makefile build. Switched to calling sphinx directly.
      
      * Fix "citation [cppimport] is not referenced" warning.
      Dean Moldovan committed
    • Don't force hidden visibility on the embed target, just the module target · 0d703f6e
      Embedding may well be used in places where hidden visibility isn't
      desired.  It should be relatively safe to allow it there; any potential
      conflict would come in if modules are loaded into that embedded
      interpreter, but as long as the modules are compiled with hidden
      visibility they shouldn't conflict.
      
      There could still be warnings if the embedded code attempts to export
      classes with internal (hidden) pybind members, but that seems a
      legitimate warning (and already has a FAQ entry).
      Jason Rhinelander committed
    • Avoid duplicate C++ standard flags if CMAKE_CXX_STANDARD is set · 76e06c89
      CMAKE_CXX_STANDARD is only available on CMake >= 3.1. If the flag is
      set, we avoid initializing PYBIND11_CPP_STANDARD.
      Dean Moldovan committed
  9. 14 Aug, 2017 2 commits
  10. 13 Aug, 2017 2 commits
  11. 12 Aug, 2017 1 commit
  12. 07 Aug, 2017 3 commits