diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-26 22:24:21 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-26 22:24:21 (GMT) |
commit | 793b531756a4752a167e29f53c4ff49ce2846c74 (patch) | |
tree | 30451bc81f557d0613390ea4a9b6b4298d15c9d3 /Objects | |
parent | c40a350db0f16c678273ee715fe7c70c431360a1 (diff) | |
download | cpython-793b531756a4752a167e29f53c4ff49ce2846c74.zip cpython-793b531756a4752a167e29f53c4ff49ce2846c74.tar.gz cpython-793b531756a4752a167e29f53c4ff49ce2846c74.tar.bz2 |
Issue #10914: Initialize correctly the filesystem codec when creating a new
subinterpreter to fix a bootstrap issue with codecs implemented in Python, as
the ISO-8859-15 codec.
Add fscodec_initialized attribute to the PyInterpreterState structure.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/unicodeobject.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 22d2137..4361908 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1653,7 +1653,17 @@ PyUnicode_EncodeFSDefault(PyObject *unicode) PyUnicode_GET_SIZE(unicode), "surrogateescape"); #else - if (Py_FileSystemDefaultEncoding) { + PyInterpreterState *interp = PyThreadState_GET()->interp; + /* Bootstrap check: if the filesystem codec is implemented in Python, we + cannot use it to encode and decode filenames before it is loaded. Load + the Python codec requires to encode at least its own filename. Use the C + version of the locale codec until the codec registry is initialized and + the Python codec is loaded. + + Py_FileSystemDefaultEncoding is shared between all interpreters, we + cannot only rely on it: check also interp->fscodec_initialized for + subinterpreters. */ + if (Py_FileSystemDefaultEncoding && interp->fscodec_initialized) { return PyUnicode_AsEncodedString(unicode, Py_FileSystemDefaultEncoding, "surrogateescape"); @@ -1843,12 +1853,17 @@ PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) #elif defined(__APPLE__) return PyUnicode_DecodeUTF8(s, size, "surrogateescape"); #else - /* During the early bootstrapping process, Py_FileSystemDefaultEncoding - can be undefined. If it is case, decode using UTF-8. The following assumes - that Py_FileSystemDefaultEncoding is set to a built-in encoding during the - bootstrapping process where the codecs aren't ready yet. - */ - if (Py_FileSystemDefaultEncoding) { + PyInterpreterState *interp = PyThreadState_GET()->interp; + /* Bootstrap check: if the filesystem codec is implemented in Python, we + cannot use it to encode and decode filenames before it is loaded. Load + the Python codec requires to encode at least its own filename. Use the C + version of the locale codec until the codec registry is initialized and + the Python codec is loaded. + + Py_FileSystemDefaultEncoding is shared between all interpreters, we + cannot only rely on it: check also interp->fscodec_initialized for + subinterpreters. */ + if (Py_FileSystemDefaultEncoding && interp->fscodec_initialized) { return PyUnicode_Decode(s, size, Py_FileSystemDefaultEncoding, "surrogateescape"); |