summaryrefslogtreecommitdiff
path: root/Python/importdl.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-11-28 19:09:45 +0100
committerAntoine Pitrou <solipsis@pitrou.net>2011-11-28 19:09:45 +0100
commit3a852cd214d726eb2bb96f94e498eda7ba042887 (patch)
tree71081d83765f4c721093b504ca9bd3b7673d41cd /Python/importdl.c
parent07ee349b41ca8f94aadaf39be3ec9ca5aca692f9 (diff)
parent07b3714e5b40f0208a7640d315213a479d3742a0 (diff)
downloadcpython-3a852cd214d726eb2bb96f94e498eda7ba042887.tar.gz
Issue #7111: Python can now be run without a stdin, stdout or stderr stream.
It was already the case with Python 2. However, the corresponding sys module entries are now set to None (instead of an unusable file object).
Diffstat (limited to 'Python/importdl.c')
-rw-r--r--Python/importdl.c84
1 files changed, 52 insertions, 32 deletions
diff --git a/Python/importdl.c b/Python/importdl.c
index 9caed453aa..9127d61de3 100644
--- a/Python/importdl.c
+++ b/Python/importdl.c
@@ -12,49 +12,71 @@
#include "importdl.h"
-extern dl_funcptr _PyImport_GetDynLoadFunc(const char *name,
- const char *shortname,
+#ifdef MS_WINDOWS
+extern dl_funcptr _PyImport_GetDynLoadWindows(const char *shortname,
+ PyObject *pathname, FILE *fp);
+#else
+extern dl_funcptr _PyImport_GetDynLoadFunc(const char *shortname,
const char *pathname, FILE *fp);
-
-
+#endif
PyObject *
-_PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
+_PyImport_LoadDynamicModule(PyObject *name, PyObject *path, FILE *fp)
{
- PyObject *m;
- PyObject *path;
- char *lastdot, *shortname, *packagecontext, *oldcontext;
+ PyObject *m = NULL;
+#ifndef MS_WINDOWS
+ PyObject *pathbytes;
+#endif
+ PyObject *nameascii;
+ char *namestr, *lastdot, *shortname, *packagecontext, *oldcontext;
dl_funcptr p0;
PyObject* (*p)(void);
struct PyModuleDef *def;
- PyObject *result;
- path = PyUnicode_DecodeFSDefault(pathname);
- if (path == NULL)
- return NULL;
-
- if ((m = _PyImport_FindExtensionUnicode(name, path)) != NULL) {
+ m = _PyImport_FindExtensionObject(name, path);
+ if (m != NULL) {
Py_INCREF(m);
- result = m;
- goto finally;
+ return m;
}
- lastdot = strrchr(name, '.');
+
+ /* name must be encodable to ASCII because dynamic module must have a
+ function called "PyInit_NAME", they are written in C, and the C language
+ doesn't accept non-ASCII identifiers. */
+ nameascii = PyUnicode_AsEncodedString(name, "ascii", NULL);
+ if (nameascii == NULL)
+ return NULL;
+
+ namestr = PyBytes_AS_STRING(nameascii);
+ if (namestr == NULL)
+ goto error;
+
+ lastdot = strrchr(namestr, '.');
if (lastdot == NULL) {
packagecontext = NULL;
- shortname = name;
+ shortname = namestr;
}
else {
- packagecontext = name;
+ packagecontext = namestr;
shortname = lastdot+1;
}
- p0 = _PyImport_GetDynLoadFunc(name, shortname, pathname, fp);
+#ifdef MS_WINDOWS
+ p0 = _PyImport_GetDynLoadWindows(shortname, path, fp);
+#else
+ pathbytes = PyUnicode_EncodeFSDefault(path);
+ if (pathbytes == NULL)
+ goto error;
+ p0 = _PyImport_GetDynLoadFunc(shortname,
+ PyBytes_AS_STRING(pathbytes), fp);
+ Py_DECREF(pathbytes);
+#endif
p = (PyObject*(*)(void))p0;
if (PyErr_Occurred())
goto error;
if (p == NULL) {
PyErr_Format(PyExc_ImportError,
- "dynamic module does not define init function (PyInit_%.200s)",
+ "dynamic module does not define init function"
+ " (PyInit_%s)",
shortname);
goto error;
}
@@ -66,7 +88,6 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
goto error;
if (PyErr_Occurred()) {
- Py_DECREF(m);
PyErr_Format(PyExc_SystemError,
"initialization of %s raised unreported exception",
shortname);
@@ -83,20 +104,19 @@ _PyImport_LoadDynamicModule(char *name, char *pathname, FILE *fp)
else
Py_INCREF(path);
- if (_PyImport_FixupExtensionUnicode(m, name, path) < 0)
+ if (_PyImport_FixupExtensionObject(m, name, path) < 0)
goto error;
if (Py_VerboseFlag)
- PySys_WriteStderr(
- "import %s # dynamically loaded from %s\n",
- name, pathname);
- result = m;
- goto finally;
+ PySys_FormatStderr(
+ "import %U # dynamically loaded from %R\n",
+ name, path);
+ Py_DECREF(nameascii);
+ return m;
error:
- result = NULL;
-finally:
- Py_DECREF(path);
- return result;
+ Py_DECREF(nameascii);
+ Py_XDECREF(m);
+ return NULL;
}
#endif /* HAVE_DYNAMIC_LOADING */