Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ORNL Quantum Computing Institute
xacc
Commits
9440695f
Commit
9440695f
authored
Nov 11, 2019
by
Mccaskey, Alex
Browse files
fix to update pybind11 for newer compilers
Signed-off-by:
Alex Mccaskey
<
mccaskeyaj@ornl.gov
>
parent
760c630c
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
tpls/pybind11/include/pybind11/attr.h
View file @
9440695f
...
...
@@ -133,8 +133,8 @@ struct argument_record {
/// Internal data structure which holds metadata about a bound function (signature, overloads, etc.)
struct
function_record
{
function_record
()
:
is_constructor
(
false
),
is_
stateless
(
false
),
is_
operator
(
false
),
has_args
(
false
),
has_kwargs
(
false
),
is_method
(
false
)
{
}
:
is_constructor
(
false
),
is_
new_style_constructor
(
false
),
is_
stateless
(
false
),
is_operator
(
false
),
has_args
(
false
),
has_kwargs
(
false
),
is_method
(
false
)
{
}
/// Function name
char
*
name
=
nullptr
;
/* why no C++ strings? They generate heavier code.. */
...
...
@@ -163,6 +163,9 @@ struct function_record {
/// True if name == '__init__'
bool
is_constructor
:
1
;
/// True if this is a new-style `__init__` defined in `detail/init.h`
bool
is_new_style_constructor
:
1
;
/// True if this is a stateless function pointer
bool
is_stateless
:
1
;
...
...
@@ -197,7 +200,8 @@ struct function_record {
/// Special data structure which (temporarily) holds metadata about a bound class
struct
type_record
{
PYBIND11_NOINLINE
type_record
()
:
multiple_inheritance
(
false
),
dynamic_attr
(
false
),
buffer_protocol
(
false
),
module_local
(
false
)
{
}
:
multiple_inheritance
(
false
),
dynamic_attr
(
false
),
buffer_protocol
(
false
),
default_holder
(
true
),
module_local
(
false
)
{
}
/// Handle to the parent scope
handle
scope
;
...
...
@@ -211,11 +215,14 @@ struct type_record {
/// How large is the underlying C++ type?
size_t
type_size
=
0
;
/// What is the alignment of the underlying C++ type?
size_t
type_align
=
0
;
/// How large is the type's holder?
size_t
holder_size
=
0
;
/// The global operator new can be overridden with a class-specific variant
void
*
(
*
operator_new
)(
size_t
)
=
::
operator
new
;
void
*
(
*
operator_new
)(
size_t
)
=
nullptr
;
/// Function pointer to class_<..>::init_instance
void
(
*
init_instance
)(
instance
*
,
const
void
*
)
=
nullptr
;
...
...
@@ -275,12 +282,15 @@ struct type_record {
}
};
inline
function_call
::
function_call
(
function_record
&
f
,
handle
p
)
:
inline
function_call
::
function_call
(
const
function_record
&
f
,
handle
p
)
:
func
(
f
),
parent
(
p
)
{
args
.
reserve
(
f
.
nargs
);
args_convert
.
reserve
(
f
.
nargs
);
}
/// Tag for a new-style `__init__` defined in `detail/init.h`
struct
is_new_style_constructor
{
};
/**
* Partial template specializations to process custom attributes provided to
* cpp_function_ and class_. These are either used to initialize the respective
...
...
@@ -339,6 +349,10 @@ template <> struct process_attribute<is_operator> : process_attribute_default<is
static
void
init
(
const
is_operator
&
,
function_record
*
r
)
{
r
->
is_operator
=
true
;
}
};
template
<
>
struct
process_attribute
<
is_new_style_constructor
>
:
process_attribute_default
<
is_new_style_constructor
>
{
static
void
init
(
const
is_new_style_constructor
&
,
function_record
*
r
)
{
r
->
is_new_style_constructor
=
true
;
}
};
/// Process a keyword argument attribute (*without* a default value)
template
<
>
struct
process_attribute
<
arg
>
:
process_attribute_default
<
arg
>
{
static
void
init
(
const
arg
&
a
,
function_record
*
r
)
{
...
...
tpls/pybind11/include/pybind11/buffer_info.h
View file @
9440695f
...
...
@@ -21,7 +21,7 @@ struct buffer_info {
std
::
string
format
;
// For homogeneous buffers, this should be set to format_descriptor<T>::format()
ssize_t
ndim
=
0
;
// Number of dimensions
std
::
vector
<
ssize_t
>
shape
;
// Shape of the tensor (1 entry per dimension)
std
::
vector
<
ssize_t
>
strides
;
// Number of
entri
es between adjacent entries (for each per dimension)
std
::
vector
<
ssize_t
>
strides
;
// Number of
byt
es between adjacent entries (for each per dimension)
buffer_info
()
{
}
...
...
tpls/pybind11/include/pybind11/cast.h
View file @
9440695f
This diff is collapsed.
Click to expand it.
tpls/pybind11/include/pybind11/chrono.h
View file @
9440695f
...
...
@@ -106,8 +106,11 @@ public:
if
(
!
PyDateTimeAPI
)
{
PyDateTime_IMPORT
;
}
if
(
!
src
)
return
false
;
std
::
tm
cal
;
microseconds
msecs
;
if
(
PyDateTime_Check
(
src
.
ptr
()))
{
std
::
tm
cal
;
cal
.
tm_sec
=
PyDateTime_DATE_GET_SECOND
(
src
.
ptr
());
cal
.
tm_min
=
PyDateTime_DATE_GET_MINUTE
(
src
.
ptr
());
cal
.
tm_hour
=
PyDateTime_DATE_GET_HOUR
(
src
.
ptr
());
...
...
@@ -115,11 +118,30 @@ public:
cal
.
tm_mon
=
PyDateTime_GET_MONTH
(
src
.
ptr
())
-
1
;
cal
.
tm_year
=
PyDateTime_GET_YEAR
(
src
.
ptr
())
-
1900
;
cal
.
tm_isdst
=
-
1
;
value
=
system_clock
::
from_time_t
(
std
::
mktime
(
&
cal
))
+
microseconds
(
PyDateTime_DATE_GET_MICROSECOND
(
src
.
ptr
()));
return
true
;
msecs
=
microseconds
(
PyDateTime_DATE_GET_MICROSECOND
(
src
.
ptr
()));
}
else
if
(
PyDate_Check
(
src
.
ptr
()))
{
cal
.
tm_sec
=
0
;
cal
.
tm_min
=
0
;
cal
.
tm_hour
=
0
;
cal
.
tm_mday
=
PyDateTime_GET_DAY
(
src
.
ptr
());
cal
.
tm_mon
=
PyDateTime_GET_MONTH
(
src
.
ptr
())
-
1
;
cal
.
tm_year
=
PyDateTime_GET_YEAR
(
src
.
ptr
())
-
1900
;
cal
.
tm_isdst
=
-
1
;
msecs
=
microseconds
(
0
);
}
else
if
(
PyTime_Check
(
src
.
ptr
()))
{
cal
.
tm_sec
=
PyDateTime_TIME_GET_SECOND
(
src
.
ptr
());
cal
.
tm_min
=
PyDateTime_TIME_GET_MINUTE
(
src
.
ptr
());
cal
.
tm_hour
=
PyDateTime_TIME_GET_HOUR
(
src
.
ptr
());
cal
.
tm_mday
=
1
;
// This date (day, month, year) = (1, 0, 70)
cal
.
tm_mon
=
0
;
// represents 1-Jan-1970, which is the first
cal
.
tm_year
=
70
;
// earliest available date for Python's datetime
cal
.
tm_isdst
=
-
1
;
msecs
=
microseconds
(
PyDateTime_TIME_GET_MICROSECOND
(
src
.
ptr
()));
}
else
return
false
;
value
=
system_clock
::
from_time_t
(
std
::
mktime
(
&
cal
))
+
msecs
;
return
true
;
}
static
handle
cast
(
const
std
::
chrono
::
time_point
<
std
::
chrono
::
system_clock
,
Duration
>
&
src
,
return_value_policy
/* policy */
,
handle
/* parent */
)
{
...
...
@@ -128,7 +150,7 @@ public:
// Lazy initialise the PyDateTime import
if
(
!
PyDateTimeAPI
)
{
PyDateTime_IMPORT
;
}
std
::
time_t
tt
=
system_clock
::
to_time_t
(
src
);
std
::
time_t
tt
=
system_clock
::
to_time_t
(
time_point_cast
<
system_clock
::
duration
>
(
src
)
)
;
// this function uses static memory so it's best to copy it out asap just in case
// otherwise other code that is using localtime may break this (not just python code)
std
::
tm
localtime
=
*
std
::
localtime
(
&
tt
);
...
...
tpls/pybind11/include/pybind11/common.h
0 → 100644
View file @
9440695f
#include
"detail/common.h"
#warning "Including 'common.h' is deprecated. It will be removed in v3.0. Use 'pybind11.h'."
tpls/pybind11/include/pybind11/complex.h
View file @
9440695f
...
...
@@ -25,9 +25,13 @@ template <typename T> struct format_descriptor<std::complex<T>, detail::enable_i
static
std
::
string
format
()
{
return
std
::
string
(
value
);
}
};
#ifndef PYBIND11_CPP17
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>::
value
[
3
];
#endif
NAMESPACE_BEGIN
(
detail
)
template
<
typename
T
>
struct
is_fmt_numeric
<
std
::
complex
<
T
>
,
detail
::
enable_if_t
<
std
::
is_floating_point
<
T
>::
value
>>
{
...
...
tpls/pybind11/include/pybind11/detail/class.h
View file @
9440695f
...
...
@@ -10,10 +10,20 @@
#pragma once
#include
"../attr.h"
#include
"../options.h"
NAMESPACE_BEGIN
(
PYBIND11_NAMESPACE
)
NAMESPACE_BEGIN
(
detail
)
#if PY_VERSION_HEX >= 0x03030000
# define PYBIND11_BUILTIN_QUALNAME
# define PYBIND11_SET_OLDPY_QUALNAME(obj, nameobj)
#else
// In pre-3.3 Python, we still set __qualname__ so that we can produce reliable function type
// signatures; in 3.3+ this macro expands to nothing:
# define PYBIND11_SET_OLDPY_QUALNAME(obj, nameobj) setattr((PyObject *) obj, "__qualname__", nameobj)
#endif
inline
PyTypeObject
*
type_incref
(
PyTypeObject
*
type
)
{
Py_INCREF
(
type
);
return
type
;
...
...
@@ -48,7 +58,7 @@ inline PyTypeObject *make_static_property_type() {
pybind11_fail
(
"make_static_property_type(): error allocating type!"
);
heap_type
->
ht_name
=
name_obj
.
inc_ref
().
ptr
();
#if
PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
#if
def PYBIND11_BUILTIN_QUALNAME
heap_type
->
ht_qualname
=
name_obj
.
inc_ref
().
ptr
();
#endif
...
...
@@ -63,6 +73,7 @@ inline PyTypeObject *make_static_property_type() {
pybind11_fail
(
"make_static_property_type(): failure in PyType_Ready()!"
);
setattr
((
PyObject
*
)
type
,
"__module__"
,
str
(
"pybind11_builtins"
));
PYBIND11_SET_OLDPY_QUALNAME
(
type
,
name_obj
);
return
type
;
}
...
...
@@ -161,7 +172,7 @@ inline PyTypeObject* make_default_metaclass() {
pybind11_fail
(
"make_default_metaclass(): error allocating metaclass!"
);
heap_type
->
ht_name
=
name_obj
.
inc_ref
().
ptr
();
#if
PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
#if
def PYBIND11_BUILTIN_QUALNAME
heap_type
->
ht_qualname
=
name_obj
.
inc_ref
().
ptr
();
#endif
...
...
@@ -179,6 +190,7 @@ inline PyTypeObject* make_default_metaclass() {
pybind11_fail
(
"make_default_metaclass(): failure in PyType_Ready()!"
);
setattr
((
PyObject
*
)
type
,
"__module__"
,
str
(
"pybind11_builtins"
));
PYBIND11_SET_OLDPY_QUALNAME
(
type
,
name_obj
);
return
type
;
}
...
...
@@ -338,6 +350,7 @@ extern "C" inline void pybind11_object_dealloc(PyObject *self) {
auto
type
=
Py_TYPE
(
self
);
type
->
tp_free
(
self
);
#if PY_VERSION_HEX < 0x03080000
// `type->tp_dealloc != pybind11_object_dealloc` means that we're being called
// as part of a derived type's dealloc, in which case we're not allowed to decref
// the type here. For cross-module compatibility, we shouldn't compare directly
...
...
@@ -345,6 +358,11 @@ extern "C" inline void pybind11_object_dealloc(PyObject *self) {
auto
pybind11_object_type
=
(
PyTypeObject
*
)
get_internals
().
instance_base
;
if
(
type
->
tp_dealloc
==
pybind11_object_type
->
tp_dealloc
)
Py_DECREF
(
type
);
#else
// This was not needed before Python 3.8 (Python issue 35810)
// https://github.com/pybind/pybind11/issues/1946
Py_DECREF
(
type
);
#endif
}
/** Create the type which can be used as a common base for all classes. This is
...
...
@@ -363,7 +381,7 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass) {
pybind11_fail
(
"make_object_base_type(): error allocating type!"
);
heap_type
->
ht_name
=
name_obj
.
inc_ref
().
ptr
();
#if
PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
#if
def PYBIND11_BUILTIN_QUALNAME
heap_type
->
ht_qualname
=
name_obj
.
inc_ref
().
ptr
();
#endif
...
...
@@ -384,6 +402,7 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass) {
pybind11_fail
(
"PyType_Ready failed in make_object_base_type():"
+
error_string
());
setattr
((
PyObject
*
)
type
,
"__module__"
,
str
(
"pybind11_builtins"
));
PYBIND11_SET_OLDPY_QUALNAME
(
type
,
name_obj
);
assert
(
!
PyType_HasFeature
(
type
,
Py_TPFLAGS_HAVE_GC
));
return
(
PyObject
*
)
heap_type
;
...
...
@@ -456,7 +475,7 @@ extern "C" inline int pybind11_getbuffer(PyObject *obj, Py_buffer *view, int fla
if
(
tinfo
&&
tinfo
->
get_buffer
)
break
;
}
if
(
view
==
nullptr
||
obj
==
nullptr
||
!
tinfo
||
!
tinfo
->
get_buffer
)
{
if
(
view
==
nullptr
||
!
tinfo
||
!
tinfo
->
get_buffer
)
{
if
(
view
)
view
->
obj
=
nullptr
;
PyErr_SetString
(
PyExc_BufferError
,
"pybind11_getbuffer(): Internal error"
);
...
...
@@ -504,13 +523,15 @@ inline void enable_buffer_protocol(PyHeapTypeObject *heap_type) {
inline
PyObject
*
make_new_python_type
(
const
type_record
&
rec
)
{
auto
name
=
reinterpret_steal
<
object
>
(
PYBIND11_FROM_STRING
(
rec
.
name
));
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
auto
ht
_qualname
=
name
;
if
(
rec
.
scope
&&
hasattr
(
rec
.
scope
,
"__qualname__"
))
{
ht_
qualname
=
reinterpret_steal
<
object
>
(
auto
qualname
=
name
;
if
(
rec
.
scope
&&
!
PyModule_Check
(
rec
.
scope
.
ptr
())
&&
hasattr
(
rec
.
scope
,
"_
_qualname
__"
))
{
#if PY_MAJOR_VERSION >= 3
qualname
=
reinterpret_steal
<
object
>
(
PyUnicode_FromFormat
(
"%U.%U"
,
rec
.
scope
.
attr
(
"__qualname__"
).
ptr
(),
name
.
ptr
()));
}
#else
qualname
=
str
(
rec
.
scope
.
attr
(
"__qualname__"
).
cast
<
std
::
string
>
()
+
"."
+
rec
.
name
);
#endif
}
object
module
;
if
(
rec
.
scope
)
{
...
...
@@ -552,8 +573,8 @@ inline PyObject* make_new_python_type(const type_record &rec) {
pybind11_fail
(
std
::
string
(
rec
.
name
)
+
": Unable to create type object!"
);
heap_type
->
ht_name
=
name
.
release
().
ptr
();
#if
PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3
heap_type
->
ht_qualname
=
ht_
qualname
.
release
().
ptr
();
#if
def PYBIND11_BUILTIN_QUALNAME
heap_type
->
ht_qualname
=
qualname
.
inc_ref
().
ptr
();
#endif
auto
type
=
&
heap_type
->
ht_type
;
...
...
@@ -571,6 +592,9 @@ inline PyObject* make_new_python_type(const type_record &rec) {
type
->
tp_as_number
=
&
heap_type
->
as_number
;
type
->
tp_as_sequence
=
&
heap_type
->
as_sequence
;
type
->
tp_as_mapping
=
&
heap_type
->
as_mapping
;
#if PY_VERSION_HEX >= 0x03050000
type
->
tp_as_async
=
&
heap_type
->
as_async
;
#endif
/* Flags */
type
->
tp_flags
|=
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_BASETYPE
|
Py_TPFLAGS_HEAPTYPE
;
...
...
@@ -599,6 +623,8 @@ inline PyObject* make_new_python_type(const type_record &rec) {
if
(
module
)
// Needed by pydoc
setattr
((
PyObject
*
)
type
,
"__module__"
,
module
);
PYBIND11_SET_OLDPY_QUALNAME
(
type
,
qualname
);
return
(
PyObject
*
)
type
;
}
...
...
tpls/pybind11/include/pybind11/detail/common.h
View file @
9440695f
...
...
@@ -27,15 +27,16 @@
# endif
#endif
#if !defined(_MSC_VER) && !defined(__INTEL_COMPILER)
#if !
(
defined(_MSC_VER) &&
__cplusplus == 199711L) &&
!defined(__INTEL_COMPILER)
# if __cplusplus >= 201402L
# define PYBIND11_CPP14
# if __cplusplus > 201
402L
/* Temporary: should be updated to >= the final C++17 value once known */
# if __cplusplus >
=
201
703L
# define PYBIND11_CPP17
# endif
# endif
#elif defined(_MSC_VER)
#elif defined(_MSC_VER)
&& __cplusplus == 199711L
// MSVC sets _MSVC_LANG rather than __cplusplus (supposedly until the standard is fully implemented)
// Unless you use the /Zc:__cplusplus flag on Visual Studio 2017 15.7 Preview 3 or newer
# if _MSVC_LANG >= 201402L
# define PYBIND11_CPP14
# if _MSVC_LANG > 201402L && _MSC_VER >= 1910
...
...
@@ -46,8 +47,8 @@
// Compiler version assertions
#if defined(__INTEL_COMPILER)
# if __INTEL_COMPILER < 1
5
00
# error pybind11 requires Intel C++ compiler v1
5
or newer
# if __INTEL_COMPILER < 1
7
00
# error pybind11 requires Intel C++ compiler v1
7
or newer
# endif
#elif defined(__clang__) && !defined(__apple_build_version__)
# if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 3)
...
...
@@ -92,8 +93,8 @@
#endif
#define PYBIND11_VERSION_MAJOR 2
#define PYBIND11_VERSION_MINOR
2
#define PYBIND11_VERSION_PATCH dev
0
#define PYBIND11_VERSION_MINOR
4
#define PYBIND11_VERSION_PATCH dev
4
/// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode
#if defined(_MSC_VER)
...
...
@@ -112,10 +113,6 @@
#include
<frameobject.h>
#include
<pythread.h>
#if defined(_WIN32) && (defined(min) || defined(max))
# error Macro clash with min and max -- define NOMINMAX when compiling your program on Windows
#endif
#if defined(isalnum)
# undef isalnum
# undef isalpha
...
...
@@ -158,6 +155,8 @@
#define PYBIND11_BYTES_SIZE PyBytes_Size
#define PYBIND11_LONG_CHECK(o) PyLong_Check(o)
#define PYBIND11_LONG_AS_LONGLONG(o) PyLong_AsLongLong(o)
#define PYBIND11_LONG_FROM_SIGNED(o) PyLong_FromSsize_t((ssize_t) o)
#define PYBIND11_LONG_FROM_UNSIGNED(o) PyLong_FromSize_t((size_t) o)
#define PYBIND11_BYTES_NAME "bytes"
#define PYBIND11_STRING_NAME "str"
#define PYBIND11_SLICE_OBJECT PyObject
...
...
@@ -165,7 +164,9 @@
#define PYBIND11_STR_TYPE ::pybind11::str
#define PYBIND11_BOOL_ATTR "__bool__"
#define PYBIND11_NB_BOOL(ptr) ((ptr)->nb_bool)
// Providing a separate declaration to make Clang's -Wmissing-prototypes happy
#define PYBIND11_PLUGIN_IMPL(name) \
extern "C" PYBIND11_EXPORT PyObject *PyInit_##name(); \
extern "C" PYBIND11_EXPORT PyObject *PyInit_##name()
#else
...
...
@@ -180,6 +181,8 @@
#define PYBIND11_BYTES_SIZE PyString_Size
#define PYBIND11_LONG_CHECK(o) (PyInt_Check(o) || PyLong_Check(o))
#define PYBIND11_LONG_AS_LONGLONG(o) (PyInt_Check(o) ? (long long) PyLong_AsLong(o) : PyLong_AsLongLong(o))
#define PYBIND11_LONG_FROM_SIGNED(o) PyInt_FromSsize_t((ssize_t) o) // Returns long if needed.
#define PYBIND11_LONG_FROM_UNSIGNED(o) PyInt_FromSize_t((size_t) o) // Returns long if needed.
#define PYBIND11_BYTES_NAME "str"
#define PYBIND11_STRING_NAME "unicode"
#define PYBIND11_SLICE_OBJECT PySliceObject
...
...
@@ -187,8 +190,10 @@
#define PYBIND11_STR_TYPE ::pybind11::bytes
#define PYBIND11_BOOL_ATTR "__nonzero__"
#define PYBIND11_NB_BOOL(ptr) ((ptr)->nb_nonzero)
// Providing a separate PyInit decl to make Clang's -Wmissing-prototypes happy
#define PYBIND11_PLUGIN_IMPL(name) \
static PyObject *pybind11_init_wrapper(); \
extern "C" PYBIND11_EXPORT void init##name(); \
extern "C" PYBIND11_EXPORT void init##name() { \
(void)pybind11_init_wrapper(); \
} \
...
...
@@ -205,6 +210,32 @@ extern "C" {
#define PYBIND11_TRY_NEXT_OVERLOAD ((PyObject *) 1) // special failure return code
#define PYBIND11_STRINGIFY(x) #x
#define PYBIND11_TOSTRING(x) PYBIND11_STRINGIFY(x)
#define PYBIND11_CONCAT(first, second) first##second
#define PYBIND11_CHECK_PYTHON_VERSION \
{ \
const char *compiled_ver = PYBIND11_TOSTRING(PY_MAJOR_VERSION) \
"." PYBIND11_TOSTRING(PY_MINOR_VERSION); \
const char *runtime_ver = Py_GetVersion(); \
size_t len = std::strlen(compiled_ver); \
if (std::strncmp(runtime_ver, compiled_ver, len) != 0 \
|| (runtime_ver[len] >= '0' && runtime_ver[len] <= '9')) { \
PyErr_Format(PyExc_ImportError, \
"Python version mismatch: module was compiled for Python %s, " \
"but the interpreter version is incompatible: %s.", \
compiled_ver, runtime_ver); \
return nullptr; \
} \
}
#define PYBIND11_CATCH_INIT_EXCEPTIONS \
catch (pybind11::error_already_set &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} catch (const std::exception &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} \
/** \rst
***Deprecated in favor of PYBIND11_MODULE***
...
...
@@ -225,27 +256,10 @@ extern "C" {
PYBIND11_DEPRECATED("PYBIND11_PLUGIN is deprecated, use PYBIND11_MODULE") \
static PyObject *pybind11_init(); \
PYBIND11_PLUGIN_IMPL(name) { \
int major, minor; \
if (sscanf(Py_GetVersion(), "%i.%i", &major, &minor) != 2) { \
PyErr_SetString(PyExc_ImportError, "Can't parse Python version."); \
return nullptr; \
} else if (major != PY_MAJOR_VERSION || minor != PY_MINOR_VERSION) { \
PyErr_Format(PyExc_ImportError, \
"Python version mismatch: module was compiled for " \
"version %i.%i, while the interpreter is running " \
"version %i.%i.", PY_MAJOR_VERSION, PY_MINOR_VERSION, \
major, minor); \
return nullptr; \
} \
PYBIND11_CHECK_PYTHON_VERSION \
try { \
return pybind11_init(); \
} catch (pybind11::error_already_set &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} catch (const std::exception &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} \
} PYBIND11_CATCH_INIT_EXCEPTIONS \
} \
PyObject *pybind11_init()
...
...
@@ -267,33 +281,16 @@ extern "C" {
}
\endrst */
#define PYBIND11_MODULE(name, variable) \
static void pybind11_init_
##
name(pybind11::module &);
\
static void
PYBIND11_CONCAT(
pybind11_init_
,
name
)
(pybind11::module &); \
PYBIND11_PLUGIN_IMPL(name) { \
int major, minor; \
if (sscanf(Py_GetVersion(), "%i.%i", &major, &minor) != 2) { \
PyErr_SetString(PyExc_ImportError, "Can't parse Python version."); \
return nullptr; \
} else if (major != PY_MAJOR_VERSION || minor != PY_MINOR_VERSION) { \
PyErr_Format(PyExc_ImportError, \
"Python version mismatch: module was compiled for " \
"version %i.%i, while the interpreter is running " \
"version %i.%i.", PY_MAJOR_VERSION, PY_MINOR_VERSION, \
major, minor); \
return nullptr; \
} \
auto m = pybind11::module(#name); \
PYBIND11_CHECK_PYTHON_VERSION \
auto m = pybind11::module(PYBIND11_TOSTRING(name)); \
try { \
pybind11_init_
##
name(m);
\
PYBIND11_CONCAT(
pybind11_init_
,
name
)
(m); \
return m.ptr(); \
} catch (pybind11::error_already_set &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} catch (const std::exception &e) { \
PyErr_SetString(PyExc_ImportError, e.what()); \
return nullptr; \
} \
} PYBIND11_CATCH_INIT_EXCEPTIONS \
} \
void pybind11_init_
##
name(pybind11::module &variable)
void
PYBIND11_CONCAT(
pybind11_init_
,
name
)
(pybind11::module &variable)
NAMESPACE_BEGIN
(
PYBIND11_NAMESPACE
)
...
...
@@ -376,18 +373,20 @@ constexpr size_t instance_simple_holder_in_ptrs() {
struct
type_info
;
struct
value_and_holder
;
struct
nonsimple_values_and_holders
{
void
**
values_and_holders
;
uint8_t
*
status
;
};
/// The 'instance' type which needs to be standard layout (need to be able to use 'offsetof')
struct
instance
{
PyObject_HEAD
/// Storage for pointers and holder; see simple_layout, below, for a description
union
{
void
*
simple_value_holder
[
1
+
instance_simple_holder_in_ptrs
()];
struct
{
void
**
values_and_holders
;
uint8_t
*
status
;
}
nonsimple
;
nonsimple_values_and_holders
nonsimple
;
};
/// Weak references
(needed for keep alive):
/// Weak references
PyObject
*
weakrefs
;
/// If true, the pointer is owned which means we're free to manage it with a holder.
bool
owned
:
1
;
...
...
@@ -404,10 +403,10 @@ struct instance {
* (which is typically the size of two pointers), or when multiple inheritance is used on the
* python side. Non-simple layout allocates the required amount of memory to have multiple
* bound C++ classes as parents. Under this layout, `nonsimple.values_and_holders` is set to a
* pointer to allocated space of the required space to hold a
a
sequence of value pointers and
* pointer to allocated space of the required space to hold a sequence of value pointers and
* holders followed `status`, a set of bit flags (1 byte each), i.e.
* [val1*][holder1][val2*][holder2]...[bb...] where each [block] is rounded up to a multiple of
* `sizeof(void *)`. `nonsimple.
holder_constructed
` is, for convenience, a pointer to the
* `sizeof(void *)`. `nonsimple.
status
` is, for convenience, a pointer to the
* beginning of the [bb...] block (but not independently allocated).
*
* Status bits indicate whether the associated holder is constructed (&
...
...
@@ -470,7 +469,7 @@ template <size_t... IPrev, size_t I, bool B, bool... Bs> struct select_indices_i
:
select_indices_impl
<
conditional_t
<
B
,
index_sequence
<
IPrev
...,
I
>
,
index_sequence
<
IPrev
...
>>
,
I
+
1
,
Bs
...
>
{};
template
<
bool
...
Bs
>
using
select_indices
=
typename
select_indices_impl
<
index_sequence
<>
,
0
,
Bs
...
>::
type
;
/// Backports of std::bool_constant and std::negation to accomodate older compilers
/// Backports of std::bool_constant and std::negation to accom
m
odate older compilers
template
<
bool
B
>
using
bool_constant
=
std
::
integral_constant
<
bool
,
B
>
;
template
<
typename
T
>
struct
negation
:
bool_constant
<!
T
::
value
>
{
};
...
...
@@ -478,7 +477,7 @@ template <typename...> struct void_t_impl { using type = void; };
template
<
typename
...
Ts
>
using
void_t
=
typename
void_t_impl
<
Ts
...
>::
type
;
/// Compile-time all/any/none of that check the boolean value of all template types
#ifdef
__cpp_fold_expressions
#if
def
ined(
__cpp_fold_expressions
) && !(defined(_MSC_VER) && (_MSC_VER < 1916))
template
<
class
...
Ts
>
using
all_of
=
bool_constant
<
(
Ts
::
value
&&
...)
>
;
template
<
class
...
Ts
>
using
any_of
=
bool_constant
<
(
Ts
::
value
||
...)
>
;
#elif !defined(_MSC_VER)
...
...
@@ -580,6 +579,11 @@ template <typename T, typename... Us> using deferred_t = typename deferred_type<
template
<
typename
Base
,
typename
Derived
>
using
is_strict_base_of
=
bool_constant
<
std
::
is_base_of
<
Base
,
Derived
>::
value
&&
!
std
::
is_same
<
Base
,
Derived
>::
value
>
;
/// Like is_base_of, but also requires that the base type is accessible (i.e. that a Derived pointer
/// can be converted to a Base pointer)
template
<
typename
Base
,
typename
Derived
>
using
is_accessible_base_of
=
bool_constant
<
std
::
is_base_of
<
Base
,
Derived
>::
value
&&
std
::
is_convertible
<
Derived
*
,
Base
*>::
value
>
;
template
<
template
<
typename
...
>
class
Base
>
struct
is_template_base_of_impl
{
template
<
typename
...
Us
>
static
std
::
true_type
check
(
Base
<
Us
...
>
*
);
...
...
@@ -669,6 +673,7 @@ PYBIND11_RUNTIME_EXCEPTION(index_error, PyExc_IndexError)
PYBIND11_RUNTIME_EXCEPTION
(
key_error
,
PyExc_KeyError
)
PYBIND11_RUNTIME_EXCEPTION
(
value_error
,
PyExc_ValueError
)
PYBIND11_RUNTIME_EXCEPTION
(
type_error
,
PyExc_TypeError
)
PYBIND11_RUNTIME_EXCEPTION
(
buffer_error
,
PyExc_BufferError
)
PYBIND11_RUNTIME_EXCEPTION
(
cast_error
,
PyExc_RuntimeError
)
/// Thrown when pybind11::cast or handle::call fail due to a type casting error
PYBIND11_RUNTIME_EXCEPTION
(
reference_cast_error
,
PyExc_RuntimeError
)
/// Used internally
...
...
@@ -698,9 +703,13 @@ template <typename T> struct format_descriptor<T, detail::enable_if_t<std::is_ar
static
std
::
string
format
()
{
return
std
::
string
(
1
,
c
);
}
};
#if !defined(PYBIND11_CPP17)
template
<
typename
T
>
constexpr
const
char
format_descriptor
<
T
,
detail
::
enable_if_t
<
std
::
is_arithmetic
<
T
>::
value
>>::
value
[
2
];
#endif
/// RAII wrapper that temporarily clears any Python error state
struct
error_scope
{
PyObject
*
type
,
*
value
,
*
trace
;
...
...
@@ -711,10 +720,6 @@ struct error_scope {
/// Dummy destructor wrapper that can be used to expose classes with a private destructor
struct
nodelete
{
template
<
typename
T
>
void
operator
()(
T
*
)
{
}
};
// overload_cast requires variable templates: C++14
#if defined(PYBIND11_CPP14)
#define PYBIND11_OVERLOAD_CAST 1
NAMESPACE_BEGIN
(
detail
)
template
<
typename
...
Args
>
struct
overload_cast_impl
{
...
...
@@ -734,19 +739,23 @@ struct overload_cast_impl {
};
NAMESPACE_END
(
detail
)
// overload_cast requires variable templates: C++14
#if defined(PYBIND11_CPP14)
#define PYBIND11_OVERLOAD_CAST 1
/// Syntax sugar for resolving overloaded function pointers:
/// - regular: static_cast<Return (Class::*)(Arg0, Arg1, Arg2)>(&Class::func)
/// - sweet: overload_cast<Arg0, Arg1, Arg2>(&Class::func)
template
<
typename
...
Args
>
static
constexpr
detail
::
overload_cast_impl
<
Args
...
>
overload_cast
=
{};
// MSVC 2015 only accepts this particular initialization syntax for this variable template.
#endif
/// Const member function selector for overload_cast
/// - regular: static_cast<Return (Class::*)(Arg) const>(&Class::func)
/// - sweet: overload_cast<Arg>(&Class::func, const_)