summaryrefslogtreecommitdiffstats
path: root/Objects/moduleobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/moduleobject.c')
-rw-r--r--Objects/moduleobject.c53
1 files changed, 43 insertions, 10 deletions
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
index f509932..441e731 100644
--- a/Objects/moduleobject.c
+++ b/Objects/moduleobject.c
@@ -32,20 +32,26 @@ static int
module_init_dict(PyModuleObject *mod, PyObject *md_dict,
PyObject *name, PyObject *doc)
{
+ _Py_IDENTIFIER(__name__);
+ _Py_IDENTIFIER(__doc__);
+ _Py_IDENTIFIER(__package__);
+ _Py_IDENTIFIER(__loader__);
+ _Py_IDENTIFIER(__spec__);
+
if (md_dict == NULL)
return -1;
if (doc == NULL)
doc = Py_None;
- if (PyDict_SetItemString(md_dict, "__name__", name) != 0)
+ if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
return -1;
- if (PyDict_SetItemString(md_dict, "__doc__", doc) != 0)
+ if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
return -1;
- if (PyDict_SetItemString(md_dict, "__package__", Py_None) != 0)
+ if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
return -1;
- if (PyDict_SetItemString(md_dict, "__loader__", Py_None) != 0)
+ if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
return -1;
- if (PyDict_SetItemString(md_dict, "__spec__", Py_None) != 0)
+ if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
return -1;
if (PyUnicode_CheckExact(name)) {
Py_INCREF(name);
@@ -184,8 +190,9 @@ PyModule_Create2(struct PyModuleDef* module, int module_api_version)
Py_DECREF(n);
}
if (module->m_doc != NULL) {
+ _Py_IDENTIFIER(__doc__);
v = PyUnicode_FromString(module->m_doc);
- if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
+ if (v == NULL || _PyDict_SetItemId(d, &PyId___doc__, v) != 0) {
Py_XDECREF(v);
Py_DECREF(m);
return NULL;
@@ -214,6 +221,7 @@ PyModule_GetDict(PyObject *m)
PyObject*
PyModule_GetNameObject(PyObject *m)
{
+ _Py_IDENTIFIER(__name__);
PyObject *d;
PyObject *name;
if (!PyModule_Check(m)) {
@@ -222,7 +230,7 @@ PyModule_GetNameObject(PyObject *m)
}
d = ((PyModuleObject *)m)->md_dict;
if (d == NULL ||
- (name = PyDict_GetItemString(d, "__name__")) == NULL ||
+ (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
!PyUnicode_Check(name))
{
PyErr_SetString(PyExc_SystemError, "nameless module");
@@ -245,6 +253,7 @@ PyModule_GetName(PyObject *m)
PyObject*
PyModule_GetFilenameObject(PyObject *m)
{
+ _Py_IDENTIFIER(__file__);
PyObject *d;
PyObject *fileobj;
if (!PyModule_Check(m)) {
@@ -253,7 +262,7 @@ PyModule_GetFilenameObject(PyObject *m)
}
d = ((PyModuleObject *)m)->md_dict;
if (d == NULL ||
- (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
+ (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
!PyUnicode_Check(fileobj))
{
PyErr_SetString(PyExc_SystemError, "module filename missing");
@@ -411,6 +420,31 @@ module_repr(PyModuleObject *m)
return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
}
+static PyObject*
+module_getattro(PyModuleObject *m, PyObject *name)
+{
+ PyObject *attr, *mod_name;
+ attr = PyObject_GenericGetAttr((PyObject *)m, name);
+ if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
+ return attr;
+ PyErr_Clear();
+ if (m->md_dict) {
+ _Py_IDENTIFIER(__name__);
+ mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
+ if (mod_name) {
+ PyErr_Format(PyExc_AttributeError,
+ "module '%U' has no attribute '%U'", mod_name, name);
+ return NULL;
+ }
+ else if (PyErr_Occurred()) {
+ PyErr_Clear();
+ }
+ }
+ PyErr_Format(PyExc_AttributeError,
+ "module has no attribute '%U'", name);
+ return NULL;
+}
+
static int
module_traverse(PyModuleObject *m, visitproc visit, void *arg)
{
@@ -464,7 +498,6 @@ static PyMethodDef module_methods[] = {
{0}
};
-
PyDoc_STRVAR(module_doc,
"module(name[, doc])\n\
\n\
@@ -488,7 +521,7 @@ PyTypeObject PyModule_Type = {
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
- PyObject_GenericGetAttr, /* tp_getattro */
+ (getattrofunc)module_getattro, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |