Home | History | Annotate | Download | only in Objects
      1 
      2 /* Module object implementation */
      3 
      4 #include "Python.h"
      5 #include "structmember.h"
      6 
      7 static Py_ssize_t max_module_number;
      8 
      9 typedef struct {
     10     PyObject_HEAD
     11     PyObject *md_dict;
     12     struct PyModuleDef *md_def;
     13     void *md_state;
     14     PyObject *md_weaklist;
     15     PyObject *md_name;  /* for logging purposes after md_dict is cleared */
     16 } PyModuleObject;
     17 
     18 static PyMemberDef module_members[] = {
     19     {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
     20     {0}
     21 };
     22 
     23 PyTypeObject PyModuleDef_Type = {
     24     PyVarObject_HEAD_INIT(&PyType_Type, 0)
     25     "moduledef",                                /* tp_name */
     26     sizeof(struct PyModuleDef),                 /* tp_size */
     27     0,                                          /* tp_itemsize */
     28 };
     29 
     30 
     31 PyObject*
     32 PyModuleDef_Init(struct PyModuleDef* def)
     33 {
     34     if (PyType_Ready(&PyModuleDef_Type) < 0)
     35          return NULL;
     36     if (def->m_base.m_index == 0) {
     37         max_module_number++;
     38         Py_REFCNT(def) = 1;
     39         Py_TYPE(def) = &PyModuleDef_Type;
     40         def->m_base.m_index = max_module_number;
     41     }
     42     return (PyObject*)def;
     43 }
     44 
     45 static int
     46 module_init_dict(PyModuleObject *mod, PyObject *md_dict,
     47                  PyObject *name, PyObject *doc)
     48 {
     49     _Py_IDENTIFIER(__name__);
     50     _Py_IDENTIFIER(__doc__);
     51     _Py_IDENTIFIER(__package__);
     52     _Py_IDENTIFIER(__loader__);
     53     _Py_IDENTIFIER(__spec__);
     54 
     55     if (md_dict == NULL)
     56         return -1;
     57     if (doc == NULL)
     58         doc = Py_None;
     59 
     60     if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
     61         return -1;
     62     if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
     63         return -1;
     64     if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
     65         return -1;
     66     if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
     67         return -1;
     68     if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
     69         return -1;
     70     if (PyUnicode_CheckExact(name)) {
     71         Py_INCREF(name);
     72         Py_XSETREF(mod->md_name, name);
     73     }
     74 
     75     return 0;
     76 }
     77 
     78 
     79 PyObject *
     80 PyModule_NewObject(PyObject *name)
     81 {
     82     PyModuleObject *m;
     83     m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
     84     if (m == NULL)
     85         return NULL;
     86     m->md_def = NULL;
     87     m->md_state = NULL;
     88     m->md_weaklist = NULL;
     89     m->md_name = NULL;
     90     m->md_dict = PyDict_New();
     91     if (module_init_dict(m, m->md_dict, name, NULL) != 0)
     92         goto fail;
     93     PyObject_GC_Track(m);
     94     return (PyObject *)m;
     95 
     96  fail:
     97     Py_DECREF(m);
     98     return NULL;
     99 }
    100 
    101 PyObject *
    102 PyModule_New(const char *name)
    103 {
    104     PyObject *nameobj, *module;
    105     nameobj = PyUnicode_FromString(name);
    106     if (nameobj == NULL)
    107         return NULL;
    108     module = PyModule_NewObject(nameobj);
    109     Py_DECREF(nameobj);
    110     return module;
    111 }
    112 
    113 /* Check API/ABI version
    114  * Issues a warning on mismatch, which is usually not fatal.
    115  * Returns 0 if an exception is raised.
    116  */
    117 static int
    118 check_api_version(const char *name, int module_api_version)
    119 {
    120     if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
    121         int err;
    122         err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
    123             "Python C API version mismatch for module %.100s: "
    124             "This Python has API version %d, module %.100s has version %d.",
    125              name,
    126              PYTHON_API_VERSION, name, module_api_version);
    127         if (err)
    128             return 0;
    129     }
    130     return 1;
    131 }
    132 
    133 static int
    134 _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
    135 {
    136     PyObject *func;
    137     PyMethodDef *fdef;
    138 
    139     for (fdef = functions; fdef->ml_name != NULL; fdef++) {
    140         if ((fdef->ml_flags & METH_CLASS) ||
    141             (fdef->ml_flags & METH_STATIC)) {
    142             PyErr_SetString(PyExc_ValueError,
    143                             "module functions cannot set"
    144                             " METH_CLASS or METH_STATIC");
    145             return -1;
    146         }
    147         func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
    148         if (func == NULL) {
    149             return -1;
    150         }
    151         if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
    152             Py_DECREF(func);
    153             return -1;
    154         }
    155         Py_DECREF(func);
    156     }
    157 
    158     return 0;
    159 }
    160 
    161 PyObject *
    162 PyModule_Create2(struct PyModuleDef* module, int module_api_version)
    163 {
    164     const char* name;
    165     PyModuleObject *m;
    166     PyInterpreterState *interp = PyThreadState_Get()->interp;
    167     if (interp->modules == NULL)
    168         Py_FatalError("Python import machinery not initialized");
    169     if (!PyModuleDef_Init(module))
    170         return NULL;
    171     name = module->m_name;
    172     if (!check_api_version(name, module_api_version)) {
    173         return NULL;
    174     }
    175     if (module->m_slots) {
    176         PyErr_Format(
    177             PyExc_SystemError,
    178             "module %s: PyModule_Create is incompatible with m_slots", name);
    179         return NULL;
    180     }
    181     /* Make sure name is fully qualified.
    182 
    183        This is a bit of a hack: when the shared library is loaded,
    184        the module name is "package.module", but the module calls
    185        PyModule_Create*() with just "module" for the name.  The shared
    186        library loader squirrels away the true name of the module in
    187        _Py_PackageContext, and PyModule_Create*() will substitute this
    188        (if the name actually matches).
    189     */
    190     if (_Py_PackageContext != NULL) {
    191         char *p = strrchr(_Py_PackageContext, '.');
    192         if (p != NULL && strcmp(module->m_name, p+1) == 0) {
    193             name = _Py_PackageContext;
    194             _Py_PackageContext = NULL;
    195         }
    196     }
    197     if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
    198         return NULL;
    199 
    200     if (module->m_size > 0) {
    201         m->md_state = PyMem_MALLOC(module->m_size);
    202         if (!m->md_state) {
    203             PyErr_NoMemory();
    204             Py_DECREF(m);
    205             return NULL;
    206         }
    207         memset(m->md_state, 0, module->m_size);
    208     }
    209 
    210     if (module->m_methods != NULL) {
    211         if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
    212             Py_DECREF(m);
    213             return NULL;
    214         }
    215     }
    216     if (module->m_doc != NULL) {
    217         if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
    218             Py_DECREF(m);
    219             return NULL;
    220         }
    221     }
    222     m->md_def = module;
    223     return (PyObject*)m;
    224 }
    225 
    226 PyObject *
    227 PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api_version)
    228 {
    229     PyModuleDef_Slot* cur_slot;
    230     PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
    231     PyObject *nameobj;
    232     PyObject *m = NULL;
    233     int has_execution_slots = 0;
    234     char *name;
    235     int ret;
    236 
    237     PyModuleDef_Init(def);
    238 
    239     nameobj = PyObject_GetAttrString(spec, "name");
    240     if (nameobj == NULL) {
    241         return NULL;
    242     }
    243     name = PyUnicode_AsUTF8(nameobj);
    244     if (name == NULL) {
    245         goto error;
    246     }
    247 
    248     if (!check_api_version(name, module_api_version)) {
    249         goto error;
    250     }
    251 
    252     if (def->m_size < 0) {
    253         PyErr_Format(
    254             PyExc_SystemError,
    255             "module %s: m_size may not be negative for multi-phase initialization",
    256             name);
    257         goto error;
    258     }
    259 
    260     for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
    261         if (cur_slot->slot == Py_mod_create) {
    262             if (create) {
    263                 PyErr_Format(
    264                     PyExc_SystemError,
    265                     "module %s has multiple create slots",
    266                     name);
    267                 goto error;
    268             }
    269             create = cur_slot->value;
    270         } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
    271             PyErr_Format(
    272                 PyExc_SystemError,
    273                 "module %s uses unknown slot ID %i",
    274                 name, cur_slot->slot);
    275             goto error;
    276         } else {
    277             has_execution_slots = 1;
    278         }
    279     }
    280 
    281     if (create) {
    282         m = create(spec, def);
    283         if (m == NULL) {
    284             if (!PyErr_Occurred()) {
    285                 PyErr_Format(
    286                     PyExc_SystemError,
    287                     "creation of module %s failed without setting an exception",
    288                     name);
    289             }
    290             goto error;
    291         } else {
    292             if (PyErr_Occurred()) {
    293                 PyErr_Format(PyExc_SystemError,
    294                             "creation of module %s raised unreported exception",
    295                             name);
    296                 goto error;
    297             }
    298         }
    299     } else {
    300         m = PyModule_NewObject(nameobj);
    301         if (m == NULL) {
    302             goto error;
    303         }
    304     }
    305 
    306     if (PyModule_Check(m)) {
    307         ((PyModuleObject*)m)->md_state = NULL;
    308         ((PyModuleObject*)m)->md_def = def;
    309     } else {
    310         if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
    311             PyErr_Format(
    312                 PyExc_SystemError,
    313                 "module %s is not a module object, but requests module state",
    314                 name);
    315             goto error;
    316         }
    317         if (has_execution_slots) {
    318             PyErr_Format(
    319                 PyExc_SystemError,
    320                 "module %s specifies execution slots, but did not create "
    321                     "a ModuleType instance",
    322                 name);
    323             goto error;
    324         }
    325     }
    326 
    327     if (def->m_methods != NULL) {
    328         ret = _add_methods_to_object(m, nameobj, def->m_methods);
    329         if (ret != 0) {
    330             goto error;
    331         }
    332     }
    333 
    334     if (def->m_doc != NULL) {
    335         ret = PyModule_SetDocString(m, def->m_doc);
    336         if (ret != 0) {
    337             goto error;
    338         }
    339     }
    340 
    341     Py_DECREF(nameobj);
    342     return m;
    343 
    344 error:
    345     Py_DECREF(nameobj);
    346     Py_XDECREF(m);
    347     return NULL;
    348 }
    349 
    350 int
    351 PyModule_ExecDef(PyObject *module, PyModuleDef *def)
    352 {
    353     PyModuleDef_Slot *cur_slot;
    354     const char *name;
    355     int ret;
    356 
    357     name = PyModule_GetName(module);
    358     if (name == NULL) {
    359         return -1;
    360     }
    361 
    362     if (def->m_size >= 0) {
    363         PyModuleObject *md = (PyModuleObject*)module;
    364         if (md->md_state == NULL) {
    365             /* Always set a state pointer; this serves as a marker to skip
    366              * multiple initialization (importlib.reload() is no-op) */
    367             md->md_state = PyMem_MALLOC(def->m_size);
    368             if (!md->md_state) {
    369                 PyErr_NoMemory();
    370                 return -1;
    371             }
    372             memset(md->md_state, 0, def->m_size);
    373         }
    374     }
    375 
    376     if (def->m_slots == NULL) {
    377         return 0;
    378     }
    379 
    380     for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
    381         switch (cur_slot->slot) {
    382             case Py_mod_create:
    383                 /* handled in PyModule_FromDefAndSpec2 */
    384                 break;
    385             case Py_mod_exec:
    386                 ret = ((int (*)(PyObject *))cur_slot->value)(module);
    387                 if (ret != 0) {
    388                     if (!PyErr_Occurred()) {
    389                         PyErr_Format(
    390                             PyExc_SystemError,
    391                             "execution of module %s failed without setting an exception",
    392                             name);
    393                     }
    394                     return -1;
    395                 }
    396                 if (PyErr_Occurred()) {
    397                     PyErr_Format(
    398                         PyExc_SystemError,
    399                         "execution of module %s raised unreported exception",
    400                         name);
    401                     return -1;
    402                 }
    403                 break;
    404             default:
    405                 PyErr_Format(
    406                     PyExc_SystemError,
    407                     "module %s initialized with unknown slot %i",
    408                     name, cur_slot->slot);
    409                 return -1;
    410         }
    411     }
    412     return 0;
    413 }
    414 
    415 int
    416 PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
    417 {
    418     int res;
    419     PyObject *name = PyModule_GetNameObject(m);
    420     if (name == NULL) {
    421         return -1;
    422     }
    423 
    424     res = _add_methods_to_object(m, name, functions);
    425     Py_DECREF(name);
    426     return res;
    427 }
    428 
    429 int
    430 PyModule_SetDocString(PyObject *m, const char *doc)
    431 {
    432     PyObject *v;
    433     _Py_IDENTIFIER(__doc__);
    434 
    435     v = PyUnicode_FromString(doc);
    436     if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) {
    437         Py_XDECREF(v);
    438         return -1;
    439     }
    440     Py_DECREF(v);
    441     return 0;
    442 }
    443 
    444 PyObject *
    445 PyModule_GetDict(PyObject *m)
    446 {
    447     PyObject *d;
    448     if (!PyModule_Check(m)) {
    449         PyErr_BadInternalCall();
    450         return NULL;
    451     }
    452     d = ((PyModuleObject *)m) -> md_dict;
    453     assert(d != NULL);
    454     return d;
    455 }
    456 
    457 PyObject*
    458 PyModule_GetNameObject(PyObject *m)
    459 {
    460     _Py_IDENTIFIER(__name__);
    461     PyObject *d;
    462     PyObject *name;
    463     if (!PyModule_Check(m)) {
    464         PyErr_BadArgument();
    465         return NULL;
    466     }
    467     d = ((PyModuleObject *)m)->md_dict;
    468     if (d == NULL ||
    469         (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
    470         !PyUnicode_Check(name))
    471     {
    472         PyErr_SetString(PyExc_SystemError, "nameless module");
    473         return NULL;
    474     }
    475     Py_INCREF(name);
    476     return name;
    477 }
    478 
    479 const char *
    480 PyModule_GetName(PyObject *m)
    481 {
    482     PyObject *name = PyModule_GetNameObject(m);
    483     if (name == NULL)
    484         return NULL;
    485     Py_DECREF(name);   /* module dict has still a reference */
    486     return PyUnicode_AsUTF8(name);
    487 }
    488 
    489 PyObject*
    490 PyModule_GetFilenameObject(PyObject *m)
    491 {
    492     _Py_IDENTIFIER(__file__);
    493     PyObject *d;
    494     PyObject *fileobj;
    495     if (!PyModule_Check(m)) {
    496         PyErr_BadArgument();
    497         return NULL;
    498     }
    499     d = ((PyModuleObject *)m)->md_dict;
    500     if (d == NULL ||
    501         (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
    502         !PyUnicode_Check(fileobj))
    503     {
    504         PyErr_SetString(PyExc_SystemError, "module filename missing");
    505         return NULL;
    506     }
    507     Py_INCREF(fileobj);
    508     return fileobj;
    509 }
    510 
    511 const char *
    512 PyModule_GetFilename(PyObject *m)
    513 {
    514     PyObject *fileobj;
    515     char *utf8;
    516     fileobj = PyModule_GetFilenameObject(m);
    517     if (fileobj == NULL)
    518         return NULL;
    519     utf8 = PyUnicode_AsUTF8(fileobj);
    520     Py_DECREF(fileobj);   /* module dict has still a reference */
    521     return utf8;
    522 }
    523 
    524 PyModuleDef*
    525 PyModule_GetDef(PyObject* m)
    526 {
    527     if (!PyModule_Check(m)) {
    528         PyErr_BadArgument();
    529         return NULL;
    530     }
    531     return ((PyModuleObject *)m)->md_def;
    532 }
    533 
    534 void*
    535 PyModule_GetState(PyObject* m)
    536 {
    537     if (!PyModule_Check(m)) {
    538         PyErr_BadArgument();
    539         return NULL;
    540     }
    541     return ((PyModuleObject *)m)->md_state;
    542 }
    543 
    544 void
    545 _PyModule_Clear(PyObject *m)
    546 {
    547     PyObject *d = ((PyModuleObject *)m)->md_dict;
    548     if (d != NULL)
    549         _PyModule_ClearDict(d);
    550 }
    551 
    552 void
    553 _PyModule_ClearDict(PyObject *d)
    554 {
    555     /* To make the execution order of destructors for global
    556        objects a bit more predictable, we first zap all objects
    557        whose name starts with a single underscore, before we clear
    558        the entire dictionary.  We zap them by replacing them with
    559        None, rather than deleting them from the dictionary, to
    560        avoid rehashing the dictionary (to some extent). */
    561 
    562     Py_ssize_t pos;
    563     PyObject *key, *value;
    564 
    565     /* First, clear only names starting with a single underscore */
    566     pos = 0;
    567     while (PyDict_Next(d, &pos, &key, &value)) {
    568         if (value != Py_None && PyUnicode_Check(key)) {
    569             if (PyUnicode_READ_CHAR(key, 0) == '_' &&
    570                 PyUnicode_READ_CHAR(key, 1) != '_') {
    571                 if (Py_VerboseFlag > 1) {
    572                     const char *s = PyUnicode_AsUTF8(key);
    573                     if (s != NULL)
    574                         PySys_WriteStderr("#   clear[1] %s\n", s);
    575                     else
    576                         PyErr_Clear();
    577                 }
    578                 if (PyDict_SetItem(d, key, Py_None) != 0)
    579                     PyErr_Clear();
    580             }
    581         }
    582     }
    583 
    584     /* Next, clear all names except for __builtins__ */
    585     pos = 0;
    586     while (PyDict_Next(d, &pos, &key, &value)) {
    587         if (value != Py_None && PyUnicode_Check(key)) {
    588             if (PyUnicode_READ_CHAR(key, 0) != '_' ||
    589                 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
    590             {
    591                 if (Py_VerboseFlag > 1) {
    592                     const char *s = PyUnicode_AsUTF8(key);
    593                     if (s != NULL)
    594                         PySys_WriteStderr("#   clear[2] %s\n", s);
    595                     else
    596                         PyErr_Clear();
    597                 }
    598                 if (PyDict_SetItem(d, key, Py_None) != 0)
    599                     PyErr_Clear();
    600             }
    601         }
    602     }
    603 
    604     /* Note: we leave __builtins__ in place, so that destructors
    605        of non-global objects defined in this module can still use
    606        builtins, in particularly 'None'. */
    607 
    608 }
    609 
    610 /* Methods */
    611 
    612 static int
    613 module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
    614 {
    615     static char *kwlist[] = {"name", "doc", NULL};
    616     PyObject *dict, *name = Py_None, *doc = Py_None;
    617     if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
    618                                      kwlist, &name, &doc))
    619         return -1;
    620     dict = m->md_dict;
    621     if (dict == NULL) {
    622         dict = PyDict_New();
    623         if (dict == NULL)
    624             return -1;
    625         m->md_dict = dict;
    626     }
    627     if (module_init_dict(m, dict, name, doc) < 0)
    628         return -1;
    629     return 0;
    630 }
    631 
    632 static void
    633 module_dealloc(PyModuleObject *m)
    634 {
    635     PyObject_GC_UnTrack(m);
    636     if (Py_VerboseFlag && m->md_name) {
    637         PySys_FormatStderr("# destroy %S\n", m->md_name);
    638     }
    639     if (m->md_weaklist != NULL)
    640         PyObject_ClearWeakRefs((PyObject *) m);
    641     if (m->md_def && m->md_def->m_free)
    642         m->md_def->m_free(m);
    643     Py_XDECREF(m->md_dict);
    644     Py_XDECREF(m->md_name);
    645     if (m->md_state != NULL)
    646         PyMem_FREE(m->md_state);
    647     Py_TYPE(m)->tp_free((PyObject *)m);
    648 }
    649 
    650 static PyObject *
    651 module_repr(PyModuleObject *m)
    652 {
    653     PyThreadState *tstate = PyThreadState_GET();
    654     PyInterpreterState *interp = tstate->interp;
    655 
    656     return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
    657 }
    658 
    659 static PyObject*
    660 module_getattro(PyModuleObject *m, PyObject *name)
    661 {
    662     PyObject *attr, *mod_name;
    663     attr = PyObject_GenericGetAttr((PyObject *)m, name);
    664     if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
    665         return attr;
    666     PyErr_Clear();
    667     if (m->md_dict) {
    668         _Py_IDENTIFIER(__name__);
    669         mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
    670         if (mod_name) {
    671             PyErr_Format(PyExc_AttributeError,
    672                         "module '%U' has no attribute '%U'", mod_name, name);
    673             return NULL;
    674         }
    675         else if (PyErr_Occurred()) {
    676             PyErr_Clear();
    677         }
    678     }
    679     PyErr_Format(PyExc_AttributeError,
    680                 "module has no attribute '%U'", name);
    681     return NULL;
    682 }
    683 
    684 static int
    685 module_traverse(PyModuleObject *m, visitproc visit, void *arg)
    686 {
    687     if (m->md_def && m->md_def->m_traverse) {
    688         int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
    689         if (res)
    690             return res;
    691     }
    692     Py_VISIT(m->md_dict);
    693     return 0;
    694 }
    695 
    696 static int
    697 module_clear(PyModuleObject *m)
    698 {
    699     if (m->md_def && m->md_def->m_clear) {
    700         int res = m->md_def->m_clear((PyObject*)m);
    701         if (res)
    702             return res;
    703     }
    704     Py_CLEAR(m->md_dict);
    705     return 0;
    706 }
    707 
    708 static PyObject *
    709 module_dir(PyObject *self, PyObject *args)
    710 {
    711     _Py_IDENTIFIER(__dict__);
    712     PyObject *result = NULL;
    713     PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
    714 
    715     if (dict != NULL) {
    716         if (PyDict_Check(dict))
    717             result = PyDict_Keys(dict);
    718         else {
    719             const char *name = PyModule_GetName(self);
    720             if (name)
    721                 PyErr_Format(PyExc_TypeError,
    722                              "%.200s.__dict__ is not a dictionary",
    723                              name);
    724         }
    725     }
    726 
    727     Py_XDECREF(dict);
    728     return result;
    729 }
    730 
    731 static PyMethodDef module_methods[] = {
    732     {"__dir__", module_dir, METH_NOARGS,
    733      PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
    734     {0}
    735 };
    736 
    737 PyDoc_STRVAR(module_doc,
    738 "module(name[, doc])\n\
    739 \n\
    740 Create a module object.\n\
    741 The name must be a string; the optional doc argument can have any type.");
    742 
    743 PyTypeObject PyModule_Type = {
    744     PyVarObject_HEAD_INIT(&PyType_Type, 0)
    745     "module",                                   /* tp_name */
    746     sizeof(PyModuleObject),                     /* tp_size */
    747     0,                                          /* tp_itemsize */
    748     (destructor)module_dealloc,                 /* tp_dealloc */
    749     0,                                          /* tp_print */
    750     0,                                          /* tp_getattr */
    751     0,                                          /* tp_setattr */
    752     0,                                          /* tp_reserved */
    753     (reprfunc)module_repr,                      /* tp_repr */
    754     0,                                          /* tp_as_number */
    755     0,                                          /* tp_as_sequence */
    756     0,                                          /* tp_as_mapping */
    757     0,                                          /* tp_hash */
    758     0,                                          /* tp_call */
    759     0,                                          /* tp_str */
    760     (getattrofunc)module_getattro,              /* tp_getattro */
    761     PyObject_GenericSetAttr,                    /* tp_setattro */
    762     0,                                          /* tp_as_buffer */
    763     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
    764         Py_TPFLAGS_BASETYPE,                    /* tp_flags */
    765     module_doc,                                 /* tp_doc */
    766     (traverseproc)module_traverse,              /* tp_traverse */
    767     (inquiry)module_clear,                      /* tp_clear */
    768     0,                                          /* tp_richcompare */
    769     offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
    770     0,                                          /* tp_iter */
    771     0,                                          /* tp_iternext */
    772     module_methods,                             /* tp_methods */
    773     module_members,                             /* tp_members */
    774     0,                                          /* tp_getset */
    775     0,                                          /* tp_base */
    776     0,                                          /* tp_dict */
    777     0,                                          /* tp_descr_get */
    778     0,                                          /* tp_descr_set */
    779     offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
    780     (initproc)module_init,                      /* tp_init */
    781     PyType_GenericAlloc,                        /* tp_alloc */
    782     PyType_GenericNew,                          /* tp_new */
    783     PyObject_GC_Del,                            /* tp_free */
    784 };
    785