2015-07-05 18:05:44 +00:00
|
|
|
/*
|
2016-01-17 21:36:44 +00:00
|
|
|
pybind11/pybind11.h: Main header file of the C++11 python
|
|
|
|
binding generator library
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2016-04-17 18:21:41 +00:00
|
|
|
Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch>
|
2015-07-05 18:05:44 +00:00
|
|
|
|
|
|
|
All rights reserved. Use of this source code is governed by a
|
|
|
|
BSD-style license that can be found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
2015-07-11 15:41:48 +00:00
|
|
|
#pragma once
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2018-11-20 22:22:02 +00:00
|
|
|
#if defined(__INTEL_COMPILER)
|
|
|
|
# pragma warning push
|
|
|
|
# pragma warning disable 68 // integer conversion resulted in a change of sign
|
|
|
|
# pragma warning disable 186 // pointless comparison of unsigned integer with zero
|
|
|
|
# pragma warning disable 878 // incompatible exception specifications
|
|
|
|
# pragma warning disable 1334 // the "template" keyword used for syntactic disambiguation may only be used within a template
|
|
|
|
# pragma warning disable 1682 // implicit conversion of a 64-bit integral type to a smaller integral type (potential portability problem)
|
|
|
|
# pragma warning disable 1786 // function "strdup" was declared deprecated
|
|
|
|
# pragma warning disable 1875 // offsetof applied to non-POD (Plain Old Data) types is nonstandard
|
|
|
|
# pragma warning disable 2196 // warning #2196: routine is both "inline" and "noinline"
|
|
|
|
#elif defined(_MSC_VER)
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma warning(push)
|
2016-08-24 23:43:33 +00:00
|
|
|
# pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
|
2016-08-24 23:43:33 +00:00
|
|
|
# pragma warning(disable: 4512) // warning C4512: Assignment operator was implicitly defined as deleted
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma warning(disable: 4800) // warning C4800: 'int': forcing value to bool 'true' or 'false' (performance warning)
|
|
|
|
# pragma warning(disable: 4996) // warning C4996: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
|
2016-09-11 11:00:40 +00:00
|
|
|
# pragma warning(disable: 4702) // warning C4702: unreachable code
|
2016-09-22 22:27:59 +00:00
|
|
|
# pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
|
2016-05-01 18:47:49 +00:00
|
|
|
#elif defined(__GNUG__) && !defined(__clang__)
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma GCC diagnostic push
|
|
|
|
# pragma GCC diagnostic ignored "-Wunused-but-set-parameter"
|
|
|
|
# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
|
|
|
|
# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
|
2016-05-15 21:54:34 +00:00
|
|
|
# pragma GCC diagnostic ignored "-Wstrict-aliasing"
|
|
|
|
# pragma GCC diagnostic ignored "-Wattributes"
|
2017-05-09 18:46:15 +00:00
|
|
|
# if __GNUC__ >= 7
|
|
|
|
# pragma GCC diagnostic ignored "-Wnoexcept-type"
|
|
|
|
# endif
|
2015-07-05 18:05:44 +00:00
|
|
|
#endif
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
#include "attr.h"
|
2016-11-15 11:38:05 +00:00
|
|
|
#include "options.h"
|
2017-08-13 22:35:53 +00:00
|
|
|
#include "detail/class.h"
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
#include "detail/init.h"
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2019-06-19 08:48:36 +00:00
|
|
|
#if defined(__GNUG__) && !defined(__clang__)
|
|
|
|
# include <cxxabi.h>
|
|
|
|
#endif
|
|
|
|
|
2017-08-10 16:03:29 +00:00
|
|
|
NAMESPACE_BEGIN(PYBIND11_NAMESPACE)
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2015-07-26 14:33:49 +00:00
|
|
|
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
|
2015-07-11 15:41:48 +00:00
|
|
|
class cpp_function : public function {
|
2015-07-26 14:33:49 +00:00
|
|
|
public:
|
2015-07-11 15:41:48 +00:00
|
|
|
cpp_function() { }
|
2017-11-07 16:35:27 +00:00
|
|
|
cpp_function(std::nullptr_t) { }
|
2015-07-26 14:33:49 +00:00
|
|
|
|
2016-05-10 14:05:03 +00:00
|
|
|
/// Construct a cpp_function from a vanilla function pointer
|
2017-02-17 11:56:41 +00:00
|
|
|
template <typename Return, typename... Args, typename... Extra>
|
|
|
|
cpp_function(Return (*f)(Args...), const Extra&... extra) {
|
2016-05-10 14:05:03 +00:00
|
|
|
initialize(f, f, extra...);
|
2015-07-26 14:33:49 +00:00
|
|
|
}
|
|
|
|
|
2016-05-10 14:05:03 +00:00
|
|
|
/// Construct a cpp_function from a lambda function (possibly with internal state)
|
2017-05-10 05:51:08 +00:00
|
|
|
template <typename Func, typename... Extra,
|
|
|
|
typename = detail::enable_if_t<detail::is_lambda<Func>::value>>
|
2017-02-17 11:56:41 +00:00
|
|
|
cpp_function(Func &&f, const Extra&... extra) {
|
2015-07-29 15:43:52 +00:00
|
|
|
initialize(std::forward<Func>(f),
|
2017-05-10 05:51:08 +00:00
|
|
|
(detail::function_signature_t<Func> *) nullptr, extra...);
|
2015-07-26 14:33:49 +00:00
|
|
|
}
|
|
|
|
|
2020-06-10 11:35:10 +00:00
|
|
|
/// Construct a cpp_function from a class method (non-const, no ref-qualifier)
|
2017-02-17 11:56:41 +00:00
|
|
|
template <typename Return, typename Class, typename... Arg, typename... Extra>
|
|
|
|
cpp_function(Return (Class::*f)(Arg...), const Extra&... extra) {
|
2015-07-29 15:43:52 +00:00
|
|
|
initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
|
2017-02-17 11:56:41 +00:00
|
|
|
(Return (*) (Class *, Arg...)) nullptr, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
2015-07-26 14:33:49 +00:00
|
|
|
|
2020-06-10 11:35:10 +00:00
|
|
|
/// Construct a cpp_function from a class method (non-const, lvalue ref-qualifier)
|
|
|
|
/// A copy of the overload for non-const functions without explicit ref-qualifier
|
|
|
|
/// but with an added `&`.
|
|
|
|
template <typename Return, typename Class, typename... Arg, typename... Extra>
|
|
|
|
cpp_function(Return (Class::*f)(Arg...)&, const Extra&... extra) {
|
|
|
|
initialize([f](Class *c, Arg... args) -> Return { return (c->*f)(args...); },
|
|
|
|
(Return (*) (Class *, Arg...)) nullptr, extra...);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Construct a cpp_function from a class method (const, no ref-qualifier)
|
2017-02-17 11:56:41 +00:00
|
|
|
template <typename Return, typename Class, typename... Arg, typename... Extra>
|
|
|
|
cpp_function(Return (Class::*f)(Arg...) const, const Extra&... extra) {
|
2015-07-29 15:43:52 +00:00
|
|
|
initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
|
2017-02-17 11:56:41 +00:00
|
|
|
(Return (*)(const Class *, Arg ...)) nullptr, extra...);
|
2015-07-26 14:33:49 +00:00
|
|
|
}
|
|
|
|
|
2020-06-10 11:35:10 +00:00
|
|
|
/// Construct a cpp_function from a class method (const, lvalue ref-qualifier)
|
|
|
|
/// A copy of the overload for const functions without explicit ref-qualifier
|
|
|
|
/// but with an added `&`.
|
|
|
|
template <typename Return, typename Class, typename... Arg, typename... Extra>
|
|
|
|
cpp_function(Return (Class::*f)(Arg...) const&, const Extra&... extra) {
|
|
|
|
initialize([f](const Class *c, Arg... args) -> Return { return (c->*f)(args...); },
|
|
|
|
(Return (*)(const Class *, Arg ...)) nullptr, extra...);
|
|
|
|
}
|
|
|
|
|
2015-09-04 21:42:12 +00:00
|
|
|
/// Return the function name
|
2016-01-17 21:36:44 +00:00
|
|
|
object name() const { return attr("__name__"); }
|
2015-09-04 21:42:12 +00:00
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
protected:
|
2016-09-10 06:28:37 +00:00
|
|
|
/// Space optimization: don't inline this frequently instantiated fragment
|
|
|
|
PYBIND11_NOINLINE detail::function_record *make_function_record() {
|
|
|
|
return new detail::function_record();
|
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/// Special internal constructor for functors, lambda functions, etc.
|
2017-02-17 11:56:41 +00:00
|
|
|
template <typename Func, typename Return, typename... Args, typename... Extra>
|
|
|
|
void initialize(Func &&f, Return (*)(Args...), const Extra&... extra) {
|
2017-07-02 10:52:00 +00:00
|
|
|
using namespace detail;
|
2018-01-12 16:06:46 +00:00
|
|
|
struct capture { remove_reference_t<Func> f; };
|
2015-07-26 14:33:49 +00:00
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/* Store the function including any extra state it might have (e.g. a lambda capture object) */
|
2016-09-10 06:28:37 +00:00
|
|
|
auto rec = make_function_record();
|
2015-07-29 15:43:52 +00:00
|
|
|
|
2016-05-10 14:05:03 +00:00
|
|
|
/* Store the capture object directly in the function record if there is enough space */
|
|
|
|
if (sizeof(capture) <= sizeof(rec->data)) {
|
2016-07-10 08:13:18 +00:00
|
|
|
/* Without these pragmas, GCC warns that there might not be
|
|
|
|
enough space to use the placement new operator. However, the
|
|
|
|
'if' statement above ensures that this is the case. */
|
2016-07-07 20:26:04 +00:00
|
|
|
#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
|
2016-07-07 20:11:42 +00:00
|
|
|
# pragma GCC diagnostic push
|
|
|
|
# pragma GCC diagnostic ignored "-Wplacement-new"
|
|
|
|
#endif
|
2016-05-10 14:05:03 +00:00
|
|
|
new ((capture *) &rec->data) capture { std::forward<Func>(f) };
|
2016-07-07 20:26:04 +00:00
|
|
|
#if defined(__GNUG__) && !defined(__clang__) && __GNUC__ >= 6
|
2016-07-07 20:11:42 +00:00
|
|
|
# pragma GCC diagnostic pop
|
|
|
|
#endif
|
2016-05-10 14:05:03 +00:00
|
|
|
if (!std::is_trivially_destructible<Func>::value)
|
2018-01-12 16:06:46 +00:00
|
|
|
rec->free_data = [](function_record *r) { ((capture *) &r->data)->~capture(); };
|
2016-05-10 14:05:03 +00:00
|
|
|
} else {
|
|
|
|
rec->data[0] = new capture { std::forward<Func>(f) };
|
2018-01-12 16:06:46 +00:00
|
|
|
rec->free_data = [](function_record *r) { delete ((capture *) r->data[0]); };
|
2016-05-10 14:05:03 +00:00
|
|
|
}
|
2015-10-13 15:37:25 +00:00
|
|
|
|
2016-05-10 14:05:03 +00:00
|
|
|
/* Type casters for the function arguments and return value */
|
2018-01-12 16:06:46 +00:00
|
|
|
using cast_in = argument_loader<Args...>;
|
|
|
|
using cast_out = make_caster<
|
|
|
|
conditional_t<std::is_void<Return>::value, void_type, Return>
|
2016-11-27 17:19:34 +00:00
|
|
|
>;
|
2015-07-26 14:33:49 +00:00
|
|
|
|
2018-01-12 16:06:46 +00:00
|
|
|
static_assert(expected_num_args<Extra...>(sizeof...(Args), cast_in::has_args, cast_in::has_kwargs),
|
2017-03-19 15:36:18 +00:00
|
|
|
"The number of argument annotations does not match the number of function arguments");
|
2017-01-22 04:42:14 +00:00
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/* Dispatch code which converts function arguments and performs the actual function call */
|
2018-01-12 16:06:46 +00:00
|
|
|
rec->impl = [](function_call &call) -> handle {
|
2016-05-10 14:05:03 +00:00
|
|
|
cast_in args_converter;
|
2016-01-17 21:36:41 +00:00
|
|
|
|
|
|
|
/* Try to cast the function arguments into the C++ domain */
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (!args_converter.load_args(call))
|
2016-01-17 21:36:41 +00:00
|
|
|
return PYBIND11_TRY_NEXT_OVERLOAD;
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
/* Invoke call policy pre-call hook */
|
2018-01-12 16:06:46 +00:00
|
|
|
process_attributes<Extra...>::precall(call);
|
2016-05-10 14:05:03 +00:00
|
|
|
|
|
|
|
/* Get a pointer to the capture object */
|
2017-02-08 22:43:08 +00:00
|
|
|
auto data = (sizeof(capture) <= sizeof(call.func.data)
|
|
|
|
? &call.func.data : call.func.data[0]);
|
|
|
|
capture *cap = const_cast<capture *>(reinterpret_cast<const capture *>(data));
|
2016-01-17 21:36:41 +00:00
|
|
|
|
Add an ability to avoid forcing rvp::move
Eigen::Ref objects, when returned, are almost always returned as
rvalues; what's important is the data they reference, not the outer
shell, and so we want to be able to use `::copy`,
`::reference_internal`, etc. to refer to the data the Eigen::Ref
references (in the following commits), rather than the Eigen::Ref
instance itself.
This moves the policy override into a struct so that code that wants to
avoid it (or wants to provide some other Return-type-conditional
override) can create a specialization of
return_value_policy_override<Return> in order to override the override.
This lets an Eigen::Ref-returning function be bound with `rvp::copy`,
for example, to specify that the data should be copied into a new numpy
array rather than referenced, or `rvp::reference_internal` to indicate
that it should be referenced, but a keep-alive used (actually, we used
the array's `base` rather than a py::keep_alive in such a case, but it
accomplishes the same thing).
2017-01-20 05:59:26 +00:00
|
|
|
/* Override policy for rvalues -- usually to enforce rvp::move on an rvalue */
|
2018-07-17 14:56:26 +00:00
|
|
|
return_value_policy policy = return_value_policy_override<Return>::policy(call.func.policy);
|
2016-11-20 04:31:02 +00:00
|
|
|
|
2017-03-16 10:22:26 +00:00
|
|
|
/* Function scope guard -- defaults to the compile-to-nothing `void_type` */
|
2018-01-12 16:06:46 +00:00
|
|
|
using Guard = extract_guard_t<Extra...>;
|
2017-03-16 10:22:26 +00:00
|
|
|
|
2016-07-10 08:13:18 +00:00
|
|
|
/* Perform the function call */
|
2017-05-14 19:57:26 +00:00
|
|
|
handle result = cast_out::cast(
|
|
|
|
std::move(args_converter).template call<Return, Guard>(cap->f), policy, call.parent);
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
/* Invoke call policy post-call hook */
|
2018-01-12 16:06:46 +00:00
|
|
|
process_attributes<Extra...>::postcall(call, result);
|
2016-01-17 21:36:41 +00:00
|
|
|
|
2016-01-17 21:36:39 +00:00
|
|
|
return result;
|
2015-07-26 14:33:49 +00:00
|
|
|
};
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
/* Process any user-provided function attributes */
|
2018-01-12 16:06:46 +00:00
|
|
|
process_attributes<Extra...>::init(extra..., rec);
|
2016-01-17 21:36:41 +00:00
|
|
|
|
2017-12-23 22:56:07 +00:00
|
|
|
{
|
2020-04-14 11:04:25 +00:00
|
|
|
constexpr bool has_kwonly_args = any_of<std::is_same<kwonly, Extra>...>::value,
|
2017-12-23 22:56:07 +00:00
|
|
|
has_args = any_of<std::is_same<args, Args>...>::value,
|
|
|
|
has_arg_annotations = any_of<is_keyword<Extra>...>::value;
|
2020-04-14 11:04:25 +00:00
|
|
|
static_assert(has_arg_annotations || !has_kwonly_args, "py::kwonly requires the use of argument annotations");
|
|
|
|
static_assert(!(has_args && has_kwonly_args), "py::kwonly cannot be combined with a py::args argument");
|
2017-12-23 22:56:07 +00:00
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/* Generate a readable signature describing the function's arguments and return value types */
|
2017-07-02 10:52:00 +00:00
|
|
|
static constexpr auto signature = _("(") + cast_in::arg_names + _(") -> ") + cast_out::name;
|
|
|
|
PYBIND11_DESCR_CONSTEXPR auto types = decltype(signature)::types();
|
2016-01-17 21:36:41 +00:00
|
|
|
|
|
|
|
/* Register the function with Python from generic (non-templated) code */
|
2017-07-02 10:52:00 +00:00
|
|
|
initialize_generic(rec, signature.text, types.data(), sizeof...(Args));
|
2016-05-10 14:59:01 +00:00
|
|
|
|
|
|
|
if (cast_in::has_args) rec->has_args = true;
|
|
|
|
if (cast_in::has_kwargs) rec->has_kwargs = true;
|
2016-07-10 08:13:18 +00:00
|
|
|
|
|
|
|
/* Stash some additional information used by an important optimization in 'functional.h' */
|
2017-02-17 11:56:41 +00:00
|
|
|
using FunctionType = Return (*)(Args...);
|
2016-07-10 08:13:18 +00:00
|
|
|
constexpr bool is_function_ptr =
|
|
|
|
std::is_convertible<Func, FunctionType>::value &&
|
|
|
|
sizeof(capture) == sizeof(void *);
|
|
|
|
if (is_function_ptr) {
|
|
|
|
rec->is_stateless = true;
|
2017-02-08 22:43:08 +00:00
|
|
|
rec->data[1] = const_cast<void *>(reinterpret_cast<const void *>(&typeid(FunctionType)));
|
2016-07-10 08:13:18 +00:00
|
|
|
}
|
2015-07-30 13:29:00 +00:00
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/// Register a function call with Python (generic non-templated code goes here)
|
2016-05-10 14:05:03 +00:00
|
|
|
void initialize_generic(detail::function_record *rec, const char *text,
|
2016-07-31 18:03:18 +00:00
|
|
|
const std::type_info *const *types, size_t args) {
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2016-01-17 21:36:36 +00:00
|
|
|
/* Create copies of all referenced C-style strings */
|
2016-01-17 21:36:44 +00:00
|
|
|
rec->name = strdup(rec->name ? rec->name : "");
|
|
|
|
if (rec->doc) rec->doc = strdup(rec->doc);
|
|
|
|
for (auto &a: rec->args) {
|
2016-01-17 21:36:36 +00:00
|
|
|
if (a.name)
|
|
|
|
a.name = strdup(a.name);
|
|
|
|
if (a.descr)
|
|
|
|
a.descr = strdup(a.descr);
|
|
|
|
else if (a.value)
|
2016-09-08 15:02:04 +00:00
|
|
|
a.descr = strdup(a.value.attr("__repr__")().cast<std::string>().c_str());
|
2016-01-17 21:36:36 +00:00
|
|
|
}
|
2016-07-10 08:13:18 +00:00
|
|
|
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
rec->is_constructor = !strcmp(rec->name, "__init__") || !strcmp(rec->name, "__setstate__");
|
|
|
|
|
2017-08-24 00:46:07 +00:00
|
|
|
#if !defined(NDEBUG) && !defined(PYBIND11_DISABLE_NEW_STYLE_INIT_WARNING)
|
|
|
|
if (rec->is_constructor && !rec->is_new_style_constructor) {
|
|
|
|
const auto class_name = std::string(((PyTypeObject *) rec->scope.ptr())->tp_name);
|
|
|
|
const auto func_name = std::string(rec->name);
|
|
|
|
PyErr_WarnEx(
|
|
|
|
PyExc_FutureWarning,
|
|
|
|
("pybind11-bound class '" + class_name + "' is using an old-style "
|
|
|
|
"placement-new '" + func_name + "' which has been deprecated. See "
|
|
|
|
"the upgrade guide in pybind11's docs. This message is only visible "
|
|
|
|
"when compiled in debug mode.").c_str(), 0
|
|
|
|
);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-01-17 21:36:36 +00:00
|
|
|
/* Generate a proper function signature */
|
|
|
|
std::string signature;
|
2017-08-31 12:38:23 +00:00
|
|
|
size_t type_index = 0, arg_index = 0;
|
|
|
|
for (auto *pc = text; *pc != '\0'; ++pc) {
|
|
|
|
const auto c = *pc;
|
2016-01-17 21:36:36 +00:00
|
|
|
|
|
|
|
if (c == '{') {
|
2017-08-31 12:38:23 +00:00
|
|
|
// Write arg name for everything except *args and **kwargs.
|
|
|
|
if (*(pc + 1) == '*')
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (arg_index < rec->args.size() && rec->args[arg_index].name) {
|
|
|
|
signature += rec->args[arg_index].name;
|
|
|
|
} else if (arg_index == 0 && rec->is_method) {
|
|
|
|
signature += "self";
|
|
|
|
} else {
|
|
|
|
signature += "arg" + std::to_string(arg_index - (rec->is_method ? 1 : 0));
|
2016-01-17 21:36:36 +00:00
|
|
|
}
|
2017-08-31 12:38:23 +00:00
|
|
|
signature += ": ";
|
2016-01-17 21:36:36 +00:00
|
|
|
} else if (c == '}') {
|
2017-08-31 12:38:23 +00:00
|
|
|
// Write default value if available.
|
|
|
|
if (arg_index < rec->args.size() && rec->args[arg_index].descr) {
|
2017-11-27 04:00:35 +00:00
|
|
|
signature += " = ";
|
2017-08-31 12:38:23 +00:00
|
|
|
signature += rec->args[arg_index].descr;
|
2016-01-17 21:36:36 +00:00
|
|
|
}
|
2017-08-31 12:38:23 +00:00
|
|
|
arg_index++;
|
2016-01-17 21:36:36 +00:00
|
|
|
} else if (c == '%') {
|
|
|
|
const std::type_info *t = types[type_index++];
|
2016-01-17 21:36:40 +00:00
|
|
|
if (!t)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("Internal error while parsing type signature (1)");
|
2016-10-23 14:43:03 +00:00
|
|
|
if (auto tinfo = detail::get_type_info(*t)) {
|
2017-11-07 16:33:05 +00:00
|
|
|
handle th((PyObject *) tinfo->type);
|
|
|
|
signature +=
|
|
|
|
th.attr("__module__").cast<std::string>() + "." +
|
|
|
|
th.attr("__qualname__").cast<std::string>(); // Python 3.3+, but we backport it to earlier versions
|
2017-08-17 00:01:32 +00:00
|
|
|
} else if (rec->is_new_style_constructor && arg_index == 0) {
|
|
|
|
// A new-style `__init__` takes `self` as `value_and_holder`.
|
|
|
|
// Rewrite it to the proper class type.
|
2017-11-07 16:33:05 +00:00
|
|
|
signature +=
|
|
|
|
rec->scope.attr("__module__").cast<std::string>() + "." +
|
|
|
|
rec->scope.attr("__qualname__").cast<std::string>();
|
2016-01-17 21:36:36 +00:00
|
|
|
} else {
|
|
|
|
std::string tname(t->name());
|
|
|
|
detail::clean_type_id(tname);
|
|
|
|
signature += tname;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
signature += c;
|
|
|
|
}
|
|
|
|
}
|
2017-08-31 12:38:23 +00:00
|
|
|
if (arg_index != args || types[type_index] != nullptr)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("Internal error while parsing type signature (2)");
|
2016-01-17 21:36:36 +00:00
|
|
|
|
2015-09-04 21:42:12 +00:00
|
|
|
#if PY_MAJOR_VERSION < 3
|
2016-01-17 21:36:44 +00:00
|
|
|
if (strcmp(rec->name, "__next__") == 0) {
|
|
|
|
std::free(rec->name);
|
|
|
|
rec->name = strdup("next");
|
2016-05-16 16:52:46 +00:00
|
|
|
} else if (strcmp(rec->name, "__bool__") == 0) {
|
|
|
|
std::free(rec->name);
|
|
|
|
rec->name = strdup("__nonzero__");
|
2016-01-17 21:36:36 +00:00
|
|
|
}
|
2015-09-04 21:42:12 +00:00
|
|
|
#endif
|
2016-01-17 21:36:44 +00:00
|
|
|
rec->signature = strdup(signature.c_str());
|
|
|
|
rec->args.shrink_to_fit();
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
rec->nargs = (std::uint16_t) args;
|
2015-09-04 21:42:12 +00:00
|
|
|
|
2017-04-17 00:30:52 +00:00
|
|
|
if (rec->sibling && PYBIND11_INSTANCE_METHOD_CHECK(rec->sibling.ptr()))
|
|
|
|
rec->sibling = PYBIND11_INSTANCE_METHOD_GET_FUNCTION(rec->sibling.ptr());
|
2015-07-29 15:43:52 +00:00
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
detail::function_record *chain = nullptr, *chain_start = rec;
|
2016-10-25 01:58:22 +00:00
|
|
|
if (rec->sibling) {
|
|
|
|
if (PyCFunction_Check(rec->sibling.ptr())) {
|
2016-12-16 14:00:46 +00:00
|
|
|
auto rec_capsule = reinterpret_borrow<capsule>(PyCFunction_GET_SELF(rec->sibling.ptr()));
|
2016-10-25 01:58:22 +00:00
|
|
|
chain = (detail::function_record *) rec_capsule;
|
|
|
|
/* Never append a method to an overload chain of a parent class;
|
|
|
|
instead, hide the parent's overloads in this case */
|
2017-02-08 00:01:56 +00:00
|
|
|
if (!chain->scope.is(rec->scope))
|
2016-10-25 01:58:22 +00:00
|
|
|
chain = nullptr;
|
|
|
|
}
|
|
|
|
// Don't trigger for things like the default __init__, which are wrapper_descriptors that we are intentionally replacing
|
|
|
|
else if (!rec->sibling.is_none() && rec->name[0] != '_')
|
|
|
|
pybind11_fail("Cannot overload existing non-function object \"" + std::string(rec->name) +
|
|
|
|
"\" with a function of the same name");
|
2015-10-01 14:46:03 +00:00
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
if (!chain) {
|
2016-01-17 21:36:41 +00:00
|
|
|
/* No existing overload was found, create a new function object */
|
2016-01-17 21:36:44 +00:00
|
|
|
rec->def = new PyMethodDef();
|
2017-02-23 02:36:09 +00:00
|
|
|
std::memset(rec->def, 0, sizeof(PyMethodDef));
|
2016-01-17 21:36:44 +00:00
|
|
|
rec->def->ml_name = rec->name;
|
2018-06-24 13:38:09 +00:00
|
|
|
rec->def->ml_meth = reinterpret_cast<PyCFunction>(reinterpret_cast<void (*) (void)>(*dispatcher));
|
2016-01-17 21:36:44 +00:00
|
|
|
rec->def->ml_flags = METH_VARARGS | METH_KEYWORDS;
|
2016-02-04 22:02:07 +00:00
|
|
|
|
2017-03-22 21:04:00 +00:00
|
|
|
capsule rec_capsule(rec, [](void *ptr) {
|
|
|
|
destruct((detail::function_record *) ptr);
|
2016-01-17 21:36:41 +00:00
|
|
|
});
|
2016-02-04 22:02:07 +00:00
|
|
|
|
|
|
|
object scope_module;
|
|
|
|
if (rec->scope) {
|
2016-09-20 23:06:32 +00:00
|
|
|
if (hasattr(rec->scope, "__module__")) {
|
|
|
|
scope_module = rec->scope.attr("__module__");
|
|
|
|
} else if (hasattr(rec->scope, "__name__")) {
|
|
|
|
scope_module = rec->scope.attr("__name__");
|
|
|
|
}
|
2016-02-04 22:02:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
m_ptr = PyCFunction_NewEx(rec->def, rec_capsule.ptr(), scope_module.ptr());
|
2015-07-05 18:05:44 +00:00
|
|
|
if (!m_ptr)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("cpp_function::cpp_function(): Could not allocate function object");
|
2015-07-05 18:05:44 +00:00
|
|
|
} else {
|
2016-01-17 21:36:41 +00:00
|
|
|
/* Append at the end of the overload chain */
|
2016-01-17 21:36:44 +00:00
|
|
|
m_ptr = rec->sibling.ptr();
|
2015-07-05 18:05:44 +00:00
|
|
|
inc_ref();
|
2016-01-17 21:36:44 +00:00
|
|
|
chain_start = chain;
|
2017-04-17 02:31:13 +00:00
|
|
|
if (chain->is_method != rec->is_method)
|
|
|
|
pybind11_fail("overloading a method with both static and instance methods is not supported; "
|
|
|
|
#if defined(NDEBUG)
|
|
|
|
"compile in debug mode for more details"
|
|
|
|
#else
|
|
|
|
"error while attempting to bind " + std::string(rec->is_method ? "instance" : "static") + " method " +
|
|
|
|
std::string(pybind11::str(rec->scope.attr("__name__"))) + "." + std::string(rec->name) + signature
|
|
|
|
#endif
|
|
|
|
);
|
2016-01-17 21:36:44 +00:00
|
|
|
while (chain->next)
|
|
|
|
chain = chain->next;
|
|
|
|
chain->next = rec;
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
2015-07-30 13:29:00 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
std::string signatures;
|
2015-07-29 15:43:52 +00:00
|
|
|
int index = 0;
|
2016-01-17 21:36:44 +00:00
|
|
|
/* Create a nice pydoc rec including all signatures and
|
2016-01-17 21:36:41 +00:00
|
|
|
docstrings of the functions in the overload chain */
|
2016-11-15 11:38:05 +00:00
|
|
|
if (chain && options::show_function_signatures()) {
|
2016-03-08 21:42:12 +00:00
|
|
|
// First a generic signature
|
|
|
|
signatures += rec->name;
|
|
|
|
signatures += "(*args, **kwargs)\n";
|
|
|
|
signatures += "Overloaded function.\n\n";
|
|
|
|
}
|
|
|
|
// Then specific overload signatures
|
2017-03-08 17:32:42 +00:00
|
|
|
bool first_user_def = true;
|
2016-01-17 21:36:44 +00:00
|
|
|
for (auto it = chain_start; it != nullptr; it = it->next) {
|
2016-11-15 11:38:05 +00:00
|
|
|
if (options::show_function_signatures()) {
|
2017-03-08 17:32:42 +00:00
|
|
|
if (index > 0) signatures += "\n";
|
2016-11-15 11:38:05 +00:00
|
|
|
if (chain)
|
|
|
|
signatures += std::to_string(++index) + ". ";
|
|
|
|
signatures += rec->name;
|
|
|
|
signatures += it->signature;
|
2016-01-17 21:36:36 +00:00
|
|
|
signatures += "\n";
|
2016-11-15 11:38:05 +00:00
|
|
|
}
|
|
|
|
if (it->doc && strlen(it->doc) > 0 && options::show_user_defined_docstrings()) {
|
2017-03-08 17:32:42 +00:00
|
|
|
// If we're appending another docstring, and aren't printing function signatures, we
|
|
|
|
// need to append a newline first:
|
|
|
|
if (!options::show_function_signatures()) {
|
|
|
|
if (first_user_def) first_user_def = false;
|
|
|
|
else signatures += "\n";
|
|
|
|
}
|
2016-11-15 11:38:05 +00:00
|
|
|
if (options::show_function_signatures()) signatures += "\n";
|
2016-02-28 22:52:37 +00:00
|
|
|
signatures += it->doc;
|
2016-11-15 11:38:05 +00:00
|
|
|
if (options::show_function_signatures()) signatures += "\n";
|
2016-01-17 21:36:36 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
/* Install docstring */
|
2015-07-05 18:05:44 +00:00
|
|
|
PyCFunctionObject *func = (PyCFunctionObject *) m_ptr;
|
|
|
|
if (func->m_ml->ml_doc)
|
2017-02-08 22:43:08 +00:00
|
|
|
std::free(const_cast<char *>(func->m_ml->ml_doc));
|
2015-07-05 18:05:44 +00:00
|
|
|
func->m_ml->ml_doc = strdup(signatures.c_str());
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2016-11-20 04:27:05 +00:00
|
|
|
if (rec->is_method) {
|
|
|
|
m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
|
2015-07-05 18:05:44 +00:00
|
|
|
if (!m_ptr)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("cpp_function::cpp_function(): Could not allocate instance method object");
|
2015-07-05 18:05:44 +00:00
|
|
|
Py_DECREF(func);
|
|
|
|
}
|
|
|
|
}
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
/// When a cpp_function is GCed, release any memory allocated by pybind11
|
|
|
|
static void destruct(detail::function_record *rec) {
|
|
|
|
while (rec) {
|
|
|
|
detail::function_record *next = rec->next;
|
|
|
|
if (rec->free_data)
|
2016-05-10 14:05:03 +00:00
|
|
|
rec->free_data(rec);
|
2016-01-17 21:36:44 +00:00
|
|
|
std::free((char *) rec->name);
|
|
|
|
std::free((char *) rec->doc);
|
|
|
|
std::free((char *) rec->signature);
|
|
|
|
for (auto &arg: rec->args) {
|
2017-02-08 22:43:08 +00:00
|
|
|
std::free(const_cast<char *>(arg.name));
|
|
|
|
std::free(const_cast<char *>(arg.descr));
|
2016-01-17 21:36:44 +00:00
|
|
|
arg.value.dec_ref();
|
|
|
|
}
|
|
|
|
if (rec->def) {
|
2017-02-08 22:43:08 +00:00
|
|
|
std::free(const_cast<char *>(rec->def->ml_doc));
|
2016-01-17 21:36:44 +00:00
|
|
|
delete rec->def;
|
|
|
|
}
|
|
|
|
delete rec;
|
|
|
|
rec = next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Main dispatch logic for calls to functions bound using pybind11
|
2017-01-22 04:42:14 +00:00
|
|
|
static PyObject *dispatcher(PyObject *self, PyObject *args_in, PyObject *kwargs_in) {
|
2017-01-30 18:34:38 +00:00
|
|
|
using namespace detail;
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
/* Iterator over the list of potentially admissible overloads */
|
2018-09-25 21:55:18 +00:00
|
|
|
const function_record *overloads = (function_record *) PyCapsule_GetPointer(self, nullptr),
|
|
|
|
*it = overloads;
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
/* Need to know how many arguments + keyword arguments there are to pick the right overload */
|
2017-01-22 04:42:14 +00:00
|
|
|
const size_t n_args_in = (size_t) PyTuple_GET_SIZE(args_in);
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2017-01-22 04:42:14 +00:00
|
|
|
handle parent = n_args_in > 0 ? PyTuple_GET_ITEM(args_in, 0) : nullptr,
|
2016-01-17 21:36:44 +00:00
|
|
|
result = PYBIND11_TRY_NEXT_OVERLOAD;
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
|
2017-08-17 00:01:32 +00:00
|
|
|
auto self_value_and_holder = value_and_holder();
|
|
|
|
if (overloads->is_constructor) {
|
|
|
|
const auto tinfo = get_type_info((PyTypeObject *) overloads->scope.ptr());
|
|
|
|
const auto pi = reinterpret_cast<instance *>(parent.ptr());
|
|
|
|
self_value_and_holder = pi->get_value_and_holder(tinfo, false);
|
|
|
|
|
|
|
|
if (!self_value_and_holder.type || !self_value_and_holder.inst) {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "__init__(self, ...) called with invalid `self` argument");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If this value is already registered it must mean __init__ is invoked multiple times;
|
|
|
|
// we really can't support that in C++, so just ignore the second __init__.
|
|
|
|
if (self_value_and_holder.instance_registered())
|
|
|
|
return none().release().ptr();
|
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
try {
|
2017-02-03 23:25:34 +00:00
|
|
|
// We do this in two passes: in the first pass, we load arguments with `convert=false`;
|
|
|
|
// in the second, we allow conversion (except for arguments with an explicit
|
|
|
|
// py::arg().noconvert()). This lets us prefer calls without conversion, with
|
|
|
|
// conversion as a fallback.
|
|
|
|
std::vector<function_call> second_pass;
|
|
|
|
|
|
|
|
// However, if there are no overloads, we can just skip the no-convert pass entirely
|
|
|
|
const bool overloaded = it != nullptr && it->next != nullptr;
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
for (; it != nullptr; it = it->next) {
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
/* For each overload:
|
2017-01-22 04:42:14 +00:00
|
|
|
1. Copy all positional arguments we were given, also checking to make sure that
|
|
|
|
named positional arguments weren't *also* specified via kwarg.
|
2017-01-31 16:23:53 +00:00
|
|
|
2. If we weren't given enough, try to make up the omitted ones by checking
|
2017-01-22 04:42:14 +00:00
|
|
|
whether they were provided by a kwarg matching the `py::arg("name")` name. If
|
|
|
|
so, use it (and remove it from kwargs; if not, see if the function binding
|
|
|
|
provided a default that we can use.
|
|
|
|
3. Ensure that either all keyword arguments were "consumed", or that the function
|
|
|
|
takes a kwargs argument to accept unconsumed kwargs.
|
|
|
|
4. Any positional arguments still left get put into a tuple (for args), and any
|
|
|
|
leftover kwargs get put into a dict.
|
|
|
|
5. Pack everything into a vector; if we have py::args or py::kwargs, they are an
|
|
|
|
extra tuple or dict at the end of the positional arguments.
|
|
|
|
6. Call the function call dispatcher (function_record::impl)
|
|
|
|
|
|
|
|
If one of these fail, move on to the next overload and keep trying until we get a
|
|
|
|
result other than PYBIND11_TRY_NEXT_OVERLOAD.
|
2016-01-17 21:36:44 +00:00
|
|
|
*/
|
|
|
|
|
2018-09-25 21:55:18 +00:00
|
|
|
const function_record &func = *it;
|
2017-12-23 22:56:07 +00:00
|
|
|
size_t num_args = func.nargs; // Number of positional arguments that we need
|
|
|
|
if (func.has_args) --num_args; // (but don't count py::args
|
|
|
|
if (func.has_kwargs) --num_args; // or py::kwargs)
|
|
|
|
size_t pos_args = num_args - func.nargs_kwonly;
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2017-01-30 18:34:38 +00:00
|
|
|
if (!func.has_args && n_args_in > pos_args)
|
2017-12-23 22:56:07 +00:00
|
|
|
continue; // Too many positional arguments for this overload
|
2017-01-22 04:42:14 +00:00
|
|
|
|
2017-01-30 18:34:38 +00:00
|
|
|
if (n_args_in < pos_args && func.args.size() < pos_args)
|
2017-12-23 22:56:07 +00:00
|
|
|
continue; // Not enough positional arguments given, and not enough defaults to fill in the blanks
|
2017-01-22 04:42:14 +00:00
|
|
|
|
2017-01-30 18:34:38 +00:00
|
|
|
function_call call(func, parent);
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2019-07-18 07:01:50 +00:00
|
|
|
size_t args_to_copy = (std::min)(pos_args, n_args_in); // Protect std::min with parentheses
|
2017-01-22 04:42:14 +00:00
|
|
|
size_t args_copied = 0;
|
|
|
|
|
2017-08-17 00:01:32 +00:00
|
|
|
// 0. Inject new-style `self` argument
|
|
|
|
if (func.is_new_style_constructor) {
|
|
|
|
// The `value` may have been preallocated by an old-style `__init__`
|
|
|
|
// if it was a preceding candidate for overload resolution.
|
|
|
|
if (self_value_and_holder)
|
|
|
|
self_value_and_holder.type->dealloc(self_value_and_holder);
|
|
|
|
|
2017-09-04 11:49:19 +00:00
|
|
|
call.init_self = PyTuple_GET_ITEM(args_in, 0);
|
2017-08-17 00:01:32 +00:00
|
|
|
call.args.push_back(reinterpret_cast<PyObject *>(&self_value_and_holder));
|
|
|
|
call.args_convert.push_back(false);
|
|
|
|
++args_copied;
|
|
|
|
}
|
|
|
|
|
2017-01-22 04:42:14 +00:00
|
|
|
// 1. Copy any position arguments given.
|
2017-05-17 15:55:43 +00:00
|
|
|
bool bad_arg = false;
|
2017-01-22 04:42:14 +00:00
|
|
|
for (; args_copied < args_to_copy; ++args_copied) {
|
2018-09-25 21:55:18 +00:00
|
|
|
const argument_record *arg_rec = args_copied < func.args.size() ? &func.args[args_copied] : nullptr;
|
2017-05-17 15:55:43 +00:00
|
|
|
if (kwargs_in && arg_rec && arg_rec->name && PyDict_GetItemString(kwargs_in, arg_rec->name)) {
|
|
|
|
bad_arg = true;
|
2017-02-24 00:54:53 +00:00
|
|
|
break;
|
2017-01-22 04:42:14 +00:00
|
|
|
}
|
|
|
|
|
2017-05-17 15:55:43 +00:00
|
|
|
handle arg(PyTuple_GET_ITEM(args_in, args_copied));
|
|
|
|
if (arg_rec && !arg_rec->none && arg.is_none()) {
|
|
|
|
bad_arg = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
call.args.push_back(arg);
|
|
|
|
call.args_convert.push_back(arg_rec ? arg_rec->convert : true);
|
2017-01-22 04:42:14 +00:00
|
|
|
}
|
2017-05-17 15:55:43 +00:00
|
|
|
if (bad_arg)
|
2017-02-24 00:54:53 +00:00
|
|
|
continue; // Maybe it was meant for another overload (issue #688)
|
2017-01-22 04:42:14 +00:00
|
|
|
|
|
|
|
// We'll need to copy this if we steal some kwargs for defaults
|
|
|
|
dict kwargs = reinterpret_borrow<dict>(kwargs_in);
|
|
|
|
|
|
|
|
// 2. Check kwargs and, failing that, defaults that may help complete the list
|
2017-12-23 22:56:07 +00:00
|
|
|
if (args_copied < num_args) {
|
2017-01-22 04:42:14 +00:00
|
|
|
bool copied_kwargs = false;
|
|
|
|
|
2017-12-23 22:56:07 +00:00
|
|
|
for (; args_copied < num_args; ++args_copied) {
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
const auto &arg = func.args[args_copied];
|
2017-01-22 04:42:14 +00:00
|
|
|
|
|
|
|
handle value;
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (kwargs_in && arg.name)
|
2017-01-22 04:42:14 +00:00
|
|
|
value = PyDict_GetItemString(kwargs.ptr(), arg.name);
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
if (value) {
|
2017-01-22 04:42:14 +00:00
|
|
|
// Consume a kwargs value
|
|
|
|
if (!copied_kwargs) {
|
|
|
|
kwargs = reinterpret_steal<dict>(PyDict_Copy(kwargs.ptr()));
|
|
|
|
copied_kwargs = true;
|
|
|
|
}
|
|
|
|
PyDict_DelItemString(kwargs.ptr(), arg.name);
|
2017-01-31 16:23:53 +00:00
|
|
|
} else if (arg.value) {
|
2017-01-22 04:42:14 +00:00
|
|
|
value = arg.value;
|
|
|
|
}
|
|
|
|
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (value) {
|
2017-01-30 18:34:38 +00:00
|
|
|
call.args.push_back(value);
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
call.args_convert.push_back(arg.convert);
|
|
|
|
}
|
2017-01-22 04:42:14 +00:00
|
|
|
else
|
2016-01-17 21:36:44 +00:00
|
|
|
break;
|
2017-01-22 04:42:14 +00:00
|
|
|
}
|
|
|
|
|
2017-12-23 22:56:07 +00:00
|
|
|
if (args_copied < num_args)
|
2017-01-22 04:42:14 +00:00
|
|
|
continue; // Not enough arguments, defaults, or kwargs to fill the positional arguments
|
|
|
|
}
|
|
|
|
|
|
|
|
// 3. Check everything was consumed (unless we have a kwargs arg)
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (kwargs && kwargs.size() > 0 && !func.has_kwargs)
|
2017-01-22 04:42:14 +00:00
|
|
|
continue; // Unconsumed kwargs, but no py::kwargs argument to accept them
|
|
|
|
|
|
|
|
// 4a. If we have a py::args argument, create a new tuple with leftovers
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (func.has_args) {
|
2017-12-23 13:42:32 +00:00
|
|
|
tuple extra_args;
|
2017-01-22 04:42:14 +00:00
|
|
|
if (args_to_copy == 0) {
|
|
|
|
// We didn't copy out any position arguments from the args_in tuple, so we
|
|
|
|
// can reuse it directly without copying:
|
|
|
|
extra_args = reinterpret_borrow<tuple>(args_in);
|
2017-01-31 16:23:53 +00:00
|
|
|
} else if (args_copied >= n_args_in) {
|
2017-01-22 04:42:14 +00:00
|
|
|
extra_args = tuple(0);
|
2017-01-31 16:23:53 +00:00
|
|
|
} else {
|
2017-01-22 04:42:14 +00:00
|
|
|
size_t args_size = n_args_in - args_copied;
|
|
|
|
extra_args = tuple(args_size);
|
|
|
|
for (size_t i = 0; i < args_size; ++i) {
|
2017-12-15 17:21:52 +00:00
|
|
|
extra_args[i] = PyTuple_GET_ITEM(args_in, args_copied + i);
|
2016-01-17 21:36:44 +00:00
|
|
|
}
|
|
|
|
}
|
2017-01-30 18:34:38 +00:00
|
|
|
call.args.push_back(extra_args);
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
call.args_convert.push_back(false);
|
2017-12-23 13:42:32 +00:00
|
|
|
call.args_ref = std::move(extra_args);
|
2016-01-17 21:36:44 +00:00
|
|
|
}
|
2016-05-01 12:42:20 +00:00
|
|
|
|
2017-01-22 04:42:14 +00:00
|
|
|
// 4b. If we have a py::kwargs, pass on any remaining kwargs
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (func.has_kwargs) {
|
2017-01-22 04:42:14 +00:00
|
|
|
if (!kwargs.ptr())
|
|
|
|
kwargs = dict(); // If we didn't get one, send an empty one
|
2017-01-30 18:34:38 +00:00
|
|
|
call.args.push_back(kwargs);
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
call.args_convert.push_back(false);
|
2017-12-23 13:42:32 +00:00
|
|
|
call.kwargs_ref = std::move(kwargs);
|
2017-01-22 04:42:14 +00:00
|
|
|
}
|
|
|
|
|
2017-01-30 18:34:38 +00:00
|
|
|
// 5. Put everything in a vector. Not technically step 5, we've been building it
|
|
|
|
// in `call.args` all along.
|
|
|
|
#if !defined(NDEBUG)
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
if (call.args.size() != func.nargs || call.args_convert.size() != func.nargs)
|
2017-01-30 18:34:38 +00:00
|
|
|
pybind11_fail("Internal error: function call dispatcher inserted wrong number of arguments!");
|
|
|
|
#endif
|
2017-01-22 04:42:14 +00:00
|
|
|
|
2017-02-03 23:25:34 +00:00
|
|
|
std::vector<bool> second_pass_convert;
|
|
|
|
if (overloaded) {
|
|
|
|
// We're in the first no-convert pass, so swap out the conversion flags for a
|
|
|
|
// set of all-false flags. If the call fails, we'll swap the flags back in for
|
|
|
|
// the conversion-allowed call below.
|
|
|
|
second_pass_convert.resize(func.nargs, false);
|
|
|
|
call.args_convert.swap(second_pass_convert);
|
|
|
|
}
|
|
|
|
|
2017-01-22 04:42:14 +00:00
|
|
|
// 6. Call the function.
|
2016-05-01 12:42:20 +00:00
|
|
|
try {
|
2017-06-26 18:34:06 +00:00
|
|
|
loader_life_support guard{};
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
result = func.impl(call);
|
2016-07-01 14:07:35 +00:00
|
|
|
} catch (reference_cast_error &) {
|
2016-05-01 12:42:20 +00:00
|
|
|
result = PYBIND11_TRY_NEXT_OVERLOAD;
|
|
|
|
}
|
2016-01-17 21:36:44 +00:00
|
|
|
|
|
|
|
if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD)
|
|
|
|
break;
|
Add support for non-converting arguments
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.
2017-01-23 08:50:00 +00:00
|
|
|
|
2017-02-03 23:25:34 +00:00
|
|
|
if (overloaded) {
|
|
|
|
// The (overloaded) call failed; if the call has at least one argument that
|
|
|
|
// permits conversion (i.e. it hasn't been explicitly specified `.noconvert()`)
|
|
|
|
// then add this call to the list of second pass overloads to try.
|
|
|
|
for (size_t i = func.is_method ? 1 : 0; i < pos_args; i++) {
|
|
|
|
if (second_pass_convert[i]) {
|
|
|
|
// Found one: swap the converting flags back in and store the call for
|
|
|
|
// the second pass.
|
|
|
|
call.args_convert.swap(second_pass_convert);
|
|
|
|
second_pass.push_back(std::move(call));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (overloaded && !second_pass.empty() && result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
|
|
|
|
// The no-conversion pass finished without success, try again with conversion allowed
|
|
|
|
for (auto &call : second_pass) {
|
|
|
|
try {
|
2017-06-26 18:34:06 +00:00
|
|
|
loader_life_support guard{};
|
2017-02-03 23:25:34 +00:00
|
|
|
result = call.func.impl(call);
|
|
|
|
} catch (reference_cast_error &) {
|
|
|
|
result = PYBIND11_TRY_NEXT_OVERLOAD;
|
|
|
|
}
|
|
|
|
|
2018-09-25 21:55:18 +00:00
|
|
|
if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD) {
|
|
|
|
// The error reporting logic below expects 'it' to be valid, as it would be
|
|
|
|
// if we'd encountered this failure in the first-pass loop.
|
|
|
|
if (!result)
|
|
|
|
it = &call.func;
|
2017-02-03 23:25:34 +00:00
|
|
|
break;
|
2018-09-25 21:55:18 +00:00
|
|
|
}
|
2017-02-03 23:25:34 +00:00
|
|
|
}
|
2016-01-17 21:36:44 +00:00
|
|
|
}
|
2016-09-10 09:58:02 +00:00
|
|
|
} catch (error_already_set &e) {
|
|
|
|
e.restore();
|
2016-06-17 21:35:59 +00:00
|
|
|
return nullptr;
|
2019-06-10 20:00:55 +00:00
|
|
|
#if defined(__GNUG__) && !defined(__clang__)
|
|
|
|
} catch ( abi::__forced_unwind& ) {
|
|
|
|
throw;
|
|
|
|
#endif
|
2016-01-17 21:36:44 +00:00
|
|
|
} catch (...) {
|
2016-06-17 21:35:59 +00:00
|
|
|
/* When an exception is caught, give each registered exception
|
|
|
|
translator a chance to translate it to a Python exception
|
|
|
|
in reverse order of registration.
|
2016-07-18 08:47:10 +00:00
|
|
|
|
2016-06-17 21:35:59 +00:00
|
|
|
A translator may choose to do one of the following:
|
2016-07-18 08:47:10 +00:00
|
|
|
|
2016-06-17 21:35:59 +00:00
|
|
|
- catch the exception and call PyErr_SetString or PyErr_SetObject
|
|
|
|
to set a standard (or custom) Python exception, or
|
|
|
|
- do nothing and let the exception fall through to the next translator, or
|
|
|
|
- delegate translation to the next translator by throwing a new type of exception. */
|
|
|
|
|
2016-07-18 08:47:10 +00:00
|
|
|
auto last_exception = std::current_exception();
|
2017-01-30 18:34:38 +00:00
|
|
|
auto ®istered_exception_translators = get_internals().registered_exception_translators;
|
2016-06-17 21:35:59 +00:00
|
|
|
for (auto& translator : registered_exception_translators) {
|
|
|
|
try {
|
|
|
|
translator(last_exception);
|
|
|
|
} catch (...) {
|
|
|
|
last_exception = std::current_exception();
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
PyErr_SetString(PyExc_SystemError, "Exception escaped from default exception translator!");
|
2016-01-17 21:36:44 +00:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2017-09-09 18:21:34 +00:00
|
|
|
auto append_note_if_missing_header_is_suspected = [](std::string &msg) {
|
|
|
|
if (msg.find("std::") != std::string::npos) {
|
|
|
|
msg += "\n\n"
|
|
|
|
"Did you forget to `#include <pybind11/stl.h>`? Or <pybind11/complex.h>,\n"
|
|
|
|
"<pybind11/functional.h>, <pybind11/chrono.h>, etc. Some automatic\n"
|
|
|
|
"conversions are optional and require extra headers to be included\n"
|
|
|
|
"when compiling your pybind11 module.";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
if (result.ptr() == PYBIND11_TRY_NEXT_OVERLOAD) {
|
2016-09-10 06:28:37 +00:00
|
|
|
if (overloads->is_operator)
|
|
|
|
return handle(Py_NotImplemented).inc_ref().ptr();
|
|
|
|
|
2016-09-12 02:44:37 +00:00
|
|
|
std::string msg = std::string(overloads->name) + "(): incompatible " +
|
|
|
|
std::string(overloads->is_constructor ? "constructor" : "function") +
|
|
|
|
" arguments. The following argument types are supported:\n";
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
int ctr = 0;
|
2018-09-25 21:55:18 +00:00
|
|
|
for (const function_record *it2 = overloads; it2 != nullptr; it2 = it2->next) {
|
2016-01-17 21:36:44 +00:00
|
|
|
msg += " "+ std::to_string(++ctr) + ". ";
|
2016-07-17 21:43:00 +00:00
|
|
|
|
|
|
|
bool wrote_sig = false;
|
|
|
|
if (overloads->is_constructor) {
|
2016-07-31 18:03:18 +00:00
|
|
|
// For a constructor, rewrite `(self: Object, arg0, ...) -> NoneType` as `Object(arg0, ...)`
|
2016-07-17 21:43:00 +00:00
|
|
|
std::string sig = it2->signature;
|
2016-07-31 18:03:18 +00:00
|
|
|
size_t start = sig.find('(') + 7; // skip "(self: "
|
2016-07-17 21:43:00 +00:00
|
|
|
if (start < sig.size()) {
|
|
|
|
// End at the , for the next argument
|
|
|
|
size_t end = sig.find(", "), next = end + 2;
|
|
|
|
size_t ret = sig.rfind(" -> ");
|
|
|
|
// Or the ), if there is no comma:
|
|
|
|
if (end >= sig.size()) next = end = sig.find(')');
|
|
|
|
if (start < end && next < sig.size()) {
|
|
|
|
msg.append(sig, start, end - start);
|
|
|
|
msg += '(';
|
|
|
|
msg.append(sig, next, ret - next);
|
|
|
|
wrote_sig = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!wrote_sig) msg += it2->signature;
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
msg += "\n";
|
|
|
|
}
|
2016-09-12 02:44:37 +00:00
|
|
|
msg += "\nInvoked with: ";
|
2017-01-22 04:42:14 +00:00
|
|
|
auto args_ = reinterpret_borrow<tuple>(args_in);
|
2017-02-24 02:04:46 +00:00
|
|
|
bool some_args = false;
|
2016-07-18 08:47:10 +00:00
|
|
|
for (size_t ti = overloads->is_constructor ? 1 : 0; ti < args_.size(); ++ti) {
|
2017-02-24 02:04:46 +00:00
|
|
|
if (!some_args) some_args = true;
|
|
|
|
else msg += ", ";
|
2016-11-22 10:28:40 +00:00
|
|
|
msg += pybind11::repr(args_[ti]);
|
2016-05-24 07:19:35 +00:00
|
|
|
}
|
2017-02-24 02:04:46 +00:00
|
|
|
if (kwargs_in) {
|
|
|
|
auto kwargs = reinterpret_borrow<dict>(kwargs_in);
|
|
|
|
if (kwargs.size() > 0) {
|
|
|
|
if (some_args) msg += "; ";
|
|
|
|
msg += "kwargs: ";
|
|
|
|
bool first = true;
|
|
|
|
for (auto kwarg : kwargs) {
|
|
|
|
if (first) first = false;
|
|
|
|
else msg += ", ";
|
|
|
|
msg += pybind11::str("{}={!r}").format(kwarg.first, kwarg.second);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-09 18:21:34 +00:00
|
|
|
append_note_if_missing_header_is_suspected(msg);
|
2016-01-17 21:36:44 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
|
|
|
return nullptr;
|
|
|
|
} else if (!result) {
|
|
|
|
std::string msg = "Unable to convert function return value to a "
|
|
|
|
"Python type! The signature was\n\t";
|
|
|
|
msg += it->signature;
|
2017-09-09 18:21:34 +00:00
|
|
|
append_note_if_missing_header_is_suspected(msg);
|
2016-01-17 21:36:44 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
|
|
|
return nullptr;
|
|
|
|
} else {
|
2017-08-17 00:01:32 +00:00
|
|
|
if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
auto *pi = reinterpret_cast<instance *>(parent.ptr());
|
2017-08-17 00:01:32 +00:00
|
|
|
self_value_and_holder.type->init_instance(pi, nullptr);
|
2016-01-17 21:36:44 +00:00
|
|
|
}
|
|
|
|
return result.ptr();
|
|
|
|
}
|
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
/// Wrapper for Python extension modules
|
2015-07-05 18:05:44 +00:00
|
|
|
class module : public object {
|
|
|
|
public:
|
2015-10-18 14:48:30 +00:00
|
|
|
PYBIND11_OBJECT_DEFAULT(module, object, PyModule_Check)
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2017-01-31 15:54:08 +00:00
|
|
|
/// Create a new top-level Python module with the given name and docstring
|
2016-10-16 20:27:42 +00:00
|
|
|
explicit module(const char *name, const char *doc = nullptr) {
|
2016-11-15 11:38:05 +00:00
|
|
|
if (!options::show_user_defined_docstrings()) doc = nullptr;
|
2015-09-04 21:42:12 +00:00
|
|
|
#if PY_MAJOR_VERSION >= 3
|
2019-12-11 20:26:46 +00:00
|
|
|
PyModuleDef *def = new PyModuleDef();
|
2017-02-23 02:36:09 +00:00
|
|
|
std::memset(def, 0, sizeof(PyModuleDef));
|
2015-07-05 18:05:44 +00:00
|
|
|
def->m_name = name;
|
|
|
|
def->m_doc = doc;
|
|
|
|
def->m_size = -1;
|
|
|
|
Py_INCREF(def);
|
|
|
|
m_ptr = PyModule_Create(def);
|
2015-09-04 21:42:12 +00:00
|
|
|
#else
|
|
|
|
m_ptr = Py_InitModule3(name, nullptr, doc);
|
|
|
|
#endif
|
2015-07-05 18:05:44 +00:00
|
|
|
if (m_ptr == nullptr)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("Internal error in module::module()");
|
2015-07-05 18:05:44 +00:00
|
|
|
inc_ref();
|
|
|
|
}
|
|
|
|
|
2017-01-31 15:54:08 +00:00
|
|
|
/** \rst
|
|
|
|
Create Python binding for a new function within the module scope. ``Func``
|
|
|
|
can be a plain C++ function, a function pointer, or a lambda function. For
|
|
|
|
details on the ``Extra&& ... extra`` argument, see section :ref:`extras`.
|
|
|
|
\endrst */
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename Func, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
module &def(const char *name_, Func &&f, const Extra& ... extra) {
|
2016-09-20 23:06:32 +00:00
|
|
|
cpp_function func(std::forward<Func>(f), name(name_), scope(*this),
|
|
|
|
sibling(getattr(*this, name_, none())), extra...);
|
2016-10-25 01:58:22 +00:00
|
|
|
// NB: allow overwriting here because cpp_function sets up a chain with the intention of
|
|
|
|
// overwriting (and has already checked internally that it isn't overwriting non-functions).
|
|
|
|
add_object(name_, func, true /* overwrite */);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-01-31 15:54:08 +00:00
|
|
|
/** \rst
|
|
|
|
Create and return a new Python submodule with the given name and docstring.
|
|
|
|
This also works recursively, i.e.
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
py::module m("example", "pybind11 example plugin");
|
|
|
|
py::module m2 = m.def_submodule("sub", "A submodule of 'example'");
|
|
|
|
py::module m3 = m2.def_submodule("subsub", "A submodule of 'example.sub'");
|
|
|
|
\endrst */
|
2015-07-11 15:41:48 +00:00
|
|
|
module def_submodule(const char *name, const char *doc = nullptr) {
|
2015-07-05 18:05:44 +00:00
|
|
|
std::string full_name = std::string(PyModule_GetName(m_ptr))
|
|
|
|
+ std::string(".") + std::string(name);
|
2016-10-28 01:08:15 +00:00
|
|
|
auto result = reinterpret_borrow<module>(PyImport_AddModule(full_name.c_str()));
|
2016-11-15 11:38:05 +00:00
|
|
|
if (doc && options::show_user_defined_docstrings())
|
2015-10-15 16:13:33 +00:00
|
|
|
result.attr("__doc__") = pybind11::str(doc);
|
2015-07-05 18:05:44 +00:00
|
|
|
attr(name) = result;
|
|
|
|
return result;
|
|
|
|
}
|
2015-10-13 21:44:25 +00:00
|
|
|
|
2017-01-31 15:54:08 +00:00
|
|
|
/// Import and return a module or throws `error_already_set`.
|
2015-10-13 21:44:25 +00:00
|
|
|
static module import(const char *name) {
|
2015-12-26 13:04:52 +00:00
|
|
|
PyObject *obj = PyImport_ImportModule(name);
|
|
|
|
if (!obj)
|
2016-12-01 10:35:34 +00:00
|
|
|
throw error_already_set();
|
2016-10-28 01:08:15 +00:00
|
|
|
return reinterpret_steal<module>(obj);
|
2015-10-13 21:44:25 +00:00
|
|
|
}
|
2016-10-25 01:58:22 +00:00
|
|
|
|
2017-09-12 06:05:05 +00:00
|
|
|
/// Reload the module or throws `error_already_set`.
|
|
|
|
void reload() {
|
|
|
|
PyObject *obj = PyImport_ReloadModule(ptr());
|
|
|
|
if (!obj)
|
|
|
|
throw error_already_set();
|
|
|
|
*this = reinterpret_steal<module>(obj);
|
|
|
|
}
|
|
|
|
|
2016-10-25 01:58:22 +00:00
|
|
|
// Adds an object to the module using the given name. Throws if an object with the given name
|
|
|
|
// already exists.
|
|
|
|
//
|
|
|
|
// overwrite should almost always be false: attempting to overwrite objects that pybind11 has
|
|
|
|
// established will, in most cases, break things.
|
2017-03-30 09:59:32 +00:00
|
|
|
PYBIND11_NOINLINE void add_object(const char *name, handle obj, bool overwrite = false) {
|
2016-10-25 01:58:22 +00:00
|
|
|
if (!overwrite && hasattr(*this, name))
|
|
|
|
pybind11_fail("Error during initialization: multiple incompatible definitions with name \"" +
|
|
|
|
std::string(name) + "\"");
|
|
|
|
|
2017-03-30 09:59:32 +00:00
|
|
|
PyModule_AddObject(ptr(), name, obj.inc_ref().ptr() /* steals a reference */);
|
2016-10-25 01:58:22 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
|
|
|
|
2017-03-29 22:20:42 +00:00
|
|
|
/// \ingroup python_builtins
|
2017-06-06 15:05:19 +00:00
|
|
|
/// Return a dictionary representing the global variables in the current execution frame,
|
|
|
|
/// or ``__main__.__dict__`` if there is no frame (usually when the interpreter is embedded).
|
|
|
|
inline dict globals() {
|
|
|
|
PyObject *p = PyEval_GetGlobals();
|
|
|
|
return reinterpret_borrow<dict>(p ? p : module::import("__main__").attr("__dict__").ptr());
|
|
|
|
}
|
2017-03-29 22:20:42 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
NAMESPACE_BEGIN(detail)
|
2016-01-17 21:36:44 +00:00
|
|
|
/// Generic support for creating new Python heap types
|
2016-01-17 21:36:41 +00:00
|
|
|
class generic_type : public object {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
template <typename...> friend class class_;
|
2015-07-05 18:05:44 +00:00
|
|
|
public:
|
2016-01-17 21:36:41 +00:00
|
|
|
PYBIND11_OBJECT_DEFAULT(generic_type, object, PyType_Check)
|
2016-01-17 21:36:44 +00:00
|
|
|
protected:
|
2017-02-15 20:10:25 +00:00
|
|
|
void initialize(const type_record &rec) {
|
|
|
|
if (rec.scope && hasattr(rec.scope, rec.name))
|
|
|
|
pybind11_fail("generic_type: cannot initialize type \"" + std::string(rec.name) +
|
|
|
|
"\": an object with that name is already defined");
|
2016-05-31 07:53:28 +00:00
|
|
|
|
2017-08-17 15:38:05 +00:00
|
|
|
if (rec.module_local ? get_local_type_info(*rec.type) : get_global_type_info(*rec.type))
|
2017-02-15 20:10:25 +00:00
|
|
|
pybind11_fail("generic_type: type \"" + std::string(rec.name) +
|
2016-05-31 07:53:28 +00:00
|
|
|
"\" is already registered!");
|
|
|
|
|
2017-02-15 20:10:25 +00:00
|
|
|
m_ptr = make_new_python_type(rec);
|
2016-01-17 21:36:41 +00:00
|
|
|
|
|
|
|
/* Register supplemental type information in C++ dict */
|
2017-02-15 20:10:25 +00:00
|
|
|
auto *tinfo = new detail::type_info();
|
|
|
|
tinfo->type = (PyTypeObject *) m_ptr;
|
2017-04-21 23:01:30 +00:00
|
|
|
tinfo->cpptype = rec.type;
|
2017-02-15 20:10:25 +00:00
|
|
|
tinfo->type_size = rec.type_size;
|
2018-11-09 19:14:53 +00:00
|
|
|
tinfo->type_align = rec.type_align;
|
2017-03-21 00:15:20 +00:00
|
|
|
tinfo->operator_new = rec.operator_new;
|
2017-02-23 02:36:09 +00:00
|
|
|
tinfo->holder_size_in_ptrs = size_in_ptrs(rec.holder_size);
|
2017-07-25 04:53:23 +00:00
|
|
|
tinfo->init_instance = rec.init_instance;
|
2017-02-15 20:10:25 +00:00
|
|
|
tinfo->dealloc = rec.dealloc;
|
2017-04-21 23:01:30 +00:00
|
|
|
tinfo->simple_type = true;
|
|
|
|
tinfo->simple_ancestors = true;
|
2017-07-29 02:03:44 +00:00
|
|
|
tinfo->default_holder = rec.default_holder;
|
|
|
|
tinfo->module_local = rec.module_local;
|
2017-02-15 20:10:25 +00:00
|
|
|
|
|
|
|
auto &internals = get_internals();
|
|
|
|
auto tindex = std::type_index(*rec.type);
|
2016-10-23 14:27:13 +00:00
|
|
|
tinfo->direct_conversions = &internals.direct_conversions[tindex];
|
2017-07-29 02:03:44 +00:00
|
|
|
if (rec.module_local)
|
|
|
|
registered_local_types_cpp()[tindex] = tinfo;
|
|
|
|
else
|
|
|
|
internals.registered_types_cpp[tindex] = tinfo;
|
2017-02-23 02:36:09 +00:00
|
|
|
internals.registered_types_py[(PyTypeObject *) m_ptr] = { tinfo };
|
2016-12-16 14:00:46 +00:00
|
|
|
|
2017-04-21 23:01:30 +00:00
|
|
|
if (rec.bases.size() > 1 || rec.multiple_inheritance) {
|
2017-02-15 20:10:25 +00:00
|
|
|
mark_parents_nonsimple(tinfo->type);
|
2017-04-21 23:01:30 +00:00
|
|
|
tinfo->simple_ancestors = false;
|
|
|
|
}
|
|
|
|
else if (rec.bases.size() == 1) {
|
|
|
|
auto parent_tinfo = get_type_info((PyTypeObject *) rec.bases[0].ptr());
|
|
|
|
tinfo->simple_ancestors = parent_tinfo->simple_ancestors;
|
|
|
|
}
|
2017-08-17 15:38:05 +00:00
|
|
|
|
|
|
|
if (rec.module_local) {
|
|
|
|
// Stash the local typeinfo and loader so that external modules can access it.
|
|
|
|
tinfo->module_local_load = &type_caster_generic::local_load;
|
2017-08-20 15:14:09 +00:00
|
|
|
setattr(m_ptr, PYBIND11_MODULE_LOCAL_ID, capsule(tinfo));
|
2017-08-17 15:38:05 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-09-11 11:00:40 +00:00
|
|
|
/// Helper function which tags all parents of a type using mult. inheritance
|
|
|
|
void mark_parents_nonsimple(PyTypeObject *value) {
|
2016-10-28 01:08:15 +00:00
|
|
|
auto t = reinterpret_borrow<tuple>(value->tp_bases);
|
2016-09-11 11:00:40 +00:00
|
|
|
for (handle h : t) {
|
|
|
|
auto tinfo2 = get_type_info((PyTypeObject *) h.ptr());
|
|
|
|
if (tinfo2)
|
|
|
|
tinfo2->simple_type = false;
|
|
|
|
mark_parents_nonsimple((PyTypeObject *) h.ptr());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-28 14:12:20 +00:00
|
|
|
void install_buffer_funcs(
|
|
|
|
buffer_info *(*get_buffer)(PyObject *, void *),
|
|
|
|
void *get_buffer_data) {
|
2015-07-05 18:05:44 +00:00
|
|
|
PyHeapTypeObject *type = (PyHeapTypeObject*) m_ptr;
|
2016-01-17 21:36:41 +00:00
|
|
|
auto tinfo = detail::get_type_info(&type->ht_type);
|
2016-12-16 14:00:46 +00:00
|
|
|
|
|
|
|
if (!type->ht_type.tp_as_buffer)
|
|
|
|
pybind11_fail(
|
|
|
|
"To be able to register buffer protocol support for the type '" +
|
|
|
|
std::string(tinfo->type->tp_name) +
|
|
|
|
"' the associated class<>(..) invocation must "
|
|
|
|
"include the pybind11::buffer_protocol() annotation!");
|
|
|
|
|
2016-01-17 21:36:41 +00:00
|
|
|
tinfo->get_buffer = get_buffer;
|
|
|
|
tinfo->get_buffer_data = get_buffer_data;
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2017-11-07 16:35:27 +00:00
|
|
|
// rec_func must be set for either fget or fset.
|
2016-12-16 14:00:46 +00:00
|
|
|
void def_property_static_impl(const char *name,
|
|
|
|
handle fget, handle fset,
|
2017-11-07 16:35:27 +00:00
|
|
|
detail::function_record *rec_func) {
|
|
|
|
const auto is_static = rec_func && !(rec_func->is_method && rec_func->scope);
|
|
|
|
const auto has_doc = rec_func && rec_func->doc && pybind11::options::show_user_defined_docstrings();
|
2017-02-13 17:11:24 +00:00
|
|
|
auto property = handle((PyObject *) (is_static ? get_internals().static_property_type
|
|
|
|
: &PyProperty_Type));
|
|
|
|
attr(name) = property(fget.ptr() ? fget : none(),
|
|
|
|
fset.ptr() ? fset : none(),
|
|
|
|
/*deleter*/none(),
|
2017-11-07 16:35:27 +00:00
|
|
|
pybind11::str(has_doc ? rec_func->doc : ""));
|
2016-12-16 14:00:46 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
2016-09-06 16:27:00 +00:00
|
|
|
|
2017-03-21 00:15:20 +00:00
|
|
|
/// Set the pointer to operator new if it exists. The cast is needed because it can be overloaded.
|
|
|
|
template <typename T, typename = void_t<decltype(static_cast<void *(*)(size_t)>(T::operator new))>>
|
|
|
|
void set_operator_new(type_record *r) { r->operator_new = &T::operator new; }
|
|
|
|
|
|
|
|
template <typename> void set_operator_new(...) { }
|
|
|
|
|
2017-07-23 04:32:58 +00:00
|
|
|
template <typename T, typename SFINAE = void> struct has_operator_delete : std::false_type { };
|
|
|
|
template <typename T> struct has_operator_delete<T, void_t<decltype(static_cast<void (*)(void *)>(T::operator delete))>>
|
|
|
|
: std::true_type { };
|
|
|
|
template <typename T, typename SFINAE = void> struct has_operator_delete_size : std::false_type { };
|
|
|
|
template <typename T> struct has_operator_delete_size<T, void_t<decltype(static_cast<void (*)(void *, size_t)>(T::operator delete))>>
|
|
|
|
: std::true_type { };
|
2017-03-21 00:15:20 +00:00
|
|
|
/// Call class-specific delete if it exists or global otherwise. Can also be an overload set.
|
2017-07-23 04:32:58 +00:00
|
|
|
template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0>
|
2018-11-09 19:14:53 +00:00
|
|
|
void call_operator_delete(T *p, size_t, size_t) { T::operator delete(p); }
|
2017-07-23 04:32:58 +00:00
|
|
|
template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0>
|
2018-11-09 19:14:53 +00:00
|
|
|
void call_operator_delete(T *p, size_t s, size_t) { T::operator delete(p, s); }
|
|
|
|
|
|
|
|
inline void call_operator_delete(void *p, size_t s, size_t a) {
|
|
|
|
(void)s; (void)a;
|
2019-11-16 00:18:24 +00:00
|
|
|
#if defined(__cpp_aligned_new) && (!defined(_MSC_VER) || _MSC_VER >= 1912)
|
2019-06-14 16:12:51 +00:00
|
|
|
if (a > __STDCPP_DEFAULT_NEW_ALIGNMENT__) {
|
|
|
|
#ifdef __cpp_sized_deallocation
|
|
|
|
::operator delete(p, s, std::align_val_t(a));
|
|
|
|
#else
|
|
|
|
::operator delete(p, std::align_val_t(a));
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef __cpp_sized_deallocation
|
2018-11-09 19:14:53 +00:00
|
|
|
::operator delete(p, s);
|
2019-06-14 16:12:51 +00:00
|
|
|
#else
|
|
|
|
::operator delete(p);
|
|
|
|
#endif
|
2018-11-09 19:14:53 +00:00
|
|
|
}
|
2017-03-21 00:15:20 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
NAMESPACE_END(detail)
|
|
|
|
|
2017-05-16 15:07:28 +00:00
|
|
|
/// Given a pointer to a member function, cast it to its `Derived` version.
|
|
|
|
/// Forward everything else unchanged.
|
|
|
|
template <typename /*Derived*/, typename F>
|
|
|
|
auto method_adaptor(F &&f) -> decltype(std::forward<F>(f)) { return std::forward<F>(f); }
|
|
|
|
|
|
|
|
template <typename Derived, typename Return, typename Class, typename... Args>
|
Add informative compilation failure for method_adaptor failures
When using `method_adaptor` (usually implicitly via a `cl.def("f",
&D::f)`) a compilation failure results if `f` is actually a method of
an inaccessible base class made public via `using`, such as:
class B { public: void f() {} };
class D : private B { public: using B::f; };
pybind deduces `&D::f` as a `B` member function pointer. Since the base
class is inaccessible, the cast in `method_adaptor` from a base class
member function pointer to derived class member function pointer isn't
valid, and a cast failure results.
This was sort of a regression in 2.2, which introduced `method_adaptor`
to do the expected thing when the base class *is* accessible. It wasn't
actually something that *worked* in 2.1, though: you wouldn't get a
compile-time failure, but the method was not callable (because the `D *`
couldn't be cast to a `B *` because of the access restriction). As a
result, you'd simply get a run-time failure if you ever tried to call
the function (this is what #855 fixed).
Thus the change in 2.2 essentially promoted a run-time failure to a
compile-time failure, so isn't really a regression.
This commit simply adds a `static_assert` with an accessible-base-class
check so that, rather than just a cryptic cast failure, you get
something more informative (along with a suggestion for a workaround).
The workaround is to use a lambda, e.g.:
class Derived : private Base {
public:
using Base::f;
};
// In binding code:
//cl.def("f", &Derived::f); // fails: &Derived::f is actually a base
// class member function pointer
cl.def("f", [](Derived &self) { return self.f(); });
This is a bit of a nuissance (especially if there are a bunch of
arguments to forward), but I don't really see another solution.
Fixes #1124
2017-10-03 13:09:49 +00:00
|
|
|
auto method_adaptor(Return (Class::*pmf)(Args...)) -> Return (Derived::*)(Args...) {
|
|
|
|
static_assert(detail::is_accessible_base_of<Class, Derived>::value,
|
|
|
|
"Cannot bind an inaccessible base class method; use a lambda definition instead");
|
|
|
|
return pmf;
|
|
|
|
}
|
2017-05-16 15:07:28 +00:00
|
|
|
|
|
|
|
template <typename Derived, typename Return, typename Class, typename... Args>
|
Add informative compilation failure for method_adaptor failures
When using `method_adaptor` (usually implicitly via a `cl.def("f",
&D::f)`) a compilation failure results if `f` is actually a method of
an inaccessible base class made public via `using`, such as:
class B { public: void f() {} };
class D : private B { public: using B::f; };
pybind deduces `&D::f` as a `B` member function pointer. Since the base
class is inaccessible, the cast in `method_adaptor` from a base class
member function pointer to derived class member function pointer isn't
valid, and a cast failure results.
This was sort of a regression in 2.2, which introduced `method_adaptor`
to do the expected thing when the base class *is* accessible. It wasn't
actually something that *worked* in 2.1, though: you wouldn't get a
compile-time failure, but the method was not callable (because the `D *`
couldn't be cast to a `B *` because of the access restriction). As a
result, you'd simply get a run-time failure if you ever tried to call
the function (this is what #855 fixed).
Thus the change in 2.2 essentially promoted a run-time failure to a
compile-time failure, so isn't really a regression.
This commit simply adds a `static_assert` with an accessible-base-class
check so that, rather than just a cryptic cast failure, you get
something more informative (along with a suggestion for a workaround).
The workaround is to use a lambda, e.g.:
class Derived : private Base {
public:
using Base::f;
};
// In binding code:
//cl.def("f", &Derived::f); // fails: &Derived::f is actually a base
// class member function pointer
cl.def("f", [](Derived &self) { return self.f(); });
This is a bit of a nuissance (especially if there are a bunch of
arguments to forward), but I don't really see another solution.
Fixes #1124
2017-10-03 13:09:49 +00:00
|
|
|
auto method_adaptor(Return (Class::*pmf)(Args...) const) -> Return (Derived::*)(Args...) const {
|
|
|
|
static_assert(detail::is_accessible_base_of<Class, Derived>::value,
|
|
|
|
"Cannot bind an inaccessible base class method; use a lambda definition instead");
|
|
|
|
return pmf;
|
|
|
|
}
|
2017-05-16 15:07:28 +00:00
|
|
|
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
template <typename type_, typename... options>
|
2016-01-17 21:36:44 +00:00
|
|
|
class class_ : public detail::generic_type {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
template <typename T> using is_holder = detail::is_holder_type<type_, T>;
|
2017-05-16 15:07:28 +00:00
|
|
|
template <typename T> using is_subtype = detail::is_strict_base_of<type_, T>;
|
|
|
|
template <typename T> using is_base = detail::is_strict_base_of<T, type_>;
|
Change all_of_t/any_of_t to all_of/any_of, add none_of
This replaces the current `all_of_t<Pred, Ts...>` with `all_of<Ts...>`,
with previous use of `all_of_t<Pred, Ts...>` becoming
`all_of<Pred<Ts>...>` (and similarly for `any_of_t`). It also adds a
`none_of<Ts...>`, a shortcut for `negation<any_of<Ts...>>`.
This allows `all_of` and `any_of` to be used a bit more flexible, e.g.
in cases where several predicates need to be tested for the same type
instead of the same predicate for multiple types.
This commit replaces the implementation with a more efficient version
for non-MSVC. For MSVC, this changes the workaround to use the
built-in, recursive std::conjunction/std::disjunction instead.
This also removes the `count_t` since `any_of_t` and `all_of_t` were the
only things using it.
This commit also rearranges some of the future std imports to use actual
`std` implementations for C++14/17 features when under the appropriate
compiler mode, as we were already doing for a few things (like
index_sequence). Most of these aren't saving much (the implementation
for enable_if_t, for example, is trivial), but I think it makes the
intention of the code instantly clear. It also enables MSVC's native
std::index_sequence support.
2016-12-12 23:11:49 +00:00
|
|
|
// struct instead of using here to help MSVC:
|
|
|
|
template <typename T> struct is_valid_class_option :
|
|
|
|
detail::any_of<is_holder<T>, is_subtype<T>, is_base<T>> {};
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
public:
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
using type = type_;
|
2017-03-29 09:55:18 +00:00
|
|
|
using type_alias = detail::exactly_one_t<is_subtype, void, options...>;
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
constexpr static bool has_alias = !std::is_void<type_alias>::value;
|
2017-03-29 09:55:18 +00:00
|
|
|
using holder_type = detail::exactly_one_t<is_holder, std::unique_ptr<type>, options...>;
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
|
Change all_of_t/any_of_t to all_of/any_of, add none_of
This replaces the current `all_of_t<Pred, Ts...>` with `all_of<Ts...>`,
with previous use of `all_of_t<Pred, Ts...>` becoming
`all_of<Pred<Ts>...>` (and similarly for `any_of_t`). It also adds a
`none_of<Ts...>`, a shortcut for `negation<any_of<Ts...>>`.
This allows `all_of` and `any_of` to be used a bit more flexible, e.g.
in cases where several predicates need to be tested for the same type
instead of the same predicate for multiple types.
This commit replaces the implementation with a more efficient version
for non-MSVC. For MSVC, this changes the workaround to use the
built-in, recursive std::conjunction/std::disjunction instead.
This also removes the `count_t` since `any_of_t` and `all_of_t` were the
only things using it.
This commit also rearranges some of the future std imports to use actual
`std` implementations for C++14/17 features when under the appropriate
compiler mode, as we were already doing for a few things (like
index_sequence). Most of these aren't saving much (the implementation
for enable_if_t, for example, is trivial), but I think it makes the
intention of the code instantly clear. It also enables MSVC's native
std::index_sequence support.
2016-12-12 23:11:49 +00:00
|
|
|
static_assert(detail::all_of<is_valid_class_option<options>...>::value,
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
"Unknown/invalid class_ template parameters provided");
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2017-06-13 01:48:36 +00:00
|
|
|
static_assert(!has_alias || std::is_polymorphic<type>::value,
|
|
|
|
"Cannot use an alias class with a non-polymorphic type");
|
|
|
|
|
2016-10-28 01:08:15 +00:00
|
|
|
PYBIND11_OBJECT(class_, generic_type, PyType_Check)
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
class_(handle scope, const char *name, const Extra &... extra) {
|
2017-03-16 23:10:48 +00:00
|
|
|
using namespace detail;
|
|
|
|
|
|
|
|
// MI can only be specified via class_ template options, not constructor parameters
|
|
|
|
static_assert(
|
|
|
|
none_of<is_pyobject<Extra>...>::value || // no base class arguments, or:
|
|
|
|
( constexpr_sum(is_pyobject<Extra>::value...) == 1 && // Exactly one base
|
|
|
|
constexpr_sum(is_base<options>::value...) == 0 && // no template option bases
|
|
|
|
none_of<std::is_same<multiple_inheritance, Extra>...>::value), // no multiple_inheritance attr
|
|
|
|
"Error: multiple inheritance bases must be specified via class_ template options");
|
|
|
|
|
|
|
|
type_record record;
|
2016-01-17 21:36:44 +00:00
|
|
|
record.scope = scope;
|
|
|
|
record.name = name;
|
|
|
|
record.type = &typeid(type);
|
2017-03-16 23:10:48 +00:00
|
|
|
record.type_size = sizeof(conditional_t<has_alias, type_alias, type>);
|
2018-11-09 19:14:53 +00:00
|
|
|
record.type_align = alignof(conditional_t<has_alias, type_alias, type>&);
|
2017-02-23 02:36:09 +00:00
|
|
|
record.holder_size = sizeof(holder_type);
|
2017-07-25 04:53:23 +00:00
|
|
|
record.init_instance = init_instance;
|
2016-01-17 21:36:44 +00:00
|
|
|
record.dealloc = dealloc;
|
2018-11-11 18:36:55 +00:00
|
|
|
record.default_holder = detail::is_instantiation<std::unique_ptr, holder_type>::value;
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2017-03-21 00:15:20 +00:00
|
|
|
set_operator_new<type>(&record);
|
|
|
|
|
2016-09-11 11:00:40 +00:00
|
|
|
/* Register base classes specified via template arguments to class_, if any */
|
2017-03-26 01:41:06 +00:00
|
|
|
PYBIND11_EXPAND_SIDE_EFFECTS(add_base<options>(record));
|
2016-09-06 16:27:00 +00:00
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
/* Process optional arguments, if any */
|
2017-03-16 23:10:48 +00:00
|
|
|
process_attributes<Extra...>::init(extra..., &record);
|
2016-01-17 21:36:44 +00:00
|
|
|
|
2017-03-16 23:10:48 +00:00
|
|
|
generic_type::initialize(record);
|
2016-05-26 11:19:27 +00:00
|
|
|
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
if (has_alias) {
|
2017-07-29 02:03:44 +00:00
|
|
|
auto &instances = record.module_local ? registered_local_types_cpp() : get_internals().registered_types_cpp;
|
2016-05-26 11:19:27 +00:00
|
|
|
instances[std::type_index(typeid(type_alias))] = instances[std::type_index(typeid(type))];
|
|
|
|
}
|
2016-01-17 21:36:44 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2016-09-12 15:36:43 +00:00
|
|
|
template <typename Base, detail::enable_if_t<is_base<Base>::value, int> = 0>
|
2016-09-11 11:00:40 +00:00
|
|
|
static void add_base(detail::type_record &rec) {
|
2017-06-21 17:38:10 +00:00
|
|
|
rec.add_base(typeid(Base), [](void *src) -> void * {
|
2016-09-11 11:00:40 +00:00
|
|
|
return static_cast<Base *>(reinterpret_cast<type *>(src));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-09-12 15:36:43 +00:00
|
|
|
template <typename Base, detail::enable_if_t<!is_base<Base>::value, int> = 0>
|
2016-09-11 11:00:40 +00:00
|
|
|
static void add_base(detail::type_record &) { }
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename Func, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def(const char *name_, Func&& f, const Extra&... extra) {
|
2017-05-16 15:07:28 +00:00
|
|
|
cpp_function cf(method_adaptor<type>(std::forward<Func>(f)), name(name_), is_method(*this),
|
2016-09-20 23:06:32 +00:00
|
|
|
sibling(getattr(*this, name_, none())), extra...);
|
2015-09-04 21:42:12 +00:00
|
|
|
attr(cf.name()) = cf;
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename Func, typename... Extra> class_ &
|
2017-03-12 20:59:07 +00:00
|
|
|
def_static(const char *name_, Func &&f, const Extra&... extra) {
|
|
|
|
static_assert(!std::is_member_function_pointer<Func>::value,
|
|
|
|
"def_static(...) called with a non-static member function pointer");
|
2016-09-20 23:06:32 +00:00
|
|
|
cpp_function cf(std::forward<Func>(f), name(name_), scope(*this),
|
|
|
|
sibling(getattr(*this, name_, none())), extra...);
|
2019-06-11 08:59:57 +00:00
|
|
|
attr(cf.name()) = staticmethod(cf);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
op.execute(*this, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <detail::op_id id, detail::op_type ot, typename L, typename R, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ & def_cast(const detail::op_<id, ot, L, R> &op, const Extra&... extra) {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
op.execute_cast(*this, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename... Args, typename... Extra>
|
2017-08-17 04:01:42 +00:00
|
|
|
class_ &def(const detail::initimpl::constructor<Args...> &init, const Extra&... extra) {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
init.execute(*this, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2016-05-26 11:19:27 +00:00
|
|
|
template <typename... Args, typename... Extra>
|
2017-08-17 04:01:42 +00:00
|
|
|
class_ &def(const detail::initimpl::alias_constructor<Args...> &init, const Extra&... extra) {
|
Allow arbitrary class_ template option ordering
The current pybind11::class_<Type, Holder, Trampoline> fixed template
ordering results in a requirement to repeat the Holder with its default
value (std::unique_ptr<Type>) argument, which is a little bit annoying:
it needs to be specified not because we want to override the default,
but rather because we need to specify the third argument.
This commit removes this limitation by making the class_ template take
the type name plus a parameter pack of options. It then extracts the
first valid holder type and the first subclass type for holder_type and
trampoline type_alias, respectively. (If unfound, both fall back to
their current defaults, `std::unique_ptr<type>` and `type`,
respectively). If any unmatched template arguments are provided, a
static assertion fails.
What this means is that you can specify or omit the arguments in any
order:
py::class_<A, PyA> c1(m, "A");
py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
It also allows future class attributes (such as base types in the next
commit) to be passed as class template types rather than needing to use
a py::base<> wrapper.
2016-09-06 16:17:06 +00:00
|
|
|
init.execute(*this, extra...);
|
2016-05-26 11:19:27 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
template <typename... Args, typename... Extra>
|
|
|
|
class_ &def(detail::initimpl::factory<Args...> &&init, const Extra&... extra) {
|
|
|
|
std::move(init).execute(*this, extra...);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-08-23 23:53:15 +00:00
|
|
|
template <typename... Args, typename... Extra>
|
|
|
|
class_ &def(detail::initimpl::pickle_factory<Args...> &&pf, const Extra &...extra) {
|
|
|
|
std::move(pf).execute(*this, extra...);
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename Func> class_& def_buffer(Func &&func) {
|
2015-07-28 14:12:20 +00:00
|
|
|
struct capture { Func func; };
|
|
|
|
capture *ptr = new capture { std::forward<Func>(func) };
|
|
|
|
install_buffer_funcs([](PyObject *obj, void *ptr) -> buffer_info* {
|
2017-01-03 10:52:05 +00:00
|
|
|
detail::make_caster<type> caster;
|
2015-07-05 18:05:44 +00:00
|
|
|
if (!caster.load(obj, false))
|
|
|
|
return nullptr;
|
2015-07-28 14:12:20 +00:00
|
|
|
return new buffer_info(((capture *) ptr)->func(caster));
|
|
|
|
}, ptr);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2017-05-17 08:52:33 +00:00
|
|
|
template <typename Return, typename Class, typename... Args>
|
|
|
|
class_ &def_buffer(Return (Class::*func)(Args...)) {
|
|
|
|
return def_buffer([func] (type &obj) { return (obj.*func)(); });
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Return, typename Class, typename... Args>
|
|
|
|
class_ &def_buffer(Return (Class::*func)(Args...) const) {
|
|
|
|
return def_buffer([func] (const type &obj) { return (obj.*func)(); });
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename C, typename D, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def_readwrite(const char *name, D C::*pm, const Extra&... extra) {
|
2019-06-11 20:25:12 +00:00
|
|
|
static_assert(std::is_same<C, type>::value || std::is_base_of<C, type>::value, "def_readwrite() requires a class member (or base class member)");
|
2017-05-16 15:07:28 +00:00
|
|
|
cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this)),
|
|
|
|
fset([pm](type &c, const D &value) { c.*pm = value; }, is_method(*this));
|
2016-03-25 15:13:10 +00:00
|
|
|
def_property(name, fget, fset, return_value_policy::reference_internal, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename C, typename D, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def_readonly(const char *name, const D C::*pm, const Extra& ...extra) {
|
2019-06-11 20:25:12 +00:00
|
|
|
static_assert(std::is_same<C, type>::value || std::is_base_of<C, type>::value, "def_readonly() requires a class member (or base class member)");
|
2017-05-16 15:07:28 +00:00
|
|
|
cpp_function fget([pm](const type &c) -> const D &{ return c.*pm; }, is_method(*this));
|
2016-03-25 15:13:10 +00:00
|
|
|
def_property_readonly(name, fget, return_value_policy::reference_internal, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename D, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def_readwrite_static(const char *name, D *pm, const Extra& ...extra) {
|
2016-03-25 15:13:10 +00:00
|
|
|
cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this)),
|
|
|
|
fset([pm](object, const D &value) { *pm = value; }, scope(*this));
|
|
|
|
def_property_static(name, fget, fset, return_value_policy::reference, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2015-07-29 15:43:52 +00:00
|
|
|
template <typename D, typename... Extra>
|
2016-01-17 21:36:44 +00:00
|
|
|
class_ &def_readonly_static(const char *name, const D *pm, const Extra& ...extra) {
|
2016-03-25 15:13:10 +00:00
|
|
|
cpp_function fget([pm](object) -> const D &{ return *pm; }, scope(*this));
|
|
|
|
def_property_readonly_static(name, fget, return_value_policy::reference, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2016-11-01 10:44:57 +00:00
|
|
|
/// Uses return_value_policy::reference_internal by default
|
|
|
|
template <typename Getter, typename... Extra>
|
|
|
|
class_ &def_property_readonly(const char *name, const Getter &fget, const Extra& ...extra) {
|
2017-05-16 15:07:28 +00:00
|
|
|
return def_property_readonly(name, cpp_function(method_adaptor<type>(fget)),
|
|
|
|
return_value_policy::reference_internal, extra...);
|
2016-11-01 10:44:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Uses cpp_function's return_value_policy by default
|
2016-03-21 16:54:24 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
class_ &def_property_readonly(const char *name, const cpp_function &fget, const Extra& ...extra) {
|
2017-11-07 16:35:27 +00:00
|
|
|
return def_property(name, fget, nullptr, extra...);
|
2016-11-01 10:44:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Uses return_value_policy::reference by default
|
|
|
|
template <typename Getter, typename... Extra>
|
|
|
|
class_ &def_property_readonly_static(const char *name, const Getter &fget, const Extra& ...extra) {
|
|
|
|
return def_property_readonly_static(name, cpp_function(fget), return_value_policy::reference, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-11-01 10:44:57 +00:00
|
|
|
/// Uses cpp_function's return_value_policy by default
|
2016-03-21 16:54:24 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
class_ &def_property_readonly_static(const char *name, const cpp_function &fget, const Extra& ...extra) {
|
2017-11-07 16:35:27 +00:00
|
|
|
return def_property_static(name, fget, nullptr, extra...);
|
2016-11-01 10:44:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Uses return_value_policy::reference_internal by default
|
2017-05-16 15:07:28 +00:00
|
|
|
template <typename Getter, typename Setter, typename... Extra>
|
|
|
|
class_ &def_property(const char *name, const Getter &fget, const Setter &fset, const Extra& ...extra) {
|
|
|
|
return def_property(name, fget, cpp_function(method_adaptor<type>(fset)), extra...);
|
|
|
|
}
|
2016-11-01 10:44:57 +00:00
|
|
|
template <typename Getter, typename... Extra>
|
|
|
|
class_ &def_property(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
|
2017-05-16 15:07:28 +00:00
|
|
|
return def_property(name, cpp_function(method_adaptor<type>(fget)), fset,
|
|
|
|
return_value_policy::reference_internal, extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-11-01 10:44:57 +00:00
|
|
|
/// Uses cpp_function's return_value_policy by default
|
2016-03-21 16:54:24 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
class_ &def_property(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
|
2016-03-25 15:13:10 +00:00
|
|
|
return def_property_static(name, fget, fset, is_method(*this), extra...);
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-11-01 10:44:57 +00:00
|
|
|
/// Uses return_value_policy::reference by default
|
|
|
|
template <typename Getter, typename... Extra>
|
|
|
|
class_ &def_property_static(const char *name, const Getter &fget, const cpp_function &fset, const Extra& ...extra) {
|
|
|
|
return def_property_static(name, cpp_function(fget), fset, return_value_policy::reference, extra...);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Uses cpp_function's return_value_policy by default
|
2016-03-21 16:54:24 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
class_ &def_property_static(const char *name, const cpp_function &fget, const cpp_function &fset, const Extra& ...extra) {
|
2019-06-11 12:25:35 +00:00
|
|
|
static_assert( 0 == detail::constexpr_sum(std::is_base_of<arg, Extra>::value...),
|
|
|
|
"Argument annotations are not allowed for properties");
|
2016-03-21 16:54:24 +00:00
|
|
|
auto rec_fget = get_function_record(fget), rec_fset = get_function_record(fset);
|
2017-11-07 16:35:27 +00:00
|
|
|
auto *rec_active = rec_fget;
|
|
|
|
if (rec_fget) {
|
|
|
|
char *doc_prev = rec_fget->doc; /* 'extra' field may include a property-specific documentation string */
|
|
|
|
detail::process_attributes<Extra...>::init(extra..., rec_fget);
|
|
|
|
if (rec_fget->doc && rec_fget->doc != doc_prev) {
|
|
|
|
free(doc_prev);
|
|
|
|
rec_fget->doc = strdup(rec_fget->doc);
|
|
|
|
}
|
2016-06-02 18:33:01 +00:00
|
|
|
}
|
|
|
|
if (rec_fset) {
|
2017-11-07 16:35:27 +00:00
|
|
|
char *doc_prev = rec_fset->doc;
|
2016-03-21 16:54:24 +00:00
|
|
|
detail::process_attributes<Extra...>::init(extra..., rec_fset);
|
2016-06-02 18:33:01 +00:00
|
|
|
if (rec_fset->doc && rec_fset->doc != doc_prev) {
|
|
|
|
free(doc_prev);
|
|
|
|
rec_fset->doc = strdup(rec_fset->doc);
|
|
|
|
}
|
2017-11-07 16:35:27 +00:00
|
|
|
if (! rec_active) rec_active = rec_fset;
|
2016-06-02 18:33:01 +00:00
|
|
|
}
|
2017-11-07 16:35:27 +00:00
|
|
|
def_property_static_impl(name, fget, fset, rec_active);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
2015-10-01 14:46:03 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
private:
|
2016-01-17 21:36:40 +00:00
|
|
|
/// Initialize holder object, variant 1: object derives from enable_shared_from_this
|
|
|
|
template <typename T>
|
2017-07-25 04:53:23 +00:00
|
|
|
static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
|
2017-02-23 02:36:09 +00:00
|
|
|
const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
|
2015-11-24 22:05:58 +00:00
|
|
|
try {
|
2017-02-23 02:36:09 +00:00
|
|
|
auto sh = std::dynamic_pointer_cast<typename holder_type::element_type>(
|
|
|
|
v_h.value_ptr<type>()->shared_from_this());
|
2017-05-19 17:34:55 +00:00
|
|
|
if (sh) {
|
2018-06-20 15:33:50 +00:00
|
|
|
new (std::addressof(v_h.holder<holder_type>())) holder_type(std::move(sh));
|
2017-02-23 02:36:09 +00:00
|
|
|
v_h.set_holder_constructed();
|
2016-12-07 01:36:44 +00:00
|
|
|
}
|
2017-05-19 17:34:55 +00:00
|
|
|
} catch (const std::bad_weak_ptr &) {}
|
2017-02-23 02:36:09 +00:00
|
|
|
|
|
|
|
if (!v_h.holder_constructed() && inst->owned) {
|
2018-06-20 15:33:50 +00:00
|
|
|
new (std::addressof(v_h.holder<holder_type>())) holder_type(v_h.value_ptr<type>());
|
2017-02-23 02:36:09 +00:00
|
|
|
v_h.set_holder_constructed();
|
2015-11-24 22:05:58 +00:00
|
|
|
}
|
2016-01-17 21:36:40 +00:00
|
|
|
}
|
|
|
|
|
2017-02-23 02:36:09 +00:00
|
|
|
static void init_holder_from_existing(const detail::value_and_holder &v_h,
|
|
|
|
const holder_type *holder_ptr, std::true_type /*is_copy_constructible*/) {
|
2018-06-20 15:33:50 +00:00
|
|
|
new (std::addressof(v_h.holder<holder_type>())) holder_type(*reinterpret_cast<const holder_type *>(holder_ptr));
|
2017-01-31 16:05:44 +00:00
|
|
|
}
|
|
|
|
|
2017-02-23 02:36:09 +00:00
|
|
|
static void init_holder_from_existing(const detail::value_and_holder &v_h,
|
|
|
|
const holder_type *holder_ptr, std::false_type /*is_copy_constructible*/) {
|
2018-06-20 15:33:50 +00:00
|
|
|
new (std::addressof(v_h.holder<holder_type>())) holder_type(std::move(*const_cast<holder_type *>(holder_ptr)));
|
2017-01-31 16:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-01-17 21:36:40 +00:00
|
|
|
/// Initialize holder object, variant 2: try to construct from existing holder object, if possible
|
2017-07-25 04:53:23 +00:00
|
|
|
static void init_holder(detail::instance *inst, detail::value_and_holder &v_h,
|
2017-02-23 02:36:09 +00:00
|
|
|
const holder_type *holder_ptr, const void * /* dummy -- not enable_shared_from_this<T>) */) {
|
2016-12-07 01:36:44 +00:00
|
|
|
if (holder_ptr) {
|
2017-02-23 02:36:09 +00:00
|
|
|
init_holder_from_existing(v_h, holder_ptr, std::is_copy_constructible<holder_type>());
|
|
|
|
v_h.set_holder_constructed();
|
2016-12-15 22:44:23 +00:00
|
|
|
} else if (inst->owned || detail::always_construct_holder<holder_type>::value) {
|
2018-06-20 15:33:50 +00:00
|
|
|
new (std::addressof(v_h.holder<holder_type>())) holder_type(v_h.value_ptr<type>());
|
2017-02-23 02:36:09 +00:00
|
|
|
v_h.set_holder_constructed();
|
2016-12-07 01:36:44 +00:00
|
|
|
}
|
2016-01-17 21:36:40 +00:00
|
|
|
}
|
|
|
|
|
2017-07-25 04:53:23 +00:00
|
|
|
/// Performs instance initialization including constructing a holder and registering the known
|
|
|
|
/// instance. Should be called as soon as the `type` value_ptr is set for an instance. Takes an
|
|
|
|
/// optional pointer to an existing holder to use; if not specified and the instance is
|
|
|
|
/// `.owned`, a new holder will be constructed to manage the value pointer.
|
|
|
|
static void init_instance(detail::instance *inst, const void *holder_ptr) {
|
2017-02-23 02:36:09 +00:00
|
|
|
auto v_h = inst->get_value_and_holder(detail::get_type_info(typeid(type)));
|
2017-07-29 07:56:01 +00:00
|
|
|
if (!v_h.instance_registered()) {
|
|
|
|
register_instance(inst, v_h.value_ptr(), v_h.type);
|
|
|
|
v_h.set_instance_registered();
|
|
|
|
}
|
2017-07-25 04:53:23 +00:00
|
|
|
init_holder(inst, v_h, (const holder_type *) holder_ptr, v_h.value_ptr<type>());
|
2015-11-24 22:05:58 +00:00
|
|
|
}
|
|
|
|
|
2017-02-23 02:36:09 +00:00
|
|
|
/// Deallocates an instance; via holder, if constructed; otherwise via operator delete.
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
static void dealloc(detail::value_and_holder &v_h) {
|
|
|
|
if (v_h.holder_constructed()) {
|
2017-02-23 02:36:09 +00:00
|
|
|
v_h.holder<holder_type>().~holder_type();
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
v_h.set_holder_constructed(false);
|
|
|
|
}
|
|
|
|
else {
|
2018-11-09 19:14:53 +00:00
|
|
|
detail::call_operator_delete(v_h.value_ptr<type>(),
|
|
|
|
v_h.type->type_size,
|
|
|
|
v_h.type->type_align
|
|
|
|
);
|
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.
2017-06-13 01:52:48 +00:00
|
|
|
}
|
|
|
|
v_h.value_ptr() = nullptr;
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
2016-03-21 16:54:24 +00:00
|
|
|
|
|
|
|
static detail::function_record *get_function_record(handle h) {
|
|
|
|
h = detail::get_function(h);
|
2016-12-16 14:00:46 +00:00
|
|
|
return h ? (detail::function_record *) reinterpret_borrow<capsule>(PyCFunction_GET_SELF(h.ptr()))
|
2016-10-28 01:08:15 +00:00
|
|
|
: nullptr;
|
2016-03-21 16:54:24 +00:00
|
|
|
}
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
|
|
|
|
2017-08-30 21:40:55 +00:00
|
|
|
/// Binds an existing constructor taking arguments Args...
|
|
|
|
template <typename... Args> detail::initimpl::constructor<Args...> init() { return {}; }
|
|
|
|
/// Like `init<Args...>()`, but the instance is always constructed through the alias class (even
|
|
|
|
/// when not inheriting on the Python side).
|
|
|
|
template <typename... Args> detail::initimpl::alias_constructor<Args...> init_alias() { return {}; }
|
|
|
|
|
|
|
|
/// Binds a factory function as a constructor
|
|
|
|
template <typename Func, typename Ret = detail::initimpl::factory<Func>>
|
|
|
|
Ret init(Func &&f) { return {std::forward<Func>(f)}; }
|
|
|
|
|
|
|
|
/// Dual-argument factory function: the first function is called when no alias is needed, the second
|
|
|
|
/// when an alias is needed (i.e. due to python-side inheritance). Arguments must be identical.
|
|
|
|
template <typename CFunc, typename AFunc, typename Ret = detail::initimpl::factory<CFunc, AFunc>>
|
|
|
|
Ret init(CFunc &&c, AFunc &&a) {
|
|
|
|
return {std::forward<CFunc>(c), std::forward<AFunc>(a)};
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Binds pickling functions `__getstate__` and `__setstate__` and ensures that the type
|
|
|
|
/// returned by `__getstate__` is the same as the argument accepted by `__setstate__`.
|
|
|
|
template <typename GetState, typename SetState>
|
|
|
|
detail::initimpl::pickle_factory<GetState, SetState> pickle(GetState &&g, SetState &&s) {
|
|
|
|
return {std::forward<GetState>(g), std::forward<SetState>(s)};
|
2017-09-04 17:37:16 +00:00
|
|
|
}
|
2017-08-30 21:40:55 +00:00
|
|
|
|
2018-08-31 23:20:24 +00:00
|
|
|
NAMESPACE_BEGIN(detail)
|
|
|
|
struct enum_base {
|
|
|
|
enum_base(handle base, handle parent) : m_base(base), m_parent(parent) { }
|
|
|
|
|
|
|
|
PYBIND11_NOINLINE void init(bool is_arithmetic, bool is_convertible) {
|
|
|
|
m_base.attr("__entries") = dict();
|
|
|
|
auto property = handle((PyObject *) &PyProperty_Type);
|
|
|
|
auto static_property = handle((PyObject *) get_internals().static_property_type);
|
|
|
|
|
|
|
|
m_base.attr("__repr__") = cpp_function(
|
|
|
|
[](handle arg) -> str {
|
|
|
|
handle type = arg.get_type();
|
|
|
|
object type_name = type.attr("__name__");
|
|
|
|
dict entries = type.attr("__entries");
|
|
|
|
for (const auto &kv : entries) {
|
|
|
|
object other = kv.second[int_(0)];
|
|
|
|
if (other.equal(arg))
|
|
|
|
return pybind11::str("{}.{}").format(type_name, kv.first);
|
|
|
|
}
|
|
|
|
return pybind11::str("{}.???").format(type_name);
|
2020-01-25 22:38:01 +00:00
|
|
|
}, name("__repr__"), is_method(m_base)
|
2018-08-31 23:20:24 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
m_base.attr("name") = property(cpp_function(
|
|
|
|
[](handle arg) -> str {
|
|
|
|
dict entries = arg.get_type().attr("__entries");
|
|
|
|
for (const auto &kv : entries) {
|
|
|
|
if (handle(kv.second[int_(0)]).equal(arg))
|
|
|
|
return pybind11::str(kv.first);
|
|
|
|
}
|
|
|
|
return "???";
|
2020-01-25 22:38:01 +00:00
|
|
|
}, name("name"), is_method(m_base)
|
2018-08-31 23:20:24 +00:00
|
|
|
));
|
|
|
|
|
|
|
|
m_base.attr("__doc__") = static_property(cpp_function(
|
|
|
|
[](handle arg) -> std::string {
|
|
|
|
std::string docstring;
|
|
|
|
dict entries = arg.attr("__entries");
|
|
|
|
if (((PyTypeObject *) arg.ptr())->tp_doc)
|
|
|
|
docstring += std::string(((PyTypeObject *) arg.ptr())->tp_doc) + "\n\n";
|
|
|
|
docstring += "Members:";
|
|
|
|
for (const auto &kv : entries) {
|
|
|
|
auto key = std::string(pybind11::str(kv.first));
|
|
|
|
auto comment = kv.second[int_(1)];
|
|
|
|
docstring += "\n\n " + key;
|
|
|
|
if (!comment.is_none())
|
|
|
|
docstring += " : " + (std::string) pybind11::str(comment);
|
|
|
|
}
|
|
|
|
return docstring;
|
2020-01-25 22:38:01 +00:00
|
|
|
}, name("__doc__")
|
2018-08-31 23:20:24 +00:00
|
|
|
), none(), none(), "");
|
|
|
|
|
|
|
|
m_base.attr("__members__") = static_property(cpp_function(
|
|
|
|
[](handle arg) -> dict {
|
|
|
|
dict entries = arg.attr("__entries"), m;
|
|
|
|
for (const auto &kv : entries)
|
|
|
|
m[kv.first] = kv.second[int_(0)];
|
|
|
|
return m;
|
2020-01-25 22:38:01 +00:00
|
|
|
}, name("__members__")), none(), none(), ""
|
2018-08-31 23:20:24 +00:00
|
|
|
);
|
|
|
|
|
2018-10-24 09:18:58 +00:00
|
|
|
#define PYBIND11_ENUM_OP_STRICT(op, expr, strict_behavior) \
|
2018-08-31 23:20:24 +00:00
|
|
|
m_base.attr(op) = cpp_function( \
|
|
|
|
[](object a, object b) { \
|
|
|
|
if (!a.get_type().is(b.get_type())) \
|
2018-10-24 09:18:58 +00:00
|
|
|
strict_behavior; \
|
2018-08-31 23:20:24 +00:00
|
|
|
return expr; \
|
|
|
|
}, \
|
2020-01-25 22:38:01 +00:00
|
|
|
name(op), is_method(m_base))
|
2018-08-31 23:20:24 +00:00
|
|
|
|
|
|
|
#define PYBIND11_ENUM_OP_CONV(op, expr) \
|
|
|
|
m_base.attr(op) = cpp_function( \
|
|
|
|
[](object a_, object b_) { \
|
|
|
|
int_ a(a_), b(b_); \
|
|
|
|
return expr; \
|
|
|
|
}, \
|
2020-01-25 22:38:01 +00:00
|
|
|
name(op), is_method(m_base))
|
2018-08-31 23:20:24 +00:00
|
|
|
|
2019-09-19 16:23:27 +00:00
|
|
|
#define PYBIND11_ENUM_OP_CONV_LHS(op, expr) \
|
|
|
|
m_base.attr(op) = cpp_function( \
|
|
|
|
[](object a_, object b) { \
|
|
|
|
int_ a(a_); \
|
|
|
|
return expr; \
|
|
|
|
}, \
|
2020-01-25 22:38:01 +00:00
|
|
|
name(op), is_method(m_base))
|
2019-09-19 16:23:27 +00:00
|
|
|
|
2018-08-31 23:20:24 +00:00
|
|
|
if (is_convertible) {
|
2019-09-19 16:23:27 +00:00
|
|
|
PYBIND11_ENUM_OP_CONV_LHS("__eq__", !b.is_none() && a.equal(b));
|
|
|
|
PYBIND11_ENUM_OP_CONV_LHS("__ne__", b.is_none() || !a.equal(b));
|
2018-08-31 23:20:24 +00:00
|
|
|
|
|
|
|
if (is_arithmetic) {
|
|
|
|
PYBIND11_ENUM_OP_CONV("__lt__", a < b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__gt__", a > b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__le__", a <= b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__ge__", a >= b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__and__", a & b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__rand__", a & b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__or__", a | b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__ror__", a | b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__xor__", a ^ b);
|
|
|
|
PYBIND11_ENUM_OP_CONV("__rxor__", a ^ b);
|
2019-09-04 20:16:21 +00:00
|
|
|
m_base.attr("__invert__") = cpp_function(
|
2020-01-25 22:38:01 +00:00
|
|
|
[](object arg) { return ~(int_(arg)); }, name("__invert__"), is_method(m_base));
|
2018-08-31 23:20:24 +00:00
|
|
|
}
|
|
|
|
} else {
|
2018-10-24 09:18:58 +00:00
|
|
|
PYBIND11_ENUM_OP_STRICT("__eq__", int_(a).equal(int_(b)), return false);
|
|
|
|
PYBIND11_ENUM_OP_STRICT("__ne__", !int_(a).equal(int_(b)), return true);
|
2018-08-31 23:20:24 +00:00
|
|
|
|
|
|
|
if (is_arithmetic) {
|
2018-11-03 12:20:08 +00:00
|
|
|
#define PYBIND11_THROW throw type_error("Expected an enumeration of matching type!");
|
|
|
|
PYBIND11_ENUM_OP_STRICT("__lt__", int_(a) < int_(b), PYBIND11_THROW);
|
|
|
|
PYBIND11_ENUM_OP_STRICT("__gt__", int_(a) > int_(b), PYBIND11_THROW);
|
|
|
|
PYBIND11_ENUM_OP_STRICT("__le__", int_(a) <= int_(b), PYBIND11_THROW);
|
|
|
|
PYBIND11_ENUM_OP_STRICT("__ge__", int_(a) >= int_(b), PYBIND11_THROW);
|
|
|
|
#undef PYBIND11_THROW
|
2018-08-31 23:20:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-19 16:23:27 +00:00
|
|
|
#undef PYBIND11_ENUM_OP_CONV_LHS
|
2018-08-31 23:20:24 +00:00
|
|
|
#undef PYBIND11_ENUM_OP_CONV
|
|
|
|
#undef PYBIND11_ENUM_OP_STRICT
|
|
|
|
|
2020-01-25 22:38:01 +00:00
|
|
|
m_base.attr("__getstate__") = cpp_function(
|
|
|
|
[](object arg) { return int_(arg); }, name("__getstate__"), is_method(m_base));
|
2018-08-31 23:20:24 +00:00
|
|
|
|
2020-01-25 22:38:01 +00:00
|
|
|
m_base.attr("__hash__") = cpp_function(
|
|
|
|
[](object arg) { return int_(arg); }, name("__hash__"), is_method(m_base));
|
2018-08-31 23:20:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
PYBIND11_NOINLINE void value(char const* name_, object value, const char *doc = nullptr) {
|
|
|
|
dict entries = m_base.attr("__entries");
|
|
|
|
str name(name_);
|
|
|
|
if (entries.contains(name)) {
|
|
|
|
std::string type_name = (std::string) str(m_base.attr("__name__"));
|
|
|
|
throw value_error(type_name + ": element \"" + std::string(name_) + "\" already exists!");
|
|
|
|
}
|
|
|
|
|
|
|
|
entries[name] = std::make_pair(value, doc);
|
|
|
|
m_base.attr(name) = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
PYBIND11_NOINLINE void export_values() {
|
|
|
|
dict entries = m_base.attr("__entries");
|
|
|
|
for (const auto &kv : entries)
|
|
|
|
m_parent.attr(kv.first) = kv.second[int_(0)];
|
|
|
|
}
|
|
|
|
|
|
|
|
handle m_base;
|
|
|
|
handle m_parent;
|
|
|
|
};
|
|
|
|
|
|
|
|
NAMESPACE_END(detail)
|
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
/// Binds C++ enumerations and enumeration classes to Python
|
|
|
|
template <typename Type> class enum_ : public class_<Type> {
|
|
|
|
public:
|
2018-09-14 10:07:47 +00:00
|
|
|
using Base = class_<Type>;
|
|
|
|
using Base::def;
|
|
|
|
using Base::attr;
|
|
|
|
using Base::def_property_readonly;
|
|
|
|
using Base::def_property_readonly_static;
|
2016-11-17 22:24:47 +00:00
|
|
|
using Scalar = typename std::underlying_type<Type>::type;
|
|
|
|
|
2016-01-17 21:36:44 +00:00
|
|
|
template <typename... Extra>
|
|
|
|
enum_(const handle &scope, const char *name, const Extra&... extra)
|
2018-08-31 23:20:24 +00:00
|
|
|
: class_<Type>(scope, name, extra...), m_base(*this, scope) {
|
2017-03-29 09:55:18 +00:00
|
|
|
constexpr bool is_arithmetic = detail::any_of<std::is_same<arithmetic, Extra>...>::value;
|
2018-08-31 23:20:24 +00:00
|
|
|
constexpr bool is_convertible = std::is_convertible<Type, Scalar>::value;
|
|
|
|
m_base.init(is_arithmetic, is_convertible);
|
2016-11-17 22:24:47 +00:00
|
|
|
|
2017-08-30 21:40:55 +00:00
|
|
|
def(init([](Scalar i) { return static_cast<Type>(i); }));
|
2016-11-17 22:24:47 +00:00
|
|
|
def("__int__", [](Type value) { return (Scalar) value; });
|
2017-04-28 12:46:52 +00:00
|
|
|
#if PY_MAJOR_VERSION < 3
|
|
|
|
def("__long__", [](Type value) { return (Scalar) value; });
|
|
|
|
#endif
|
2019-09-21 16:09:35 +00:00
|
|
|
#if PY_MAJOR_VERSION > 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8)
|
2019-09-20 09:06:10 +00:00
|
|
|
def("__index__", [](Type value) { return (Scalar) value; });
|
|
|
|
#endif
|
|
|
|
|
2020-01-25 22:38:01 +00:00
|
|
|
attr("__setstate__") = cpp_function(
|
|
|
|
[](detail::value_and_holder &v_h, Scalar arg) {
|
|
|
|
detail::initimpl::setstate<Base>(v_h, static_cast<Type>(arg),
|
|
|
|
Py_TYPE(v_h.inst) != v_h.type->type); },
|
|
|
|
detail::is_new_style_constructor(),
|
|
|
|
pybind11::name("__setstate__"), is_method(*this));
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Export enumeration entries into the parent scope
|
2017-03-03 16:45:50 +00:00
|
|
|
enum_& export_values() {
|
2018-08-31 23:20:24 +00:00
|
|
|
m_base.export_values();
|
2016-11-04 15:51:14 +00:00
|
|
|
return *this;
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Add an enumeration entry
|
2017-11-16 21:24:36 +00:00
|
|
|
enum_& value(char const* name, Type value, const char *doc = nullptr) {
|
2018-08-31 23:20:24 +00:00
|
|
|
m_base.value(name, pybind11::cast(value, return_value_policy::copy), doc);
|
2015-07-05 18:05:44 +00:00
|
|
|
return *this;
|
|
|
|
}
|
2017-03-03 16:45:50 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
private:
|
2018-08-31 23:20:24 +00:00
|
|
|
detail::enum_base m_base;
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
NAMESPACE_BEGIN(detail)
|
2016-01-17 21:36:39 +00:00
|
|
|
|
Implement py::init_alias<>() constructors
This commit adds support for forcing alias type initialization by
defining constructors with `py::init_alias<arg1, arg2>()` instead of
`py::init<arg1, arg2>()`. Currently py::init<> only results in Alias
initialization if the type is extended in python, or the given
arguments can't be used to construct the base type, but can be used to
construct the alias. py::init_alias<>, in contrast, always invokes the
constructor of the alias type.
It looks like this was already the intention of
`py::detail::init_alias`, which was forward-declared in
86d825f3302701d81414ddd3d38bcd09433076bc, but was apparently never
finished: despite the existance of a .def method accepting it, the
`detail::init_alias` class isn't actually defined anywhere.
This commit completes the feature (or possibly repurposes it), allowing
declaration of classes that will always initialize the trampoline which
is (as I argued in #397) sometimes useful.
2016-09-09 06:42:51 +00:00
|
|
|
|
2016-08-10 16:08:04 +00:00
|
|
|
inline void keep_alive_impl(handle nurse, handle patient) {
|
2016-01-17 21:36:40 +00:00
|
|
|
if (!nurse || !patient)
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("Could not activate keep_alive!");
|
2016-01-17 21:36:39 +00:00
|
|
|
|
2016-08-29 01:38:47 +00:00
|
|
|
if (patient.is_none() || nurse.is_none())
|
2016-08-16 05:50:43 +00:00
|
|
|
return; /* Nothing to keep alive or nothing to be kept alive by */
|
2016-04-25 01:25:13 +00:00
|
|
|
|
2017-06-24 12:58:42 +00:00
|
|
|
auto tinfo = all_type_info(Py_TYPE(nurse.ptr()));
|
|
|
|
if (!tinfo.empty()) {
|
|
|
|
/* It's a pybind-registered type, so we can store the patient in the
|
|
|
|
* internal list. */
|
|
|
|
add_patient(nurse.ptr(), patient.ptr());
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* Fall back to clever approach based on weak references taken from
|
|
|
|
* Boost.Python. This is not used for pybind-registered types because
|
|
|
|
* the objects can be destroyed out-of-order in a GC pass. */
|
|
|
|
cpp_function disable_lifesupport(
|
|
|
|
[patient](handle weakref) { patient.dec_ref(); weakref.dec_ref(); });
|
2016-01-17 21:36:39 +00:00
|
|
|
|
2017-06-24 12:58:42 +00:00
|
|
|
weakref wr(nurse, disable_lifesupport);
|
2016-01-17 21:36:39 +00:00
|
|
|
|
2017-06-24 12:58:42 +00:00
|
|
|
patient.inc_ref(); /* reference patient and leak the weak reference */
|
|
|
|
(void) wr.release();
|
|
|
|
}
|
2016-01-17 21:36:39 +00:00
|
|
|
}
|
|
|
|
|
2017-01-30 18:34:38 +00:00
|
|
|
PYBIND11_NOINLINE inline void keep_alive_impl(size_t Nurse, size_t Patient, function_call &call, handle ret) {
|
2017-09-04 11:49:19 +00:00
|
|
|
auto get_arg = [&](size_t n) {
|
|
|
|
if (n == 0)
|
|
|
|
return ret;
|
|
|
|
else if (n == 1 && call.init_self)
|
|
|
|
return call.init_self;
|
|
|
|
else if (n <= call.args.size())
|
|
|
|
return call.args[n - 1];
|
|
|
|
return handle();
|
|
|
|
};
|
|
|
|
|
|
|
|
keep_alive_impl(get_arg(Nurse), get_arg(Patient));
|
2016-08-10 16:08:04 +00:00
|
|
|
}
|
|
|
|
|
2017-02-23 02:36:09 +00:00
|
|
|
inline std::pair<decltype(internals::registered_types_py)::iterator, bool> all_type_info_get_cache(PyTypeObject *type) {
|
|
|
|
auto res = get_internals().registered_types_py
|
2017-07-29 07:53:45 +00:00
|
|
|
#ifdef __cpp_lib_unordered_map_try_emplace
|
2017-02-23 02:36:09 +00:00
|
|
|
.try_emplace(type);
|
|
|
|
#else
|
|
|
|
.emplace(type, std::vector<detail::type_info *>());
|
|
|
|
#endif
|
|
|
|
if (res.second) {
|
|
|
|
// New cache entry created; set up a weak reference to automatically remove it if the type
|
|
|
|
// gets destroyed:
|
|
|
|
weakref((PyObject *) type, cpp_function([type](handle wr) {
|
|
|
|
get_internals().registered_types_py.erase(type);
|
|
|
|
wr.dec_ref();
|
|
|
|
})).release();
|
|
|
|
}
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2016-09-10 07:00:50 +00:00
|
|
|
template <typename Iterator, typename Sentinel, bool KeyIterator, return_value_policy Policy>
|
2016-08-24 22:29:04 +00:00
|
|
|
struct iterator_state {
|
|
|
|
Iterator it;
|
|
|
|
Sentinel end;
|
2017-06-09 14:49:04 +00:00
|
|
|
bool first_or_done;
|
2016-06-17 21:29:39 +00:00
|
|
|
};
|
2016-04-13 21:33:00 +00:00
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
NAMESPACE_END(detail)
|
|
|
|
|
2017-03-18 16:34:21 +00:00
|
|
|
/// Makes a python iterator from a first and past-the-end C++ InputIterator.
|
2016-09-10 07:00:50 +00:00
|
|
|
template <return_value_policy Policy = return_value_policy::reference_internal,
|
|
|
|
typename Iterator,
|
2016-08-24 22:29:04 +00:00
|
|
|
typename Sentinel,
|
2016-05-30 09:28:21 +00:00
|
|
|
typename ValueType = decltype(*std::declval<Iterator>()),
|
|
|
|
typename... Extra>
|
2016-08-24 22:29:04 +00:00
|
|
|
iterator make_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
2016-09-10 07:00:50 +00:00
|
|
|
typedef detail::iterator_state<Iterator, Sentinel, false, Policy> state;
|
2016-04-13 21:33:00 +00:00
|
|
|
|
2016-09-11 11:00:40 +00:00
|
|
|
if (!detail::get_type_info(typeid(state), false)) {
|
2017-07-29 02:03:44 +00:00
|
|
|
class_<state>(handle(), "iterator", pybind11::module_local())
|
2016-04-13 21:33:00 +00:00
|
|
|
.def("__iter__", [](state &s) -> state& { return s; })
|
2016-05-30 09:28:21 +00:00
|
|
|
.def("__next__", [](state &s) -> ValueType {
|
2017-06-09 14:49:04 +00:00
|
|
|
if (!s.first_or_done)
|
2016-06-17 21:29:39 +00:00
|
|
|
++s.it;
|
|
|
|
else
|
2017-06-09 14:49:04 +00:00
|
|
|
s.first_or_done = false;
|
|
|
|
if (s.it == s.end) {
|
|
|
|
s.first_or_done = true;
|
2016-04-13 21:33:00 +00:00
|
|
|
throw stop_iteration();
|
2017-06-09 14:49:04 +00:00
|
|
|
}
|
2016-06-17 21:29:39 +00:00
|
|
|
return *s.it;
|
2016-09-10 07:00:50 +00:00
|
|
|
}, std::forward<Extra>(extra)..., Policy);
|
2016-04-13 21:33:00 +00:00
|
|
|
}
|
|
|
|
|
2017-06-09 14:49:04 +00:00
|
|
|
return cast(state{first, last, true});
|
2016-04-13 21:33:00 +00:00
|
|
|
}
|
2016-09-06 04:06:31 +00:00
|
|
|
|
2017-03-18 16:34:21 +00:00
|
|
|
/// Makes an python iterator over the keys (`.first`) of a iterator over pairs from a
|
|
|
|
/// first and past-the-end InputIterator.
|
2016-09-10 07:00:50 +00:00
|
|
|
template <return_value_policy Policy = return_value_policy::reference_internal,
|
|
|
|
typename Iterator,
|
2016-08-24 22:29:04 +00:00
|
|
|
typename Sentinel,
|
2016-08-24 22:27:19 +00:00
|
|
|
typename KeyType = decltype((*std::declval<Iterator>()).first),
|
2016-08-12 01:22:05 +00:00
|
|
|
typename... Extra>
|
2016-08-24 22:29:04 +00:00
|
|
|
iterator make_key_iterator(Iterator first, Sentinel last, Extra &&... extra) {
|
2016-09-10 07:00:50 +00:00
|
|
|
typedef detail::iterator_state<Iterator, Sentinel, true, Policy> state;
|
2016-08-12 01:22:05 +00:00
|
|
|
|
2016-09-11 11:00:40 +00:00
|
|
|
if (!detail::get_type_info(typeid(state), false)) {
|
2017-07-29 02:03:44 +00:00
|
|
|
class_<state>(handle(), "iterator", pybind11::module_local())
|
2016-08-12 01:22:05 +00:00
|
|
|
.def("__iter__", [](state &s) -> state& { return s; })
|
|
|
|
.def("__next__", [](state &s) -> KeyType {
|
2017-06-09 14:49:04 +00:00
|
|
|
if (!s.first_or_done)
|
2016-08-12 01:22:05 +00:00
|
|
|
++s.it;
|
|
|
|
else
|
2017-06-09 14:49:04 +00:00
|
|
|
s.first_or_done = false;
|
|
|
|
if (s.it == s.end) {
|
|
|
|
s.first_or_done = true;
|
2016-08-12 01:22:05 +00:00
|
|
|
throw stop_iteration();
|
2017-06-09 14:49:04 +00:00
|
|
|
}
|
2016-08-24 22:27:19 +00:00
|
|
|
return (*s.it).first;
|
2016-09-10 07:00:50 +00:00
|
|
|
}, std::forward<Extra>(extra)..., Policy);
|
2016-08-12 01:22:05 +00:00
|
|
|
}
|
|
|
|
|
2017-06-09 14:49:04 +00:00
|
|
|
return cast(state{first, last, true});
|
2016-08-12 01:22:05 +00:00
|
|
|
}
|
2016-04-13 21:33:00 +00:00
|
|
|
|
2017-03-18 16:34:21 +00:00
|
|
|
/// Makes an iterator over values of an stl container or other container supporting
|
|
|
|
/// `std::begin()`/`std::end()`
|
2016-09-10 07:00:50 +00:00
|
|
|
template <return_value_policy Policy = return_value_policy::reference_internal,
|
|
|
|
typename Type, typename... Extra> iterator make_iterator(Type &value, Extra&&... extra) {
|
|
|
|
return make_iterator<Policy>(std::begin(value), std::end(value), extra...);
|
2016-04-18 08:52:12 +00:00
|
|
|
}
|
|
|
|
|
2017-03-18 16:34:21 +00:00
|
|
|
/// Makes an iterator over the keys (`.first`) of a stl map-like container supporting
|
|
|
|
/// `std::begin()`/`std::end()`
|
2016-09-10 07:00:50 +00:00
|
|
|
template <return_value_policy Policy = return_value_policy::reference_internal,
|
|
|
|
typename Type, typename... Extra> iterator make_key_iterator(Type &value, Extra&&... extra) {
|
|
|
|
return make_key_iterator<Policy>(std::begin(value), std::end(value), extra...);
|
2016-08-12 01:22:05 +00:00
|
|
|
}
|
|
|
|
|
2015-07-05 18:05:44 +00:00
|
|
|
template <typename InputType, typename OutputType> void implicitly_convertible() {
|
2017-08-28 14:34:06 +00:00
|
|
|
struct set_flag {
|
|
|
|
bool &flag;
|
|
|
|
set_flag(bool &flag) : flag(flag) { flag = true; }
|
|
|
|
~set_flag() { flag = false; }
|
|
|
|
};
|
moved processing of cpp_function arguments out of dispatch code
The cpp_function class accepts a variadic argument, which was formerly
processed twice -- once at registration time, and once in the dispatch
lambda function. This is not only unnecessarily slow but also leads to
code bloat since it adds to the object code generated for every bound
function. This change removes the second pass at dispatch time.
One noteworthy change of this commit is that default arguments are now
constructed (and converted to Python objects) right at declaration time.
Consider the following example:
py::class_<MyClass>("MyClass")
.def("myFunction", py::arg("arg") = SomeType(123));
In this case, the change means that pybind11 must already be set up to
deal with values of the type 'SomeType', or an exception will be thrown.
Another change is that the "preview" of the default argument in the
function signature is generated using the __repr__ special method. If
it is not available in this type, the signature may not be very helpful,
i.e.:
| myFunction(...)
| Signature : (MyClass, arg : SomeType = <SomeType object at 0x101b7b080>) -> None
One workaround (other than defining SomeType.__repr__) is to specify the
human-readable preview of the default argument manually using the more
cumbersome arg_t notation:
py::class_<MyClass>("MyClass")
.def("myFunction", py::arg_t<SomeType>("arg", SomeType(123), "SomeType(123)"));
2016-01-17 21:36:35 +00:00
|
|
|
auto implicit_caster = [](PyObject *obj, PyTypeObject *type) -> PyObject * {
|
2017-08-28 14:34:06 +00:00
|
|
|
static bool currently_used = false;
|
|
|
|
if (currently_used) // implicit conversions are non-reentrant
|
|
|
|
return nullptr;
|
|
|
|
set_flag flag_helper(currently_used);
|
2017-01-03 10:52:05 +00:00
|
|
|
if (!detail::make_caster<InputType>().load(obj, false))
|
2015-07-05 18:05:44 +00:00
|
|
|
return nullptr;
|
|
|
|
tuple args(1);
|
|
|
|
args[0] = obj;
|
|
|
|
PyObject *result = PyObject_Call((PyObject *) type, args.ptr(), nullptr);
|
|
|
|
if (result == nullptr)
|
|
|
|
PyErr_Clear();
|
|
|
|
return result;
|
|
|
|
};
|
2016-10-23 14:43:03 +00:00
|
|
|
|
|
|
|
if (auto tinfo = detail::get_type_info(typeid(OutputType)))
|
|
|
|
tinfo->implicit_conversions.push_back(implicit_caster);
|
|
|
|
else
|
2016-01-17 21:36:41 +00:00
|
|
|
pybind11_fail("implicitly_convertible: Unable to find type " + type_id<OutputType>());
|
2015-07-05 18:05:44 +00:00
|
|
|
}
|
|
|
|
|
2016-06-17 21:35:59 +00:00
|
|
|
template <typename ExceptionTranslator>
|
|
|
|
void register_exception_translator(ExceptionTranslator&& translator) {
|
|
|
|
detail::get_internals().registered_exception_translators.push_front(
|
|
|
|
std::forward<ExceptionTranslator>(translator));
|
|
|
|
}
|
|
|
|
|
2017-05-22 16:06:16 +00:00
|
|
|
/**
|
|
|
|
* Wrapper to generate a new Python exception type.
|
2016-06-17 21:35:59 +00:00
|
|
|
*
|
|
|
|
* This should only be used with PyErr_SetString for now.
|
|
|
|
* It is not (yet) possible to use as a py::base.
|
|
|
|
* Template type argument is reserved for future use.
|
|
|
|
*/
|
|
|
|
template <typename type>
|
|
|
|
class exception : public object {
|
|
|
|
public:
|
2018-04-05 14:04:15 +00:00
|
|
|
exception() = default;
|
2016-11-16 16:59:56 +00:00
|
|
|
exception(handle scope, const char *name, PyObject *base = PyExc_Exception) {
|
|
|
|
std::string full_name = scope.attr("__name__").cast<std::string>() +
|
|
|
|
std::string(".") + name;
|
2017-02-08 22:43:08 +00:00
|
|
|
m_ptr = PyErr_NewException(const_cast<char *>(full_name.c_str()), base, NULL);
|
2016-11-16 16:59:56 +00:00
|
|
|
if (hasattr(scope, name))
|
|
|
|
pybind11_fail("Error during initialization: multiple incompatible "
|
|
|
|
"definitions with name \"" + std::string(name) + "\"");
|
|
|
|
scope.attr(name) = *this;
|
2016-06-17 21:35:59 +00:00
|
|
|
}
|
2016-09-16 06:04:15 +00:00
|
|
|
|
|
|
|
// Sets the current python exception to this exception object with the given message
|
|
|
|
void operator()(const char *message) {
|
|
|
|
PyErr_SetString(m_ptr, message);
|
|
|
|
}
|
2016-06-17 21:35:59 +00:00
|
|
|
};
|
|
|
|
|
2018-04-05 14:04:15 +00:00
|
|
|
NAMESPACE_BEGIN(detail)
|
|
|
|
// Returns a reference to a function-local static exception object used in the simple
|
|
|
|
// register_exception approach below. (It would be simpler to have the static local variable
|
|
|
|
// directly in register_exception, but that makes clang <3.5 segfault - issue #1349).
|
|
|
|
template <typename CppException>
|
|
|
|
exception<CppException> &get_exception_object() { static exception<CppException> ex; return ex; }
|
|
|
|
NAMESPACE_END(detail)
|
|
|
|
|
2017-05-22 16:06:16 +00:00
|
|
|
/**
|
|
|
|
* Registers a Python exception in `m` of the given `name` and installs an exception translator to
|
2016-09-16 06:04:15 +00:00
|
|
|
* translate the C++ exception to the created Python exception using the exceptions what() method.
|
|
|
|
* This is intended for simple exception translations; for more complex translation, register the
|
|
|
|
* exception object and translator directly.
|
|
|
|
*/
|
2016-11-16 16:59:56 +00:00
|
|
|
template <typename CppException>
|
|
|
|
exception<CppException> ®ister_exception(handle scope,
|
|
|
|
const char *name,
|
|
|
|
PyObject *base = PyExc_Exception) {
|
2018-04-05 14:04:15 +00:00
|
|
|
auto &ex = detail::get_exception_object<CppException>();
|
|
|
|
if (!ex) ex = exception<CppException>(scope, name, base);
|
|
|
|
|
2016-09-16 06:04:15 +00:00
|
|
|
register_exception_translator([](std::exception_ptr p) {
|
|
|
|
if (!p) return;
|
|
|
|
try {
|
|
|
|
std::rethrow_exception(p);
|
2016-11-16 16:59:56 +00:00
|
|
|
} catch (const CppException &e) {
|
2018-04-05 14:04:15 +00:00
|
|
|
detail::get_exception_object<CppException>()(e.what());
|
2016-09-16 06:04:15 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return ex;
|
|
|
|
}
|
|
|
|
|
2016-08-29 16:03:34 +00:00
|
|
|
NAMESPACE_BEGIN(detail)
|
|
|
|
PYBIND11_NOINLINE inline void print(tuple args, dict kwargs) {
|
|
|
|
auto strings = tuple(args.size());
|
|
|
|
for (size_t i = 0; i < args.size(); ++i) {
|
2016-10-25 20:12:39 +00:00
|
|
|
strings[i] = str(args[i]);
|
2016-08-29 16:03:34 +00:00
|
|
|
}
|
2016-09-20 23:06:32 +00:00
|
|
|
auto sep = kwargs.contains("sep") ? kwargs["sep"] : cast(" ");
|
2016-09-08 15:02:04 +00:00
|
|
|
auto line = sep.attr("join")(strings);
|
2016-08-29 16:03:34 +00:00
|
|
|
|
2016-10-13 08:34:52 +00:00
|
|
|
object file;
|
|
|
|
if (kwargs.contains("file")) {
|
|
|
|
file = kwargs["file"].cast<object>();
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
file = module::import("sys").attr("stdout");
|
2016-12-01 10:35:34 +00:00
|
|
|
} catch (const error_already_set &) {
|
2016-10-13 08:34:52 +00:00
|
|
|
/* If print() is called from code that is executed as
|
|
|
|
part of garbage collection during interpreter shutdown,
|
|
|
|
importing 'sys' can fail. Give up rather than crashing the
|
|
|
|
interpreter in this case. */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-08 15:02:04 +00:00
|
|
|
auto write = file.attr("write");
|
2016-08-29 16:03:34 +00:00
|
|
|
write(line);
|
2016-09-20 23:06:32 +00:00
|
|
|
write(kwargs.contains("end") ? kwargs["end"] : cast("\n"));
|
2016-08-29 16:03:34 +00:00
|
|
|
|
2016-10-13 08:34:52 +00:00
|
|
|
if (kwargs.contains("flush") && kwargs["flush"].cast<bool>())
|
2016-09-08 15:02:04 +00:00
|
|
|
file.attr("flush")();
|
2016-08-29 16:03:34 +00:00
|
|
|
}
|
|
|
|
NAMESPACE_END(detail)
|
|
|
|
|
|
|
|
template <return_value_policy policy = return_value_policy::automatic_reference, typename... Args>
|
|
|
|
void print(Args &&...args) {
|
|
|
|
auto c = detail::collect_arguments<policy>(std::forward<Args>(args)...);
|
|
|
|
detail::print(c.args(), c.kwargs());
|
|
|
|
}
|
|
|
|
|
2016-12-16 14:00:46 +00:00
|
|
|
#if defined(WITH_THREAD) && !defined(PYPY_VERSION)
|
2016-04-25 01:26:15 +00:00
|
|
|
|
|
|
|
/* The functions below essentially reproduce the PyGILState_* API using a RAII
|
|
|
|
* pattern, but there are a few important differences:
|
|
|
|
*
|
|
|
|
* 1. When acquiring the GIL from an non-main thread during the finalization
|
|
|
|
* phase, the GILState API blindly terminates the calling thread, which
|
|
|
|
* is often not what is wanted. This API does not do this.
|
|
|
|
*
|
|
|
|
* 2. The gil_scoped_release function can optionally cut the relationship
|
|
|
|
* of a PyThreadState and its associated thread, which allows moving it to
|
|
|
|
* another thread (this is a fairly rare/advanced use case).
|
|
|
|
*
|
|
|
|
* 3. The reference count of an acquired thread state can be controlled. This
|
|
|
|
* can be handy to prevent cases where callbacks issued from an external
|
2016-04-25 13:02:43 +00:00
|
|
|
* thread would otherwise constantly construct and destroy thread state data
|
|
|
|
* structures.
|
2016-05-26 12:29:31 +00:00
|
|
|
*
|
|
|
|
* See the Python bindings of NanoGUI (http://github.com/wjakob/nanogui) for an
|
|
|
|
* example which uses features 2 and 3 to migrate the Python thread of
|
|
|
|
* execution to another thread (to run the event loop on the original thread,
|
|
|
|
* in this case).
|
2016-04-25 13:02:43 +00:00
|
|
|
*/
|
2015-07-05 18:05:44 +00:00
|
|
|
|
|
|
|
class gil_scoped_acquire {
|
|
|
|
public:
|
2016-04-25 13:02:43 +00:00
|
|
|
PYBIND11_NOINLINE gil_scoped_acquire() {
|
2016-04-25 01:26:15 +00:00
|
|
|
auto const &internals = detail::get_internals();
|
2018-07-17 14:55:52 +00:00
|
|
|
tstate = (PyThreadState *) PYBIND11_TLS_GET_VALUE(internals.tstate);
|
2016-04-25 01:26:15 +00:00
|
|
|
|
2018-12-01 13:47:40 +00:00
|
|
|
if (!tstate) {
|
|
|
|
/* Check if the GIL was acquired using the PyGILState_* API instead (e.g. if
|
|
|
|
calling from a Python thread). Since we use a different key, this ensures
|
|
|
|
we don't create a new thread state and deadlock in PyEval_AcquireThread
|
|
|
|
below. Note we don't save this state with internals.tstate, since we don't
|
|
|
|
create it we would fail to clear it (its reference count should be > 0). */
|
|
|
|
tstate = PyGILState_GetThisThreadState();
|
|
|
|
}
|
|
|
|
|
2016-04-25 01:26:15 +00:00
|
|
|
if (!tstate) {
|
|
|
|
tstate = PyThreadState_New(internals.istate);
|
|
|
|
#if !defined(NDEBUG)
|
|
|
|
if (!tstate)
|
|
|
|
pybind11_fail("scoped_acquire: could not create thread state!");
|
|
|
|
#endif
|
|
|
|
tstate->gilstate_counter = 0;
|
2018-07-17 14:55:52 +00:00
|
|
|
PYBIND11_TLS_REPLACE_VALUE(internals.tstate, tstate);
|
2016-04-25 01:26:15 +00:00
|
|
|
} else {
|
2016-04-25 13:02:43 +00:00
|
|
|
release = detail::get_thread_state_unchecked() != tstate;
|
2016-04-25 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (release) {
|
|
|
|
/* Work around an annoying assertion in PyThreadState_Swap */
|
2016-04-25 13:02:43 +00:00
|
|
|
#if defined(Py_DEBUG)
|
|
|
|
PyInterpreterState *interp = tstate->interp;
|
|
|
|
tstate->interp = nullptr;
|
|
|
|
#endif
|
2016-04-25 01:26:15 +00:00
|
|
|
PyEval_AcquireThread(tstate);
|
2016-04-25 13:02:43 +00:00
|
|
|
#if defined(Py_DEBUG)
|
|
|
|
tstate->interp = interp;
|
|
|
|
#endif
|
2016-04-25 01:26:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inc_ref();
|
|
|
|
}
|
|
|
|
|
|
|
|
void inc_ref() {
|
|
|
|
++tstate->gilstate_counter;
|
|
|
|
}
|
|
|
|
|
2016-04-25 13:02:43 +00:00
|
|
|
PYBIND11_NOINLINE void dec_ref() {
|
2016-04-25 01:26:15 +00:00
|
|
|
--tstate->gilstate_counter;
|
|
|
|
#if !defined(NDEBUG)
|
2016-04-25 13:02:43 +00:00
|
|
|
if (detail::get_thread_state_unchecked() != tstate)
|
2016-04-25 01:26:15 +00:00
|
|
|
pybind11_fail("scoped_acquire::dec_ref(): thread state must be current!");
|
|
|
|
if (tstate->gilstate_counter < 0)
|
|
|
|
pybind11_fail("scoped_acquire::dec_ref(): reference count underflow!");
|
|
|
|
#endif
|
|
|
|
if (tstate->gilstate_counter == 0) {
|
|
|
|
#if !defined(NDEBUG)
|
|
|
|
if (!release)
|
|
|
|
pybind11_fail("scoped_acquire::dec_ref(): internal error!");
|
|
|
|
#endif
|
|
|
|
PyThreadState_Clear(tstate);
|
|
|
|
PyThreadState_DeleteCurrent();
|
2018-07-17 14:55:52 +00:00
|
|
|
PYBIND11_TLS_DELETE_VALUE(detail::get_internals().tstate);
|
2016-04-25 01:26:15 +00:00
|
|
|
release = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-25 13:02:43 +00:00
|
|
|
PYBIND11_NOINLINE ~gil_scoped_acquire() {
|
2016-04-25 01:26:15 +00:00
|
|
|
dec_ref();
|
|
|
|
if (release)
|
|
|
|
PyEval_SaveThread();
|
|
|
|
}
|
|
|
|
private:
|
|
|
|
PyThreadState *tstate = nullptr;
|
|
|
|
bool release = true;
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class gil_scoped_release {
|
|
|
|
public:
|
2016-10-16 20:27:42 +00:00
|
|
|
explicit gil_scoped_release(bool disassoc = false) : disassoc(disassoc) {
|
2017-06-20 21:50:51 +00:00
|
|
|
// `get_internals()` must be called here unconditionally in order to initialize
|
|
|
|
// `internals.tstate` for subsequent `gil_scoped_acquire` calls. Otherwise, an
|
|
|
|
// initialization race could occur as multiple threads try `gil_scoped_acquire`.
|
|
|
|
const auto &internals = detail::get_internals();
|
2016-04-25 01:26:15 +00:00
|
|
|
tstate = PyEval_SaveThread();
|
2016-04-25 07:16:41 +00:00
|
|
|
if (disassoc) {
|
2017-06-20 21:50:51 +00:00
|
|
|
auto key = internals.tstate;
|
2018-07-17 14:55:52 +00:00
|
|
|
PYBIND11_TLS_DELETE_VALUE(key);
|
2016-04-25 07:16:41 +00:00
|
|
|
}
|
2016-04-25 01:26:15 +00:00
|
|
|
}
|
|
|
|
~gil_scoped_release() {
|
|
|
|
if (!tstate)
|
|
|
|
return;
|
|
|
|
PyEval_RestoreThread(tstate);
|
2016-04-25 07:16:41 +00:00
|
|
|
if (disassoc) {
|
2016-05-28 10:26:18 +00:00
|
|
|
auto key = detail::get_internals().tstate;
|
2018-07-17 14:55:52 +00:00
|
|
|
PYBIND11_TLS_REPLACE_VALUE(key, tstate);
|
2016-04-25 07:16:41 +00:00
|
|
|
}
|
2016-04-25 01:26:15 +00:00
|
|
|
}
|
|
|
|
private:
|
|
|
|
PyThreadState *tstate;
|
|
|
|
bool disassoc;
|
2015-07-05 18:05:44 +00:00
|
|
|
};
|
2016-12-16 14:00:46 +00:00
|
|
|
#elif defined(PYPY_VERSION)
|
|
|
|
class gil_scoped_acquire {
|
|
|
|
PyGILState_STATE state;
|
|
|
|
public:
|
|
|
|
gil_scoped_acquire() { state = PyGILState_Ensure(); }
|
|
|
|
~gil_scoped_acquire() { PyGILState_Release(state); }
|
|
|
|
};
|
|
|
|
|
|
|
|
class gil_scoped_release {
|
|
|
|
PyThreadState *state;
|
|
|
|
public:
|
|
|
|
gil_scoped_release() { state = PyEval_SaveThread(); }
|
|
|
|
~gil_scoped_release() { PyEval_RestoreThread(state); }
|
|
|
|
};
|
2016-04-25 01:26:15 +00:00
|
|
|
#else
|
|
|
|
class gil_scoped_acquire { };
|
|
|
|
class gil_scoped_release { };
|
2016-01-25 19:22:44 +00:00
|
|
|
#endif
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2016-11-24 22:11:02 +00:00
|
|
|
error_already_set::~error_already_set() {
|
2019-05-03 12:32:28 +00:00
|
|
|
if (m_type) {
|
2016-11-24 22:11:02 +00:00
|
|
|
gil_scoped_acquire gil;
|
2019-07-06 12:52:32 +00:00
|
|
|
error_scope scope;
|
2019-05-03 12:32:28 +00:00
|
|
|
m_type.release().dec_ref();
|
|
|
|
m_value.release().dec_ref();
|
|
|
|
m_trace.release().dec_ref();
|
2016-11-24 22:11:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-09 21:57:59 +00:00
|
|
|
inline function get_type_overload(const void *this_ptr, const detail::type_info *this_type, const char *name) {
|
2016-12-16 14:00:46 +00:00
|
|
|
handle self = detail::get_object_handle(this_ptr, this_type);
|
|
|
|
if (!self)
|
2015-10-01 16:37:26 +00:00
|
|
|
return function();
|
2016-12-16 14:00:46 +00:00
|
|
|
handle type = self.get_type();
|
2015-10-01 14:46:03 +00:00
|
|
|
auto key = std::make_pair(type.ptr(), name);
|
|
|
|
|
2016-04-11 16:13:08 +00:00
|
|
|
/* Cache functions that aren't overloaded in Python to avoid
|
|
|
|
many costly Python dictionary lookups below */
|
2015-10-01 14:46:03 +00:00
|
|
|
auto &cache = detail::get_internals().inactive_overload_cache;
|
|
|
|
if (cache.find(key) != cache.end())
|
|
|
|
return function();
|
|
|
|
|
2016-12-16 14:00:46 +00:00
|
|
|
function overload = getattr(self, name, function());
|
2015-10-01 14:46:03 +00:00
|
|
|
if (overload.is_cpp_function()) {
|
|
|
|
cache.insert(key);
|
|
|
|
return function();
|
|
|
|
}
|
2016-01-17 21:36:37 +00:00
|
|
|
|
2016-12-16 14:00:46 +00:00
|
|
|
/* Don't call dispatch code if invoked from overridden function.
|
|
|
|
Unfortunately this doesn't work on PyPy. */
|
|
|
|
#if !defined(PYPY_VERSION)
|
2015-10-01 14:46:03 +00:00
|
|
|
PyFrameObject *frame = PyThreadState_Get()->frame;
|
2016-10-25 20:12:39 +00:00
|
|
|
if (frame && (std::string) str(frame->f_code->co_name) == name &&
|
2016-04-11 16:13:08 +00:00
|
|
|
frame->f_code->co_argcount > 0) {
|
|
|
|
PyFrame_FastToLocals(frame);
|
|
|
|
PyObject *self_caller = PyDict_GetItem(
|
|
|
|
frame->f_locals, PyTuple_GET_ITEM(frame->f_code->co_varnames, 0));
|
2016-12-16 14:00:46 +00:00
|
|
|
if (self_caller == self.ptr())
|
2016-04-11 16:13:08 +00:00
|
|
|
return function();
|
|
|
|
}
|
2016-12-16 14:00:46 +00:00
|
|
|
#else
|
|
|
|
/* PyPy currently doesn't provide a detailed cpyext emulation of
|
|
|
|
frame objects, so we have to emulate this using Python. This
|
|
|
|
is going to be slow..*/
|
|
|
|
dict d; d["self"] = self; d["name"] = pybind11::str(name);
|
|
|
|
PyObject *result = PyRun_String(
|
|
|
|
"import inspect\n"
|
|
|
|
"frame = inspect.currentframe()\n"
|
|
|
|
"if frame is not None:\n"
|
|
|
|
" frame = frame.f_back\n"
|
|
|
|
" if frame is not None and str(frame.f_code.co_name) == name and "
|
|
|
|
"frame.f_code.co_argcount > 0:\n"
|
|
|
|
" self_caller = frame.f_locals[frame.f_code.co_varnames[0]]\n"
|
|
|
|
" if self_caller == self:\n"
|
|
|
|
" self = None\n",
|
|
|
|
Py_file_input, d.ptr(), d.ptr());
|
|
|
|
if (result == nullptr)
|
|
|
|
throw error_already_set();
|
2017-02-08 00:01:56 +00:00
|
|
|
if (d["self"].is_none())
|
2016-12-16 14:00:46 +00:00
|
|
|
return function();
|
|
|
|
Py_DECREF(result);
|
|
|
|
#endif
|
|
|
|
|
2015-10-01 14:46:03 +00:00
|
|
|
return overload;
|
|
|
|
}
|
|
|
|
|
2019-06-10 20:12:28 +00:00
|
|
|
/** \rst
|
|
|
|
Try to retrieve a python method by the provided name from the instance pointed to by the this_ptr.
|
|
|
|
|
|
|
|
:this_ptr: The pointer to the object the overload should be retrieved for. This should be the first
|
|
|
|
non-trampoline class encountered in the inheritance chain.
|
|
|
|
:name: The name of the overloaded Python method to retrieve.
|
|
|
|
:return: The Python method by this name from the object or an empty function wrapper.
|
|
|
|
\endrst */
|
2016-08-09 21:57:59 +00:00
|
|
|
template <class T> function get_overload(const T *this_ptr, const char *name) {
|
2016-10-23 14:43:03 +00:00
|
|
|
auto tinfo = detail::get_type_info(typeid(T));
|
|
|
|
return tinfo ? get_type_overload(this_ptr, tinfo, name) : function();
|
2016-08-09 21:57:59 +00:00
|
|
|
}
|
|
|
|
|
Fix template trampoline overload lookup failure
Problem
=======
The template trampoline pattern documented in PR #322 has a problem with
virtual method overloads in intermediate classes in the inheritance
chain between the trampoline class and the base class.
For example, consider the following inheritance structure, where `B` is
the actual class, `PyB<B>` is the trampoline class, and `PyA<B>` is an
intermediate class adding A's methods into the trampoline:
PyB<B> -> PyA<B> -> B -> A
Suppose PyA<B> has a method `some_method()` with a PYBIND11_OVERLOAD in
it to overload the virtual `A::some_method()`. If a Python class `C` is
defined that inherits from the pybind11-registered `B` and tries to
provide an overriding `some_method()`, the PYBIND11_OVERLOADs declared
in PyA<B> fails to find this overloaded method, and thus never invoke it
(or, if pure virtual and not overridden in PyB<B>, raises an exception).
This happens because the base (internal) `PYBIND11_OVERLOAD_INT` macro
simply calls `get_overload(this, name)`; `get_overload()` then uses the
inferred type of `this` to do a type lookup in `registered_types_cpp`.
This is where it fails: `this` will be a `PyA<B> *`, but `PyA<B>` is
neither the base type (`B`) nor the trampoline type (`PyB<B>`). As a
result, the overload fails and we get a failed overload lookup.
The fix
=======
The fix is relatively simple: we can cast `this` passed to
`get_overload()` to a `const B *`, which lets get_overload look up the
correct class. Since trampoline classes should be derived from `B`
classes anyway, this cast should be perfectly safe.
This does require adding the class name as an argument to the
PYBIND11_OVERLOAD_INT macro, but leaves the public macro signatures
unchanged.
2016-08-29 22:16:46 +00:00
|
|
|
#define PYBIND11_OVERLOAD_INT(ret_type, cname, name, ...) { \
|
2015-10-15 16:13:33 +00:00
|
|
|
pybind11::gil_scoped_acquire gil; \
|
Fix template trampoline overload lookup failure
Problem
=======
The template trampoline pattern documented in PR #322 has a problem with
virtual method overloads in intermediate classes in the inheritance
chain between the trampoline class and the base class.
For example, consider the following inheritance structure, where `B` is
the actual class, `PyB<B>` is the trampoline class, and `PyA<B>` is an
intermediate class adding A's methods into the trampoline:
PyB<B> -> PyA<B> -> B -> A
Suppose PyA<B> has a method `some_method()` with a PYBIND11_OVERLOAD in
it to overload the virtual `A::some_method()`. If a Python class `C` is
defined that inherits from the pybind11-registered `B` and tries to
provide an overriding `some_method()`, the PYBIND11_OVERLOADs declared
in PyA<B> fails to find this overloaded method, and thus never invoke it
(or, if pure virtual and not overridden in PyB<B>, raises an exception).
This happens because the base (internal) `PYBIND11_OVERLOAD_INT` macro
simply calls `get_overload(this, name)`; `get_overload()` then uses the
inferred type of `this` to do a type lookup in `registered_types_cpp`.
This is where it fails: `this` will be a `PyA<B> *`, but `PyA<B>` is
neither the base type (`B`) nor the trampoline type (`PyB<B>`). As a
result, the overload fails and we get a failed overload lookup.
The fix
=======
The fix is relatively simple: we can cast `this` passed to
`get_overload()` to a `const B *`, which lets get_overload look up the
correct class. Since trampoline classes should be derived from `B`
classes anyway, this cast should be perfectly safe.
This does require adding the class name as an argument to the
PYBIND11_OVERLOAD_INT macro, but leaves the public macro signatures
unchanged.
2016-08-29 22:16:46 +00:00
|
|
|
pybind11::function overload = pybind11::get_overload(static_cast<const cname *>(this), name); \
|
2016-09-08 18:49:43 +00:00
|
|
|
if (overload) { \
|
2016-09-11 16:17:41 +00:00
|
|
|
auto o = overload(__VA_ARGS__); \
|
2016-09-08 18:49:43 +00:00
|
|
|
if (pybind11::detail::cast_is_temporary_value_reference<ret_type>::value) { \
|
2016-09-11 16:17:41 +00:00
|
|
|
static pybind11::detail::overload_caster_t<ret_type> caster; \
|
|
|
|
return pybind11::detail::cast_ref<ret_type>(std::move(o), caster); \
|
2016-09-08 18:49:43 +00:00
|
|
|
} \
|
|
|
|
else return pybind11::detail::cast_safe<ret_type>(std::move(o)); \
|
|
|
|
} \
|
|
|
|
}
|
2015-10-01 14:46:03 +00:00
|
|
|
|
2019-06-10 20:12:28 +00:00
|
|
|
/** \rst
|
|
|
|
Macro to populate the virtual method in the trampoline class. This macro tries to look up a method named 'fn'
|
|
|
|
from the Python side, deals with the :ref:`gil` and necessary argument conversions to call this method and return
|
|
|
|
the appropriate type. See :ref:`overriding_virtuals` for more information. This macro should be used when the method
|
|
|
|
name in C is not the same as the method name in Python. For example with `__str__`.
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
std::string toString() override {
|
|
|
|
PYBIND11_OVERLOAD_NAME(
|
|
|
|
std::string, // Return type (ret_type)
|
|
|
|
Animal, // Parent class (cname)
|
|
|
|
toString, // Name of function in C++ (name)
|
|
|
|
"__str__", // Name of method in Python (fn)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
\endrst */
|
2016-05-24 21:42:05 +00:00
|
|
|
#define PYBIND11_OVERLOAD_NAME(ret_type, cname, name, fn, ...) \
|
2018-02-28 02:33:41 +00:00
|
|
|
PYBIND11_OVERLOAD_INT(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, __VA_ARGS__) \
|
2016-05-24 21:42:05 +00:00
|
|
|
return cname::fn(__VA_ARGS__)
|
2015-10-01 14:46:03 +00:00
|
|
|
|
2019-06-10 20:12:28 +00:00
|
|
|
/** \rst
|
|
|
|
Macro for pure virtual functions, this function is identical to :c:macro:`PYBIND11_OVERLOAD_NAME`, except that it
|
|
|
|
throws if no overload can be found.
|
|
|
|
\endrst */
|
2016-05-24 21:42:05 +00:00
|
|
|
#define PYBIND11_OVERLOAD_PURE_NAME(ret_type, cname, name, fn, ...) \
|
2018-02-28 02:33:41 +00:00
|
|
|
PYBIND11_OVERLOAD_INT(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), name, __VA_ARGS__) \
|
2018-02-28 03:43:16 +00:00
|
|
|
pybind11::pybind11_fail("Tried to call pure virtual function \"" PYBIND11_STRINGIFY(cname) "::" name "\"");
|
2016-05-24 21:42:05 +00:00
|
|
|
|
2019-06-10 20:12:28 +00:00
|
|
|
/** \rst
|
|
|
|
Macro to populate the virtual method in the trampoline class. This macro tries to look up the method
|
|
|
|
from the Python side, deals with the :ref:`gil` and necessary argument conversions to call this method and return
|
|
|
|
the appropriate type. This macro should be used if the method name in C and in Python are identical.
|
|
|
|
See :ref:`overriding_virtuals` for more information.
|
|
|
|
|
|
|
|
.. code-block:: cpp
|
|
|
|
|
|
|
|
class PyAnimal : public Animal {
|
|
|
|
public:
|
|
|
|
// Inherit the constructors
|
|
|
|
using Animal::Animal;
|
|
|
|
|
|
|
|
// Trampoline (need one for each virtual function)
|
|
|
|
std::string go(int n_times) override {
|
|
|
|
PYBIND11_OVERLOAD_PURE(
|
|
|
|
std::string, // Return type (ret_type)
|
|
|
|
Animal, // Parent class (cname)
|
|
|
|
go, // Name of function in C++ (must match Python name) (fn)
|
|
|
|
n_times // Argument(s) (...)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
\endrst */
|
2016-05-24 21:42:05 +00:00
|
|
|
#define PYBIND11_OVERLOAD(ret_type, cname, fn, ...) \
|
2018-02-28 02:33:41 +00:00
|
|
|
PYBIND11_OVERLOAD_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), #fn, fn, __VA_ARGS__)
|
2016-05-24 21:42:05 +00:00
|
|
|
|
2019-06-10 20:12:28 +00:00
|
|
|
/** \rst
|
|
|
|
Macro for pure virtual functions, this function is identical to :c:macro:`PYBIND11_OVERLOAD`, except that it throws
|
|
|
|
if no overload can be found.
|
|
|
|
\endrst */
|
2016-05-24 21:42:05 +00:00
|
|
|
#define PYBIND11_OVERLOAD_PURE(ret_type, cname, fn, ...) \
|
2018-02-28 02:33:41 +00:00
|
|
|
PYBIND11_OVERLOAD_PURE_NAME(PYBIND11_TYPE(ret_type), PYBIND11_TYPE(cname), #fn, fn, __VA_ARGS__)
|
2015-10-01 14:46:03 +00:00
|
|
|
|
2017-08-10 16:03:29 +00:00
|
|
|
NAMESPACE_END(PYBIND11_NAMESPACE)
|
2015-07-05 18:05:44 +00:00
|
|
|
|
2018-11-20 22:22:02 +00:00
|
|
|
#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma warning(pop)
|
2016-05-01 18:47:49 +00:00
|
|
|
#elif defined(__GNUG__) && !defined(__clang__)
|
2016-01-17 21:36:44 +00:00
|
|
|
# pragma GCC diagnostic pop
|
2015-07-05 18:05:44 +00:00
|
|
|
#endif
|