mirror of
https://github.com/pybind/pybind11.git
synced 2026-05-25 07:14:50 +00:00
Merge branch 'master' into smart_holder
This commit is contained in:
@@ -375,7 +375,7 @@ extern "C" inline PyObject *pybind11_object_new(PyTypeObject *type, PyObject *,
|
||||
extern "C" inline int pybind11_object_init(PyObject *self, PyObject *, PyObject *) {
|
||||
PyTypeObject *type = Py_TYPE(self);
|
||||
std::string msg = get_fully_qualified_tp_name(type) + ": No constructor defined!";
|
||||
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
||||
set_error(PyExc_TypeError, msg.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@ extern "C" inline int pybind11_getbuffer(PyObject *obj, Py_buffer *view, int fla
|
||||
if (view) {
|
||||
view->obj = nullptr;
|
||||
}
|
||||
PyErr_SetString(PyExc_BufferError, "pybind11_getbuffer(): Internal error");
|
||||
set_error(PyExc_BufferError, "pybind11_getbuffer(): Internal error");
|
||||
return -1;
|
||||
}
|
||||
std::memset(view, 0, sizeof(Py_buffer));
|
||||
@@ -589,7 +589,7 @@ extern "C" inline int pybind11_getbuffer(PyObject *obj, Py_buffer *view, int fla
|
||||
if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE && info->readonly) {
|
||||
delete info;
|
||||
// view->obj = nullptr; // Was just memset to 0, so not necessary
|
||||
PyErr_SetString(PyExc_BufferError, "Writable buffer requested for readonly storage");
|
||||
set_error(PyExc_BufferError, "Writable buffer requested for readonly storage");
|
||||
return -1;
|
||||
}
|
||||
view->obj = obj;
|
||||
|
||||
@@ -399,7 +399,7 @@ PYBIND11_WARNING_POP
|
||||
return nullptr; \
|
||||
} \
|
||||
catch (const std::exception &e) { \
|
||||
PyErr_SetString(PyExc_ImportError, e.what()); \
|
||||
::pybind11::set_error(PyExc_ImportError, e.what()); \
|
||||
return nullptr; \
|
||||
}
|
||||
|
||||
|
||||
@@ -363,7 +363,7 @@ inline bool raise_err(PyObject *exc_type, const char *msg) {
|
||||
raise_from(exc_type, msg);
|
||||
return true;
|
||||
}
|
||||
PyErr_SetString(exc_type, msg);
|
||||
set_error(exc_type, msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -790,7 +790,7 @@ public:
|
||||
std::string tname = rtti_type ? rtti_type->name() : cast_type.name();
|
||||
detail::clean_type_id(tname);
|
||||
std::string msg = "Unregistered type : " + tname;
|
||||
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
||||
set_error(PyExc_TypeError, msg.c_str());
|
||||
return {nullptr, nullptr};
|
||||
}
|
||||
|
||||
|
||||
@@ -1008,7 +1008,7 @@ protected:
|
||||
/// Create array from any object -- always returns a new reference
|
||||
static PyObject *raw_array(PyObject *ptr, int ExtraFlags = 0) {
|
||||
if (ptr == nullptr) {
|
||||
PyErr_SetString(PyExc_ValueError, "cannot create a pybind11::array from a nullptr");
|
||||
set_error(PyExc_ValueError, "cannot create a pybind11::array from a nullptr");
|
||||
return nullptr;
|
||||
}
|
||||
return detail::npy_api::get().PyArray_FromAny_(
|
||||
@@ -1155,7 +1155,7 @@ protected:
|
||||
/// Create array from any object -- always returns a new reference
|
||||
static PyObject *raw_array_t(PyObject *ptr) {
|
||||
if (ptr == nullptr) {
|
||||
PyErr_SetString(PyExc_ValueError, "cannot create a pybind11::array_t from a nullptr");
|
||||
set_error(PyExc_ValueError, "cannot create a pybind11::array_t from a nullptr");
|
||||
return nullptr;
|
||||
}
|
||||
return detail::npy_api::get().PyArray_FromAny_(ptr,
|
||||
|
||||
@@ -695,9 +695,8 @@ protected:
|
||||
if (overloads->is_constructor) {
|
||||
if (!parent
|
||||
|| !PyObject_TypeCheck(parent.ptr(), (PyTypeObject *) overloads->scope.ptr())) {
|
||||
PyErr_SetString(
|
||||
PyExc_TypeError,
|
||||
"__init__(self, ...) called with invalid or missing `self` argument");
|
||||
set_error(PyExc_TypeError,
|
||||
"__init__(self, ...) called with invalid or missing `self` argument");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1008,7 +1007,7 @@ protected:
|
||||
|
||||
A translator may choose to do one of the following:
|
||||
|
||||
- catch the exception and call PyErr_SetString or PyErr_SetObject
|
||||
- catch the exception and call py::set_error()
|
||||
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.
|
||||
@@ -1024,8 +1023,7 @@ protected:
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
PyErr_SetString(PyExc_SystemError,
|
||||
"Exception escaped from default exception translator!");
|
||||
set_error(PyExc_SystemError, "Exception escaped from default exception translator!");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -1126,7 +1124,7 @@ protected:
|
||||
raise_from(PyExc_TypeError, msg.c_str());
|
||||
return nullptr;
|
||||
}
|
||||
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
||||
set_error(PyExc_TypeError, msg.c_str());
|
||||
return nullptr;
|
||||
}
|
||||
if (!result) {
|
||||
@@ -1139,7 +1137,7 @@ protected:
|
||||
raise_from(PyExc_TypeError, msg.c_str());
|
||||
return nullptr;
|
||||
}
|
||||
PyErr_SetString(PyExc_TypeError, msg.c_str());
|
||||
set_error(PyExc_TypeError, msg.c_str());
|
||||
return nullptr;
|
||||
}
|
||||
if (overloads->is_constructor && !self_value_and_holder.holder_constructed()) {
|
||||
@@ -2788,7 +2786,7 @@ inline void register_local_exception_translator(ExceptionTranslator &&translator
|
||||
/**
|
||||
* Wrapper to generate a new Python exception type.
|
||||
*
|
||||
* This should only be used with PyErr_SetString for now.
|
||||
* This should only be used with py::set_error() for now.
|
||||
* It is not (yet) possible to use as a py::base.
|
||||
* Template type argument is reserved for future use.
|
||||
*/
|
||||
@@ -2809,7 +2807,9 @@ public:
|
||||
}
|
||||
|
||||
// Sets the current python exception to this exception object with the given message
|
||||
void operator()(const char *message) { PyErr_SetString(m_ptr, message); }
|
||||
PYBIND11_DEPRECATED("Please use py::set_error() instead "
|
||||
"(https://github.com/pybind/pybind11/pull/4772)")
|
||||
void operator()(const char *message) const { set_error(*this, message); }
|
||||
};
|
||||
|
||||
PYBIND11_NAMESPACE_BEGIN(detail)
|
||||
@@ -2841,7 +2841,7 @@ register_exception_impl(handle scope, const char *name, handle base, bool isLoca
|
||||
try {
|
||||
std::rethrow_exception(p);
|
||||
} catch (const CppException &e) {
|
||||
detail::get_exception_object<CppException>()(e.what());
|
||||
set_error(detail::get_exception_object<CppException>(), e.what());
|
||||
}
|
||||
});
|
||||
return ex;
|
||||
|
||||
@@ -334,6 +334,14 @@ public:
|
||||
#endif
|
||||
};
|
||||
|
||||
inline void set_error(const handle &type, const char *message) {
|
||||
PyErr_SetString(type.ptr(), message);
|
||||
}
|
||||
|
||||
inline void set_error(const handle &type, const handle &value) {
|
||||
PyErr_SetObject(type.ptr(), value.ptr());
|
||||
}
|
||||
|
||||
/** \rst
|
||||
Holds a reference to a Python object (with reference counting)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user