]> granicus.if.org Git - python/commitdiff
Issue #3080: Add PyImport_ImportModuleLevelObject() function
authorVictor Stinner <victor.stinner@haypocalc.com>
Mon, 14 Mar 2011 19:54:52 +0000 (15:54 -0400)
committerVictor Stinner <victor.stinner@haypocalc.com>
Mon, 14 Mar 2011 19:54:52 +0000 (15:54 -0400)
Use it for the builtin __import__ function.

Doc/c-api/import.rst
Include/import.h
Python/bltinmodule.c
Python/import.c

index 885a752fea0aadba9c2c75e2c074376b7d081a80..cf954862f6a72ad07a108cfc55cccbbeeb97460d 100644 (file)
@@ -57,7 +57,7 @@ Importing Modules
    :c:func:`PyImport_ImportModule`.
 
 
-.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
+.. c:function:: PyObject* PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
 
    Import a module.  This is best described by referring to the built-in Python
    function :func:`__import__`, as the standard :func:`__import__` function calls
@@ -68,6 +68,13 @@ Importing Modules
    the return value when a submodule of a package was requested is normally the
    top-level package, unless a non-empty *fromlist* was given.
 
+   .. versionadded:: 3.3
+
+
+.. c:function:: PyObject* PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level)
+
+   Similar to :c:func:`PyImport_ImportModuleLevelObject`, but the name is an
+   UTF-8 encoded string instead of a Unicode object.
 
 .. c:function:: PyObject* PyImport_Import(PyObject *name)
 
index 6a62c94c6860f3acfdead7d9585a028ad32e0990..6331edf7efe6b805f712219fec0c396695408ed2 100644 (file)
@@ -50,6 +50,13 @@ PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevel(
     PyObject *fromlist,
     int level
     );
+PyAPI_FUNC(PyObject *) PyImport_ImportModuleLevelObject(
+    PyObject *name,
+    PyObject *globals,
+    PyObject *locals,
+    PyObject *fromlist,
+    int level
+    );
 
 #define PyImport_ImportModuleEx(n, g, l, f) \
     PyImport_ImportModuleLevel(n, g, l, f, -1)
index ca40cb07dce28e4ffbf5513965c09d9d1b66bb96..3074e4cb63cc5c97f709b5b6c3031328616968cb 100644 (file)
@@ -155,17 +155,14 @@ builtin___import__(PyObject *self, PyObject *args, PyObject *kwds)
 {
     static char *kwlist[] = {"name", "globals", "locals", "fromlist",
                              "level", 0};
-    char *name;
-    PyObject *globals = NULL;
-    PyObject *locals = NULL;
-    PyObject *fromlist = NULL;
+    PyObject *name, *globals = NULL, *locals = NULL, *fromlist = NULL;
     int level = -1;
 
-    if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|OOOi:__import__",
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|OOOi:__import__",
                     kwlist, &name, &globals, &locals, &fromlist, &level))
         return NULL;
-    return PyImport_ImportModuleLevel(name, globals, locals,
-                                      fromlist, level);
+    return PyImport_ImportModuleLevelObject(name, globals, locals,
+                                            fromlist, level);
 }
 
 PyDoc_STRVAR(import_doc,
index 65944473ccbe2a8b8110340234beedfb87bfb997..7f9042ac016780a9d3c9c7976f59f990d2933692 100644 (file)
@@ -2753,25 +2753,37 @@ import_module_level(PyObject *name, PyObject *globals, PyObject *locals,
 }
 
 PyObject *
-PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
-                           PyObject *fromlist, int level)
+PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
+                                 PyObject *locals, PyObject *fromlist,
+                                 int level)
 {
-    PyObject *nameobj, *result;
-    nameobj = PyUnicode_FromString(name);
-    if (nameobj == NULL)
-        return NULL;
+    PyObject *mod;
     _PyImport_AcquireLock();
-    result = import_module_level(nameobj, globals, locals, fromlist, level);
-    Py_DECREF(nameobj);
+    mod = import_module_level(name, globals, locals, fromlist, level);
     if (_PyImport_ReleaseLock() < 0) {
-        Py_XDECREF(result);
+        Py_XDECREF(mod);
         PyErr_SetString(PyExc_RuntimeError,
                         "not holding the import lock");
         return NULL;
     }
-    return result;
+    return mod;
+}
+
+PyObject *
+PyImport_ImportModuleLevel(char *name, PyObject *globals, PyObject *locals,
+                           PyObject *fromlist, int level)
+{
+    PyObject *nameobj, *mod;
+    nameobj = PyUnicode_FromString(name);
+    if (nameobj == NULL)
+        return NULL;
+    mod = PyImport_ImportModuleLevelObject(nameobj, globals, locals,
+                                           fromlist, level);
+    Py_DECREF(nameobj);
+    return mod;
 }
 
+
 /* Return the package that an import is being performed in.  If globals comes
    from the module foo.bar.bat (not itself a package), this returns the
    sys.modules entry for foo.bar.  If globals is from a package's __init__.py,