1. 24 Feb, 2017 7 commits
    • Jason Rhinelander's avatar
      array: fix base handling · f86dddf7
      Jason Rhinelander authored
      numpy arrays aren't currently properly setting base: by setting `->base`
      directly, the base doesn't follow what numpy expects and documents (that
      is, following chained array bases to the root array).
      
      This fixes the behaviour by using numpy's PyArray_SetBaseObject to set
      the base instead, and then updates the tests to reflect the fixed
      behaviour.
      f86dddf7
    • Jason Rhinelander's avatar
      Change numpy constants to non-deprecated versions · 88fff9d1
      Jason Rhinelander authored
      A few of pybind's numpy constants are using the numpy-deprecated names
      (without "ARRAY_" in them); updated our names to be consistent with
      current numpy code.
      88fff9d1
    • Jason Rhinelander's avatar
      Make is_template_base_of ignore cv qualification · 7d46c6f6
      Jason Rhinelander authored
      `is_template_base_of<T>` fails when `T` is `const` (because its
      implementation relies on being able to convert a `T*` to a `Base<U>*`,
      which won't work when `T` is const).
      
      (This also agrees with std::is_base_of, which ignores cv qualification.)
      7d46c6f6
    • Jason Rhinelander's avatar
      Eigen: fix partially-fixed matrix conversion · d9d224f2
      Jason Rhinelander authored
      Currently when we do a conversion between a numpy array and an Eigen
      Vector, we allow the conversion only if the Eigen type is a
      compile-time vector (i.e. at least one dimension is fixed at 1 at
      compile time), or if the type is dynamic on *both* dimensions.
      
      This means we can run into cases where MatrixXd allow things that
      conforming, compile-time sizes does not: for example,
      `Matrix<double,4,Dynamic>` is currently not allowed, even when assigning
      from a 4-element vector, but it *is* allowed for a
      `Matrix<double,Dynamic,Dynamic>`.
      
      This commit also reverts the current behaviour of using the matrix's
      storage order to determine the structure when the Matrix is fully
      dynamic (i.e. in both dimensions).  Currently we assign to an eigen row
      if the storage order is row-major, and column otherwise: this seems
      wrong (the storage order has nothing to do with the shape!).  While
      numpy doesn't distinguish between a row/column vector, Eigen does, but
      it makes more sense to consistently choose one than to produce
      something with a different shape based on the intended storage layout.
      d9d224f2
    • Jason Rhinelander's avatar
      Show kwargs in failed method invocation · 231e1678
      Jason Rhinelander authored
      With the previous commit, output can be very confusing because you only
      see positional arguments in the "invoked with" line, but you can have a
      failure from kwargs as well (in particular, when a value is invalidly
      specified via both via positional and kwargs).  This commits adds
      kwargs to the output, and updates the associated tests to match.
      231e1678
    • Jason Rhinelander's avatar
      Make bad kwarg arguments try next overload · caa1379e
      Jason Rhinelander authored
      Fixes #688.
      
      My (commented) assumption that such an error is "highly likely to be a
      caller mistake" was proven false by #688.
      caa1379e
    • Jason Rhinelander's avatar
      Make string conversion stricter (#695) · ee2e5a50
      Jason Rhinelander authored
      * Make string conversion stricter
      
      The string conversion logic added in PR #624 for all std::basic_strings
      was derived from the old std::wstring logic, but that was underused and
      turns out to have had a bug in accepting almost anything convertible to
      unicode, while the previous std::string logic was much stricter.  This
      restores the previous std::string logic by only allowing actual unicode
      or string types.
      
      Fixes #685.
      
      * Added missing 'requires numpy' decorator
      
      (I forgot that the change to a global decorator here is in the
      not-yet-merged Eigen PR)
      ee2e5a50
  2. 23 Feb, 2017 3 commits
    • Dean Moldovan's avatar
      Enable static properties (py::metaclass) by default · dd01665e
      Dean Moldovan authored
      Now that only one shared metaclass is ever allocated, it's extremely
      cheap to enable it for all pybind11 types.
      
      * Deprecate the default py::metaclass() since it's not needed anymore.
      * Allow users to specify a custom metaclass via py::metaclass(handle).
      dd01665e
    • Dean Moldovan's avatar
      Make all classes with the same instance size derive from a common base · 08cbe8df
      Dean Moldovan authored
      In order to fully satisfy Python's inheritance type layout requirements,
      all types should have a common 'solid' base. A solid base is one which
      has the same instance size as the derived type (not counting the space
      required for the optional `dict_ptr` and `weakrefs_ptr`). Thus, `object`
      does not qualify as a solid base for pybind11 types and this can lead to
      issues with multiple inheritance.
      
      To get around this, new base types are created: one per unique instance
      size. There is going to be very few of these bases. They ensure Python's
      MRO checks will pass when multiple bases are involved.
      08cbe8df
    • Dean Moldovan's avatar
      Reimplement static properties by extending PyProperty_Type · c91f8bd6
      Dean Moldovan authored
      Instead of creating a new unique metaclass for each type, the builtin
      `property` type is subclassed to support static properties. The new
      setter/getters always pass types instead of instances in their `self`
      argument. A metaclass is still required to support this behavior, but
      it doesn't store any data anymore, so a new one doesn't need to be
      created for each class. There is now only one common metaclass which
      is shared by all pybind11 types.
      c91f8bd6
  3. 22 Feb, 2017 1 commit
    • Lunderberg's avatar
      Fixed compilation error when binding function accepting some forms of std::function (#689) · c7fcde7c
      Lunderberg authored
      * Fixed compilation error when defining function accepting some forms of std::function.
      
      The compilation error happens only when the functional.h header is
      present, and the build is done in debug mode, with NDEBUG being
      undefined.  In addition, the std::function must accept an abstract
      base class by reference.
      
      The compilation error occurred in cast.h, when trying to construct a
      std::tuple<AbstractBase>, rather than a std::tuple<AbstractBase&>.
      This was caused by functional.h using std::move rather than
      std::forward, changing the signature of the function being used.
      
      This commit contains the fix, along with a test that exhibits the
      issue when compiled in debug mode without the fix applied.
      
      * Moved new std::function tests into test_callbacks, added callback_with_movable test.
      c7fcde7c
  4. 18 Feb, 2017 1 commit
  5. 17 Feb, 2017 1 commit
    • Jason Rhinelander's avatar
      Revert noexcept deduction in favour of better SFINAE on lambda functions (#677) · 1d7998e3
      Jason Rhinelander authored
      noexcept deduction, added in PR #555, doesn't work with clang's
      -std=c++1z; and while it works with g++, it isn't entirely clear to me
      that it is required to work in C++17.
      
      What should work, however, is that C++17 allows implicit conversion of a
      `noexcept(true)` function pointer to a `noexcept(false)` (i.e.  default,
      noexcept-not-specified) function pointer.  That was breaking in pybind11
      because the cpp_function template used for lambdas provided a better
      match (i.e. without requiring an implicit conversion), but it then
      failed.
      
      This commit takes a different approach of using SFINAE on the lambda
      function to prevent it from matching a non-lambda object, which then
      gets implicit conversion from a `noexcept` function pointer to a
      `noexcept(false)` function pointer.  This much nicer solution also gets
      rid of the C++17 NOEXCEPT macros, and works in both clang and g++.
      1d7998e3
  6. 14 Feb, 2017 4 commits
    • Dean Moldovan's avatar
      Revert "Template array constructor (#582)" · 329d9833
      Dean Moldovan authored
      This reverts commit bee8827a.
      329d9833
    • Jason Rhinelander's avatar
      Unicode fixes and docs (#624) · 11a337f1
      Jason Rhinelander authored
      * Propagate unicode conversion failure
      
      If returning a std::string with invalid utf-8 data, we currently fail
      with an uninformative TypeError instead of propagating the
      UnicodeDecodeError that Python sets on failure.
      
      * Add support for u16/u32strings and literals
      
      This adds support for wchar{16,32}_t character literals and the
      associated std::u{16,32}string types.  It also folds the
      character/string conversion into a single type_caster template, since
      the type casters for string and wstring were mostly the same anyway.
      
      * Added too-long and too-big character conversion errors
      
      With this commit, when casting to a single character, as opposed to a
      C-style string, we make sure the input wasn't a multi-character string
      or a single character with codepoint too large for the character type.
      
      This also changes the character cast op to CharT instead of CharT& (we
      need to be able to return a temporary decoded char value, but also
      because there's little gained by bothering with an lvalue return here).
      
      Finally it changes the char caster to 'has-a-string-caster' instead of
      'is-a-string-caster' because, with the cast_op change above, there's
      nothing at all gained from inheritance.  This also lets us remove the
      `success` from the string caster (which was only there for the char
      caster) into the char caster itself.  (I also renamed it to 'none' and
      inverted its value to better reflect its purpose).  The None -> nullptr
      loading also now takes place only under a `convert = true` load pass.
      Although it's unlikely that a function taking a char also has overloads
      that can take a None, it seems marginally more correct to treat it as a
      conversion.
      
      This commit simplifies the size assumptions about character sizes with
      static_asserts to back them up.
      11a337f1
    • Sylvain Corlay's avatar
      Template array constructor (#582) · bee8827a
      Sylvain Corlay authored
      bee8827a
    • Dean Moldovan's avatar
      Fix sequence_item reference leak (#660) · a76ed42c
      Dean Moldovan authored
      a76ed42c
  7. 08 Feb, 2017 3 commits
    • Matthew Woehlke's avatar
      Avoid C-style const casts (#659) · e15fa9f9
      Matthew Woehlke authored
      * Avoid C-style const casts
      
      Replace C-style casts that discard `const` with `const_cast` (and, where
      necessary, `reinterpret_cast` as well).
      
      * Warn about C-style const-discarding casts
      
      Change pybind11_enable_warnings to also enable `-Wcast-qual` (warn if a
      C-style cast discards `const`) by default. The previous commit should
      have gotten rid of all of these (at least, all the ones that tripped in
      my build, which included the tests), and this should discourage more
      from newly appearing.
      e15fa9f9
    • Dean Moldovan's avatar
      Fix handling of Python exceptions during module initialization (#657) · d534bd67
      Dean Moldovan authored
      Fixes #656.
      
      Before this commit, the problematic sequence was:
      
      1. `catch (const std::exception &e)` gets a Python exception,
         i.e. `error_already_set`.
      2. `PyErr_SetString(PyExc_ImportError, e.what())` sets an `ImportError`.
      3. `~error_already_set()` now runs, but `gil_scoped_acquire` fails due
         to an unhandled `ImportError` (which was just set in step 2).
      
      This commit adds a separate catch block for Python exceptions which just
      clears the Python error state a little earlier and replaces it with an
      `ImportError`, thus making sure that there is only a single Python
      exception in flight at a time. (After step 2 in the sequence above,
      there were effectively two Python expections set.)
      d534bd67
    • Jason Rhinelander's avatar
      Fix debugging output for nameless py::arg_v annotations (#648) · 1eaacd19
      Jason Rhinelander authored
      * Fix debugging output for nameless py::arg annotations
      
      This fixes a couple bugs with nameless py::arg() (introduced in #634)
      annotations:
      
      - the argument name was being used in debug mode without checking that
        it exists (which would result in the std::string construction throwing
        an exception for being invoked with a nullptr)
      - the error output says "keyword arguments", but py::arg_v() can now
        also be used for positional argument defaults.
      - the debugging output "in function named 'blah'" was overly verbose:
        changed it to just "in function 'blah'".
      
      * Fix missing space in debug test string
      
      * Moved tests from issues to methods_and_attributes
      1eaacd19
  8. 06 Feb, 2017 1 commit
    • Wenzel Jakob's avatar
      renamed _check -> check_ · 0defac59
      Wenzel Jakob authored
      (Identifiers starting with underscores are reserved by the standard)
      Also fixed a typo in a comment.
      0defac59
  9. 04 Feb, 2017 3 commits
    • Jason Rhinelander's avatar
      Prefer non-converting argument overloads · e550589b
      Jason Rhinelander authored
      This changes the function dispatching code for overloaded functions into
      a two-pass procedure where we first try all overloads with
      `convert=false` for all arguments.  If no function calls succeeds in the
      first pass, we then try a second pass where we allow arguments to have
      `convert=true` (unless, of course, the argument was explicitly specified
      with `py::arg().noconvert()`).
      
      For non-overloaded methods, the two-pass procedure is skipped (we just
      make the overload-allowed call).  The second pass is also skipped if it
      would result in the same thing (i.e. where all arguments are
      `.noconvert()` arguments).
      e550589b
    • Jason Rhinelander's avatar
      Add support for non-converting arguments · abc29cad
      Jason Rhinelander authored
      This adds support for controlling the `convert` flag of arguments
      through the py::arg annotation.  This then allows arguments to be
      flagged as non-converting, which the type_caster is able to use to
      request different behaviour.
      
      Currently, AFAICS `convert` is only used for type converters of regular
      pybind11-registered types; all of the other core type_casters ignore it.
      We can, however, repurpose it to control internal conversion of
      converters like Eigen and `array`: most usefully to give callers a way
      to disable the conversion that would otherwise occur when a
      `Eigen::Ref<const Eigen::Matrix>` argument is passed a numpy array that
      requires conversion (either because it has an incompatible stride or the
      wrong dtype).
      
      Specifying a noconvert looks like one of these:
      
          m.def("f1", &f, "a"_a.noconvert() = "default"); // Named, default, noconvert
          m.def("f2", &f, "a"_a.noconvert()); // Named, no default, no converting
          m.def("f3", &f, py::arg().noconvert()); // Unnamed, no default, no converting
      
      (The last part--being able to declare a py::arg without a name--is new:
      previous py::arg() only accepted named keyword arguments).
      
      Such an non-convert argument is then passed `convert = false` by the
      type caster when loading the argument.  Whether this has an effect is up
      to the type caster itself, but as mentioned above, this would be
      extremely helpful for the Eigen support to give a nicer way to specify
      a "no-copy" mode than the custom wrapper in the current PR, and
      moreover isn't an Eigen-specific hack.
      abc29cad
    • Jason Rhinelander's avatar
      Made arithmetic and complex casters respect `convert` · 709675a7
      Jason Rhinelander authored
      Arithmetic and complex casters now only do a converting cast when
      `convert=true`; previously they would convert always (e.g. when passing
      an int to a float-accepting function, or a float to complex-accepting
      function).
      709675a7
  10. 31 Jan, 2017 11 commits
    • Wenzel Jakob's avatar
      ab60bf13
    • Jason Rhinelander's avatar
      Pack all function call data into a single struct · bfcf952e
      Jason Rhinelander authored
      This cleans up the previous commit slightly by further reducing the
      function call arguments to a single struct (containing the
      function_record, arguments vector, and parent).
      
      Although this doesn't currently change anything, it does allow for
      future functionality to have a place for precalls to store temporary
      objects that need to be destroyed after a function call (whether or not
      the call succeeds).
      
      As a concrete example, with this change #625 could be easily implemented
      (I think) by adding a std::unique_ptr<gil_scoped_release> member to the
      `function_call` struct with a precall that actually constructs it.
      Without this, the precall can't do that: the postcall won't be invoked
      if the call throws an exception.
      
      This doesn't seems to affect the .so size noticeably (either way).
      bfcf952e
    • Jason Rhinelander's avatar
    • Jason Rhinelander's avatar
      Move constexpr_first/last to common.h · 34d308ad
      Jason Rhinelander authored
      This keeps it with constexpr_sum and the other metafunctions.
      34d308ad
    • Jason Rhinelander's avatar
      Changed keep_alive template arguments from int to size_t · 3b4b9211
      Jason Rhinelander authored
      Passing a negative value wasn't valid anyway, and moreover this avoids a
      little bit of extra code to avoid signed/unsigned argument warnings.
      3b4b9211
    • Jason Rhinelander's avatar
      Add support for positional args with args/kwargs · 2686da83
      Jason Rhinelander authored
      This commit rewrites the function dispatcher code to support mixing
      regular arguments with py::args/py::kwargs arguments.  It also
      simplifies the argument loader noticeably as it no longer has to worry
      about args/kwargs: all of that is now sorted out in the dispatcher,
      which now simply appends a tuple/dict if the function takes
      py::args/py::kwargs, then passes all the arguments in a vector.
      
      When the argument loader hit a py::args or py::kwargs, it doesn't do
      anything special: it just calls the appropriate type_caster just like it
      does for any other argument (thus removing the previous special cases
      for args/kwargs).
      
      Switching to passing arguments in a single std::vector instead of a pair
      of tuples also makes things simpler, both in the dispatch and the
      argument_loader: since this argument list is strictly pybind-internal
      (i.e. it never goes to Python) we have no particular reason to use a
      Python tuple here.
      
      Some (intentional) restrictions:
      - you may not bind a function that has args/kwargs somewhere other than
        the end (this somewhat matches Python, and keeps the dispatch code a
        little cleaner by being able to not worry about where to inject the
        args/kwargs in the argument list).
      - If you specify an argument both positionally and via a keyword
        argument, you get a TypeError alerting you to this (as you do in
        Python).
      2686da83
    • Dean Moldovan's avatar
      Improve custom holder support (#607) · ec009a7c
      Dean Moldovan authored
      * Abstract away some holder functionality (resolve #585)
      
      Custom holder types which don't have `.get()` can select the correct
      function to call by specializing `holder_traits`.
      
      * Add support for move-only holders (fix #605)
      ec009a7c
    • Jason Rhinelander's avatar
      Numpy: better compilation errors, long double support (#619) · f7f5bc8e
      Jason Rhinelander authored
      * Clarify PYBIND11_NUMPY_DTYPE documentation
      
      The current documentation and example reads as though
      PYBIND11_NUMPY_DTYPE is a declarative macro along the same lines as
      PYBIND11_DECLARE_HOLDER_TYPE, but it isn't.  The changes the
      documentation and docs example to make it clear that you need to "call"
      the macro.
      
      * Add satisfies_{all,any,none}_of<T, Preds>
      
      `satisfies_all_of<T, Pred1, Pred2, Pred3>` is a nice legibility-enhanced
      shortcut for `is_all<Pred1<T>, Pred2<T>, Pred3<T>>`.
      
      * Give better error message for non-POD dtype attempts
      
      If you try to use a non-POD data type, you get difficult-to-interpret
      compilation errors (about ::name() not being a member of an internal
      pybind11 struct, among others), for which isn't at all obvious what the
      problem is.
      
      This adds a static_assert for such cases.
      
      It also changes the base case from an empty struct to the is_pod_struct
      case by no longer using `enable_if<is_pod_struct>` but instead using a
      static_assert: thus specializations avoid the base class, POD types
      work, and non-POD types (and unimplemented POD types like std::array)
      get a more informative static_assert failure.
      
      * Prefix macros with PYBIND11_
      
      numpy.h uses unprefixed macros, which seems undesirable.  This prefixes
      them with PYBIND11_ to match all the other macros in numpy.h (and
      elsewhere).
      
      * Add long double support
      
      This adds long double and std::complex<long double> support for numpy
      arrays.
      
      This allows some simplification of the code used to generate format
      descriptors; the new code uses fewer macros, instead putting the code as
      different templated options; the template conditions end up simpler with
      this because we are now supporting all basic C++ arithmetic types (and
      so can use is_arithmetic instead of is_integral + multiple
      different specializations).
      
      In addition to testing that it is indeed working in the test script, it
      also adds various offset and size calculations there, which
      fixes the test failures under x86 compilations.
      f7f5bc8e
    • Matthias Möller's avatar
      Update common.h (#606) · c2d1d958
      Matthias Möller authored
      fixed VS build, when _DEBUG is just defined without any value assigned (e.g. VS15)
      c2d1d958
    • Dean Moldovan's avatar
      Automate generation of reference docs with doxygen and breathe (#598) · 57a9bbc6
      Dean Moldovan authored
      * Make 'any' the default markup role for Sphinx docs
      
      * Automate generation of reference docs with doxygen and breathe
      
      * Improve reference docs coverage
      57a9bbc6
    • Pim Schellart's avatar
  11. 13 Jan, 2017 1 commit
  12. 03 Jan, 2017 1 commit
  13. 01 Jan, 2017 2 commits
  14. 26 Dec, 2016 1 commit