[Python-Dev] questions about memory management (original) (raw)

Julia Lawall julia.lawall at lip6.fr
Sat Apr 28 10:06:52 CEST 2012


In Python-3.2.3/Python/import.c, in the function _PyImport_FixupExtensionUnicode, is any call to PyDict_DelItemString needed before the final failure returns?

 modules = PyImport_GetModuleDict();
 if (PyDict_SetItemString(modules, name, mod) < 0)
     return -1;
 if (_PyState_AddModule(mod, def) < 0) {
     PyDict_DelItemString(modules, name);
     return -1;
 }
 if (def->m_size == -1) {
     if (def->m_base.m_copy) {
         /* Somebody already imported the module,
            likely under a different name.
            XXX this should really not happen. */
         Py_DECREF(def->m_base.m_copy);
         def->m_base.m_copy = NULL;
     }
     dict = PyModule_GetDict(mod);
     if (dict == NULL)
         return -1;
     def->m_base.m_copy = PyDict_Copy(dict);
     if (def->m_base.m_copy == NULL)
         return -1;
 }

In Python-3.2.3/Modules/ossaudiodev.c, in the function build_namelists, is it intentional that labels is not freed in the last failure case:

 if (PyModule_AddObject(module, "control_labels", labels) == -1)
     goto error2;
 if (PyModule_AddObject(module, "control_names", names) == -1)
     goto error1;

 return 0;

error2: Py_XDECREF(labels); error1: Py_XDECREF(names); return -1;

thanks, julia



More information about the Python-Dev mailing list