diff options
Diffstat (limited to 'Objects/moduleobject.c')
| -rw-r--r-- | Objects/moduleobject.c | 53 | 
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 | | 
