1. 24 Feb, 2017 10 commits
    • Change array's writeable exception to a ValueError · fd751703
      Numpy raises ValueError when attempting to modify an array, while
      py::array is raising a RuntimeError.  This changes the exception to a
      std::domain_error, which gets mapped to the expected ValueError in
      python.
      Jason Rhinelander committed
    • array: fix base handling · f86dddf7
      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.
      Jason Rhinelander committed
    • Change numpy constants to non-deprecated versions · 88fff9d1
      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.
      Jason Rhinelander committed
    • Make is_template_base_of ignore cv qualification · 7d46c6f6
      `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.)
      Jason Rhinelander committed
    • Eigen: fix partially-fixed matrix conversion · d9d224f2
      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.
      Jason Rhinelander committed
    • Show kwargs in failed method invocation · 231e1678
      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.
      Jason Rhinelander committed
    • Make bad kwarg arguments try next overload · caa1379e
      Fixes #688.
      
      My (commented) assumption that such an error is "highly likely to be a
      caller mistake" was proven false by #688.
      Jason Rhinelander committed
    • Independent tests (#665) · 60d0e0db
      * Make tests buildable independently
      
      This makes "tests" buildable as a separate project that uses
      find_package(pybind11 CONFIG) when invoked independently.
      
      This also moves the WERROR option into tests/CMakeLists.txt, as that's
      the only place it is used.
      
      * Use Eigen 3.3.1's cmake target, if available
      
      This changes the eigen finding code to attempt to use Eigen's
      system-installed Eigen3Config first.  In Eigen 3.3.1, it exports a cmake
      Eigen3::Eigen target to get dependencies from (rather than setting the
      include path directly).
      
      If it fails, we fall back to the trying to load allowing modules (i.e.
      allowing our tools/FindEigen3.cmake).  If we either fallback, or the
      eigen version is older than 3.3.1 (or , we still set the include
      directory manually; otherwise, for CONFIG + new Eigen, we get it via
      the target.
      
      This is also needed to allow 'tests' to be built independently, when
      the find_package(Eigen3) is going to find via the system-installed
      Eigen3Config.cmake.
      
      * Add a install-then-build test, using clang on linux
      
      This tests that `make install` to the actual system, followed by a build
      of the tests (without the main pybind11 repository available) works as
      expected.
      
      To also expand the testing variety a bit, it also builds using
      clang-3.9 instead of gcc.
      
      * Don't try loading Eigen3Config in cmake < 3.0
      
      It could FATAL_ERROR as the newer cmake includes a cmake 3.0 required
      line.
      
      If doing an independent, out-of-tree "tests" build, the regular
      find_package(Eigen3) is likely to fail with the same error, but I think
      we can just let that be: if you want a recent Eigen with proper cmake
      loading support *and* want to do an independent tests build, you'll
      need at least cmake 3.0.
      Jason Rhinelander committed
    • Make string conversion stricter (#695) · ee2e5a50
      * 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)
      Jason Rhinelander committed
  2. 23 Feb, 2017 4 commits
    • Enable static properties (py::metaclass) by default · dd01665e
      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).
      Dean Moldovan committed
    • Make all classes with the same instance size derive from a common base · 08cbe8df
      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.
      Dean Moldovan committed
    • Reimplement static properties by extending PyProperty_Type · c91f8bd6
      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.
      Dean Moldovan committed
    • Minor docs build maintenance (#692) · a3f4a02c
      * Switch breathe to stable releases. It was previously pulling directly
        from master because a required bugfix was not in a stable release yet.
      
      * Force update sphinx and RTD theme. When using conda, readthedocs pins
        sphinx==1.3.5 and sphinx_rtd_theme==0.1.7, which is a bit older than
        the ones used in the RTD regular (non-conda) build. The newer theme
        has nicer sidebar navigation (4-level depth vs. only 2-level on the
        older version). Note that the python==3.5 requirement must stay
        because RTD still installs the older sphinx at one point which isn't
        available with Python 3.6.
      
      [skip ci]
      Dean Moldovan committed
  3. 22 Feb, 2017 1 commit
    • Fixed compilation error when binding function accepting some forms of std::function (#689) · c7fcde7c
      * 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.
      Lunderberg committed
  4. 18 Feb, 2017 1 commit
  5. 17 Feb, 2017 3 commits
    • changed return_value:: to return_value_policy:: (#672) · e72eaa47
      * changed return_value:: to return_value_policy::
      
      * Update functions.rst
      thorink committed
    • Revert noexcept deduction in favour of better SFINAE on lambda functions (#677) · 1d7998e3
      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++.
      Jason Rhinelander committed
  6. 14 Feb, 2017 10 commits
    • CMake installation path consistency (#652) · d5ce82b6
      * Add flag for installation of headers under python include directory
      
      * Allow the disabling of distutils install_headers
      Sylvain Corlay committed
    • Fix readthedocs build · cec052b5
      Fixes #667
      
      The sphinx version is pinned by readthedocs, but sphinx 1.3.5 is not
      available with conda python 3.6. The workaround is to pin the python
      version to 3.5 (it doesn't really matter for the docs build).
      Dean Moldovan committed
    • Revert "Template array constructor (#582)" · 329d9833
      This reverts commit bee8827a.
      Dean Moldovan committed
    • Unicode fixes and docs (#624) · 11a337f1
      * 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.
      Jason Rhinelander committed
    • Temporary gcc travis-ci build fixes · ada763b9
      Recent gcc snapshots (both gcc 7 snapshots and recent gcc 6 stable
      branch snapshots) are triggering an upstream gcc bug when -flto is
      enabled (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79296).  This has
      been hitting the gcc-7 builds for a while now, but is going to start
      hitting the debian testing builds in a few days as well.
      
      The issue is triggered by using -flto in combination with structs or
      classes declared in a function, as done in test_alias_initialization,
      test_isses, test_methods_and_attributes (and possibly more).
      
      I'm subscribed to the upstream bug, and will submit another PR to
      reenable LTO once a fixed gcc is available.
      
      The gcc-7 build also generates some warnings; just ignore them for now
      (by turning off -Werror).
      Jason Rhinelander committed
    • Store LTO flags in PYBIND11_LTO_{CXX,LINKER}_FLAGS cache variables · c137c0a8
      This both lets us not bother rechecking LTO flags when cmake reinvokes
      itself, and also lets the cmake invoker override to specify custom or
      no LTO flags by setting the cache variable with
      -DPYBIND11_LTO_CXX_FLAGS= when invoking cmake.
      Jason Rhinelander committed
    • Overhaul LTO flag detection · 1bee6e7d
      Clang on linux currently fails to run cmake:
      
          $ CC=clang CXX=clang++ cmake ..
          ...
          -- Configuring done
          CMake Error at tools/pybind11Tools.cmake:135 (target_compile_options):
            Error evaluating generator expression:
      
              $<:-flto>
      
            Expression did not evaluate to a known generator expression
          Call Stack (most recent call first):
            tests/CMakeLists.txt:68 (pybind11_add_module)
      
      But investigating this led to various other -flto detection problems;
      this commit thus overhauls LTO flag detection:
      
      - -flto needs to be passed to the linker as well
      - Also compile with -fno-fat-lto-objects under GCC
      - Pass the equivalent flags to MSVC
      - Enable LTO flags for via generator expressions (for non-debug builds
        only), so that multi-config builds (like on Windows) still work
        properly.  This seems reasonable, however, even on single-config
        builds (and simplifies the cmake code a bit).
      - clang's lto linker plugins don't accept '-Os', so replace it with
        '-O3' when doing a MINSIZEREL build
      - Enable trying ThinLTO by default for test suite (only affects clang)
      - Match Clang$ rather than ^Clang$ because, for cmake with 3.0+
        policies in effect, the compiler ID will be AppleClang on macOS.
      Jason Rhinelander committed
  7. 08 Feb, 2017 5 commits
    • Fix path to libsize.py (#658) · 5e92b3e6
      Use PROJECT_SOURCE_DIR instead of CMAKE_SOURCE_DIR as the base of the
      path to libsize.py. This fixes an error if pybind11 is being built
      directly within another project.
      Matthew Woehlke committed
    • Avoid C-style const casts (#659) · e15fa9f9
      * 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.
      Matthew Woehlke committed
    • Fix handling of Python exceptions during module initialization (#657) · d534bd67
      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.)
      Dean Moldovan committed
    • Fix debugging output for nameless py::arg_v annotations (#648) · 1eaacd19
      * 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
      Jason Rhinelander committed
    • Merge pull request #655 from dean0x7d/issue-template · 93cc4bd6
      Add a GitHub issue template
      Wenzel Jakob committed
  8. 07 Feb, 2017 1 commit
  9. 06 Feb, 2017 1 commit
  10. 05 Feb, 2017 2 commits
  11. 04 Feb, 2017 2 commits
    • Prefer non-converting argument overloads · e550589b
      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).
      Jason Rhinelander committed
    • Add support for non-converting arguments · abc29cad
      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.
      Jason Rhinelander committed