[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] PATCH: Python 2.5 support



pygame 1.7.1 fails with Python 2.5, due to the introduction of Py_ssize_t. (it 
compiles, but calling pygame.event.Event() with keyword arguments fails to 
actually add anything to the dict used by the event object

Following is an initial patch to fix this. I didn't audit the code for 
correctness, I just set CFLAGS="-Wall -Wextra" and fixed the places where gcc 
complained. It does fix the problem I was having with pygame.event.Event 
though.

diff -Nurp pygame-1.7.1release/src/event.c 
pygame-1.7.1release-fixed/src/event.c
--- pygame-1.7.1release/src/event.c	2005-08-15 04:11:40.000000000 -0700
+++ pygame-1.7.1release-fixed/src/event.c	2007-05-10 22:25:49.000000000 -0700
@@ -534,7 +534,7 @@ static PyObject* Event(PyObject* self, P
 	if(keywords)
 	{
 		PyObject *key, *value;
-		int pos  = 0;
+		Py_ssize_t pos  = 0;
 		while(PyDict_Next(keywords, &pos, &key, &value))
 			PyDict_SetItem(dict, key, value);
 	}
diff -Nurp pygame-1.7.1release/src/image.c 
pygame-1.7.1release-fixed/src/image.c
--- pygame-1.7.1release/src/image.c	2005-03-12 17:12:35.000000000 -0800
+++ pygame-1.7.1release-fixed/src/image.c	2007-05-10 22:30:45.000000000 -0700
@@ -291,7 +291,8 @@ PyObject* image_tostring(PyObject* self,
 	PyObject *surfobj, *string=NULL;
 	char *format, *data, *pixels;
 	SDL_Surface *surf, *temp=NULL;
-	int w, h, color, len, flipped=0;
+	Py_ssize_t len;
+	int w, h, color, flipped=0;
 	int Rmask, Gmask, Bmask, Amask, Rshift, Gshift, Bshift, Ashift, Rloss, 
Gloss, Bloss, Aloss;
 	int hascolorkey, colorkey;
 
@@ -605,7 +606,8 @@ PyObject* image_fromstring(PyObject* sel
 	PyObject *string;
 	char *format, *data;
 	SDL_Surface *surf = NULL;
-	int w, h, len, flipped=0;
+	Py_ssize_t len;
+	int w, h, flipped=0;
 	int loopw, looph;
 
 	if(!PyArg_ParseTuple(arg, "O!(ii)s|i", &PyString_Type, &string, &w, &h, 
&format, &flipped))
@@ -729,7 +731,8 @@ PyObject* image_frombuffer(PyObject* sel
 	PyObject *buffer;
 	char *format, *data;
 	SDL_Surface *surf = NULL;
-	int w, h, len;
+	Py_ssize_t len;
+	int w, h;
         PyObject *surfobj;
 
 	if(!PyArg_ParseTuple(arg, "O(ii)s|i", &buffer, &w, &h, &format))
diff -Nurp pygame-1.7.1release/src/pygame.h 
pygame-1.7.1release-fixed/src/pygame.h
--- pygame-1.7.1release/src/pygame.h	2005-04-17 22:46:24.000000000 -0700
+++ pygame-1.7.1release-fixed/src/pygame.h	2007-05-12 21:32:15.000000000 -0700
@@ -56,6 +56,13 @@
 	 **/
 #include <Python.h>
 
+/* support changes for Python 2.5 on earlier versions of Python */
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+typedef int Py_ssize_t;
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif
+
 #ifdef MS_WIN32 /*Python gives us MS_WIN32, SDL needs just WIN32*/
 #define WIN32
 #endif
Files pygame-1.7.1release/src/.pygame.h.swp and 
pygame-1.7.1release-fixed/src/.pygame.h.swp differ
diff -Nurp pygame-1.7.1release/src/rect.c pygame-1.7.1release-fixed/src/rect.c
--- pygame-1.7.1release/src/rect.c	2004-07-18 18:39:49.000000000 -0700
+++ pygame-1.7.1release-fixed/src/rect.c	2007-05-10 23:01:14.000000000 -0700
@@ -589,7 +589,7 @@ static PyObject* rect_collidedict(PyObje
 {
 	PyRectObject* self = (PyRectObject*)oself;
 	GAME_Rect *argrect, temp;
-	int loop=0;
+	Py_ssize_t loop=0;
 	PyObject* dict, *key, *val;
 	PyObject* ret = NULL;
 
@@ -640,7 +640,7 @@ static PyObject* rect_collidedictall(PyO
 {
 	PyRectObject* self = (PyRectObject*)oself;
 	GAME_Rect *argrect, temp;
-	int loop=0;
+	Py_ssize_t loop=0;
 	PyObject* dict, *key, *val;
 	PyObject* ret = NULL;
 
@@ -937,13 +937,15 @@ static struct PyMethodDef rect_methods[]
 
 /* sequence functions */
 
-static int rect_length(PyRectObject *self)
+static Py_ssize_t rect_length(PyObject *_self)
 {
 	return 4;
 }
 
-static PyObject* rect_item(PyRectObject *self, int i)
+static PyObject* rect_item(PyObject *_self, Py_ssize_t i)
 {
+	PyRectObject *self = (PyRectObject*) _self;
+
 	int* data = (int*)&self->r;
 	if(i<0 || i>3)
 		return RAISE(PyExc_IndexError, "Invalid rect Index");
@@ -951,8 +953,10 @@ static PyObject* rect_item(PyRectObject 
 	return PyInt_FromLong(data[i]);
 }
 
-static int rect_ass_item(PyRectObject *self, int i, PyObject *v)
+static int rect_ass_item(PyObject *_self, Py_ssize_t i, PyObject *v)
 {
+	PyRectObject *self = (PyRectObject*) _self;
+
 	int val;
 	int* data = (int*)&self->r;
 	if(i<0 || i>3)
@@ -970,8 +974,10 @@ static int rect_ass_item(PyRectObject *s
 }
 
 
-static PyObject* rect_slice(PyRectObject *self, int ilow, int ihigh)
+static PyObject* rect_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t 
ihigh)
 {
+	PyRectObject *self = (PyRectObject*) _self;
+
 	PyObject *list;
 	int* data = (int*)&self->r;
 	int numitems, loop, l = 4;
@@ -994,8 +1000,10 @@ static PyObject* rect_slice(PyRectObject
 
 
 
-static int rect_ass_slice(PyRectObject *self, int ilow, int ihigh, PyObject 
*v)
+static int rect_ass_slice(PyObject *_self, Py_ssize_t ilow, Py_ssize_t ihigh, 
PyObject *v)
 {
+	PyRectObject *self = (PyRectObject*) _self;
+
 	int* data = (int*)&self->r;
 	int numitems, loop, l = 4;
 	int val;
@@ -1031,13 +1039,13 @@ static int rect_ass_slice(PyRectObject *
 }
 
 static PySequenceMethods rect_as_sequence = {
-	(inquiry)rect_length,				/*length*/
-	(binaryfunc)NULL,					/*concat*/
-	(intargfunc)NULL,					/*repeat*/
-	(intargfunc)rect_item,				/*item*/
-	(intintargfunc)rect_slice,			/*slice*/
-	(intobjargproc)rect_ass_item,		/*ass_item*/
-	(intintobjargproc)rect_ass_slice,	/*ass_slice*/
+	rect_length,	/*length*/
+	NULL,			/*concat*/
+	NULL,			/*repeat*/
+	rect_item,		/*item*/
+	rect_slice,		/*slice*/
+	rect_ass_item,	/*ass_item*/
+	rect_ass_slice,	/*ass_slice*/
 };
 
 
diff -Nurp pygame-1.7.1release/src/surface.c 
pygame-1.7.1release-fixed/src/surface.c
--- pygame-1.7.1release/src/surface.c	2005-02-05 16:03:07.000000000 -0800
+++ pygame-1.7.1release-fixed/src/surface.c	2007-05-10 
22:33:56.000000000 -0700
@@ -1353,7 +1353,7 @@ static PyObject* surf_get_rect(PyObject*
 	if(rect && kw)
 	{
 		PyObject *key, *value;
-		int pos=0;
+		Py_ssize_t pos=0;
 		while(PyDict_Next(kw, &pos, &key, &value))
 		{
 			if((PyObject_SetAttr(rect, key, value) == -1))

Attachment: signature.asc
Description: This is a digitally signed message part.