summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Objects/moduleobject.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Objects/moduleobject.c
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Objects/moduleobject.c')
-rw-r--r--contrib/tools/python3/src/Objects/moduleobject.c153
1 files changed, 119 insertions, 34 deletions
diff --git a/contrib/tools/python3/src/Objects/moduleobject.c b/contrib/tools/python3/src/Objects/moduleobject.c
index ee4ed97588e..b69e5cedbb5 100644
--- a/contrib/tools/python3/src/Objects/moduleobject.c
+++ b/contrib/tools/python3/src/Objects/moduleobject.c
@@ -4,6 +4,7 @@
#include "Python.h"
#include "pycore_interp.h" // PyInterpreterState.importlib
#include "pycore_pystate.h" // _PyInterpreterState_GET()
+#include "pycore_moduleobject.h" // _PyModule_GetDef()
#include "structmember.h" // PyMemberDef
static Py_ssize_t max_module_number;
@@ -11,15 +12,9 @@ static Py_ssize_t max_module_number;
_Py_IDENTIFIER(__doc__);
_Py_IDENTIFIER(__name__);
_Py_IDENTIFIER(__spec__);
-
-typedef struct {
- PyObject_HEAD
- PyObject *md_dict;
- struct PyModuleDef *md_def;
- void *md_state;
- PyObject *md_weaklist;
- PyObject *md_name; /* for logging purposes after md_dict is cleared */
-} PyModuleObject;
+_Py_IDENTIFIER(__dict__);
+_Py_IDENTIFIER(__dir__);
+_Py_IDENTIFIER(__annotations__);
static PyMemberDef module_members[] = {
{"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
@@ -35,6 +30,19 @@ PyTypeObject PyModuleDef_Type = {
};
+int
+_PyModule_IsExtension(PyObject *obj)
+{
+ if (!PyModule_Check(obj)) {
+ return 0;
+ }
+ PyModuleObject *module = (PyModuleObject*)obj;
+
+ struct PyModuleDef *def = module->md_def;
+ return (def != NULL && def->m_methods != NULL);
+}
+
+
PyObject*
PyModuleDef_Init(struct PyModuleDef* def)
{
@@ -211,7 +219,7 @@ _PyModule_CreateInitialized(struct PyModuleDef* module, int module_api_version)
return NULL;
if (module->m_size > 0) {
- m->md_state = PyMem_MALLOC(module->m_size);
+ m->md_state = PyMem_Malloc(module->m_size);
if (!m->md_state) {
PyErr_NoMemory();
Py_DECREF(m);
@@ -377,7 +385,7 @@ PyModule_ExecDef(PyObject *module, PyModuleDef *def)
if (md->md_state == NULL) {
/* Always set a state pointer; this serves as a marker to skip
* multiple initialization (importlib.reload() is no-op) */
- md->md_state = PyMem_MALLOC(def->m_size);
+ md->md_state = PyMem_Malloc(def->m_size);
if (!md->md_state) {
PyErr_NoMemory();
return -1;
@@ -456,14 +464,11 @@ PyModule_SetDocString(PyObject *m, const char *doc)
PyObject *
PyModule_GetDict(PyObject *m)
{
- PyObject *d;
if (!PyModule_Check(m)) {
PyErr_BadInternalCall();
return NULL;
}
- d = ((PyModuleObject *)m) -> md_dict;
- assert(d != NULL);
- return d;
+ return _PyModule_GetDict(m);
}
PyObject*
@@ -476,11 +481,13 @@ PyModule_GetNameObject(PyObject *m)
return NULL;
}
d = ((PyModuleObject *)m)->md_dict;
- if (d == NULL ||
- (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
+ if (d == NULL || !PyDict_Check(d) ||
+ (name = _PyDict_GetItemIdWithError(d, &PyId___name__)) == NULL ||
!PyUnicode_Check(name))
{
- PyErr_SetString(PyExc_SystemError, "nameless module");
+ if (!PyErr_Occurred()) {
+ PyErr_SetString(PyExc_SystemError, "nameless module");
+ }
return NULL;
}
Py_INCREF(name);
@@ -509,10 +516,12 @@ PyModule_GetFilenameObject(PyObject *m)
}
d = ((PyModuleObject *)m)->md_dict;
if (d == NULL ||
- (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
+ (fileobj = _PyDict_GetItemIdWithError(d, &PyId___file__)) == NULL ||
!PyUnicode_Check(fileobj))
{
- PyErr_SetString(PyExc_SystemError, "module filename missing");
+ if (!PyErr_Occurred()) {
+ PyErr_SetString(PyExc_SystemError, "module filename missing");
+ }
return NULL;
}
Py_INCREF(fileobj);
@@ -539,7 +548,7 @@ PyModule_GetDef(PyObject* m)
PyErr_BadArgument();
return NULL;
}
- return ((PyModuleObject *)m)->md_def;
+ return _PyModule_GetDef(m);
}
void*
@@ -549,7 +558,7 @@ PyModule_GetState(PyObject* m)
PyErr_BadArgument();
return NULL;
}
- return ((PyModuleObject *)m)->md_state;
+ return _PyModule_GetState(m);
}
void
@@ -677,7 +686,7 @@ module_dealloc(PyModuleObject *m)
Py_XDECREF(m->md_dict);
Py_XDECREF(m->md_name);
if (m->md_state != NULL)
- PyMem_FREE(m->md_state);
+ PyMem_Free(m->md_state);
Py_TYPE(m)->tp_free((PyObject *)m);
}
@@ -721,14 +730,21 @@ module_getattro(PyModuleObject *m, PyObject *name)
PyErr_Clear();
if (m->md_dict) {
_Py_IDENTIFIER(__getattr__);
- getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__);
+ getattr = _PyDict_GetItemIdWithError(m->md_dict, &PyId___getattr__);
if (getattr) {
return PyObject_CallOneArg(getattr, name);
}
- mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
+ if (PyErr_Occurred()) {
+ return NULL;
+ }
+ mod_name = _PyDict_GetItemIdWithError(m->md_dict, &PyId___name__);
if (mod_name && PyUnicode_Check(mod_name)) {
Py_INCREF(mod_name);
- PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__);
+ PyObject *spec = _PyDict_GetItemIdWithError(m->md_dict, &PyId___spec__);
+ if (spec == NULL && PyErr_Occurred()) {
+ Py_DECREF(mod_name);
+ return NULL;
+ }
Py_XINCREF(spec);
if (_PyModuleSpec_IsInitializing(spec)) {
PyErr_Format(PyExc_AttributeError,
@@ -746,6 +762,9 @@ module_getattro(PyModuleObject *m, PyObject *name)
Py_DECREF(mod_name);
return NULL;
}
+ else if (PyErr_Occurred()) {
+ return NULL;
+ }
}
PyErr_Format(PyExc_AttributeError,
"module has no attribute '%U'", name);
@@ -791,8 +810,6 @@ module_clear(PyModuleObject *m)
static PyObject *
module_dir(PyObject *self, PyObject *args)
{
- _Py_IDENTIFIER(__dict__);
- _Py_IDENTIFIER(__dir__);
PyObject *result = NULL;
PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
@@ -807,11 +824,7 @@ module_dir(PyObject *self, PyObject *args)
}
}
else {
- const char *name = PyModule_GetName(self);
- if (name)
- PyErr_Format(PyExc_TypeError,
- "%.200s.__dict__ is not a dictionary",
- name);
+ PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
}
}
@@ -825,6 +838,78 @@ static PyMethodDef module_methods[] = {
{0}
};
+static PyObject *
+module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
+{
+ PyObject *dict = _PyObject_GetAttrId((PyObject *)m, &PyId___dict__);
+
+ if ((dict == NULL) || !PyDict_Check(dict)) {
+ PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
+ Py_XDECREF(dict);
+ return NULL;
+ }
+
+ PyObject *annotations;
+ /* there's no _PyDict_GetItemId without WithError, so let's LBYL. */
+ if (_PyDict_ContainsId(dict, &PyId___annotations__)) {
+ annotations = _PyDict_GetItemIdWithError(dict, &PyId___annotations__);
+ /*
+ ** _PyDict_GetItemIdWithError could still fail,
+ ** for instance with a well-timed Ctrl-C or a MemoryError.
+ ** so let's be totally safe.
+ */
+ if (annotations) {
+ Py_INCREF(annotations);
+ }
+ } else {
+ annotations = PyDict_New();
+ if (annotations) {
+ int result = _PyDict_SetItemId(dict, &PyId___annotations__, annotations);
+ if (result) {
+ Py_CLEAR(annotations);
+ }
+ }
+ }
+ Py_DECREF(dict);
+ return annotations;
+}
+
+static int
+module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored))
+{
+ int ret = -1;
+ PyObject *dict = _PyObject_GetAttrId((PyObject *)m, &PyId___dict__);
+
+ if ((dict == NULL) || !PyDict_Check(dict)) {
+ PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
+ goto exit;
+ }
+
+ if (value != NULL) {
+ /* set */
+ ret = _PyDict_SetItemId(dict, &PyId___annotations__, value);
+ goto exit;
+ }
+
+ /* delete */
+ if (!_PyDict_ContainsId(dict, &PyId___annotations__)) {
+ PyErr_Format(PyExc_AttributeError, "__annotations__");
+ goto exit;
+ }
+
+ ret = _PyDict_DelItemId(dict, &PyId___annotations__);
+
+exit:
+ Py_XDECREF(dict);
+ return ret;
+}
+
+
+static PyGetSetDef module_getsets[] = {
+ {"__annotations__", (getter)module_get_annotations, (setter)module_set_annotations},
+ {NULL}
+};
+
PyTypeObject PyModule_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"module", /* tp_name */
@@ -856,7 +941,7 @@ PyTypeObject PyModule_Type = {
0, /* tp_iternext */
module_methods, /* tp_methods */
module_members, /* tp_members */
- 0, /* tp_getset */
+ module_getsets, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */