-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Moving tp_class access, and consistent fully-qualified naming for PyPy, to detail::get_tp_name #2520
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Moving tp_class access, and consistent fully-qualified naming for PyPy, to detail::get_tp_name #2520
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -24,6 +24,14 @@ PYBIND11_NAMESPACE_BEGIN(detail) | |
| # define PYBIND11_SET_OLDPY_QUALNAME(obj, nameobj) setattr((PyObject *) obj, "__qualname__", nameobj) | ||
| #endif | ||
|
|
||
| inline std::string get_tp_name(PyTypeObject *type) { | ||
| #if !defined(PYPY_VERSION) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What happens in 7.3.2? Does the line below start working?
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think so, no. I believe the
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ugh .. I'd written this yesterday, but it was still a "pending review" ... |
||
| return type->tp_name; | ||
| #else | ||
| return handle((PyObject *) type).attr("__module__").cast<std::string>() + "." + type->tp_name; | ||
| #endif | ||
| } | ||
|
|
||
| inline PyTypeObject *type_incref(PyTypeObject *type) { | ||
| Py_INCREF(type); | ||
| return type; | ||
|
|
@@ -172,7 +180,7 @@ extern "C" inline PyObject *pybind11_meta_call(PyObject *type, PyObject *args, P | |
| for (const auto &vh : values_and_holders(instance)) { | ||
| if (!vh.holder_constructed()) { | ||
| PyErr_Format(PyExc_TypeError, "%.200s.__init__() must be called when overriding __init__", | ||
| vh.type->type->tp_name); | ||
| get_tp_name(vh.type->type).c_str()); | ||
| Py_DECREF(self); | ||
| return nullptr; | ||
| } | ||
|
|
@@ -304,12 +312,7 @@ extern "C" inline PyObject *pybind11_object_new(PyTypeObject *type, PyObject *, | |
| /// following default function will be used which simply throws an exception. | ||
| extern "C" inline int pybind11_object_init(PyObject *self, PyObject *, PyObject *) { | ||
| PyTypeObject *type = Py_TYPE(self); | ||
| std::string msg; | ||
| #if defined(PYPY_VERSION) | ||
| msg += handle((PyObject *) type).attr("__module__").cast<std::string>() + "."; | ||
| #endif | ||
| msg += type->tp_name; | ||
| msg += ": No constructor defined!"; | ||
| std::string msg = get_tp_name(type) + ": No constructor defined!"; | ||
| PyErr_SetString(PyExc_TypeError, msg.c_str()); | ||
| return -1; | ||
| } | ||
|
|
@@ -448,7 +451,7 @@ extern "C" inline PyObject *pybind11_get_dict(PyObject *self, void *) { | |
| extern "C" inline int pybind11_set_dict(PyObject *self, PyObject *new_dict, void *) { | ||
| if (!PyDict_Check(new_dict)) { | ||
| PyErr_Format(PyExc_TypeError, "__dict__ must be set to a dictionary, not a '%.200s'", | ||
| Py_TYPE(new_dict)->tp_name); | ||
| get_tp_name(Py_TYPE(new_dict)).c_str()); | ||
| return -1; | ||
| } | ||
| PyObject *&dict = *_PyObject_GetDictPtr(self); | ||
|
|
@@ -476,9 +479,8 @@ extern "C" inline int pybind11_clear(PyObject *self) { | |
| inline void enable_dynamic_attributes(PyHeapTypeObject *heap_type) { | ||
| auto type = &heap_type->ht_type; | ||
| #if defined(PYPY_VERSION) && (PYPY_VERSION_NUM < 0x06000000) | ||
| pybind11_fail(std::string(type->tp_name) + ": dynamic attributes are " | ||
| "currently not supported in " | ||
| "conjunction with PyPy!"); | ||
| pybind11_fail(get_tp_type(type) + ": dynamic attributes are currently not " | ||
YannickJadoul marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "supported in conjunction with PyPy!"); | ||
| #endif | ||
| type->tp_flags |= Py_TPFLAGS_HAVE_GC; | ||
| type->tp_dictoffset = type->tp_basicsize; // place dict at the end | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -155,7 +155,7 @@ def test_internal_locals_differ(): | |
| assert m.local_cpp_types_addr() != cm.local_cpp_types_addr() | ||
|
|
||
|
|
||
| @pytest.mark.xfail("env.PYPY") | ||
| @pytest.mark.xfail("env.PYPY and sys.pypy_version_info < (7, 3, 2)") | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "Expect this to fail on PyPy < 7.3.2" Didn't we decide to drop older versions already?
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 7.3.2 is not out, yet. And it still fails on 7.3.1 :-)
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If 7.3.2 is out before this gets merged, yes, let's remove it
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (unrelated change, btw, but something I bumped into, when testing locally)
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I probably wouldn't drop it right away; approximately supporting 7.3.0+ would probably be ideal.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, that's probably best. |
||
| def test_stl_caster_vs_stl_bind(msg): | ||
| """One module uses a generic vector caster from `<pybind11/stl.h>` while the other | ||
| exports `std::vector<int>` via `py:bind_vector` and `py::module_local`""" | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.