[Python-3000-checkins] r67057 - in python/branches/py3k: Demo/embed/importexc.c Include/pystate.h Misc/NEWS Objects/unicodeobject.c Python/bltinmodule.c Python/codecs.c Python/pystate.c Python/pythonrun.c Python/sysmodule.c

christian.heimes python-3000-checkins at python.org
Fri Oct 31 00:47:45 CET 2008


Author: christian.heimes
Date: Thu Oct 30 22:48:26 2008
New Revision: 67057

Log:
Issue 3723: Fixed initialization of subinterpreters
The patch fixes several issues with Py_NewInterpreter as well as the demo for multiple subinterpreters.
Most of the patch was written by MvL with help from Benjamin, Amaury and me. Graham Dumpleton has verified that this patch fixes an issue with mod_wsgi.

Modified:
   python/branches/py3k/Demo/embed/importexc.c
   python/branches/py3k/Include/pystate.h
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Objects/unicodeobject.c
   python/branches/py3k/Python/bltinmodule.c
   python/branches/py3k/Python/codecs.c
   python/branches/py3k/Python/pystate.c
   python/branches/py3k/Python/pythonrun.c
   python/branches/py3k/Python/sysmodule.c

Modified: python/branches/py3k/Demo/embed/importexc.c
==============================================================================
--- python/branches/py3k/Demo/embed/importexc.c	(original)
+++ python/branches/py3k/Demo/embed/importexc.c	Thu Oct 30 22:48:26 2008
@@ -1,14 +1,20 @@
 #include <Python.h>
 
-char* cmd = "import exceptions";
+#if 0
+char* cmd = "import codecs, encodings.utf_8, types; print(types)";
+#else
+char* cmd = "import types; print(types)";
+#endif
 
 int main()
 {
+	printf("Initialize interpreter\n");
 	Py_Initialize();
 	PyEval_InitThreads();
 	PyRun_SimpleString(cmd);
 	Py_EndInterpreter(PyThreadState_Get());
 
+	printf("\nInitialize subinterpreter\n");
 	Py_NewInterpreter();
 	PyRun_SimpleString(cmd);
 	Py_Finalize();

Modified: python/branches/py3k/Include/pystate.h
==============================================================================
--- python/branches/py3k/Include/pystate.h	(original)
+++ python/branches/py3k/Include/pystate.h	Thu Oct 30 22:48:26 2008
@@ -27,6 +27,7 @@
     PyObject *codec_search_path;
     PyObject *codec_search_cache;
     PyObject *codec_error_registry;
+    int codecs_initialized;
 
 #ifdef HAVE_DLOPEN
     int dlopenflags;

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Thu Oct 30 22:48:26 2008
@@ -15,6 +15,8 @@
 Core and Builtins
 -----------------
 
+- Issue 3723: Fixed initialization of subinterpreters.
+
 - Issue #4213: The file system encoding is now normalized by the
   codec subsystem, for example UTF-8 is turned into utf-8.
 

Modified: python/branches/py3k/Objects/unicodeobject.c
==============================================================================
--- python/branches/py3k/Objects/unicodeobject.c	(original)
+++ python/branches/py3k/Objects/unicodeobject.c	Thu Oct 30 22:48:26 2008
@@ -1346,6 +1346,19 @@
 #endif
 	else if (strcmp(encoding, "ascii") == 0)
 	    return PyUnicode_AsASCIIString(unicode);
+        /* During bootstrap, we may need to find the encodings
+           package, to load the file system encoding, and require the
+           file system encoding in order to load the encodings
+           package.
+
+           Break out of this dependency by assuming that the path to
+           the encodings module is ASCII-only.  XXX could try wcstombs
+           instead, if the file system encoding is the locale's
+           encoding. */
+        else if (Py_FileSystemDefaultEncoding &&
+                 strcmp(encoding, Py_FileSystemDefaultEncoding) == 0 &&
+                 !PyThreadState_GET()->interp->codecs_initialized)
+	    return PyUnicode_AsASCIIString(unicode);            
     }
 
     /* Encode via the codec registry */

Modified: python/branches/py3k/Python/bltinmodule.c
==============================================================================
--- python/branches/py3k/Python/bltinmodule.c	(original)
+++ python/branches/py3k/Python/bltinmodule.c	Thu Oct 30 22:48:26 2008
@@ -2282,7 +2282,7 @@
 	PyModuleDef_HEAD_INIT,
 	"builtins",
 	builtin_doc,
-	0,
+	-1, /* multiple "initialization" just copies the module dict. */
 	builtin_methods,
 	NULL,
 	NULL,

Modified: python/branches/py3k/Python/codecs.c
==============================================================================
--- python/branches/py3k/Python/codecs.c	(original)
+++ python/branches/py3k/Python/codecs.c	Thu Oct 30 22:48:26 2008
@@ -869,5 +869,6 @@
 	return -1;
     }
     Py_DECREF(mod);
+    interp->codecs_initialized = 1;
     return 0;
 }

Modified: python/branches/py3k/Python/pystate.c
==============================================================================
--- python/branches/py3k/Python/pystate.c	(original)
+++ python/branches/py3k/Python/pystate.c	Thu Oct 30 22:48:26 2008
@@ -76,6 +76,7 @@
 		interp->codec_search_path = NULL;
 		interp->codec_search_cache = NULL;
 		interp->codec_error_registry = NULL;
+		interp->codecs_initialized = 0;
 #ifdef HAVE_DLOPEN
 #ifdef RTLD_NOW
                 interp->dlopenflags = RTLD_NOW;

Modified: python/branches/py3k/Python/pythonrun.c
==============================================================================
--- python/branches/py3k/Python/pythonrun.c	(original)
+++ python/branches/py3k/Python/pythonrun.c	Thu Oct 30 22:48:26 2008
@@ -562,8 +562,13 @@
 			goto handle_error;
 		Py_INCREF(interp->builtins);
 	}
+
+	/* initialize builtin exceptions */
+	_PyExc_Init();
+
 	sysmod = _PyImport_FindExtension("sys", "sys");
 	if (bimod != NULL && sysmod != NULL) {
+		PyObject *pstderr;
 		interp->sysdict = PyModule_GetDict(sysmod);
 		if (interp->sysdict == NULL)
 			goto handle_error;
@@ -571,7 +576,18 @@
 		PySys_SetPath(Py_GetPath());
 		PyDict_SetItemString(interp->sysdict, "modules",
 				     interp->modules);
+		/* Set up a preliminary stderr printer until we have enough
+		   infrastructure for the io module in place. */
+		pstderr = PyFile_NewStdPrinter(fileno(stderr));
+		if (pstderr == NULL)
+			Py_FatalError("Py_Initialize: can't set preliminary stderr");
+		PySys_SetObject("stderr", pstderr);
+		PySys_SetObject("__stderr__", pstderr);
+
 		_PyImportHooks_Init();
+                if (initstdio() < 0)
+                    Py_FatalError(
+                        "Py_Initialize: can't initialize sys standard streams");
 		initmain();
 		if (!Py_NoSiteFlag)
 			initsite();

Modified: python/branches/py3k/Python/sysmodule.c
==============================================================================
--- python/branches/py3k/Python/sysmodule.c	(original)
+++ python/branches/py3k/Python/sysmodule.c	Thu Oct 30 22:48:26 2008
@@ -1231,7 +1231,7 @@
 	PyModuleDef_HEAD_INIT,
 	"sys",
 	sys_doc,
-	0,
+	-1, /* multiple "initialization" just copies the module dict. */
 	sys_methods,
 	NULL,
 	NULL,


More information about the Python-3000-checkins mailing list