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 | 3cbf14bfb11ce1f7f94a2a8e69161a621a200a5d (patch) | |
tree | c37a2c102c11824fd902e0cc602af1b81ca53ddc /Objects | |
parent | 1188935af9ff5b762c6b1eaacb1dffdf0208bb40 (diff) | |
download | cpython-3cbf14bfb11ce1f7f94a2a8e69161a621a200a5d.zip cpython-3cbf14bfb11ce1f7f94a2a8e69161a621a200a5d.tar.gz cpython-3cbf14bfb11ce1f7f94a2a8e69161a621a200a5d.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 1f1fe8e..7a70a5e 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1626,7 +1626,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"); @@ -1818,12 +1828,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"); |