[Python-3000-checkins] r59232 - in python/branches/py3k: Include/fileobject.h Objects/object.c Python/bltinmodule.c Python/pythonrun.c

christian.heimes python-3000-checkins at python.org
Fri Nov 30 11:18:27 CET 2007


Author: christian.heimes
Date: Fri Nov 30 11:18:26 2007
New Revision: 59232

Modified:
   python/branches/py3k/Include/fileobject.h
   python/branches/py3k/Objects/object.c
   python/branches/py3k/Python/bltinmodule.c
   python/branches/py3k/Python/pythonrun.c
Log:
Partial fix for bug #1306
Multiple reinitializations of Python 3.0 failed on a system without a hardcoded default fs encoding. The patch makes sure that the default fs encoding is freed and reset to NULL on e.g. Linux.
I've also taken the liberty to increase the debugging in Objects/object.c:_Py_ForgetReference(). The method is used to validate the reference chain.
Reinitialization still fails in the 3rd round of my test suite:
* ob
object  : <refcnt 0 at 0x821c840>
type    : str
refcount: 0
address : 0x821c840
* op->_ob_prev->_ob_next
object  : <refcnt 0 at 0x821c840>
type    : str
refcount: 0
address : 0x821c840
* op->_ob_next->_ob_prev
object  : bytearray(b'')
type    : bytearray
refcount: 1
address : 0x826b838
Fatal Python error: UNREF invalid object


Modified: python/branches/py3k/Include/fileobject.h
==============================================================================
--- python/branches/py3k/Include/fileobject.h	(original)
+++ python/branches/py3k/Include/fileobject.h	Fri Nov 30 11:18:26 2007
@@ -20,6 +20,7 @@
    If non-NULL, this is different than the default encoding for strings
 */
 PyAPI_DATA(const char *) Py_FileSystemDefaultEncoding;
+PyAPI_DATA(const int) Py_HasFileSystemDefaultEncoding;
 
 /* Internal API
 

Modified: python/branches/py3k/Objects/object.c
==============================================================================
--- python/branches/py3k/Objects/object.c	(original)
+++ python/branches/py3k/Objects/object.c	Fri Nov 30 11:18:26 2007
@@ -1532,8 +1532,15 @@
 	if (op->ob_refcnt < 0)
 		Py_FatalError("UNREF negative refcnt");
 	if (op == &refchain ||
-	    op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
+	    op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op) {
+		fprintf(stderr, "* ob\n");
+		_PyObject_Dump(op);
+		fprintf(stderr, "* op->_ob_prev->_ob_next\n");
+		_PyObject_Dump(op->_ob_prev->_ob_next);
+		fprintf(stderr, "* op->_ob_next->_ob_prev\n");
+		_PyObject_Dump(op->_ob_next->_ob_prev);
 		Py_FatalError("UNREF invalid object");
+	}
 #ifdef SLOW_UNREF_CHECK
 	for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
 		if (p == op)

Modified: python/branches/py3k/Python/bltinmodule.c
==============================================================================
--- python/branches/py3k/Python/bltinmodule.c	(original)
+++ python/branches/py3k/Python/bltinmodule.c	Fri Nov 30 11:18:26 2007
@@ -16,10 +16,13 @@
 */
 #if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)
 const char *Py_FileSystemDefaultEncoding = "mbcs";
+const int Py_HasFileSystemDefaultEncoding = 1;
 #elif defined(__APPLE__)
 const char *Py_FileSystemDefaultEncoding = "utf-8";
+const int Py_HasFileSystemDefaultEncoding = 1;
 #else
 const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
+const int Py_HasFileSystemDefaultEncoding = 0;
 #endif
 
 static PyObject *

Modified: python/branches/py3k/Python/pythonrun.c
==============================================================================
--- python/branches/py3k/Python/pythonrun.c	(original)
+++ python/branches/py3k/Python/pythonrun.c	Fri Nov 30 11:18:26 2007
@@ -502,6 +502,12 @@
 	/* Cleanup Unicode implementation */
 	_PyUnicode_Fini();
 
+	/* reset file system default encoding */
+	if (!Py_HasFileSystemDefaultEncoding) {
+		free((char*)Py_FileSystemDefaultEncoding);
+        	Py_FileSystemDefaultEncoding = NULL;
+	}
+
 	/* XXX Still allocated:
 	   - various static ad-hoc pointers to interned strings
 	   - int and float free list blocks


More information about the Python-3000-checkins mailing list