summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2011-03-14 19:54:52 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2011-03-14 19:54:52 (GMT)
commitfe93faf98c0866c20f05dc009a8ac2fecee80692 (patch)
tree42249c67dc2ec193951ddec2baf21823d50ce756
parent98dbba5d209dda5300df549ef26eb4646cb891f0 (diff)
downloadcpython-fe93faf98c0866c20f05dc009a8ac2fecee80692.zip
cpython-fe93faf98c0866c20f05dc009a8ac2fecee80692.tar.gz
cpython-fe93faf98c0866c20f05dc009a8ac2fecee80692.tar.bz2
Issue #3080: Add PyImport_ImportModuleLevelObject() function
Use it for the builtin __import__ function.
-rw-r--r--Doc/c-api/import.rst9
-rw-r--r--Include/import.h7
-rw-r--r--Python/bltinmodule.c11
-rw-r--r--Python/import.c32
4 files changed, 41 insertions, 18 deletions
diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst
index 885a752..cf95486 100644
--- a/Doc/c-api/import.rst
+++ b/Doc/c-api/import.rst
@@ -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)
diff --git a/Include/import.h b/Include/import.h
index 6a62c94..6331edf 100644
--- a/Include/import.h
+++ b/Include/import.h
@@ -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)
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ca40cb0..3074e4c 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -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,
diff --git a/Python/import.c b/Python/import.c
index 6594447..7f9042a 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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,