summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-06-10 16:43:10 (GMT)
committerGitHub <noreply@github.com>2020-06-10 16:43:10 (GMT)
commit9419158a3e67ba2eadf33215568003ed723b0a98 (patch)
tree220e7e768c66fa0710d7a7fd4445d10ac1395d0f
parent3b97d1becbe08cf56c58d9c740a4622cbf6285fd (diff)
downloadcpython-9419158a3e67ba2eadf33215568003ed723b0a98.zip
cpython-9419158a3e67ba2eadf33215568003ed723b0a98.tar.gz
cpython-9419158a3e67ba2eadf33215568003ed723b0a98.tar.bz2
bpo-40703: Let PyType_FromSpec() set "type.__module__" only if it is not set yet. (GH-20273) (GH-20782)
(cherry picked from commit 24b8bad6d30ae4fb37ee686a073adfa5308659f9)
-rw-r--r--Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst2
-rw-r--r--Objects/typeobject.c35
2 files changed, 22 insertions, 15 deletions
diff --git a/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst b/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst
new file mode 100644
index 0000000..5385a2d
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2020-05-20-19-11-12.bpo-40703.qQXfW8.rst
@@ -0,0 +1,2 @@
+The PyType_FromSpec*() functions no longer overwrite the type's "__module__" attribute
+if it is set via "Py_tp_members" or "Py_tp_getset".
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index 4891cf4..e52e21d 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -3061,23 +3061,28 @@ PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
}
/* Set type.__module__ */
- s = strrchr(spec->name, '.');
- if (s != NULL) {
- int err;
- modname = PyUnicode_FromStringAndSize(
- spec->name, (Py_ssize_t)(s - spec->name));
- if (modname == NULL) {
+ if (_PyDict_GetItemIdWithError(type->tp_dict, &PyId___module__) == NULL) {
+ if (PyErr_Occurred()) {
goto fail;
}
- err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname);
- Py_DECREF(modname);
- if (err != 0)
- goto fail;
- } else {
- if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
- "builtin type %.200s has no __module__ attribute",
- spec->name))
- goto fail;
+ s = strrchr(spec->name, '.');
+ if (s != NULL) {
+ int err;
+ modname = PyUnicode_FromStringAndSize(
+ spec->name, (Py_ssize_t)(s - spec->name));
+ if (modname == NULL) {
+ goto fail;
+ }
+ err = _PyDict_SetItemId(type->tp_dict, &PyId___module__, modname);
+ Py_DECREF(modname);
+ if (err != 0)
+ goto fail;
+ } else {
+ if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
+ "builtin type %.200s has no __module__ attribute",
+ spec->name))
+ goto fail;
+ }
}
return (PyObject*)res;