mirror of
https://github.com/pybind/pybind11.git
synced 2025-01-31 23:30:30 +00:00
Merge branch 'master' into smart_holder
This commit is contained in:
commit
8ed9e93d57
@ -32,7 +32,7 @@ repos:
|
|||||||
exclude: ^noxfile.py$
|
exclude: ^noxfile.py$
|
||||||
|
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
- repo: https://github.com/asottile/pyupgrade
|
||||||
rev: v2.21.2
|
rev: v2.23.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: pyupgrade
|
- id: pyupgrade
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ struct buffer_info {
|
|||||||
view->strides
|
view->strides
|
||||||
? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
|
? std::vector<ssize_t>(view->strides, view->strides + view->ndim)
|
||||||
: detail::c_strides({view->shape, view->shape + view->ndim}, view->itemsize),
|
: detail::c_strides({view->shape, view->shape + view->ndim}, view->itemsize),
|
||||||
view->readonly) {
|
(view->readonly != 0)) {
|
||||||
this->m_view = view;
|
this->m_view = view;
|
||||||
this->ownview = ownview;
|
this->ownview = ownview;
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (res == 0 || res == 1) {
|
if (res == 0 || res == 1) {
|
||||||
value = (bool) res;
|
value = (res != 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
@ -11,9 +11,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "pybind11.h"
|
#include "pybind11.h"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <chrono>
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include <datetime.h>
|
#include <datetime.h>
|
||||||
|
|
||||||
// Backport the PyDateTime_DELTA functions from Python3.3 if required
|
// Backport the PyDateTime_DELTA functions from Python3.3 if required
|
||||||
@ -95,6 +100,22 @@ public:
|
|||||||
PYBIND11_TYPE_CASTER(type, _("datetime.timedelta"));
|
PYBIND11_TYPE_CASTER(type, _("datetime.timedelta"));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline std::tm *localtime_thread_safe(const std::time_t *time, std::tm *buf) {
|
||||||
|
#if defined(__STDC_WANT_LIB_EXT1__) || defined(_MSC_VER)
|
||||||
|
if (localtime_s(buf, time))
|
||||||
|
return nullptr;
|
||||||
|
return buf;
|
||||||
|
#else
|
||||||
|
static std::mutex mtx;
|
||||||
|
std::lock_guard<std::mutex> lock(mtx);
|
||||||
|
std::tm *tm_ptr = localtime(time);
|
||||||
|
if (tm_ptr != nullptr) {
|
||||||
|
*buf = *tm_ptr;
|
||||||
|
}
|
||||||
|
return tm_ptr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// This is for casting times on the system clock into datetime.datetime instances
|
// This is for casting times on the system clock into datetime.datetime instances
|
||||||
template <typename Duration> class type_caster<std::chrono::time_point<std::chrono::system_clock, Duration>> {
|
template <typename Duration> class type_caster<std::chrono::time_point<std::chrono::system_clock, Duration>> {
|
||||||
public:
|
public:
|
||||||
@ -162,16 +183,10 @@ public:
|
|||||||
// (https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)
|
// (https://en.cppreference.com/w/cpp/chrono/system_clock/to_time_t)
|
||||||
std::time_t tt = system_clock::to_time_t(time_point_cast<system_clock::duration>(src - us));
|
std::time_t tt = system_clock::to_time_t(time_point_cast<system_clock::duration>(src - us));
|
||||||
|
|
||||||
// std::localtime returns a pointer to a static internal std::tm object on success,
|
std::tm localtime;
|
||||||
// or null pointer otherwise
|
std::tm *localtime_ptr = localtime_thread_safe(&tt, &localtime);
|
||||||
std::tm *localtime_ptr = std::localtime(&tt);
|
|
||||||
if (!localtime_ptr)
|
if (!localtime_ptr)
|
||||||
throw cast_error("Unable to represent system_clock in local time");
|
throw cast_error("Unable to represent system_clock in local time");
|
||||||
|
|
||||||
// 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 = *localtime_ptr;
|
|
||||||
|
|
||||||
return PyDateTime_FromDateAndTime(localtime.tm_year + 1900,
|
return PyDateTime_FromDateAndTime(localtime.tm_year + 1900,
|
||||||
localtime.tm_mon + 1,
|
localtime.tm_mon + 1,
|
||||||
localtime.tm_mday,
|
localtime.tm_mday,
|
||||||
|
@ -125,6 +125,11 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// https://en.cppreference.com/w/c/chrono/localtime
|
||||||
|
#if defined(__STDC_LIB_EXT1__) && !defined(__STDC_WANT_LIB_EXT1__)
|
||||||
|
# define __STDC_WANT_LIB_EXT1__
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <Python.h>
|
#include <Python.h>
|
||||||
#include <frameobject.h>
|
#include <frameobject.h>
|
||||||
#include <pythread.h>
|
#include <pythread.h>
|
||||||
|
@ -8,9 +8,6 @@
|
|||||||
# pragma warning(push)
|
# pragma warning(push)
|
||||||
# pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
|
# pragma warning(disable: 4100) // warning C4100: Unreferenced formal parameter
|
||||||
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
|
# pragma warning(disable: 4127) // warning C4127: Conditional expression is constant
|
||||||
# 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
|
|
||||||
# pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
|
|
||||||
# pragma warning(disable: 4505) // warning C4505: 'PySlice_GetIndicesEx': unreferenced local function has been removed (PyPy only)
|
# pragma warning(disable: 4505) // warning C4505: 'PySlice_GetIndicesEx': unreferenced local function has been removed (PyPy only)
|
||||||
#elif defined(__GNUG__) && !defined(__clang__)
|
#elif defined(__GNUG__) && !defined(__clang__)
|
||||||
# pragma GCC diagnostic push
|
# pragma GCC diagnostic push
|
||||||
|
@ -231,7 +231,7 @@ struct value_and_holder {
|
|||||||
return reinterpret_cast<V *&>(vh[0]);
|
return reinterpret_cast<V *&>(vh[0]);
|
||||||
}
|
}
|
||||||
// True if this `value_and_holder` has a non-null value pointer
|
// True if this `value_and_holder` has a non-null value pointer
|
||||||
explicit operator bool() const { return value_ptr(); }
|
explicit operator bool() const { return value_ptr() != nullptr; }
|
||||||
|
|
||||||
template <typename H> H &holder() const {
|
template <typename H> H &holder() const {
|
||||||
return reinterpret_cast<H &>(vh[1]);
|
return reinterpret_cast<H &>(vh[1]);
|
||||||
@ -252,7 +252,7 @@ struct value_and_holder {
|
|||||||
bool instance_registered() const {
|
bool instance_registered() const {
|
||||||
return inst->simple_layout
|
return inst->simple_layout
|
||||||
? inst->simple_instance_registered
|
? inst->simple_instance_registered
|
||||||
: inst->nonsimple.status[index] & instance::status_instance_registered;
|
: ((inst->nonsimple.status[index] & instance::status_instance_registered) != 0);
|
||||||
}
|
}
|
||||||
void set_instance_registered(bool v = true) const {
|
void set_instance_registered(bool v = true) const {
|
||||||
if (inst->simple_layout)
|
if (inst->simple_layout)
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(__cpp_lib_launder) && !(defined(_MSC_VER) && (_MSC_VER < 1914))
|
#if defined(__cpp_lib_launder) && !(defined(_MSC_VER) && (_MSC_VER < 1914))
|
||||||
# define PYBIND11_STD_LAUNDER std::launder
|
# define PYBIND11_STD_LAUNDER std::launder
|
||||||
# define PYBIND11_HAS_STD_LAUNDER 1
|
# define PYBIND11_HAS_STD_LAUNDER 1
|
||||||
@ -61,8 +63,13 @@ inline bool apply_exception_translators(std::forward_list<ExceptionTranslator>&
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
PYBIND11_NAMESPACE_END(detail)
|
#if defined(_MSC_VER)
|
||||||
|
# define PYBIND11_COMPAT_STRDUP _strdup
|
||||||
|
#else
|
||||||
|
# define PYBIND11_COMPAT_STRDUP strdup
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PYBIND11_NAMESPACE_END(detail)
|
||||||
|
|
||||||
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
|
/// Wraps an arbitrary C++ function/method/lambda function/.. into a callable Python object
|
||||||
class cpp_function : public function {
|
class cpp_function : public function {
|
||||||
@ -261,7 +268,7 @@ protected:
|
|||||||
std::free(s);
|
std::free(s);
|
||||||
}
|
}
|
||||||
char *operator()(const char *s) {
|
char *operator()(const char *s) {
|
||||||
auto t = strdup(s);
|
auto t = PYBIND11_COMPAT_STRDUP(s);
|
||||||
strings.push_back(t);
|
strings.push_back(t);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
@ -505,7 +512,8 @@ protected:
|
|||||||
auto *func = (PyCFunctionObject *) m_ptr;
|
auto *func = (PyCFunctionObject *) m_ptr;
|
||||||
std::free(const_cast<char *>(func->m_ml->ml_doc));
|
std::free(const_cast<char *>(func->m_ml->ml_doc));
|
||||||
// Install docstring if it's non-empty (when at least one option is enabled)
|
// Install docstring if it's non-empty (when at least one option is enabled)
|
||||||
func->m_ml->ml_doc = signatures.empty() ? nullptr : strdup(signatures.c_str());
|
func->m_ml->ml_doc
|
||||||
|
= signatures.empty() ? nullptr : PYBIND11_COMPAT_STRDUP(signatures.c_str());
|
||||||
|
|
||||||
if (rec->is_method) {
|
if (rec->is_method) {
|
||||||
m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
|
m_ptr = PYBIND11_INSTANCE_METHOD_NEW(m_ptr, rec->scope.ptr());
|
||||||
@ -1596,7 +1604,7 @@ public:
|
|||||||
detail::process_attributes<Extra...>::init(extra..., rec_fget);
|
detail::process_attributes<Extra...>::init(extra..., rec_fget);
|
||||||
if (rec_fget->doc && rec_fget->doc != doc_prev) {
|
if (rec_fget->doc && rec_fget->doc != doc_prev) {
|
||||||
free(doc_prev);
|
free(doc_prev);
|
||||||
rec_fget->doc = strdup(rec_fget->doc);
|
rec_fget->doc = PYBIND11_COMPAT_STRDUP(rec_fget->doc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (rec_fset) {
|
if (rec_fset) {
|
||||||
@ -1604,7 +1612,7 @@ public:
|
|||||||
detail::process_attributes<Extra...>::init(extra..., rec_fset);
|
detail::process_attributes<Extra...>::init(extra..., rec_fset);
|
||||||
if (rec_fset->doc && rec_fset->doc != doc_prev) {
|
if (rec_fset->doc && rec_fset->doc != doc_prev) {
|
||||||
free(doc_prev);
|
free(doc_prev);
|
||||||
rec_fset->doc = strdup(rec_fset->doc);
|
rec_fset->doc = PYBIND11_COMPAT_STRDUP(rec_fset->doc);
|
||||||
}
|
}
|
||||||
if (! rec_active) rec_active = rec_fset;
|
if (! rec_active) rec_active = rec_fset;
|
||||||
}
|
}
|
||||||
|
@ -367,7 +367,9 @@ public:
|
|||||||
/// Check if the currently trapped error type matches the given Python exception class (or a
|
/// Check if the currently trapped error type matches the given Python exception class (or a
|
||||||
/// subclass thereof). May also be passed a tuple to search for any exception class matches in
|
/// subclass thereof). May also be passed a tuple to search for any exception class matches in
|
||||||
/// the given tuple.
|
/// the given tuple.
|
||||||
bool matches(handle exc) const { return PyErr_GivenExceptionMatches(m_type.ptr(), exc.ptr()); }
|
bool matches(handle exc) const {
|
||||||
|
return (PyErr_GivenExceptionMatches(m_type.ptr(), exc.ptr()) != 0);
|
||||||
|
}
|
||||||
|
|
||||||
const object& type() const { return m_type; }
|
const object& type() const { return m_type; }
|
||||||
const object& value() const { return m_value; }
|
const object& value() const { return m_value; }
|
||||||
@ -532,6 +534,10 @@ object object_or_cast(T &&o);
|
|||||||
// Match a PyObject*, which we want to convert directly to handle via its converting constructor
|
// Match a PyObject*, which we want to convert directly to handle via its converting constructor
|
||||||
inline handle object_or_cast(PyObject *ptr) { return ptr; }
|
inline handle object_or_cast(PyObject *ptr) { return ptr; }
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1920
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning(disable: 4522) // warning C4522: multiple assignment operators specified
|
||||||
|
#endif
|
||||||
template <typename Policy>
|
template <typename Policy>
|
||||||
class accessor : public object_api<accessor<Policy>> {
|
class accessor : public object_api<accessor<Policy>> {
|
||||||
using key_type = typename Policy::key_type;
|
using key_type = typename Policy::key_type;
|
||||||
@ -580,6 +586,9 @@ private:
|
|||||||
key_type key;
|
key_type key;
|
||||||
mutable object cache;
|
mutable object cache;
|
||||||
};
|
};
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1920
|
||||||
|
# pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
PYBIND11_NAMESPACE_BEGIN(accessor_policies)
|
PYBIND11_NAMESPACE_BEGIN(accessor_policies)
|
||||||
struct obj_attr {
|
struct obj_attr {
|
||||||
@ -846,7 +855,7 @@ PYBIND11_NAMESPACE_END(detail)
|
|||||||
Name(handle h, borrowed_t) : Parent(h, borrowed_t{}) { } \
|
Name(handle h, borrowed_t) : Parent(h, borrowed_t{}) { } \
|
||||||
Name(handle h, stolen_t) : Parent(h, stolen_t{}) { } \
|
Name(handle h, stolen_t) : Parent(h, stolen_t{}) { } \
|
||||||
PYBIND11_DEPRECATED("Use py::isinstance<py::python_type>(obj) instead") \
|
PYBIND11_DEPRECATED("Use py::isinstance<py::python_type>(obj) instead") \
|
||||||
bool check() const { return m_ptr != nullptr && (bool) CheckFun(m_ptr); } \
|
bool check() const { return m_ptr != nullptr && (CheckFun(m_ptr) != 0); } \
|
||||||
static bool check_(handle h) { return h.ptr() != nullptr && CheckFun(h.ptr()); } \
|
static bool check_(handle h) { return h.ptr() != nullptr && CheckFun(h.ptr()); } \
|
||||||
template <typename Policy_> \
|
template <typename Policy_> \
|
||||||
Name(const ::pybind11::detail::accessor<Policy_> &a) : Name(object(a)) { }
|
Name(const ::pybind11::detail::accessor<Policy_> &a) : Name(object(a)) { }
|
||||||
|
Loading…
Reference in New Issue
Block a user