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.
This commit is contained in:
Victor Stinner 2011-04-27 00:24:21 +02:00
parent c40a350db0
commit 793b531756
5 changed files with 43 additions and 15 deletions

View file

@ -79,6 +79,7 @@ PyInterpreterState_New(void)
interp->codec_search_cache = NULL;
interp->codec_error_registry = NULL;
interp->codecs_initialized = 0;
interp->fscodec_initialized = 0;
#ifdef HAVE_DLOPEN
#ifdef RTLD_NOW
interp->dlopenflags = RTLD_NOW;

View file

@ -53,7 +53,7 @@ extern grammar _PyParser_Grammar; /* From graminit.c */
/* Forward */
static void initmain(void);
static void initfsencoding(void);
static int initfsencoding(PyInterpreterState *interp);
static void initsite(void);
static int initstdio(void);
static void flush_io(void);
@ -298,7 +298,8 @@ Py_InitializeEx(int install_sigs)
_PyTime_Init();
initfsencoding();
if (initfsencoding(interp) < 0)
Py_FatalError("Py_Initialize: unable to load the file system codec");
if (install_sigs)
initsigs(); /* Signal handling stuff, including initintr() */
@ -618,6 +619,10 @@ Py_NewInterpreter(void)
Py_DECREF(pstderr);
_PyImportHooks_Init();
if (initfsencoding(interp) < 0)
goto handle_error;
if (initstdio() < 0)
Py_FatalError(
"Py_Initialize: can't initialize sys standard streams");
@ -730,8 +735,8 @@ initmain(void)
}
}
static void
initfsencoding(void)
static int
initfsencoding(PyInterpreterState *interp)
{
PyObject *codec;
#if defined(HAVE_LANGINFO_H) && defined(CODESET)
@ -748,7 +753,8 @@ initfsencoding(void)
Py_FileSystemDefaultEncoding = codeset;
Py_HasFileSystemDefaultEncoding = 0;
return;
interp->fscodec_initialized = 1;
return 0;
}
#endif
@ -758,10 +764,11 @@ initfsencoding(void)
/* Such error can only occurs in critical situations: no more
* memory, import a module of the standard library failed,
* etc. */
Py_FatalError("Py_Initialize: unable to load the file system codec");
} else {
Py_DECREF(codec);
return -1;
}
Py_DECREF(codec);
interp->fscodec_initialized = 1;
return 0;
}
/* Import the site module (not into __main__ though) */