]> granicus.if.org Git - python/commitdiff
Issue #3080: Add PyModule_NewObject() function
authorVictor Stinner <victor.stinner@haypocalc.com>
Fri, 4 Mar 2011 12:57:07 +0000 (12:57 +0000)
committerVictor Stinner <victor.stinner@haypocalc.com>
Fri, 4 Mar 2011 12:57:07 +0000 (12:57 +0000)
Doc/c-api/module.rst
Include/moduleobject.h
Objects/moduleobject.c

index a31046ce27d501e71f29f478527539dbe8dc30c1..b914068a1ff54f1e879e807af1538bf4053c26f7 100644 (file)
@@ -29,7 +29,7 @@ There are only a few functions special to module objects.
    :c:data:`PyModule_Type`.
 
 
-.. c:function:: PyObject* PyModule_New(const char *name)
+.. c:function:: PyObject* PyModule_NewObject(PyObject *name)
 
    .. index::
       single: __name__ (module attribute)
@@ -40,6 +40,14 @@ There are only a few functions special to module objects.
    Only the module's :attr:`__doc__` and :attr:`__name__` attributes are filled in;
    the caller is responsible for providing a :attr:`__file__` attribute.
 
+   .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyModule_New(const char *name)
+
+   Similar to :c:func:`PyImport_NewObject`, but the name is an UTF-8 encoded
+   string instead of a Unicode object.
+
 
 .. c:function:: PyObject* PyModule_GetDict(PyObject *module)
 
index 79ca7ec74aca3bce4881881db3bf05122a3b165e..8013dd9b484aa94f1766c868337d907dd31367be 100644 (file)
@@ -12,6 +12,9 @@ PyAPI_DATA(PyTypeObject) PyModule_Type;
 #define PyModule_Check(op) PyObject_TypeCheck(op, &PyModule_Type)
 #define PyModule_CheckExact(op) (Py_TYPE(op) == &PyModule_Type)
 
+PyAPI_FUNC(PyObject *) PyModule_NewObject(
+    PyObject *name
+    );
 PyAPI_FUNC(PyObject *) PyModule_New(
     const char *name            /* UTF-8 encoded string */
     );
index 103ac8314270eeadc2245b135ca02439812a6423..06f58d80d74416801003018222193dea131bd15f 100644 (file)
@@ -27,35 +27,44 @@ static PyTypeObject moduledef_type = {
 
 
 PyObject *
-PyModule_New(const char *name)
+PyModule_NewObject(PyObject *name)
 {
     PyModuleObject *m;
-    PyObject *nameobj;
     m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
     if (m == NULL)
         return NULL;
     m->md_def = NULL;
     m->md_state = NULL;
-    nameobj = PyUnicode_FromString(name);
     m->md_dict = PyDict_New();
-    if (m->md_dict == NULL || nameobj == NULL)
+    if (m->md_dict == NULL)
         goto fail;
-    if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
+    if (PyDict_SetItemString(m->md_dict, "__name__", name) != 0)
         goto fail;
     if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
         goto fail;
     if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
         goto fail;
-    Py_DECREF(nameobj);
     PyObject_GC_Track(m);
     return (PyObject *)m;
 
  fail:
-    Py_XDECREF(nameobj);
     Py_DECREF(m);
     return NULL;
 }
 
+PyObject *
+PyModule_New(const char *name)
+{
+    PyObject *nameobj, *module;
+    nameobj = PyUnicode_FromString(name);
+    if (nameobj == NULL)
+        return NULL;
+    module = PyModule_NewObject(nameobj);
+    Py_DECREF(nameobj);
+    return module;
+}
+
+
 PyObject *
 PyModule_Create2(struct PyModuleDef* module, int module_api_version)
 {