diff Python/import.c @ 23879:08475c87d24f legacy-trunk

Apply diff2.txt from SF patch http://www.python.org/sf/566999 This patch enhances Python/import.c/find_module() so that unicode objects found in sys.path will be treated as legal directory names (The current code ignores anything that is not a str). The unicode name is converted to str using Py_FileSystemDefaultEncoding.
author Walter Dörwald <walter@livinglogic.de>
date Mon, 17 Jun 2002 10:43:59 +0000
parents d6ae544acd24
children 8142f8d668a0
line wrap: on
line diff
--- a/Python/import.c	Mon Jun 17 07:07:20 2002 +0000
+++ b/Python/import.c	Mon Jun 17 10:43:59 2002 +0000
@@ -969,15 +969,30 @@
 	npath = PyList_Size(path);
 	namelen = strlen(name);
 	for (i = 0; i < npath; i++) {
+		PyObject *copy = NULL;
 		PyObject *v = PyList_GetItem(path, i);
+#ifdef Py_USING_UNICODE
+		if (PyUnicode_Check(v)) {
+			copy = PyUnicode_Encode(PyUnicode_AS_UNICODE(v),
+				PyUnicode_GET_SIZE(v), Py_FileSystemDefaultEncoding, NULL);
+			if (copy == NULL)
+				return NULL;
+			v = copy;
+		}
+		else
+#endif
 		if (!PyString_Check(v))
 			continue;
 		len = PyString_Size(v);
-		if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen)
+		if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
+			Py_XDECREF(copy);
 			continue; /* Too long */
+		}
 		strcpy(buf, PyString_AsString(v));
-		if (strlen(buf) != len)
+		if (strlen(buf) != len) {
+			Py_XDECREF(copy);
 			continue; /* v contains '\0' */
+		}
 #ifdef macintosh
 		/*
 		** Speedup: each sys.path item is interned, and
@@ -991,12 +1006,14 @@
 			static struct filedescr resfiledescr =
 				{"", "", PY_RESOURCE};
 
+			Py_XDECREF(copy);
 			return &resfiledescr;
 		}
 		if (PyMac_FindCodeResourceModule((PyStringObject *)v, name, buf)) {
 			static struct filedescr resfiledescr =
 				{"", "", PY_CODERESOURCE};
 
+			Py_XDECREF(copy);
 			return &resfiledescr;
 		}
 #endif
@@ -1012,18 +1029,22 @@
 		/* Check for package import (buf holds a directory name,
 		   and there's an __init__ module in that directory */
 #ifdef HAVE_STAT
-		if (stat(buf, &statbuf) == 0 &&       /* it exists */
-		    S_ISDIR(statbuf.st_mode) &&       /* it's a directory */
-		    find_init_module(buf) &&          /* it has __init__.py */
-		    case_ok(buf, len, namelen, name)) /* and case matches */
+		if (stat(buf, &statbuf) == 0 &&         /* it exists */
+		    S_ISDIR(statbuf.st_mode) &&         /* it's a directory */
+		    find_init_module(buf) &&            /* it has __init__.py */
+		    case_ok(buf, len, namelen, name)) { /* and case matches */
+			Py_XDECREF(copy);
 			return &fd_package;
+		}
 #else
 		/* XXX How are you going to test for directories? */
 #ifdef RISCOS
 		if (isdir(buf) &&
 		    find_init_module(buf) &&
-		    case_ok(buf, len, namelen, name))
+		    case_ok(buf, len, namelen, name)) {
+			Py_XDECREF(copy);
 			return &fd_package;
+		}
 #endif
 #endif
 #ifdef macintosh
@@ -1095,6 +1116,7 @@
 			saved_buf = NULL;
 		}
 #endif
+		Py_XDECREF(copy);
 		if (fp != NULL)
 			break;
 	}