Merge pull request #395 from aldanor/feature/error-already-set-message
error_already_set improvements
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index 080b2e0..438f7cf 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -160,7 +160,7 @@
PYBIND11_NOINLINE bool load(handle src, bool convert) {
if (!src || !typeinfo)
return false;
- if (src.ptr() == Py_None) {
+ if (src.is_none()) {
value = nullptr;
return true;
} else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
@@ -185,7 +185,7 @@
const void *existing_holder = nullptr) {
void *src = const_cast<void *>(_src);
if (src == nullptr)
- return handle(Py_None).inc_ref();
+ return none();
auto &internals = get_internals();
@@ -413,7 +413,7 @@
public:
bool load(handle, bool) { return false; }
static handle cast(void_type, return_value_policy /* policy */, handle /* parent */) {
- return handle(Py_None).inc_ref();
+ return none();
}
PYBIND11_TYPE_CASTER(void_type, _("None"));
};
@@ -425,7 +425,7 @@
bool load(handle h, bool) {
if (!h) {
return false;
- } else if (h.ptr() == Py_None) {
+ } else if (h.is_none()) {
value = nullptr;
return true;
}
@@ -451,7 +451,7 @@
if (ptr)
return capsule(ptr).release();
else
- return handle(Py_None).inc_ref();
+ return none();
}
template <typename T> using cast_op_type = void*&;
@@ -563,12 +563,12 @@
template <> class type_caster<char> : public type_caster<std::string> {
public:
bool load(handle src, bool convert) {
- if (src.ptr() == Py_None) return true;
+ if (src.is_none()) return true;
return type_caster<std::string>::load(src, convert);
}
static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
- if (src == nullptr) return handle(Py_None).inc_ref();
+ if (src == nullptr) return none();
return PyUnicode_FromString(src);
}
@@ -586,12 +586,12 @@
template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
public:
bool load(handle src, bool convert) {
- if (src.ptr() == Py_None) return true;
+ if (src.is_none()) return true;
return type_caster<std::wstring>::load(src, convert);
}
static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
- if (src == nullptr) return handle(Py_None).inc_ref();
+ if (src == nullptr) return none();
return PyUnicode_FromWideChar(src, (ssize_t) wcslen(src));
}
@@ -762,7 +762,7 @@
bool load(handle src, bool convert) {
if (!src || !typeinfo) {
return false;
- } else if (src.ptr() == Py_None) {
+ } else if (src.is_none()) {
value = nullptr;
return true;
} else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
diff --git a/include/pybind11/functional.h b/include/pybind11/functional.h
index 0df8129..7f032fc 100644
--- a/include/pybind11/functional.h
+++ b/include/pybind11/functional.h
@@ -20,7 +20,7 @@
typedef typename std::conditional<std::is_same<Return, void>::value, void_type, Return>::type retval_type;
public:
bool load(handle src_, bool) {
- if (src_.ptr() == Py_None)
+ if (src_.is_none())
return true;
src_ = detail::get_function(src_);
@@ -62,7 +62,7 @@
template <typename Func>
static handle cast(Func &&f_, return_value_policy policy, handle /* parent */) {
if (!f_)
- return handle(Py_None).inc_ref();
+ return none();
auto result = f_.template target<Return (*)(Args...)>();
if (result)
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index 0d16c7a..dd04e95 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -1143,7 +1143,7 @@
if (!nurse || !patient)
pybind11_fail("Could not activate keep_alive!");
- if (patient.ptr() == Py_None || nurse.ptr() == Py_None)
+ if (patient.is_none() || nurse.is_none())
return; /* Nothing to keep alive or nothing to be kept alive by */
cpp_function disable_lifesupport(
diff --git a/include/pybind11/pytypes.h b/include/pybind11/pytypes.h
index 51f1629..ba5d2c4 100644
--- a/include/pybind11/pytypes.h
+++ b/include/pybind11/pytypes.h
@@ -40,6 +40,7 @@
inline detail::accessor attr(const char *key) const;
inline pybind11::str str() const;
inline pybind11::str repr() const;
+ bool is_none() const { return m_ptr == Py_None; }
template <typename T> T cast() const;
template <return_value_policy policy = return_value_policy::automatic_reference, typename ... Args>
#if __cplusplus > 201103L