From: mattia\.barbon\@libero\.it <mat...@li...> - 2005-01-12 09:50:44
|
Hello, > I've made a lot of progress on my wrapping of wxArtProvider= . It is in > fact almost complete. However, there's one nagging problem= regarding > the perl callbacks. I'm sorry I couldn't answer before= . > I'm having issues with wxSize objects getting double deleted somew= here > in the call to wxArtProvider::CreateBitmap. As near as I can tel= l, > what happens is: > 1) Perl code calls Wx::ArtProvider::GetBitmap.=0D = > 2) XS code for Wx::ArtProvider::GetBitmap makes a wxSize object from=0D = > either the parameter passed, or from wxDefaultSize. > 3) XS code calls= down to wxArtProvider::GetBitmap > 4) In the guts of here, a call is ma= de out to > wxPlArtProvider::CreateBitmap, passing the wxSize object alo= ng > 5) The XS for wxPlArtProvider::CreateBitmap creates a Wx::Size obje= ct > to pass on to the perl code > 6) The perl code does its thing > 7= ) The Wx::Size object created in #5 goes out of scope, and the > underly= ing wxSize object gets destroyed > 8) Call frames finish and we end up b= ack in the XS for > Wx::ArtProvider::GetBitmap > 9) This code delets th= e same underlying wxSize object again > 10) Reams of warnings from glibc= about free()ing invalid pointers are > emitted as this chain of events = repeats. This looks plausible. There are workarounds for this in ext= /docview/XS/*.xs and ext/docview/cpp/*.h. I'll give more precise indicat= ions later. > I can work around this by allocating a copy of the size = on the heap in > the XS for Wx::ArtProvider::CreateBitmap and then letti= ng / assuming > that it will be deleted by perl, but somehow this seems = dirty. But if > it's the right way to go, then I guess the attached pat= ch is okay. > > Attached is a patch against 0.22 with my progress so f= ar. Other than > the problem described here, it seems to work for all t= he static > functions of wxArtProvider, and for deriving your own provid= er from > Wx::PlArtProvider. To demonstrate the latter, I added an artp= rov > sample based on the minimal sample from wxPerl and the artprov sam= ple > from wxWidgets. Great! > As an aside, the build process f= or my code, and for XS/PlWindow.xsp > leaves the .h files they generate = in cpp/ even after a make realclean. > What's the proper way to fix thi= s? I fixed plwindow.h deletion in CVS. Add your file in (IIRC) buil= d/Wx/buid/ExtUtils/MakeMaker/Any_OS.pm. HTH & thanks! Mattia=0A=0A=0A= =0A____________________________________________________________=0ALibero = ADSL: 3 mesi gratis e navighi a 1.2 Mega. E poi hai l'Adsl senza limiti a= meno di 1 euro al giorno. =0AAbbonati subito senza costi di attivazione = su http://www.libero.it=0A=0A |