mirror of https://github.com/pybind/pybind11
Branch:
array-sequence-fix
archive/smart_holder
array-sequence-fix
cpp17-aligned-new
fold-expression-caster
henryiii-patch-1
henryiii-patch-2
henryiii/revert/pycapsule
internals_ptr
issue1561_fix
master
pre-commit-ci-update-config
revert-4220-fix-nvcc-11.4-11.8
stable
undefined-macos
v1.8
v2.0
v2.1
v2.10
v2.11
v2.12
v2.13
v2.2
v2.3
v2.4
v2.5
v2.6
v2.7
v2.8
v2.9
void-caster-fix
archive/llvm_sanitizer_mods
archive/pr2198_list_caster_bytes_uint8
archive/pr2409_2020_10_18_two_defines
archive/pr2672_sideline_cast_shtc_interleaved
archive/pr2672_sideline_cast_shtc_interleaved_openspiel_pattern
archive/pr2672_test_unique_ptr_member
archive/pr2672_use_smart_holder_as_default_v1
archive/pr2687_move_holder_test_premature_delete
archive/xxx_value_ptr_xxx_holder
archive/yclass_v0
milestones_reached/pr2672_as_deployed_with_cl_358092606
v1.0
v1.1
v1.2
v1.3
v1.4
v1.5
v1.6
v1.7
v1.8
v1.8.1
v2.0.0
v2.0.0-rc1
v2.0.1
v2.1.0
v2.1.1
v2.10.0
v2.10.1
v2.10.2
v2.10.3
v2.10.4
v2.11.0
v2.11.1
v2.11.2
v2.12.0
v2.12.1
v2.13.0
v2.13.1
v2.13.2
v2.13.3
v2.13.4
v2.13.5
v2.13.6
v2.2.0
v2.2.1
v2.2.2
v2.2.3
v2.2.4
v2.3.0
v2.4.0
v2.4.1
v2.4.2
v2.4.3
v2.5.0
v2.6.0
v2.6.0b1
v2.6.0rc1
v2.6.0rc2
v2.6.0rc3
v2.6.1
v2.6.2
v2.7.0
v2.7.1
v2.8.0
v2.8.1
v2.9.0
v2.9.1
v2.9.2
v3.0.0rc1
v3.0.0rc2
v3.0.0rc3
v3.0.0rc4
${ noResults }
3 Commits (array-sequence-fix)
Author | SHA1 | Message | Date |
---|---|---|---|
|
39fd6a9463 |
Reduce binary size overhead of new-style constructors
The lookup of the `self` type and value pointer are moved out of template code and into `dispatcher`. This brings down the binary size of constructors back to the level of the old placement-new approach. (It also avoids a second lookup for `init_instance`.) With this implementation, mixing old- and new-style constructors in the same overload set may result in some runtime overhead for temporary allocations/deallocations, but this should be fine as old style constructors are phased out. |
8 years ago |
|
c4e180081d |
Reimplement py::init<...> to use common factory code
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. |
8 years ago |
|
464d98962d |
Allow binding factory functions as constructors
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. |
8 years ago |