Issue 1342: Python could not start if installed in a directory
with non-ascii characters. This is the simple fix, which uses the FileSystemEncoding. Replacing all the char* with unicode strings is a major rewrite, and needs more thinking.
This commit is contained in:
parent
c354c2e6ef
commit
f1ca0b11b5
|
@ -12,6 +12,9 @@ What's new in Python 3.0b1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #1342: On windows, Python could not start when installed in a
|
||||||
|
directory with non-ascii characters.
|
||||||
|
|
||||||
- Implement PEP 3121: new module initialization and finalization API.
|
- Implement PEP 3121: new module initialization and finalization API.
|
||||||
|
|
||||||
- Removed the already-defunct ``-t`` option.
|
- Removed the already-defunct ``-t`` option.
|
||||||
|
|
|
@ -1364,19 +1364,26 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf,
|
||||||
if (!v)
|
if (!v)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (PyUnicode_Check(v)) {
|
if (PyUnicode_Check(v)) {
|
||||||
v = _PyUnicode_AsDefaultEncodedString(v, NULL);
|
v = PyUnicode_AsEncodedString(v,
|
||||||
|
Py_FileSystemDefaultEncoding, NULL);
|
||||||
if (v == NULL)
|
if (v == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!PyBytes_Check(v))
|
else if (!PyBytes_Check(v))
|
||||||
continue;
|
continue;
|
||||||
|
else
|
||||||
|
Py_INCREF(v);
|
||||||
|
|
||||||
base = PyBytes_AS_STRING(v);
|
base = PyBytes_AS_STRING(v);
|
||||||
size = PyBytes_GET_SIZE(v);
|
size = PyBytes_GET_SIZE(v);
|
||||||
len = size;
|
len = size;
|
||||||
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
|
if (len + 2 + namelen + MAXSUFFIXSIZE >= buflen) {
|
||||||
|
Py_DECREF(v);
|
||||||
continue; /* Too long */
|
continue; /* Too long */
|
||||||
}
|
}
|
||||||
strcpy(buf, base);
|
strcpy(buf, base);
|
||||||
|
Py_DECREF(v);
|
||||||
|
|
||||||
if (strlen(buf) != len) {
|
if (strlen(buf) != len) {
|
||||||
continue; /* v contains '\0' */
|
continue; /* v contains '\0' */
|
||||||
}
|
}
|
||||||
|
@ -3155,8 +3162,8 @@ NullImporter_init(NullImporter *self, PyObject *args, PyObject *kwds)
|
||||||
if (!_PyArg_NoKeywords("NullImporter()", kwds))
|
if (!_PyArg_NoKeywords("NullImporter()", kwds))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "s:NullImporter",
|
if (!PyArg_ParseTuple(args, "es:NullImporter",
|
||||||
&path))
|
Py_FileSystemDefaultEncoding, &path))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
pathlen = strlen(path);
|
pathlen = strlen(path);
|
||||||
|
|
|
@ -695,7 +695,7 @@ initstdio(void)
|
||||||
PyObject *std = NULL;
|
PyObject *std = NULL;
|
||||||
int status = 0, fd;
|
int status = 0, fd;
|
||||||
PyObject * encoding_attr;
|
PyObject * encoding_attr;
|
||||||
char *encoding, *errors;
|
char *encoding = NULL, *errors;
|
||||||
|
|
||||||
/* Hack to avoid a nasty recursion issue when Python is invoked
|
/* Hack to avoid a nasty recursion issue when Python is invoked
|
||||||
in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
|
in verbose mode: pre-import the Latin-1 and UTF-8 codecs */
|
||||||
|
|
Loading…
Reference in New Issue