1. 13 Aug, 2016 13 commits
  2. 12 Aug, 2016 2 commits
  3. 11 Aug, 2016 6 commits
    • quench warning on clang/OSX · 216df0dd
      Wenzel Jakob committed
    • Merge pull request #324 from jagerman/example-constructor-tracking · f4f2afb6
      Improve constructor/destructor tracking
      Wenzel Jakob committed
    • Improve constructor/destructor tracking · 3f589379
      This commit rewrites the examples that look for constructor/destructor
      calls to do so via static variable tracking rather than output parsing.
      
      The added ConstructorStats class provides methods to keep track of
      constructors and destructors, number of default/copy/move constructors,
      and number of copy/move assignments.  It also provides a mechanism for
      storing values (e.g. for value construction), and then allows all of
      this to be checked at the end of a test by getting the statistics for a
      C++ (or python mapping) class.
      
      By not relying on the precise pattern of constructions/destructions,
      but rather simply ensuring that every construction is matched with a
      destruction on the same object, we ensure that everything that gets
      created also gets destroyed as expected.
      
      This replaces all of the various "std::cout << whatever" code in
      constructors/destructors with
      `print_created(this)`/`print_destroyed(this)`/etc. functions which
      provide similar output, but now has a unified format across the
      different examples, including a new ### prefix that makes mixed example
      output and lifecycle events easier to distinguish.
      
      With this change, relaxed mode is no longer needed, which enables
      testing for proper destruction under MSVC, and under any other compiler
      that generates code calling extra constructors, or optimizes away any
      constructors.  GCC/clang are used as the baseline for move
      constructors; the tests are adapted to allow more move constructors to
      be evoked (but other types are constructors much have matching counts).
      
      This commit also disables output buffering of tests, as the buffering
      sometimes results in C++ output ending up in the middle of python
      output (or vice versa), depending on the OS/python version.
      Jason Rhinelander committed
    • Merge pull request #330 from jagerman/silence-msvc-warning · 85557b1d
      Silence MSVC warning
      Wenzel Jakob committed
    • Silence MSVC warning · e20fc61a
      PR #329 generates the following warning under MSVC:
      
          ...\cast.h(202): warning C4456: declaration of 'it' hides previous local declaration
      
      This renames the second iterator to silence it.
      Jason Rhinelander committed
  4. 10 Aug, 2016 3 commits
  5. 09 Aug, 2016 2 commits
    • Track registered instances that share a pointer address · 1b05ce5b
      The pointer to the first member of a class instance is the same as the
      pointer to instance itself; pybind11 has some workarounds for this to
      not track registered instances that have a registered parent with the
      same address.  This doesn't work everywhere, however: issue #328 is a
      failure of this for a mutator operator which resolves its argument to
      the parent rather than the child, as is needed in #328.
      
      This commit resolves the issue (and restores tracking of same-address
      instances) by changing registered_instances from an unordered_map to an
      unordered_multimap that allows duplicate instances for the same pointer
      to be recorded, then resolves these differences by checking the type of
      each matched instance when looking up an instance.  (A
      unordered_multimap seems cleaner for this than a unordered_map<list> or
      similar because, the vast majority of the time, the instance will be
      unique).
      Jason Rhinelander committed
    • Merge pull request #297 from jagerman/move-python-return-value · bb1ee389
      Move support for return values of called Python functions
      Wenzel Jakob committed
  6. 08 Aug, 2016 4 commits
    • Move support for return values of called Python functions · ed14879a
      Currently pybind11 always translates values returned by Python functions
      invoked from C++ code by copying, even when moving is feasible--and,
      more importantly, even when moving is required.
      
      The first, and relatively minor, concern is that moving may be
      considerably more efficient for some types.  The second problem,
      however, is more serious: there's currently no way python code can
      return a non-copyable type to C++ code.
      
      I ran into this while trying to add a PYBIND11_OVERLOAD of a virtual
      method that returns just such a type: it simply fails to compile because
      this:
      
          overload = ...
          overload(args).template cast<ret_type>();
      
      involves a copy: overload(args) returns an object instance, and the
      invoked object::cast() loads the returned value, then returns a copy of
      the loaded value.
      
      We can, however, safely move that returned value *if* the object has the
      only reference to it (i.e. if ref_count() == 1) and the object is
      itself temporary (i.e. if it's an rvalue).
      
      This commit does that by adding an rvalue-qualified object::cast()
      method that allows the returned value to be move-constructed out of the
      stored instance when feasible.
      
      This basically comes down to three cases:
      
      - For objects that are movable but not copyable, we always try the move,
        with a runtime exception raised if this would involve moving a value
        with multiple references.
      - When the type is both movable and non-trivially copyable, the move
        happens only if the invoked object has a ref_count of 1, otherwise the
        object is copied.  (Trivially copyable types are excluded from this
        case because they are typically just collections of primitive types,
        which can be copied just as easily as they can be moved.)
      - Non-movable and trivially copy constructible objects are simply
        copied.
      
      This also adds examples to example-virtual-functions that shows both a
      non-copyable object and a movable/copyable object in action: the former
      raises an exception if returned while holding a reference, the latter
      invokes a move constructor if unreferenced, or a copy constructor if
      referenced.
      
      Basically this allows code such as:
      
          class MyClass(Pybind11Class):
              def somemethod(self, whatever):
                  mt = MovableType(whatever)
                  # ...
                  return mt
      
      which allows the MovableType instance to be returned to the C++ code
      via its move constructor.
      
      Of course if you attempt to violate this by doing something like:
      
          self.value = MovableType(whatever)
          return self.value
      
      you get an exception--but right now, the pybind11-side of that code
      won't compile at all.
      Jason Rhinelander committed
    • Merge pull request #325 from Hubble1942/fix-python-library-path-in-windows-venv · 6697f80f
      Fixed finding python libraries on windows in venv
      Wenzel Jakob committed
    • Merge pull request #322 from jagerman/document-inherited-virtuals · 72270777
      Added advanced doc section on virtual methods + inheritance
      Wenzel Jakob committed
    • Fixed finding python libraries on windows in venv · b81c500c
      When run on windows in a venv, PYTHON_LIBRARY pointet to a non-existant
      location in the virtual environment directory.
      
      This has been fixed by testing if the path exists and, if not, trying
      an alternative path, relative to the PYTHON_INCLUDE_DIR.
      
      If the alternative path doesn't exit as well, an error will be raised.
      Christian Ewald committed
  7. 05 Aug, 2016 2 commits
    • virtual + inheritance example: remove multiple inheritance approach · d6c365bc
      It was already pretty badly intrusive, but it also appears to make MSVC
      segfault.  Rather than investigating and fixing it, it's easier to just
      remove it.
      Jason Rhinelander committed
    • Added advanced doc section on virtual methods + inheritance · 0ca96e29
      As discussed in #320.
      
      The adds a documentation block that mentions that the trampoline classes
      must provide overrides for both the classes' own virtual methods *and*
      any inherited virtual methods.  It also provides a templated solution to
      avoiding method duplication.
      
      The example includes a third method (only mentioned in the "see also"
      section of the documentation addition), using multiple inheritance.
      While this approach works, and avoids code generation in deep
      hierarchies, it is intrusive by requiring that the wrapped classes use
      virtual inheritance, which itself is more instrusive if any of the
      virtual base classes need anything other than default constructors.  As
      per the discussion in #320, it is kept as an example, but not suggested
      in the documentation.
      Jason Rhinelander committed
  8. 04 Aug, 2016 8 commits