[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [pygame] Segmentation Fault
On Fri, Oct 28, 2005 at 09:05:36AM +1000, Rene Dudfield wrote:
> Thanks.
>
> That has been added to cvs.
>
Thanks.
> I wonder if there was a reason for the extra surf =
> PySurface_AsSurface(surface); line?
>
I initially wondered that also, perhaps some kind of reference counting,
but PySurface_AsSurface() is just a macro:
From pygame.h:
#define PySurface_AsSurface(x) (((PySurfaceObject*)x)->surf)
So I don't see how it can do anything useful. Cruft left over from
factoring-out do_set_icon() perhaps?
I had a quick look at other uses of PySurface_AsSurface() (in the same
file) and couldn't find any similar occurrences.
Seems OK to me to remove this line,
best regards,
John.
>
>
> On 10/28/05, John Popplewell <john@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> > [I sent this mail early this morning but it seems to have gone missing]
> > Hi,
> >
> > I was working on a game and used:
> >
> > export set SDL_VIDEODRIVER=bobble
> >
> > to see what would happen with an invalid driver name.
> > Bang! Turned out that the GP was triggered by this sequence:
> >
> > C:>python
> > Python 2.3.5 (#62, Feb 8 2005, 16:23:02) [MSC v.1200 32 bit (Intel)] on win32
> > Type "help", "copyright", "credits" or "license" for more information.
> > >>> import pygame
> > >>> pygame.init()
> > (5, 1)
> > >>> icon = pygame.image.load("icon32x32.png")
> > >>> pygame.display.set_icon(icon)
> > Fatal Python error: (pygame parachute) Segmentation Fault
> >
> > abnormal program termination
> > C:>
> >
> > I tracked it down to the fact that SDL_WM_SetIcon() was being called even
> > though SDL_Init(SDL_INIT_VIDEO) had failed.
> >
> > Happens on Linux as well as Windows. Not particularly important, but it wasted
> > a chunk of my time.
> >
> > Here's a diff against current CVS that also removes some redundancy,
> >
> > cheers,
> > John Popplewell.
> >
> > Index: display.c
> > ===================================================================
> > RCS file: /home/cvspsrv/cvsroot/games/pygame/src/display.c,v
> > retrieving revision 1.64
> > diff -c -r1.64 display.c
> > *** display.c 3 Oct 2005 06:52:07 -0000 1.64
> > --- display.c 27 Oct 2005 02:08:59 -0000
> > ***************
> > *** 919,925 ****
> > static void do_set_icon(PyObject *surface)
> > {
> > SDL_Surface* surf = PySurface_AsSurface(surface);
> > ! surf = PySurface_AsSurface(surface);
> > SDL_WM_SetIcon(surf, NULL);
> > icon_was_set = 1;
> > }
> > --- 919,925 ----
> > static void do_set_icon(PyObject *surface)
> > {
> > SDL_Surface* surf = PySurface_AsSurface(surface);
> > !
> > SDL_WM_SetIcon(surf, NULL);
> > icon_was_set = 1;
> > }
> > ***************
> > *** 930,935 ****
> > --- 930,937 ----
> > PyObject* surface;
> > if(!PyArg_ParseTuple(arg, "O!", &PySurface_Type, &surface))
> > return NULL;
> > + if(!PyGame_Video_AutoInit())
> > + return RAISE(PyExc_SDLError, SDL_GetError());
> > do_set_icon(surface);
> > RETURN_NONE
> > }
> >
> >
> >
>