diff options
Diffstat (limited to 'www/firefox3-devel/files')
23 files changed, 0 insertions, 3010 deletions
diff --git a/www/firefox3-devel/files/firefox.desktop.in b/www/firefox3-devel/files/firefox.desktop.in deleted file mode 100644 index d72090e1a..000000000 --- a/www/firefox3-devel/files/firefox.desktop.in +++ /dev/null @@ -1,191 +0,0 @@ -[Desktop Entry] -Encoding=UTF-8 -Name=@MOZILLA_NAME@ Web Browser -Name[am]= -Name[ar]= -Name[az]=@MOZILLA_NAME@ Veb Səyyahı -Name[be]= -Name[bg]=Интернет браузър @MOZILLA_NAME@ -Name[bn]= -Name[bs]=@MOZILLA_NAME@ web preglednik -Name[ca]=Navegador web @MOZILLA_NAME@ -Name[cs]=Prohlížeč WWW @MOZILLA_NAME@ -Name[cy]=Y Porwr Gwe @MOZILLA_NAME@ -Name[da]=@MOZILLA_NAME@ - internetsurfning -Name[de]=@MOZILLA_NAME@ Webbrowser -Name[el]=Περιηγητής Διαδικτύου @MOZILLA_NAME@ -Name[en_CA]=@MOZILLA_NAME@ Web Browser -Name[en_GB]=@MOZILLA_NAME@ Web Browser -Name[es]=Navegador Web @MOZILLA_NAME@ -Name[et]=@MOZILLA_NAME@ veebibrauser -Name[eu]=@MOZILLA_NAME@ web arakatzailea -Name[fi]=@MOZILLA_NAME@, WWW-selain -Name[fr]=Navigateur Web @MOZILLA_NAME@ -Name[ga]=Brabhsálaí Lín @MOZILLA_NAME@ -Name[gu]=એપીફની વૅબ બ્રાઉઝર -Name[he]=דפדפן @MOZILLA_NAME@ -Name[hi]= -Name[hr]=@MOZILLA_NAME@ Web preglednik -Name[hu]=@MOZILLA_NAME@ webböngésző -Name[id]=Web Browser @MOZILLA_NAME@ -Name[it]=Browser web @MOZILLA_NAME@ -Name[ja]=@MOZILLA_NAME@ ウェブ・ブラウザ -Name[ko]=@MOZILLA_NAME@ 웹 브라우저 -Name[li]=@MOZILLA_NAME@ Web Browser -Name[lt]=@MOZILLA_NAME@ web naršyklė -Name[mk]=@MOZILLA_NAME@ веб прелистувач -Name[ml]=എപ്പിഫാനി വെബ്ബ് ബ്രൌസര് -Name[mn]=@MOZILLA_NAME@ веб хөтөч -Name[ms]=Pelungsur Web @MOZILLA_NAME@ -Name[nb]=@MOZILLA_NAME@ nettleser -Name[nl]=@MOZILLA_NAME@ Webbrowser -Name[nn]=@MOZILLA_NAME@ nettlesar -Name[no]=@MOZILLA_NAME@ nettleser -Name[pa]=ਏਪੀਫਾਨੀ ਵੈੱਬ ਬਰਾਊਜ਼ਰ -Name[pl]=Przeglądarka WWW @MOZILLA_NAME@ -Name[pt]=Navegador Web @MOZILLA_NAME@ -Name[pt_BR]=Navegador Web @MOZILLA_NAME@ -Name[ro]=Navigatorul @MOZILLA_NAME@ -Name[ru]=Веб-браузер @MOZILLA_NAME@ -Name[sk]= -Name[sl]=Spletni brskalnik @MOZILLA_NAME@ -Name[sq]=@MOZILLA_NAME@ - Shfletuesi Web -Name[sr]= -Name[sr@Latn]=Veb čitač Spoznaja -Name[sv]=Webbläsaren @MOZILLA_NAME@ -Name[ta]=எபிபனி வலை உலாவி -Name[tk]=@MOZILLA_NAME@ Web Ahtarçisi -Name[tr]=@MOZILLA_NAME@ Web Tarayıcı -Name[uk]=Переглядач web @MOZILLA_NAME@ -Name[vi]=Trình Duyệt Web @MOZILLA_NAME@ -Name[wa]=Betchteu waibe epiphany -Name[zh_CN]=@MOZILLA_NAME@ Web 浏览器 -Name[zh_TW]=@MOZILLA_NAME@ 網頁瀏覽器 -GenericName=Web Browser -GenericName[ar]=متصفّح الانترنت -GenericName[az]=Veb Səyyahı -GenericName[be]=Вандроўнік па павуціньню -GenericName[bg]=Браузър -GenericName[bn]=ওয়েব ব্রাউজার -GenericName[bs]=Web preglednik -GenericName[ca]=Navegador web -GenericName[cs]=Prohlížeč WWW -GenericName[cy]=Porwr Gwe -GenericName[da]=Internetsurfning -GenericName[de]=Webbrowser -GenericName[el]=Περιηγητής Ιστοσελίδων -GenericName[en_CA]=Web Browser -GenericName[en_GB]=Web Browser -GenericName[es]=Navegador web -GenericName[et]=Veebilehitseja -GenericName[eu]=Web arakatzailea -GenericName[fi]=WWW-selain -GenericName[fr]=Navigateur Web @MOZILLA_NAME@ -GenericName[ga]=Brabhsálaí Lín -GenericName[gu]=વેબ બ્રાઉઝર -GenericName[he]=דפדפן אינטרנט -GenericName[hi]=वेब ब्राउज़र -GenericName[hr]=Web preglednik -GenericName[hu]=Webböngésző -GenericName[id]=Browser Web -GenericName[it]=Browser web -GenericName[ja]=GNOME ウェブ・ブラウザ -GenericName[ko]=웹 브라우저 -GenericName[li]=Wèb Browser -GenericName[lt]=Web naršyklė -GenericName[mk]=Веб прелистувач -GenericName[mn]=Веб хөтөч -GenericName[ms]=Pelungsur Web -GenericName[nb]=Nettleser -GenericName[nl]=Web-browser -GenericName[nn]=Nettlesar -GenericName[no]=Nettleser -GenericName[pa]=ਵੈਬ ਬਰਾਊਜ਼ -GenericName[pl]=Przeglądarka WWW -GenericName[pt]=Navegador Web -GenericName[pt_BR]=Navegador Web -GenericName[ro]=Navigator Internet -GenericName[ru]=Веб-браузер -GenericName[sk]=WWW prehliadač -GenericName[sl]=Spletni brskalnik -GenericName[sq]=Shfletuesi Web -GenericName[sr]=Веб читач -GenericName[sr@Latn]=Veb čitač -GenericName[sv]=Webbläsare -GenericName[ta]=வலை உலாவி -GenericName[th]=เว็บบราวเซอร์ -GenericName[tk]=Web Ahtarçysy -GenericName[tr]=Web Tarayıcı -GenericName[uk]=Переглядач web-сторінок -GenericName[vi]=Trình duyệt Web -GenericName[wa]=Betchteu waibe -GenericName[zh_CN]=Web 浏览器 -GenericName[zh_TW]=網頁瀏覽器 -Comment=Browse the web -Comment[ar]=تصفح الانترنت -Comment[az]=Vebi gəzin -Comment[be]=Вандраваць па павуціньню -Comment[bg]=Сърфиране в интернет -Comment[bn]=ওয়েব ব্রাউজ করুন -Comment[bs]=Pregledaj na internetu -Comment[ca]=Navegueu per la web -Comment[cs]=Prohlížet WWW -Comment[cy]=Pori'r we -Comment[da]=Surf på internettet -Comment[de]=Im Web surfen -Comment[el]=Περιήγηση στον παγκόσμιο ιστό -Comment[en_CA]=Browse the web -Comment[en_GB]=Browse the web -Comment[es]=Navegar por la web -Comment[et]=Sirvi veebi -Comment[eu]=Arakatu web-a -Comment[fi]=Selaa WWW:tä -Comment[fr]=Naviguer sur Internet -Comment[ga]=Brabhsáil an Líon -Comment[gu]=વેબમાં શોધો -Comment[he]=גלוש ברשת -Comment[hi]=वेब ब्राउज़ करें -Comment[hr]=Pregledaj Web -Comment[hu]=A világháló böngészése -Comment[id]=Jelajah web -Comment[it]=Esplora il web -Comment[ja]=ウェブを閲覧します -Comment[ko]=웹을 돌아 다닙니다 -Comment[li]=Blajere op internet -Comment[lt]=Naršyti internete -Comment[mk]=Прелистувајте на веб -Comment[ml]=വലക്കെട്ട് തിരയുക -Comment[mn]=Веб броузе хийх -Comment[ms]=Layari web -Comment[nb]=Surf på nettet -Comment[nl]=Websurfen -Comment[nn]=Surf på nettet -Comment[no]=Surf på nettet -Comment[pa]=ਵੈਬ ਬਰਾਊਜ਼ -Comment[pl]=Przeglądanie stron WWW -Comment[pt]=Navegar na web -Comment[pt_BR]=Navegar na web -Comment[ro]=Navigare Internet -Comment[ru]=Веб-браузер -Comment[sk]=Prehliadať internet -Comment[sl]=Brskaj po spletu -Comment[sq]=Eksploro web-in -Comment[sr]=Прегледај веб -Comment[sr@Latn]=Pregledaj veb -Comment[sv]=Surfa på nätet -Comment[ta]=வலையில் உலாவு -Comment[th]=ใช้งานเว็บบราวเซอร์ @MOZILLA_NAME@ -Comment[tk]=Webi Ahtar -Comment[tr]=Web'e Gözat -Comment[uk]=Програма перегляду web-сторінок -Comment[vi]=Duyệt web -Comment[wa]=Naivyî avå les waibes -Comment[zh_CN]=浏览 Web -Comment[zh_TW]=瀏覽網頁 -Exec=@MOZILLA@ %u -Icon=@FIREFOX_ICON@ -StartupNotify=false -Terminal=false -Type=Application -Categories=Application;Network; -MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml; diff --git a/www/firefox3-devel/files/patch-bugzilla296818 b/www/firefox3-devel/files/patch-bugzilla296818 deleted file mode 100644 index a7f22b4eb..000000000 --- a/www/firefox3-devel/files/patch-bugzilla296818 +++ /dev/null @@ -1,1621 +0,0 @@ -diff --git ChangeLog ChangeLog -new file mode 100644 -index 0000000..c9c7dce ---- /dev/null -+++ ChangeLog -@@ -0,0 +1,277 @@ -+2007-09-06 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Write the restore data regardless of -+ the state we are in, right when we first fill the buffer. -+ -+2007-09-06 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::RestoreDataDone): Print the first four bytes of the -+ restore data, to check it later. -+ (imgContainer::ReloadImages): Likewise. -+ -+2007-09-06 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/decoders/png/nsPNGDecoder.cpp (info_callback): -+ Reuse the image container if the loader has one; don't always -+ create a new one. This lets containers reload themselves. -+ -+2007-09-06 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::AppendFrame): Unconditionally increment mNumFrames! -+ (imgContainer::RestoreDiscardedData): Check the number of restored -+ frames here. -+ (imgContainer::ReloadImages): Flush and close the decoder. -+ (imgContainer::RestoreDataDone): No-op if we are already restoring -+ the data. -+ -+2007-09-06 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/decoders/png/nsPNGDecoder.cpp (*): Print the -+ imgContainer pointers when logging. -+ -+ * modules/libpr0n/src/imgContainer.cpp (*): Likewise. -+ -+2007-09-04 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::ReloadImages): Oops, use an nsCOMPtr<> for the -+ ContainerLoader, not a direct pointer. -+ (ContainerLoader NS_IMPL_ISUPPORTS3): Oops, we also implement -+ imgIContainerObserver. -+ (class ContainerLoader): Implement nsISupportsWeakReference as -+ well; imgContainer needs it from the observer. -+ (imgContainer::RestoreDiscardedData): Log how many frames we got -+ and how many we expected. -+ (imgContainer::ReloadImages): Assert that we got the right number -+ of frames. -+ (imgContainer::GetCurrentFrameNoRef): Log failures from -+ RestoreDiscardedData(). -+ -+ * modules/libpr0n/decoders/png/nsPNGDecoder.cpp (end_callback): -+ Don't tell the container that the restore data is done here... -+ (nsPNGDecoder::Close): ... but do it here instead. This is -+ because end_callback() gets called from within ReadDataOut(); we -+ don't want end_callback() to inform the container that the restore -+ data is done before actually writing the restore data to it! -+ -+2007-09-04 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/decoders/png/nsPNGDecoder.cpp (info_callback): -+ Set the image container as discardable. -+ (ReadDataOut): Store the compressed data in the image container to -+ restore from it later. -+ (end_callback): Tell the image container that we finished feeding -+ it the restore data. -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::SetDiscardable): Log the MIME type of the -+ discardable container. -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Clean up a printf format, and do the -+ logging only on success. -+ -+ * gfx/thebes/public/gfxXlibSurface.h: Add myself to the contributors. -+ * modules/libpr0n/public/imgIContainer.idl: Likewise. -+ * modules/libpr0n/src/imgContainer.cpp: Likewise. -+ * modules/libpr0n/src/imgContainer.h: Likewise. -+ -+2007-09-03 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::AddRestoreData): No-op if we are being called -+ during the restore process (we already have the data; there is no -+ need to save it again). -+ (class ContainerLoader): Put the macro to implement QI for -+ imgILoad and imgIDecoderObserver. -+ (imgContainer::AppendFrame): Don't increment mNumFrames if we are -+ restoring the image data. Fix the use of the frame counters. -+ (imgContainer::sDiscardTimerCallback): Implement. -+ (imgContainer::GetCurrentFrame): Oops, preserve the semantics of -+ the original function --- if the actual getter gives us a null -+ frame, return NS_ERROR_FAILURE. -+ -+2007-08-31 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.h (class imgContainer): New -+ prototype for a ReloadImages() method. -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::RestoreDiscardedData): Call ReloadImages(). -+ (imgContainer::ReloadImages): Implement. -+ (class ContainerLoader): New helper class that implements -+ imgILoader and imgIDecoderObserver. We'll use this to re-load the -+ imgContainer from an image decoder. -+ -+2007-08-31 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::RestoreDiscardedData): Reset the timer; if we got -+ here it means that the data may be used again soon. -+ -+2007-08-30 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.h (class imgContainer): Add an -+ mDiscarded field. We'll use it to know if the uncompressed image -+ data has been discarded already and needs to be regenerated on -+ demand. -+ (class imgContainer): New prototype for a RestoreDiscardedData() method. -+ -+ * modules/libpr0n/src/imgContainer.cpp (imgContainer): Initialize -+ mDiscarded. -+ (imgContainer::GetCurrentFrameNoRef): Return an nsresult rather -+ than the image frame; return the actual image frame as a -+ reference. Ensure that the discarded data gets restored. -+ (imgContainer::GetCurrentFrame): Return the error from -+ GetCurrentFrameNoRef() if it fails. -+ (imgContainer::StartAnimation): Likewise. -+ (imgContainer::GetFrameAt): Ensure that the discarded data gets restored. -+ (imgContainer::ResetAnimation): Likewise. -+ (imgContainer::Notify): Likewise. -+ (imgContainer::RestoreDiscardedData): Just a stub for now. -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Oops, use "count" for the restore -+ data, not "mBufferLen". -+ -+2007-08-29 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.h (class imgContainer): Add a -+ mNumFrames field. Since we'll discard the contents of mFrames, we -+ can't rely on mFrames.Count() for the frame count. -+ -+ * modules/libpr0n/src/imgContainer.cpp (imgContainer): Initialize mNumFrames. -+ (imgContainer::AppendFrame): Maintain the frame count in mNumFrames. -+ (imgContainer::GetNumFrames): Use mNumFrames instead of mFrames.Count(). -+ (imgContainer::GetFrameAt): Likewise. -+ (imgContainer::DecodingComplete): Likewise. -+ (imgContainer::SetAnimationMode): Likewise. -+ (imgContainer::StartAnimation): Likewise. -+ (imgContainer::Notify): Likewise. -+ -+2007-08-29 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.h -+ (imgContainer::inlinedGetCurrentFrame): Removed to make it not -+ inline. -+ (imgContainer::GetCurrentFrameNoRef): New prototype. -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (imgContainer::GetCurrentFrameNoRef): Implement this here. -+ (imgContainer::GetCurrentFrame, imgContainer::StartAnimation): Use -+ GetCurrentFrameNoRef() instead of inlinedGetCurrentFrame(). -+ -+2007-08-28 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/public/imgIContainer.idl (restoreDataDone): New -+ method. We'll use this to tell the container when we finish -+ feeding it the compressed data. After that, it can begin its -+ discard process whenever it wants. -+ -+ * modules/libpr0n/src/imgContainer.h (class imgContainer): Add -+ mRestoreDataDone and mDiscardTimer fields. -+ -+ * modules/libpr0n/src/imgContainer.cpp (imgContainer): Initialize -+ the new fields. -+ (imgContainer::RestoreDataDone): Implement. When turned on, we -+ start the discard timer. -+ (imgContainer::ResetDiscardTimer): New method. -+ (~imgContainer): Cancel and destroy the timer. -+ (imgContainer::sDiscardTimerCallback): New callback. Here we'll -+ discard the uncompressed image data in the image frames. For now -+ this is just a stub. -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Tell the imgContainer when we are done -+ feeding data to it. -+ -+2007-08-28 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp (discarding_is_enabled): -+ Stub function, to be replaced with something better in the -+ future. This lets us disable image discarding by setting a -+ MOZ_DISABLE_IMAGE_DISCARD environment variable. -+ (imgContainer::SetDiscardable): Noop if discarding is disabled. -+ (imgContainer::AddRestoreData): Likewise. -+ -+2007-08-28 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Mark the imgContainer as discardable -+ when we create it. And when writing to the JPEG decoder, add the -+ compressed data to the imgContainer so that it can restore itself -+ later. -+ -+2007-08-28 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgContainer.cpp -+ (gCompressedImageAccountingLog): Create a -+ "CompressedImageAccounting" log domain. -+ (~imgContainer): Log the destruction of compressed data. -+ (imgContainer::AddRestoreData): Log the addition of compressed data. -+ (imgContainer::SetDiscardable): Log the creation of a compressed imgContainer. -+ -+2007-08-28 Federico Mena Quintero <federico@novell.com> -+ -+ -+ * modules/libpr0n/src/imgContainer.cpp (~imgContainer): Free the -+ restore data and the MIME type. -+ -+2007-08-22 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/public/imgIContainer.idl (setDiscardable): New -+ method. When this is called (can be called only once) from an -+ image decoder, the image container will discard its uncompressed -+ image data after a timeout. -+ (addRestoreData): New method. Image decoders should call this -+ repeatedly after calling setDiscardable(); this is used to feed -+ the original, compressed image data to the image container so that -+ it can uncompress it on demand after discarding it. -+ -+ * modules/libpr0n/src/imgContainer.cpp (imgContainer::SetDiscardable): -+ Implement. -+ (imgContainer::AddRestoreData): Implement. -+ -+2007-08-20 Federico Mena Quintero <federico@novell.com> -+ -+ * gfx/thebes/src/gfxXlibSurface.cpp -+ (gfxXlibSurface::LogSurfaceCreation, surface_destroy_func): Count -+ the number of surfaces in addition to the number of pixels. -+ -+2007-08-17 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/public/ImageLogging.h: Remove gImgAccountingLog -+ from here. -+ -+ * modules/libpr0n/src/imgRequest.cpp: Likewise. -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (gJPEGDecodeAccountingLog): Create a "JPEGDecoderAccounting" log domain. -+ (nsJPEGDecoder::WriteFrom): Use that log domain. -+ -+ * gfx/thebes/src/gfxXlibSurface.cpp (gXlibSurfaceAccountingLog): -+ Define a "XlibSurfaceAccounting" log domain. -+ (gfxXlibSurface::LogSurfaceCreation): New method to log when an -+ Xlib surface is created from a pixmap. Keeps a counter of how -+ many pixels are allocated globally. -+ (gfxXlibSurface::HookSurfaceDestructionForLogging): Utility method -+ to set user data on the cairo surface, so that we can know when it -+ is destroyed. -+ (gfxXlibSurface::gfxXlibSurface): Log the creation of the surface, -+ and hook it so that we can know when it is destroyed. -+ -+2007-08-17 Federico Mena Quintero <federico@novell.com> -+ -+ * modules/libpr0n/src/imgRequest.cpp (gImgAccountingLog): New -+ logging domain "imgAccounting". We'll use this to log when images -+ get allocated, freed, requested, etc. -+ -+ * modules/libpr0n/public/ImageLogging.h (gImgAccountingLog): -+ Declare this. -+ -+ * modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+ (nsJPEGDecoder::WriteFrom): Log the creation of an image frame. -+ -diff --git gfx/thebes/public/gfxXlibSurface.h gfx/thebes/public/gfxXlibSurface.h -index 078dc73..ea7ba24 100644 ---- gfx/thebes/public/gfxXlibSurface.h -+++ gfx/thebes/public/gfxXlibSurface.h -@@ -21,6 +21,7 @@ - * Contributor(s): - * Stuart Parmenter <pavlov@pavlov.net> - * Vladimir Vukicevic <vladimir@pobox.com> -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -85,6 +86,9 @@ public: - // when the gfxXlibSurface is destroyed. - void TakePixmap(); - -+ void LogSurfaceCreation (); -+ void HookSurfaceDestructionForLogging (); -+ - protected: - // if TakePixmap() was already called on this - PRBool mPixmapTaken; -diff --git gfx/thebes/src/gfxXlibSurface.cpp gfx/thebes/src/gfxXlibSurface.cpp -index dc2a19f..f9c191c 100644 ---- gfx/thebes/src/gfxXlibSurface.cpp -+++ gfx/thebes/src/gfxXlibSurface.cpp -@@ -21,6 +21,7 @@ - * Contributor(s): - * Stuart Parmenter <pavlov@pavlov.net> - * Vladimir Vukicevic <vladimir@pobox.com> -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -37,6 +38,7 @@ - * ***** END LICENSE BLOCK ***** */ - - #include "gfxXlibSurface.h" -+#include "prlog.h" - - #include "cairo.h" - #include "cairo-xlib.h" -@@ -51,6 +53,18 @@ typedef struct { - - static void pixmap_free_func (void *); - -+ -+#if defined(PR_LOGGING) -+static PRLogModuleInfo *gXlibSurfaceAccountingLog = PR_NewLogModule ("XlibSurfaceAccounting"); -+#else -+#define gXlibSurfaceAccountingLog -+#endif -+ -+static cairo_user_data_key_t surface_free_key; -+static int num_surfaces_allocated; -+static PRInt64 pixels_allocated; -+ -+ - #define XLIB_IMAGE_SIDE_SIZE_LIMIT 0xffff - - gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual) -@@ -59,6 +73,9 @@ gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual) - DoSizeQuery(); - cairo_surface_t *surf = cairo_xlib_surface_create(dpy, drawable, visual, mSize.width, mSize.height); - Init(surf); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual, const gfxIntSize& size) -@@ -69,6 +86,9 @@ gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, Visual *visual, - - cairo_surface_t *surf = cairo_xlib_surface_create(dpy, drawable, visual, mSize.width, mSize.height); - Init(surf); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::gfxXlibSurface(Display *dpy, Visual *visual, const gfxIntSize& size) -@@ -87,6 +107,9 @@ gfxXlibSurface::gfxXlibSurface(Display *dpy, Visual *visual, const gfxIntSize& s - - Init(surf); - TakePixmap(); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, XRenderPictFormat *format, -@@ -100,6 +123,9 @@ gfxXlibSurface::gfxXlibSurface(Display *dpy, Drawable drawable, XRenderPictForma - ScreenOfDisplay(dpy,DefaultScreen(dpy)), - format, mSize.width, mSize.height); - Init(surf); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::gfxXlibSurface(Display *dpy, XRenderPictFormat *format, const gfxIntSize& size) -@@ -115,6 +141,9 @@ gfxXlibSurface::gfxXlibSurface(Display *dpy, XRenderPictFormat *format, const gf - format, mSize.width, mSize.height); - Init(surf); - TakePixmap(); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::gfxXlibSurface(cairo_surface_t *csurf) -@@ -124,6 +153,9 @@ gfxXlibSurface::gfxXlibSurface(cairo_surface_t *csurf) - mDisplay = cairo_xlib_surface_get_display(csurf); - - Init(csurf, PR_TRUE); -+ -+ LogSurfaceCreation (); -+ HookSurfaceDestructionForLogging(); - } - - gfxXlibSurface::~gfxXlibSurface() -@@ -198,3 +230,63 @@ pixmap_free_func (void *data) - - delete pfs; - } -+ -+void -+gfxXlibSurface::LogSurfaceCreation () -+{ -+ gfxIntSize size; -+ -+ size = GetSize (); -+ -+ num_surfaces_allocated++; -+ pixels_allocated += (PRInt64) size.width * size.height; -+ -+ PR_LOG (gXlibSurfaceAccountingLog, PR_LOG_DEBUG, -+ ("XlibSurfaceAccounting: Xlib surface %p created, %ux%u pixels - %d surfaces with %lld global pixels allocated", -+ CairoSurface (), -+ size.width, -+ size.height, -+ num_surfaces_allocated, -+ pixels_allocated)); -+} -+ -+struct SurfaceFreeData { -+ gfxIntSize size; -+ cairo_surface_t *surface; -+}; -+ -+static void -+surface_destroy_func (void *closure) -+{ -+ SurfaceFreeData *data; -+ -+ data = (SurfaceFreeData *) closure; -+ -+ num_surfaces_allocated--; -+ pixels_allocated -= (PRInt64) data->size.width * data->size.height; -+ -+ PR_LOG (gXlibSurfaceAccountingLog, PR_LOG_DEBUG, -+ ("XlibSurfaceAccounting: Destroying Xlib surface %p, %dx%d pixels - %d surfaces with %lld global pixels allocated", -+ data->surface, -+ data->size.width, -+ data->size.height, -+ num_surfaces_allocated, -+ pixels_allocated)); -+ -+ delete data; -+} -+ -+void -+gfxXlibSurface::HookSurfaceDestructionForLogging () -+{ -+ SurfaceFreeData *data; -+ -+ data = new SurfaceFreeData; -+ data->size = GetSize (); -+ data->surface = CairoSurface (); -+ -+ cairo_surface_set_user_data (data->surface, -+ &surface_free_key, -+ data, -+ surface_destroy_func); -+} -diff --git modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -index 16b9fd8..48431e4 100644 ---- modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -+++ modules/libpr0n/decoders/jpeg/nsJPEGDecoder.cpp -@@ -22,6 +22,7 @@ - * - * Contributor(s): - * Stuart Parmenter <stuart@mozilla.com> -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -63,8 +64,10 @@ NS_IMPL_ISUPPORTS1(nsJPEGDecoder, imgIDecoder) - - #if defined(PR_LOGGING) - PRLogModuleInfo *gJPEGlog = PR_NewLogModule("JPEGDecoder"); -+static PRLogModuleInfo *gJPEGDecoderAccountingLog = PR_NewLogModule ("JPEGDecoderAccounting"); - #else - #define gJPEGlog -+#define gJPEGDecoderAccountingLog - #endif - - -@@ -208,6 +211,15 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - nsresult rv = inStr->Read((char*)mBuffer, count, &mBufferLen); - *_retval = mBufferLen; - -+ if (mImage) { -+ nsresult result = mImage->AddRestoreData ((char *) mBuffer, count); -+ -+ if (NS_FAILED (result)) { -+ mState = JPEG_ERROR; -+ return result; -+ } -+ } -+ - NS_ASSERTION(NS_SUCCEEDED(rv), "nsJPEGDecoder::WriteFrom -- inStr->Read failed"); - } - // else no input stream.. Flush() ? -@@ -357,6 +369,9 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - /* Check if the request already has an image container. - this is the case when multipart/x-mixed-replace is being downloaded - if we already have one and it has the same width and height, reuse it. -+ -+ This is also the case when an existing container is reloading itself from -+ us. - */ - mImageLoad->GetImage(getter_AddRefs(mImage)); - if (mImage) { -@@ -370,6 +385,8 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - } - - if (!mImage) { -+ nsresult result; -+ - mImage = do_CreateInstance("@mozilla.org/image/container;1"); - if (!mImage) { - mState = JPEG_ERROR; -@@ -377,6 +394,18 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - } - mImageLoad->SetImage(mImage); - mImage->Init(mInfo.image_width, mInfo.image_height, mObserver); -+ -+ result = mImage->SetDiscardable ("image/jpeg"); /* FIXME: is this MIME type always right for this decoder? */ -+ if (NS_FAILED (result)) { -+ mState = JPEG_ERROR; -+ return result; -+ } -+ -+ result = mImage->AddRestoreData ((char *) mBuffer, count); -+ if (NS_FAILED (result)) { -+ mState = JPEG_ERROR; -+ return result; -+ } - } - - mObserver->OnStartContainer(nsnull, mImage); -@@ -416,7 +445,11 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - } - - mImage->AppendFrame(mFrame); -- } -+ -+ PR_LOG (gJPEGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("JPEGDecoderAccounting: nsJPEGDecoder::WriteFrom -- created image frame with %ux%u pixels", -+ mInfo.image_width, mInfo.image_height)); -+ } - - mObserver->OnStartFrame(nsnull, mFrame); - -@@ -538,6 +571,8 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - - case JPEG_DONE: - { -+ nsresult result; -+ - LOG_SCOPE(gJPEGlog, "nsJPEGDecoder::WriteFrom -- entering JPEG_DONE case"); - - /* Step 7: Finish decompression */ -@@ -547,6 +582,12 @@ NS_IMETHODIMP nsJPEGDecoder::WriteFrom(nsIInputStream *inStr, PRUint32 count, PR - - mState = JPEG_SINK_NON_JPEG_TRAILER; - -+ result = mImage->RestoreDataDone (); -+ if (NS_FAILED (result)) { -+ mState = JPEG_ERROR; -+ return result; -+ } -+ - /* we're done dude */ - break; - } -diff --git modules/libpr0n/decoders/png/nsPNGDecoder.cpp modules/libpr0n/decoders/png/nsPNGDecoder.cpp -index 85f0216..15abc9f 100644 ---- modules/libpr0n/decoders/png/nsPNGDecoder.cpp -+++ modules/libpr0n/decoders/png/nsPNGDecoder.cpp -@@ -23,6 +23,7 @@ - * Contributor(s): - * Stuart Parmenter <stuart@mozilla.com> - * Andrew Smith -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -73,6 +74,7 @@ static void PNGAPI warning_callback(png_structp png_ptr, png_const_charp warning - - #ifdef PR_LOGGING - PRLogModuleInfo *gPNGLog = PR_NewLogModule("PNGDecoder"); -+static PRLogModuleInfo *gPNGDecoderAccountingLog = PR_NewLogModule ("PNGDecoderAccounting"); - #endif - - NS_IMPL_ISUPPORTS1(nsPNGDecoder, imgIDecoder) -@@ -119,6 +121,11 @@ void nsPNGDecoder::CreateFrame(png_uint_32 x_offset, png_uint_32 y_offset, - - if (mObserver) - mObserver->OnStartFrame(nsnull, mFrame); -+ -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: nsPNGDecoder::CreateFrame -- created image frame with %dx%d pixels in container %p", -+ width, height, -+ mImage.get ())); - } - - // set timeout and frame disposal method for the current frame -@@ -213,9 +220,25 @@ NS_IMETHODIMP nsPNGDecoder::Init(imgILoad *aLoad) - /* void close (); */ - NS_IMETHODIMP nsPNGDecoder::Close() - { -+ nsresult result; -+ - if (mPNG) - png_destroy_read_struct(&mPNG, mInfo ? &mInfo : NULL, NULL); - -+ result = mImage->RestoreDataDone (); -+ if (NS_FAILED (result)) { -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: nsPNGDecoder::Close(): failure in RestoreDataDone() for image container %p", -+ mImage.get ())); -+ -+ mError = PR_TRUE; -+ return result; -+ } -+ -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: nsPNGDecoder::Close(): image container %p is now with RestoreDataDone", -+ mImage.get ())); -+ - return NS_OK; - } - -@@ -234,6 +257,7 @@ static NS_METHOD ReadDataOut(nsIInputStream* in, - PRUint32 *writeCount) - { - nsPNGDecoder *decoder = static_cast<nsPNGDecoder*>(closure); -+ nsresult result; - - if (decoder->mError) { - *writeCount = 0; -@@ -248,10 +272,24 @@ static NS_METHOD ReadDataOut(nsIInputStream* in, - *writeCount = 0; - return NS_ERROR_FAILURE; - } -- - png_process_data(decoder->mPNG, decoder->mInfo, - reinterpret_cast<unsigned char *>(const_cast<char *>(fromRawSegment)), count); - -+ result = decoder->mImage->AddRestoreData ((char *) fromRawSegment, count); -+ if (NS_FAILED (result)) { -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: ReadDataOut(): failed to add restore data to image container %p", -+ decoder->mImage.get ())); -+ -+ decoder->mError = PR_TRUE; -+ *writeCount = 0; -+ return result; -+ } -+ -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: ReadDataOut(): Added restore data to image container %p", -+ decoder->mImage.get ())); -+ - *writeCount = count; - return NS_OK; - } -@@ -525,13 +563,41 @@ info_callback(png_structp png_ptr, png_infop info_ptr) - if (decoder->mObserver) - decoder->mObserver->OnStartDecode(nsnull); - -- decoder->mImage = do_CreateInstance("@mozilla.org/image/container;1"); -- if (!decoder->mImage) -- longjmp(decoder->mPNG->jmpbuf, 5); // NS_ERROR_OUT_OF_MEMORY -+ /* The image container may already exist if it is reloading itself from us. -+ * Check that it has the same width/height; otherwise create a new container. -+ */ -+ decoder->mImageLoad->GetImage (getter_AddRefs (decoder->mImage)); -+ if (decoder->mImage) { -+ PRInt32 container_width, container_height; -+ -+ decoder->mImage->GetWidth (&container_width); -+ decoder->mImage->GetHeight (&container_height); - -- decoder->mImageLoad->SetImage(decoder->mImage); -+ if (container_width != width || container_height != height) -+ decoder->mImage = nsnull; -+ } - -- decoder->mImage->Init(width, height, decoder->mObserver); -+ if (!decoder->mImage) { -+ decoder->mImage = do_CreateInstance("@mozilla.org/image/container;1"); -+ if (!decoder->mImage) -+ longjmp(decoder->mPNG->jmpbuf, 5); // NS_ERROR_OUT_OF_MEMORY -+ -+ decoder->mImageLoad->SetImage(decoder->mImage); -+ -+ decoder->mImage->Init(width, height, decoder->mObserver); -+ -+ /* FIXME: is this MIME type always right for this decoder? */ -+ if (NS_FAILED (decoder->mImage->SetDiscardable ("image/png"))) { -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: info_callback(): failed to set image container %p as discardable", -+ decoder->mImage.get ())); -+ longjmp(decoder->mPNG->jmpbuf, 5); // NS_ERROR_OUT_OF_MEMORY -+ } -+ -+ PR_LOG (gPNGDecoderAccountingLog, PR_LOG_DEBUG, -+ ("PNGDecoderAccounting: info_callback(): set image container %p as discardable", -+ decoder->mImage.get ())); -+ } - - if (decoder->mObserver) - decoder->mObserver->OnStartContainer(nsnull, decoder->mImage); -@@ -757,7 +823,7 @@ end_callback(png_structp png_ptr, png_infop info_ptr) - } - - decoder->mImage->DecodingComplete(); -- -+ - if (decoder->mObserver) { - if (!(decoder->apngFlags & FRAME_HIDDEN)) - decoder->mObserver->OnStopFrame(nsnull, decoder->mFrame); -diff --git modules/libpr0n/public/imgIContainer.idl modules/libpr0n/public/imgIContainer.idl -index fc42335..524af96 100644 ---- modules/libpr0n/public/imgIContainer.idl -+++ modules/libpr0n/public/imgIContainer.idl -@@ -22,6 +22,7 @@ - * - * Contributor(s): - * Stuart Parmenter <pavlov@netscape.com> -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -144,4 +145,10 @@ interface imgIContainer : nsISupports - * @note -1 means forever. - */ - attribute long loopCount; -+ -+ /* Methods to discard uncompressed images and restore them again */ -+ [noscript] void setDiscardable(in string aMimeType); -+ [noscript] void addRestoreData(in charPtr aBuffer, -+ in unsigned long aCount); -+ [noscript] void restoreDataDone(); - }; -diff --git modules/libpr0n/src/imgContainer.cpp modules/libpr0n/src/imgContainer.cpp -index 776c4ee..22d8735 100644 ---- modules/libpr0n/src/imgContainer.cpp -+++ modules/libpr0n/src/imgContainer.cpp -@@ -25,6 +25,7 @@ - * Asko Tontti <atontti@cc.hut.fi> - * Arron Mogge <paper@animecity.nu> - * Andrew Smith -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -42,23 +43,49 @@ - - #include "nsComponentManagerUtils.h" - #include "imgIContainerObserver.h" -+#include "ImageErrors.h" - #include "nsIImage.h" -+#include "imgILoad.h" -+#include "imgIDecoder.h" -+#include "imgIDecoderObserver.h" - #include "imgContainer.h" - #include "nsIInterfaceRequestor.h" - #include "nsIInterfaceRequestorUtils.h" - #include "nsAutoPtr.h" -+#include "nsStringStream.h" -+#include "prmem.h" -+#include "prlog.h" - - #include "gfxContext.h" - -+/* Accounting for compressed data */ -+#if defined(PR_LOGGING) -+static PRLogModuleInfo *gCompressedImageAccountingLog = PR_NewLogModule ("CompressedImageAccounting"); -+#else -+#define gCompressedImageAccountingLog -+#endif -+ -+static int num_containers_with_discardable_data; -+static PRInt64 num_compressed_image_bytes; -+ -+ - NS_IMPL_ISUPPORTS3(imgContainer, imgIContainer, nsITimerCallback, nsIProperties) - - //****************************************************************************** - imgContainer::imgContainer() : - mSize(0,0), -+ mNumFrames(0), - mAnim(nsnull), - mAnimationMode(kNormalAnimMode), - mLoopCount(-1), -- mObserver(nsnull) -+ mObserver(nsnull), -+ mDiscardable(PR_FALSE), -+ mDiscarded(PR_FALSE), -+ mDiscardableMimeType(nsnull), -+ mRestoreData(nsnull), -+ mRestoreDataLength(0), -+ mRestoreDataDone(PR_FALSE), -+ mDiscardTimer(nsnull) - { - } - -@@ -67,6 +94,32 @@ imgContainer::~imgContainer() - { - if (mAnim) - delete mAnim; -+ -+ if (mDiscardableMimeType) { -+ free (mDiscardableMimeType); -+ mDiscardableMimeType = nsnull; -+ } -+ -+ if (mRestoreData) { -+ PR_Free (mRestoreData); -+ -+ num_containers_with_discardable_data--; -+ num_compressed_image_bytes -= mRestoreDataLength; -+ -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: destroying imgContainer %p. " -+ "Compressed containers: %d, Compressed data bytes: %lld", -+ this, -+ num_containers_with_discardable_data, -+ num_compressed_image_bytes)); -+ -+ mRestoreDataLength = 0; -+ } -+ -+ if (mDiscardTimer) { -+ mDiscardTimer->Cancel (); -+ mDiscardTimer = nsnull; -+ } - } - - //****************************************************************************** -@@ -124,15 +177,53 @@ NS_IMETHODIMP imgContainer::GetHeight(PRInt32 *aHeight) - return NS_OK; - } - -+nsresult imgContainer::GetCurrentFrameNoRef (gfxIImageFrame** aFrame) -+{ -+ nsresult result; -+ -+ result = RestoreDiscardedData (); -+ if (NS_FAILED (result)) { -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: imgContainer::GetCurrentFrameNoRef(): error %d in RestoreDiscardedData(); " -+ "returning a null frame from imgContainer %p", -+ result, -+ this)); -+ -+ *aFrame = nsnull; -+ return result; -+ } -+ -+ if (!mAnim) -+ *aFrame = mFrames.SafeObjectAt(0); -+ else if (mAnim->lastCompositedFrameIndex == mAnim->currentAnimationFrameIndex) -+ *aFrame = mAnim->compositingFrame; -+ else -+ *aFrame = mFrames.SafeObjectAt(mAnim->currentAnimationFrameIndex); -+ -+ if (!*aFrame) -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: imgContainer::GetCurrentFrameNoRef(): returning null frame from imgContainer %p " -+ "(no errors when restoring data)", -+ this)); -+ -+ return NS_OK; -+} -+ - //****************************************************************************** - /* readonly attribute gfxIImageFrame currentFrame; */ - NS_IMETHODIMP imgContainer::GetCurrentFrame(gfxIImageFrame **aCurrentFrame) - { -+ nsresult result; -+ - NS_ASSERTION(aCurrentFrame, "imgContainer::GetCurrentFrame; Invalid Arg"); - if (!aCurrentFrame) - return NS_ERROR_INVALID_POINTER; - -- if (!(*aCurrentFrame = inlinedGetCurrentFrame())) -+ result = GetCurrentFrameNoRef (aCurrentFrame); -+ if (NS_FAILED (result)) -+ return result; -+ -+ if (!*aCurrentFrame) - return NS_ERROR_FAILURE; - - NS_ADDREF(*aCurrentFrame); -@@ -148,7 +239,7 @@ NS_IMETHODIMP imgContainer::GetNumFrames(PRUint32 *aNumFrames) - if (!aNumFrames) - return NS_ERROR_INVALID_ARG; - -- *aNumFrames = mFrames.Count(); -+ *aNumFrames = mNumFrames; - - return NS_OK; - } -@@ -157,16 +248,24 @@ NS_IMETHODIMP imgContainer::GetNumFrames(PRUint32 *aNumFrames) - /* gfxIImageFrame getFrameAt (in unsigned long index); */ - NS_IMETHODIMP imgContainer::GetFrameAt(PRUint32 index, gfxIImageFrame **_retval) - { -+ nsresult result; -+ - NS_ASSERTION(_retval, "imgContainer::GetFrameAt; Invalid Arg"); - if (!_retval) - return NS_ERROR_INVALID_POINTER; - -- if (!mFrames.Count()) { -+ if (mNumFrames == 0) { - *_retval = nsnull; - return NS_OK; - } - -- NS_ENSURE_ARG(index < static_cast<PRUint32>(mFrames.Count())); -+ NS_ENSURE_ARG((int) index < mNumFrames); -+ -+ result = RestoreDiscardedData (); -+ if (NS_FAILED (result)) { -+ *_retval = nsnull; -+ return result; -+ } - - if (!(*_retval = mFrames[index])) - return NS_ERROR_FAILURE; -@@ -183,16 +282,17 @@ NS_IMETHODIMP imgContainer::AppendFrame(gfxIImageFrame *item) - NS_ASSERTION(item, "imgContainer::AppendFrame; Invalid Arg"); - if (!item) - return NS_ERROR_INVALID_ARG; -- -- PRInt32 numFrames = mFrames.Count(); -- -- if (numFrames == 0) { -+ -+ if (mFrames.Count () == 0) { - // This may not be an animated image, don't do all the animation stuff. - mFrames.AppendObject(item); -+ -+ mNumFrames++; -+ - return NS_OK; - } - -- if (numFrames == 1) { -+ if (mFrames.Count () == 1) { - // Now that we got a second frame, initialize animation stuff. - if (!ensureAnimExists()) - return NS_ERROR_OUT_OF_MEMORY; -@@ -216,11 +316,13 @@ NS_IMETHODIMP imgContainer::AppendFrame(gfxIImageFrame *item) - itemRect); - - mFrames.AppendObject(item); -+ -+ mNumFrames++; - - // If this is our second frame, start the animation. - // Must be called after AppendObject because StartAnimation checks for > 1 - // frame -- if (numFrames == 1) -+ if (mFrames.Count () == 1) - StartAnimation(); - - return NS_OK; -@@ -230,6 +332,7 @@ NS_IMETHODIMP imgContainer::AppendFrame(gfxIImageFrame *item) - /* void removeFrame (in gfxIImageFrame item); */ - NS_IMETHODIMP imgContainer::RemoveFrame(gfxIImageFrame *item) - { -+ /* Remember to decrement mNumFrames if you implement this */ - return NS_ERROR_NOT_IMPLEMENTED; - } - -@@ -253,7 +356,7 @@ NS_IMETHODIMP imgContainer::DecodingComplete(void) - mAnim->doneDecoding = PR_TRUE; - // If there's only 1 frame, optimize it. - // Optimizing animated images is not supported -- if (mFrames.Count() == 1) -+ if (mNumFrames == 1) - mFrames[0]->SetMutable(PR_FALSE); - return NS_OK; - } -@@ -292,11 +395,11 @@ NS_IMETHODIMP imgContainer::SetAnimationMode(PRUint16 aAnimationMode) - break; - case kNormalAnimMode: - if (mLoopCount != 0 || -- (mAnim && (mAnim->currentAnimationFrameIndex + 1 < mFrames.Count()))) -+ (mAnim && (mAnim->currentAnimationFrameIndex + 1 < mNumFrames))) - StartAnimation(); - break; - case kLoopOnceAnimMode: -- if (mAnim && (mAnim->currentAnimationFrameIndex + 1 < mFrames.Count())) -+ if (mAnim && (mAnim->currentAnimationFrameIndex + 1 < mNumFrames)) - StartAnimation(); - break; - } -@@ -312,12 +415,18 @@ NS_IMETHODIMP imgContainer::StartAnimation() - (mAnim && (mAnim->timer || mAnim->animating))) - return NS_OK; - -- if (mFrames.Count() > 1) { -+ if (mNumFrames > 1) { - if (!ensureAnimExists()) - return NS_ERROR_OUT_OF_MEMORY; - - PRInt32 timeout; -- gfxIImageFrame *currentFrame = inlinedGetCurrentFrame(); -+ nsresult result; -+ gfxIImageFrame *currentFrame; -+ -+ result = GetCurrentFrameNoRef (¤tFrame); -+ if (NS_FAILED (result)) -+ return result; -+ - if (currentFrame) { - currentFrame->GetTimeout(&timeout); - if (timeout <= 0) // -1 means display this frame forever -@@ -376,8 +485,15 @@ NS_IMETHODIMP imgContainer::ResetAnimation() - mAnim->currentAnimationFrameIndex = 0; - // Update display - nsCOMPtr<imgIContainerObserver> observer(do_QueryReferent(mObserver)); -- if (observer) -+ if (observer) { -+ nsresult result; -+ -+ result = RestoreDiscardedData (); -+ if (NS_FAILED (result)) -+ return result; -+ - observer->FrameChanged(this, mFrames[0], &(mAnim->firstFrameRefreshArea)); -+ } - - if (oldAnimating) - return StartAnimation(); -@@ -411,10 +527,161 @@ NS_IMETHODIMP imgContainer::SetLoopCount(PRInt32 aLoopCount) - return NS_OK; - } - -+static PRBool -+discarding_is_enabled (void) -+{ -+ static PRBool inited; -+ static PRBool enabled; -+ -+ if (!inited) { -+ inited = PR_TRUE; -+ -+ enabled = (getenv ("MOZ_DISABLE_IMAGE_DISCARD") == nsnull); -+ } -+ -+ return enabled; -+} -+ -+//****************************************************************************** -+/* void setDiscardable(in string mime_type); */ -+NS_IMETHODIMP imgContainer::SetDiscardable (const char* aMimeType) -+{ -+ NS_ASSERTION(aMimeType, "imgContainer::SetDiscardable() called with null aMimeType"); -+ -+ if (!discarding_is_enabled ()) -+ return NS_OK; -+ -+ if (mDiscardable) { -+ NS_WARNING ("imgContainer::SetDiscardable(): cannot change an imgContainer which is already discardable"); -+ return NS_ERROR_FAILURE; -+ } -+ -+ mDiscardableMimeType = strdup (aMimeType); -+ if (!mDiscardableMimeType) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ mDiscardable = PR_TRUE; -+ -+ num_containers_with_discardable_data++; -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: Making imgContainer %p (%s) discardable. " -+ "Compressed containers: %d, Compressed data bytes: %lld", -+ this, -+ aMimeType, -+ num_containers_with_discardable_data, -+ num_compressed_image_bytes)); -+ -+ return NS_OK; -+} -+ -+//****************************************************************************** -+/* void addRestoreData(in nsIInputStream aInputStream, in unsigned long aCount); */ -+NS_IMETHODIMP imgContainer::AddRestoreData (char *aBuffer, PRUint32 aCount) -+{ -+ PRSize new_size; -+ char *new_buffer; -+ -+ NS_ASSERTION(aBuffer, "imgContainer::AddRestoreData() called with null aBuffer"); -+ -+ if (!discarding_is_enabled ()) -+ return NS_OK; -+ -+ if (!mDiscardable) { -+ NS_WARNING ("imgContainer::AddRestoreData() can only be called if SetDiscardable is called first"); -+ return NS_ERROR_FAILURE; -+ } -+ -+ if (mRestoreDataDone) { -+ /* We are being called from the decoder while the data is being restored -+ * (i.e. we were fully loaded once, then we discarded the image data, then -+ * we are being restored). We don't want to save the compressed data again, -+ * since we already have it. -+ */ -+ return NS_OK; -+ } -+ -+ new_size = mRestoreDataLength + aCount; -+ -+ new_buffer = (char *) PR_Realloc (mRestoreData, new_size); -+ if (new_buffer) -+ mRestoreData = new_buffer; -+ else { -+ /* Hmm, should we discard the whole buffer? The caller isn't going to be able to recover... */ -+ return NS_ERROR_OUT_OF_MEMORY; -+ } -+ -+ memcpy (mRestoreData + mRestoreDataLength, aBuffer, aCount); -+ mRestoreDataLength = new_size; -+ -+ num_compressed_image_bytes += aCount; -+ -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: Added compressed data to imgContainer %p (%s). " -+ "Compressed containers: %d, Compressed data bytes: %lld", -+ this, -+ mDiscardableMimeType, -+ num_containers_with_discardable_data, -+ num_compressed_image_bytes)); -+ -+ return NS_OK; -+} -+ -+/* Note! buf must be declared as char buf[9]; */ -+static void -+get_header_str (char *buf, char *data, PRSize data_len) -+{ -+ int i; -+ int n; -+ static char hex[] = "0123456789abcdef"; -+ -+ n = data_len < 4 ? data_len : 4; -+ -+ for (i = 0; i < n; i++) { -+ buf[i * 2] = hex[(data[i] >> 4) & 0x0f]; -+ buf[i * 2 + 1] = hex[data[i] & 0x0f]; -+ } -+ -+ buf[i * 2] = 0; -+} -+ -+//****************************************************************************** -+/* void restoreDataDone(); */ -+NS_IMETHODIMP imgContainer::RestoreDataDone (void) -+{ -+ char buf[9]; -+ -+ if (!discarding_is_enabled ()) -+ return NS_OK; -+ -+ if (mRestoreDataDone) -+ return NS_OK; -+ -+ mRestoreDataDone = PR_TRUE; -+ -+ get_header_str (buf, mRestoreData, mRestoreDataLength); -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: imgContainer::RestoreDataDone() - data is done for container %p (%s), %d real frames (cached as %d frames) - header %p is 0x%s (length %d)", -+ this, -+ mDiscardableMimeType, -+ mFrames.Count (), -+ mNumFrames, -+ mRestoreData, -+ buf, -+ (int) mRestoreDataLength)); -+ -+ return ResetDiscardTimer (); -+} -+ - //****************************************************************************** - /* void notify(in nsITimer timer); */ - NS_IMETHODIMP imgContainer::Notify(nsITimer *timer) - { -+ nsresult result; -+ -+ result = RestoreDiscardedData (); -+ if (NS_FAILED (result)) -+ return result; -+ - // This should never happen since the timer is only set up in StartAnimation() - // after mAnim is checked to exist. - NS_ASSERTION(mAnim, "imgContainer::Notify() called but mAnim is null"); -@@ -433,8 +700,7 @@ NS_IMETHODIMP imgContainer::Notify(nsITimer *timer) - return NS_OK; - } - -- PRInt32 numFrames = mFrames.Count(); -- if (!numFrames) -+ if (mNumFrames == 0) - return NS_OK; - - gfxIImageFrame *nextFrame = nsnull; -@@ -448,7 +714,7 @@ NS_IMETHODIMP imgContainer::Notify(nsITimer *timer) - // finished decoding (see EndFrameDecode) - if (mAnim->doneDecoding || - (nextFrameIndex < mAnim->currentDecodingFrameIndex)) { -- if (numFrames == nextFrameIndex) { -+ if (mNumFrames == nextFrameIndex) { - // End of Animation - - // If animation mode is "loop once", it's time to stop animating -@@ -875,3 +1141,328 @@ NS_IMETHODIMP imgContainer::GetKeys(PRUint32 *count, char ***keys) - } - return mProperties->GetKeys(count, keys); - } -+ -+static int -+get_discard_timer_ms (void) -+{ -+ /* FIXME: don't hardcode this */ -+ return 5000; /* 5 seconds */ -+} -+ -+void -+imgContainer::sDiscardTimerCallback (nsITimer *aTimer, void *aClosure) -+{ -+ imgContainer *self = (imgContainer *) aClosure; -+ int old_frame_count; -+ -+ NS_ASSERTION (aTimer == self->mDiscardTimer, -+ "imgContainer::DiscardTimerCallback() got a callback for an unknown timer"); -+ -+ self->mDiscardTimer = nsnull; -+ -+ old_frame_count = self->mFrames.Count (); -+ -+ if (self->mAnim) { -+ delete self->mAnim; -+ self->mAnim = nsnull; -+ } -+ -+ self->mFrames.Clear (); -+ -+ self->mDiscarded = PR_TRUE; -+ -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: discarded uncompressed image data from imgContainer %p (%s) - %d frames (cached count: %d); " -+ "Compressed containers: %d, Compressed data bytes: %lld", -+ self, -+ self->mDiscardableMimeType, -+ old_frame_count, -+ self->mNumFrames, -+ num_containers_with_discardable_data, -+ num_compressed_image_bytes)); -+} -+ -+nsresult -+imgContainer::ResetDiscardTimer (void) -+{ -+ if (!discarding_is_enabled ()) -+ return NS_OK; -+ -+ if (!mDiscardTimer) { -+ mDiscardTimer = do_CreateInstance("@mozilla.org/timer;1"); -+ -+ if (!mDiscardTimer) -+ return NS_ERROR_OUT_OF_MEMORY; -+ } else { -+ if (NS_FAILED (mDiscardTimer->Cancel ())) -+ return NS_ERROR_FAILURE; -+ } -+ -+ return mDiscardTimer->InitWithFuncCallback (sDiscardTimerCallback, -+ (void *) this, -+ get_discard_timer_ms (), -+ nsITimer::TYPE_ONE_SHOT); -+} -+ -+nsresult -+imgContainer::RestoreDiscardedData (void) -+{ -+ nsresult result; -+ int num_expected_frames; -+ -+ if (!mDiscarded) -+ return NS_OK; -+ -+ result = ResetDiscardTimer (); -+ if (NS_FAILED (result)) -+ return result; -+ -+ num_expected_frames = mNumFrames; -+ -+ result = ReloadImages (); -+ if (NS_FAILED (result)) { -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: imgContainer::RestoreDiscardedData() for container %p failed to ReloadImages()", -+ this)); -+ return result; -+ } -+ -+ mDiscarded = PR_FALSE; -+ -+ NS_ASSERTION (mNumFrames == mFrames.Count (), -+ "number of restored image frames doesn't match"); -+ NS_ASSERTION (num_expected_frames == mNumFrames, -+ "number of restored image frames doesn't match the original number of frames!"); -+ -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_DEBUG, -+ ("CompressedImageAccounting: imgContainer::RestoreDiscardedData() restored discarded data " -+ "for imgContainer %p (%s) - %d image frames. " -+ "Compressed containers: %d, Compressed data bytes: %lld", -+ this, -+ mDiscardableMimeType, -+ mNumFrames, -+ num_containers_with_discardable_data, -+ num_compressed_image_bytes)); -+ -+ return NS_OK; -+} -+ -+class ContainerLoader : public imgILoad, -+ public imgIDecoderObserver, -+ public nsSupportsWeakReference -+{ -+public: -+ -+ NS_DECL_ISUPPORTS -+ NS_DECL_IMGILOAD -+ NS_DECL_IMGIDECODEROBSERVER -+ NS_DECL_IMGICONTAINEROBSERVER -+ -+ ContainerLoader (void); -+ -+private: -+ -+ imgIContainer *mContainer; -+}; -+ -+NS_IMPL_ISUPPORTS4 (ContainerLoader, imgILoad, imgIDecoderObserver, imgIContainerObserver, nsISupportsWeakReference) -+ -+ContainerLoader::ContainerLoader (void) -+{ -+} -+ -+/* Implement imgILoad::image getter */ -+NS_IMETHODIMP -+ContainerLoader::GetImage(imgIContainer **aImage) -+{ -+ *aImage = mContainer; -+ NS_IF_ADDREF (*aImage); -+ return NS_OK; -+} -+ -+/* Implement imgILoad::image setter */ -+NS_IMETHODIMP -+ContainerLoader::SetImage(imgIContainer *aImage) -+{ -+ mContainer = aImage; -+ return NS_OK; -+} -+ -+/* Implement imgILoad::isMultiPartChannel getter */ -+NS_IMETHODIMP -+ContainerLoader::GetIsMultiPartChannel(PRBool *aIsMultiPartChannel) -+{ -+ *aIsMultiPartChannel = PR_FALSE; /* FIXME: is this always right? */ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStartRequest() */ -+NS_IMETHODIMP -+ContainerLoader::OnStartRequest (imgIRequest *aRequest) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStartDecode() */ -+NS_IMETHODIMP -+ContainerLoader::OnStartDecode (imgIRequest *aRequest) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStartContainer() */ -+NS_IMETHODIMP -+ContainerLoader::OnStartContainer (imgIRequest *aRequest, imgIContainer *aContainer) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStartFrame() */ -+NS_IMETHODIMP -+ContainerLoader::OnStartFrame (imgIRequest *aRequest, gfxIImageFrame *aFrame) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onDataAvailable() */ -+NS_IMETHODIMP -+ContainerLoader::OnDataAvailable (imgIRequest *aRequest, gfxIImageFrame *aFrame, const nsIntRect * aRect) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStopFrame() */ -+NS_IMETHODIMP -+ContainerLoader::OnStopFrame (imgIRequest *aRequest, gfxIImageFrame *aFrame) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStopContainer() */ -+NS_IMETHODIMP -+ContainerLoader::OnStopContainer (imgIRequest *aRequest, imgIContainer *aContainer) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStopDecode() */ -+NS_IMETHODIMP -+ContainerLoader::OnStopDecode (imgIRequest *aRequest, nsresult status, const PRUnichar *statusArg) -+{ -+ return NS_OK; -+} -+ -+/* Implement imgIDecoderObserver::onStopRequest() */ -+NS_IMETHODIMP -+ContainerLoader::OnStopRequest (imgIRequest *aRequest, PRBool aIsLastPart) -+{ -+ return NS_OK; -+} -+ -+/* implement imgIContainerObserver::frameChanged() */ -+NS_IMETHODIMP -+ContainerLoader::FrameChanged (imgIContainer *aContainer, gfxIImageFrame *aFrame, nsIntRect * aDirtyRect) -+{ -+ return NS_OK; -+} -+ -+static char * -+make_id_from_mime_type (char *mime_type) -+{ -+ const char idbase[] = "@mozilla.org/image/decoder;2?type="; -+ int idbase_len = strlen (idbase); -+ char *id; -+ -+ id = (char *) PR_Malloc (strlen (mime_type) + idbase_len + 1); -+ if (!id) -+ return nsnull; -+ -+ strcpy (id, idbase); -+ strcpy (id + idbase_len, mime_type); -+ -+ return id; -+} -+ -+nsresult -+imgContainer::ReloadImages (void) -+{ -+ char *id; -+ nsCOMPtr<imgILoad> loader; -+ nsCOMPtr<imgIDecoder> decoder; -+ nsresult result; -+ PRUint32 written; -+ nsCOMPtr<nsIInputStream> stream; -+ char buf[9]; -+ -+ NS_ASSERTION (mRestoreData, -+ "imgContainer::ReloadImages(): mRestoreData should not be null"); -+ NS_ASSERTION (mRestoreDataDone, -+ "imgContainer::ReloadImages(): mRestoreDataDone shoudl be true!"); -+ -+ id = make_id_from_mime_type (mDiscardableMimeType); -+ if (!id) -+ return NS_ERROR_OUT_OF_MEMORY; -+ -+ mNumFrames = 0; -+ NS_ASSERTION (mFrames.Count() == 0, -+ "imgContainer::ReloadImages(): mFrames should be empty"); -+ -+ decoder = do_CreateInstance (id); -+ PR_Free (id); -+ -+ if (!decoder) { -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_WARNING, -+ ("CompressedImageAccounting: imgContainer::ReloadImages() could not create decoder for %s", -+ mDiscardableMimeType)); -+ return NS_IMAGELIB_ERROR_NO_DECODER; -+ } -+ -+ loader = new ContainerLoader (); -+ if (!loader) { -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_WARNING, -+ ("CompressedImageAccounting: imgContainer::ReloadImages() could not allocate ContainerLoader " -+ "when reloading the images for container %p", -+ this)); -+ return NS_ERROR_OUT_OF_MEMORY; -+ } -+ -+ loader->SetImage (this); -+ -+ result = decoder->Init (loader); -+ if (NS_FAILED (result)) { -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_WARNING, -+ ("CompressedImageAccounting: imgContainer::ReloadImages() image container %p " -+ "failed to initialize the decoder (%s)", -+ this, -+ mDiscardableMimeType)); -+ return result; -+ } -+ -+ result = NS_NewByteInputStream (getter_AddRefs (stream), mRestoreData, mRestoreDataLength, NS_ASSIGNMENT_DEPEND); -+ NS_ENSURE_SUCCESS (result, result); -+ -+ get_header_str (buf, mRestoreData, mRestoreDataLength); -+ PR_LOG (gCompressedImageAccountingLog, PR_LOG_WARNING, -+ ("CompressedImageAccounting: imgContainer::ReloadImages() starting to restore images for container %p (%s) - " -+ "header %p is 0x%s (length %d)", -+ this, -+ mDiscardableMimeType, -+ mRestoreData, -+ buf, -+ (int) mRestoreDataLength)); -+ -+ result = decoder->WriteFrom (stream, mRestoreDataLength, &written); -+ NS_ENSURE_SUCCESS (result, result); -+ -+ result = decoder->Flush (); -+ if (!(result == NS_OK || result == NS_ERROR_NOT_IMPLEMENTED)) /* PNG doesn't implement Flush(), for example */ -+ return result; -+ -+ result = decoder->Close (); -+ NS_ENSURE_SUCCESS (result, result); -+ -+ NS_ASSERTION (mFrames.Count() == mNumFrames, -+ "imgContainer::ReloadImages(): the restored mFrames.Count() doesn't match mNumFrames!"); -+ -+ return result; -+} -diff --git modules/libpr0n/src/imgContainer.h modules/libpr0n/src/imgContainer.h -index 3db7034..aa56939 100644 ---- modules/libpr0n/src/imgContainer.h -+++ modules/libpr0n/src/imgContainer.h -@@ -23,6 +23,7 @@ - * Contributor(s): - * Stuart Parmenter <pavlov@netscape.com> - * Chris Saari <saari@netscape.com> -+ * Federico Mena-Quintero <federico@novell.com> - * - * Alternatively, the contents of this file may be used under the terms of - * either the GNU General Public License Version 2 or later (the "GPL"), or -@@ -194,14 +195,8 @@ private: - timer->Cancel(); - } - }; -- -- inline gfxIImageFrame* inlinedGetCurrentFrame() { -- if (!mAnim) -- return mFrames.SafeObjectAt(0); -- if (mAnim->lastCompositedFrameIndex == mAnim->currentAnimationFrameIndex) -- return mAnim->compositingFrame; -- return mFrames.SafeObjectAt(mAnim->currentAnimationFrameIndex); -- } -+ -+ nsresult GetCurrentFrameNoRef(gfxIImageFrame** aFrame); - - inline Anim* ensureAnimExists() { - if (!mAnim) -@@ -274,10 +269,15 @@ private: - nsIntSize mSize; - - //! All the <gfxIImageFrame>s of the PNG -+ // *** IMPORTANT: if you use mFrames in a method, call RestoreDiscardedData() first to ensure -+ // that the frames actually exist (they may have been discarded to save memory). - nsCOMArray<gfxIImageFrame> mFrames; -+ int mNumFrames; /* stored separately from mFrames.Count() to support discarded images */ - - nsCOMPtr<nsIProperties> mProperties; -- -+ -+ // *** IMPORTANT: if you use mAnim in a method, call RestoreDiscardedData() first to ensure -+ // that the frames actually exist (they may have been discarded to save memory). - imgContainer::Anim* mAnim; - - //! See imgIContainer for mode constants -@@ -288,6 +288,19 @@ private: - - //! imgIContainerObserver - nsWeakPtr mObserver; -+ -+ PRBool mDiscardable; -+ PRBool mDiscarded; -+ char* mDiscardableMimeType; -+ char* mRestoreData; -+ PRSize mRestoreDataLength; -+ PRBool mRestoreDataDone; -+ nsCOMPtr<nsITimer> mDiscardTimer; -+ -+ nsresult ResetDiscardTimer (void); -+ nsresult RestoreDiscardedData (void); -+ nsresult ReloadImages (void); -+ static void sDiscardTimerCallback (nsITimer *aTimer, void *aClosure); - }; - - #endif /* __imgContainer_h__ */ diff --git a/www/firefox3-devel/files/patch-build_unix_run-mozilla.sh b/www/firefox3-devel/files/patch-build_unix_run-mozilla.sh deleted file mode 100644 index a5295588e..000000000 --- a/www/firefox3-devel/files/patch-build_unix_run-mozilla.sh +++ /dev/null @@ -1,12 +0,0 @@ ---- build/unix/run-mozilla.sh.orig Tue Feb 14 19:56:54 2006 -+++ build/unix/run-mozilla.sh Fri Dec 8 15:49:48 2006 -@@ -443,6 +443,9 @@ - export MOZILLA_FIVE_HOME LD_LIBRARY_PATH - export SHLIB_PATH LIBPATH LIBRARY_PATH ADDON_PATH DYLD_LIBRARY_PATH - -+MOZ_PLUGIN_PATH=%%PREFIX%%/lib/browser_plugins:%%PREFIX%%/lib/browser_linux_plugins -+export MOZ_PLUGIN_PATH -+ - if [ $moz_debug -eq 1 ] - then - moz_debug_program ${1+"$@"} diff --git a/www/firefox3-devel/files/patch-config-mkdepend-imakemdep.h b/www/firefox3-devel/files/patch-config-mkdepend-imakemdep.h deleted file mode 100644 index b688e6644..000000000 --- a/www/firefox3-devel/files/patch-config-mkdepend-imakemdep.h +++ /dev/null @@ -1,10 +0,0 @@ ---- config/mkdepend/imakemdep.h Fri Sep 4 21:22:25 1998 -+++ config/mkdepend/imakemdep.h Thu Oct 16 22:43:25 2003 -@@ -278,4 +278,7 @@ - "-D__i386__", - # endif -+# if defined(__amd64__) || defined(__x86_64__) -+ "-D__amd64__ -D__x86_64__", -+# endif - # ifdef __GNUC__ - "-traditional", diff --git a/www/firefox3-devel/files/patch-config-rules.mk b/www/firefox3-devel/files/patch-config-rules.mk deleted file mode 100644 index 8ab35f5a8..000000000 --- a/www/firefox3-devel/files/patch-config-rules.mk +++ /dev/null @@ -1,13 +0,0 @@ ---- config/rules.mk.orig Thu Sep 14 14:07:03 2006 -+++ config/rules.mk Wed Oct 18 11:00:09 2006 -@@ -442,9 +442,7 @@ - endif - - ifeq ($(OS_ARCH),FreeBSD) --ifdef IS_COMPONENT --EXTRA_DSO_LDOPTS += -Wl,-Bsymbolic --endif -+EXTRA_DSO_LDOPTS += -Wl,-Bsymbolic -lc - endif - - ifeq ($(OS_ARCH),NetBSD) diff --git a/www/firefox3-devel/files/patch-config_autoconf.mk.in b/www/firefox3-devel/files/patch-config_autoconf.mk.in deleted file mode 100644 index 29fe7f8fb..000000000 --- a/www/firefox3-devel/files/patch-config_autoconf.mk.in +++ /dev/null @@ -1,18 +0,0 @@ ---- config/autoconf.mk.in.orig Thu Jul 14 00:50:06 2005 -+++ config/autoconf.mk.in Thu Jul 14 00:50:40 2005 -@@ -50,13 +50,13 @@ - prefix = @prefix@ - exec_prefix = @exec_prefix@ - bindir = @bindir@ --includedir = @includedir@/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) -+includedir = @includedir@/%%MOZILLA%% - libdir = @libdir@ - datadir = @datadir@ - mandir = @mandir@ - idldir = @datadir@/idl/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) - --mozappdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) -+mozappdir = $(libdir)/%%MOZILLA%% - mredir = $(libdir)/mre/mre-$(MOZ_APP_VERSION) - mrelibdir = $(mredir)/lib - diff --git a/www/firefox3-devel/files/patch-config_mkdepend_Makefile.in b/www/firefox3-devel/files/patch-config_mkdepend_Makefile.in deleted file mode 100644 index bace012a2..000000000 --- a/www/firefox3-devel/files/patch-config_mkdepend_Makefile.in +++ /dev/null @@ -1,10 +0,0 @@ ---- config/mkdepend/Makefile.in.orig Sun Dec 12 07:36:57 2004 -+++ config/mkdepend/Makefile.in Sun Dec 12 07:37:55 2004 -@@ -57,6 +57,7 @@ - include $(topsrcdir)/config/rules.mk - - HOST_CFLAGS += -DINCLUDEDIR=\"/usr/include\" -DOBJSUFFIX=\".$(OBJ_SUFFIX)\" -+HOST_CFLAGS += $(XCFLAGS) - - ifdef GNU_CC - _GCCDIR = $(shell $(CC) -print-file-name=include) diff --git a/www/firefox3-devel/files/patch-content_xslt_public_txDouble.h b/www/firefox3-devel/files/patch-content_xslt_public_txDouble.h deleted file mode 100644 index 534bccba4..000000000 --- a/www/firefox3-devel/files/patch-content_xslt_public_txDouble.h +++ /dev/null @@ -1,20 +0,0 @@ ---- content/xslt/public/txDouble.h.orig Fri Oct 13 00:00:29 2006 -+++ content/xslt/public/txDouble.h Fri Oct 13 00:00:53 2006 -@@ -41,7 +41,7 @@ - #define __txdouble_h__ - - //A trick to handle IEEE floating point exceptions on FreeBSD - E.D. --#ifdef __FreeBSD__ -+/* #ifdef __FreeBSD__ - #include <ieeefp.h> - #ifdef __alpha__ - fp_except_t allmask = FP_X_INV|FP_X_OFL|FP_X_UFL|FP_X_DZ|FP_X_IMP; -@@ -50,7 +50,7 @@ - #endif - fp_except_t oldmask = fpsetmask(~allmask); - #endif -- -+*/ - /** - * Macros to workaround math-bugs bugs in various platforms - */ diff --git a/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.cpp b/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.cpp deleted file mode 100644 index 41c462d74..000000000 --- a/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.cpp +++ /dev/null @@ -1,46 +0,0 @@ ---- extensions/typeaheadfind/src/nsTypeAheadFind.cpp.orig Wed Nov 19 01:20:47 2003 -+++ extensions/typeaheadfind/src/nsTypeAheadFind.cpp Tue Feb 10 02:52:26 2004 -@@ -323,11 +323,11 @@ - prefBranch->GetBoolPref("accessibility.typeaheadfind.startlinksonly", - &mStartLinksOnlyPref); - -- PRBool isSoundEnabled = PR_TRUE; -+ mIsSoundEnabled = PR_TRUE; - prefBranch->GetBoolPref("accessibility.typeaheadfind.enablesound", -- &isSoundEnabled); -+ &mIsSoundEnabled); - nsXPIDLCString soundStr; -- if (isSoundEnabled) { -+ if (mIsSoundEnabled && mIsSoundEnabled) { - prefBranch->GetCharPref("accessibility.typeaheadfind.soundURL", - getter_Copies(soundStr)); - } -@@ -758,7 +758,7 @@ - } - else { - // No find string to backspace in! -- if (mIsBackspaceProtectOn) { -+ if (mIsBackspaceProtectOn && mIsSoundEnabled) { - // This flag should be on only if the last key was a backspace. - // It keeps us from accidentally hitting backspace too many times and - // going back in history when we really just wanted to clear -@@ -1012,7 +1012,9 @@ - - // Error sound (don't fire when backspace is pressed, they're - // trying to correct the mistake!) -- PlayNotFoundSound(); -+ if (mIsSoundEnabled) { -+ PlayNotFoundSound(); -+ } - - // Remove bad character from buffer, so we can continue typing from - // last matched character -@@ -1059,7 +1061,7 @@ - void - nsTypeAheadFind::PlayNotFoundSound() - { -- if (mNotFoundSoundURL.IsEmpty()) // no sound -+ if (mNotFoundSoundURL.IsEmpty() || !mIsSoundEnabled) // no sound - return; - if (!mSoundInterface) { - mSoundInterface = do_CreateInstance("@mozilla.org/sound;1"); diff --git a/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.h b/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.h deleted file mode 100644 index 07ad43b43..000000000 --- a/www/firefox3-devel/files/patch-extensions_typeaheadfind_src_nsTypeAheadFind.h +++ /dev/null @@ -1,12 +0,0 @@ ---- extensions/typeaheadfind/src/nsTypeAheadFind.h.orig Fri May 23 22:00:33 2003 -+++ extensions/typeaheadfind/src/nsTypeAheadFind.h Mon Feb 9 22:21:43 2004 -@@ -194,6 +194,9 @@ - - nsCString mNotFoundSoundURL; - -+ // Move the sound enabled boolean out for all methods to access. -+ PRBool mIsSoundEnabled; -+ - // PRBool's are used instead of PRPackedBool's where the address of the - // boolean variable is getting passed into a method. For example: - // GetBoolPref("accessibility.typeaheadfind.linksonly", &mLinksOnlyPref); diff --git a/www/firefox3-devel/files/patch-js_src_Makefile.in b/www/firefox3-devel/files/patch-js_src_Makefile.in deleted file mode 100644 index fb0bd7f19..000000000 --- a/www/firefox3-devel/files/patch-js_src_Makefile.in +++ /dev/null @@ -1,10 +0,0 @@ ---- js/src/Makefile.in.orig Wed Oct 18 09:23:09 2006 -+++ js/src/Makefile.in Wed Oct 18 09:27:27 2006 -@@ -244,6 +244,7 @@ - endif - - LDFLAGS += $(pathsubst -l%,$(NSPR_STATIC_PATH)/%.a,$(NSPR_LIBS)) -+LDFLAGS += -lc - - # BeOS and HP-UX do not require the extra linking of "-lm" - ifeq (,$(filter BeOS HP-UX WINNT WINCE OpenVMS,$(OS_ARCH))) diff --git a/www/firefox3-devel/files/patch-js_src_jsnum.c b/www/firefox3-devel/files/patch-js_src_jsnum.c deleted file mode 100644 index a3ef2769a..000000000 --- a/www/firefox3-devel/files/patch-js_src_jsnum.c +++ /dev/null @@ -1,28 +0,0 @@ ---- js/src/jsnum.c.orig Sun Nov 5 18:37:07 2006 -+++ js/src/jsnum.c Sun Nov 5 18:42:31 2006 -@@ -45,6 +45,9 @@ - #if defined(XP_WIN) || defined(XP_OS2) - #include <float.h> - #endif -+#if defined(__FreeBSD__) -+#include <sys/param.h> -+#endif - #include <locale.h> - #include <limits.h> - #include <math.h> -@@ -532,7 +535,15 @@ static jsdouble NaN; - - #else - -+#if defined(__FreeBSD__) && __FreeBSD_version >= 601000 -+#include <fenv.h> -+#define FIX_FPU() (fedisableexcept(FE_ALL_EXCEPT)) -+ -+#else -+ - #define FIX_FPU() ((void)0) -+ -+#endif /* defined(__FreeBSD__) && __FreeBSD_version >= 503000 */ - - #endif - diff --git a/www/firefox3-devel/files/patch-modules_libpref_src_init_all.js b/www/firefox3-devel/files/patch-modules_libpref_src_init_all.js deleted file mode 100644 index 1700380a5..000000000 --- a/www/firefox3-devel/files/patch-modules_libpref_src_init_all.js +++ /dev/null @@ -1,53 +0,0 @@ ---- modules/libpref/src/init/all.js.orig Mon Feb 13 22:58:15 2006 -+++ modules/libpref/src/init/all.js Tue May 2 00:32:55 2006 -@@ -1883,33 +1883,33 @@ - - // th - --pref("font.name.serif.tr", "Times"); --pref("font.name.sans-serif.tr", "Helvetica"); --pref("font.name.monospace.tr", "Courier"); -+pref("font.name.serif.tr", "serif"); -+pref("font.name.sans-serif.tr", "sans-serif"); -+pref("font.name.monospace.tr", "monospace"); - - pref("font.name.serif.x-baltic", "serif"); - pref("font.name.sans-serif.x-baltic", "sans-serif"); - pref("font.name.monospace.x-baltic", "monospace"); - --pref("font.name.serif.x-central-euro", "Times"); --pref("font.name.sans-serif.x-central-euro", "Helvetica"); --pref("font.name.monospace.x-central-euro", "Courier"); -+pref("font.name.serif.x-central-euro", "serif"); -+pref("font.name.sans-serif.x-central-euro", "sans-serif"); -+pref("font.name.monospace.x-central-euro", "monospace"); - - pref("font.name.serif.x-cyrillic", "serif"); - pref("font.name.sans-serif.x-cyrillic", "sans-serif"); - pref("font.name.monospace.x-cyrillic", "monospace"); - --pref("font.name.serif.x-unicode", "Times"); --pref("font.name.sans-serif.x-unicode", "Helvetica"); --pref("font.name.monospace.x-unicode", "Courier"); -- --pref("font.name.serif.x-user-def", "Times"); --pref("font.name.sans-serif.x-user-def", "Helvetica"); --pref("font.name.monospace.x-user-def", "Courier"); -- --pref("font.name.serif.x-western", "Times"); --pref("font.name.sans-serif.x-western", "Helvetica"); --pref("font.name.monospace.x-western", "Courier"); -+pref("font.name.serif.x-unicode", "serif"); -+pref("font.name.sans-serif.x-unicode", "sans-serif"); -+pref("font.name.monospace.x-unicode", "monospace"); -+ -+pref("font.name.serif.x-user-def", "serif"); -+pref("font.name.sans-serif.x-user-def", "sans-serif"); -+pref("font.name.monospace.x-user-def", "monospace"); -+ -+pref("font.name.serif.x-western", "serif"); -+pref("font.name.sans-serif.x-western", "sans-serif"); -+pref("font.name.monospace.x-western", "monospace"); - - pref("font.name.serif.zh-CN", "serif"); - pref("font.name.sans-serif.zh-CN", "sans-serif"); diff --git a/www/firefox3-devel/files/patch-security-coreconf-FreeBSD.mk b/www/firefox3-devel/files/patch-security-coreconf-FreeBSD.mk deleted file mode 100644 index 0f7a04a02..000000000 --- a/www/firefox3-devel/files/patch-security-coreconf-FreeBSD.mk +++ /dev/null @@ -1,24 +0,0 @@ ---- security/coreconf/FreeBSD.mk.orig Mon Sep 25 18:26:23 2006 -+++ security/coreconf/FreeBSD.mk Mon Sep 25 18:27:03 2006 -@@ -45,8 +45,12 @@ - ifeq ($(OS_TEST),alpha) - CPU_ARCH = alpha - else -+ifeq ($(OS_TEST),amd64) -+CPU_ARCH = amd64 -+else - CPU_ARCH = x86 - endif -+endif - - OS_CFLAGS = $(DSO_CFLAGS) -ansi -Wall -DFREEBSD -DHAVE_STRERROR -DHAVE_BSD_FLOCK - -@@ -73,7 +77,7 @@ - DLL_SUFFIX = so.1.0 - endif - --MKSHLIB = $(CC) $(DSO_LDOPTS) -+MKSHLIB = $(CC) -Wl,-Bsymbolic -lc $(DSO_LDOPTS) -o $@ - ifdef MAPFILE - MKSHLIB += -Wl,--version-script,$(MAPFILE) - endif diff --git a/www/firefox3-devel/files/patch-security_manager_ssl_src_nsNSSComponent.cpp b/www/firefox3-devel/files/patch-security_manager_ssl_src_nsNSSComponent.cpp deleted file mode 100644 index f30d12229..000000000 --- a/www/firefox3-devel/files/patch-security_manager_ssl_src_nsNSSComponent.cpp +++ /dev/null @@ -1,10 +0,0 @@ ---- security/manager/ssl/src/nsNSSComponent.cpp.orig Mon May 29 23:10:54 2006 -+++ security/manager/ssl/src/nsNSSComponent.cpp Mon May 29 23:12:22 2006 -@@ -110,6 +110,7 @@ - #include "nss.h" - #include "pk11func.h" - #include "ssl.h" -+#define NSS_ENABLE_ECC 1 - #include "sslproto.h" - #include "secmod.h" - #include "sechash.h" diff --git a/www/firefox3-devel/files/patch-storage_build_Makefile.in b/www/firefox3-devel/files/patch-storage_build_Makefile.in deleted file mode 100644 index 18202a5a6..000000000 --- a/www/firefox3-devel/files/patch-storage_build_Makefile.in +++ /dev/null @@ -1,10 +0,0 @@ ---- storage/build/Makefile.in.orig Tue Feb 21 11:18:56 2006 -+++ storage/build/Makefile.in Sun Nov 5 16:16:06 2006 -@@ -77,6 +77,7 @@ - $(EXTRA_DSO_LIBS) \ - $(MOZ_COMPONENT_LIBS) \ - $(MOZ_JS_LIBS) \ -+ %%PTHREAD_LIBS%% \ - $(NULL) - - include $(topsrcdir)/config/rules.mk diff --git a/www/firefox3-devel/files/patch-sysnss b/www/firefox3-devel/files/patch-sysnss deleted file mode 100644 index 6f3d06298..000000000 --- a/www/firefox3-devel/files/patch-sysnss +++ /dev/null @@ -1,34 +0,0 @@ ---- security/manager/ssl/src/Makefile.in.orig 2007-07-23 15:03:01.000000000 -0400 -+++ security/manager/ssl/src/Makefile.in 2007-09-04 20:47:03.000000000 -0400 -@@ -125,13 +125,11 @@ - pipboot \ - $(NULL) - --EXTRA_DEPS = $(NSS_DEP_LIBS) -- - DEFINES += -DNSS_ENABLE_ECC - - # Use local includes because they are inserted before INCLUDES - # so that Mozilla's nss.h is used, not glibc's --LOCAL_INCLUDES += $(NSS_CFLAGS) -+LOCAL_INCLUDES += -I%%LOCALBASE%%/include/nss/nss - - ifeq ($(OS_ARCH),Darwin) - EXTRA_DSO_LDOPTS += \ -@@ -143,6 +141,7 @@ - $(MOZ_COMPONENT_LIBS) \ - $(MOZ_JS_LIBS) \ - $(NSS_LIBS) \ -+ $(LOCAL_INCLUDES) \ - $(NULL) - - include $(topsrcdir)/config/rules.mk ---- toolkit/components/url-classifier/src/Makefile.in.orig 2007-09-05 09:00:23.000000000 -0400 -+++ toolkit/components/url-classifier/src/Makefile.in 2007-09-05 09:00:27.000000000 -0400 -@@ -36,6 +36,3 @@ - $(NULL) - - include $(topsrcdir)/config/rules.mk -- --export:: $(topsrcdir)/security/nss/lib/freebl/sha512.c -- $(INSTALL) $^ . diff --git a/www/firefox3-devel/files/patch-toolkit_xre_Makefile.in b/www/firefox3-devel/files/patch-toolkit_xre_Makefile.in deleted file mode 100644 index 4a9c8533a..000000000 --- a/www/firefox3-devel/files/patch-toolkit_xre_Makefile.in +++ /dev/null @@ -1,8 +0,0 @@ ---- toolkit/xre/Makefile.in.orig 2007-09-10 10:31:53.000000000 -0400 -+++ toolkit/xre/Makefile.in 2007-09-10 10:35:00.000000000 -0400 -@@ -263,5 +263,3 @@ - libs:: platform.ini - $(INSTALL) $^ $(DIST)/bin - --install:: -- $(INSTALL) $(IFLAGS1) $^ $(DESTDIR)$(mozappdir) diff --git a/www/firefox3-devel/files/patch-uriloader_exthandler_unix_nsGNOMERegistry.cpp b/www/firefox3-devel/files/patch-uriloader_exthandler_unix_nsGNOMERegistry.cpp deleted file mode 100644 index 7f8e55f53..000000000 --- a/www/firefox3-devel/files/patch-uriloader_exthandler_unix_nsGNOMERegistry.cpp +++ /dev/null @@ -1,29 +0,0 @@ ---- uriloader/exthandler/unix/nsGNOMERegistry.cpp.orig Fri Dec 24 04:30:00 2004 -+++ uriloader/exthandler/unix/nsGNOMERegistry.cpp Fri Dec 24 04:34:05 2004 -@@ -143,7 +143,7 @@ - PR_END_MACRO - - // Attempt to open libgconf -- gconfLib = LoadVersionedLibrary("gconf-2", ".4"); -+ gconfLib = PR_LoadLibrary("libgconf-2.so"); - ENSURE_LIB(gconfLib); - - GET_LIB_FUNCTION(gconf, gconf_client_get_default); -@@ -151,7 +151,7 @@ - GET_LIB_FUNCTION(gconf, gconf_client_get_bool); - - // Attempt to open libgnome -- gnomeLib = LoadVersionedLibrary("gnome-2", ".0"); -+ gnomeLib = PR_LoadLibrary("libgnome-2.so"); - ENSURE_LIB(gnomeLib); - - GET_LIB_FUNCTION(gnome, gnome_url_show); -@@ -160,7 +160,7 @@ - GET_LIB_FUNCTION(gnome, gnome_program_get); - - // Attempt to open libgnomevfs -- vfsLib = LoadVersionedLibrary("gnomevfs-2", ".0"); -+ vfsLib = PR_LoadLibrary("libgnomevfs-2.so"); - ENSURE_LIB(vfsLib); - - GET_LIB_FUNCTION(vfs, gnome_vfs_mime_type_from_name); diff --git a/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-public-xptcstubsdecl.inc b/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-public-xptcstubsdecl.inc deleted file mode 100644 index 9a41bbfc4..000000000 --- a/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-public-xptcstubsdecl.inc +++ /dev/null @@ -1,11 +0,0 @@ ---- xpcom/reflect/xptcall/public/xptcstubsdecl.inc.orig Tue Mar 16 03:07:25 2004 -+++ xpcom/reflect/xptcall/public/xptcstubsdecl.inc Tue Jun 15 12:52:36 2004 -@@ -8,7 +8,7 @@ - * 1 is AddRef - * 2 is Release - */ --#if !defined(__ia64) || (!defined(__hpux) && !defined(__linux__)) -+#if !defined(__ia64) - NS_IMETHOD Stub3(); - NS_IMETHOD Stub4(); - NS_IMETHOD Stub5(); diff --git a/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-src-md-unix-Makefile.in b/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-src-md-unix-Makefile.in deleted file mode 100644 index 51edeb95a..000000000 --- a/www/firefox3-devel/files/patch-xpcom-reflect-xptcall-src-md-unix-Makefile.in +++ /dev/null @@ -1,54 +0,0 @@ ---- xpcom/reflect/xptcall/src/md/unix/Makefile.in.orig Thu Aug 14 21:00:23 2003 -+++ xpcom/reflect/xptcall/src/md/unix/Makefile.in Sun Feb 1 15:06:40 2004 -@@ -49,6 +49,9 @@ - ifeq (86,$(findstring 86,$(OS_TEST))) - CPPSRCS := xptcinvoke_unixish_x86.cpp xptcstubs_unixish_x86.cpp - endif -+ifeq (amd64,$(OS_TEST)) -+CPPSRCS := xptcinvoke_x86_64_linux.cpp xptcstubs_x86_64_linux.cpp -+endif - endif - # - # New code for Linux, et. al., with gcc -@@ -60,7 +63,7 @@ - endif - endif - # IA64 Linux --ifneq (,$(filter Linux,$(OS_ARCH))) -+ifneq (,$(filter Linux FreeBSD,$(OS_ARCH))) - ifneq (,$(findstring ia64,$(OS_TEST))) - CPPSRCS := xptcinvoke_ipf64.cpp xptcstubs_ipf64.cpp - ASFILES := xptcstubs_asm_ipf64.s xptcinvoke_asm_ipf64.s -@@ -106,9 +109,15 @@ - ASFILES := xptcinvoke_asm_osf1_alpha.s xptcstubs_asm_osf1_alpha.s - endif - # -+# FreeBSD/Alpha -+# -+ifeq ($(OS_ARCH)$(OS_TEST),FreeBSDalpha) -+CPPSRCS := xptcinvoke_freebsd_alpha.cpp xptcstubs_freebsd_alpha.cpp -+endif -+# - # Linux/Alpha - # --ifneq (,$(filter Linuxalpha FreeBSDalpha NetBSDalpha,$(OS_ARCH)$(OS_TEST))) -+ifneq (,$(filter Linuxalpha NetBSDalpha,$(OS_ARCH)$(OS_TEST))) - CPPSRCS := xptcinvoke_linux_alpha.cpp xptcstubs_linux_alpha.cpp - endif - # -@@ -294,6 +303,15 @@ - ifeq ($(OS_ARCH)$(OS_TEST),NetBSDsparc) - CPPSRCS := xptcinvoke_sparc_netbsd.cpp xptcstubs_sparc_netbsd.cpp - ASFILES := xptcinvoke_asm_sparc_netbsd.s xptcstubs_asm_sparc_netbsd.s -+endif -+# -+# FreeBSD/SPARC64 -+# -+ifeq ($(OS_ARCH),FreeBSD) -+ifneq (,$(findstring sparc,$(OS_TEST))) -+CPPSRCS := xptcinvoke_sparc64_freebsd.cpp xptcstubs_sparc64_freebsd.cpp -+ASFILES := xptcinvoke_asm_sparc64_freebsd.s xptcstubs_asm_sparcv9_solaris.s -+endif - endif - # - # Solaris/SPARC diff --git a/www/firefox3-devel/files/patch-xptcall-alpha b/www/firefox3-devel/files/patch-xptcall-alpha deleted file mode 100644 index 29631a98e..000000000 --- a/www/firefox3-devel/files/patch-xptcall-alpha +++ /dev/null @@ -1,459 +0,0 @@ ---- xpcom/reflect/xptcall/src/md/unix/xptcinvoke_freebsd_alpha.cpp.orig Tue May 27 01:37:25 2003 -+++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_freebsd_alpha.cpp Tue May 27 01:37:00 2003 -@@ -0,0 +1,184 @@ -+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -+/* ***** BEGIN LICENSE BLOCK ***** -+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1 -+ * -+ * The contents of this file are subject to the Netscape Public License -+ * Version 1.1 (the "License"); you may not use this file except in -+ * compliance with the License. You may obtain a copy of the License at -+ * http://www.mozilla.org/NPL/ -+ * -+ * Software distributed under the License is distributed on an "AS IS" basis, -+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -+ * for the specific language governing rights and limitations under the -+ * License. -+ * -+ * The Original Code is mozilla.org code. -+ * -+ * The Initial Developer of the Original Code is -+ * Netscape Communications Corporation. -+ * Portions created by the Initial Developer are Copyright (C) 1998 -+ * the Initial Developer. All Rights Reserved. -+ * -+ * Contributor(s): -+ * -+ * Alternatively, the contents of this file may be used under the terms of -+ * either the GNU General Public License Version 2 or later (the "GPL"), or -+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -+ * in which case the provisions of the GPL or the LGPL are applicable instead -+ * of those above. If you wish to allow use of your version of this file only -+ * under the terms of either the GPL or the LGPL, and not to allow others to -+ * use your version of this file under the terms of the NPL, indicate your -+ * decision by deleting the provisions above and replace them with the notice -+ * and other provisions required by the GPL or the LGPL. If you do not delete -+ * the provisions above, a recipient may use your version of this file under -+ * the terms of any one of the NPL, the GPL or the LGPL. -+ * -+ * ***** END LICENSE BLOCK ***** */ -+ -+/* Platform specific code to invoke XPCOM methods on native objects */ -+ -+/* contributed by Glen Nakamura <glen.nakamura@usa.net> */ -+ -+#include "xptcprivate.h" -+ -+/* Prototype specifies unmangled function name and disables unused warning */ -+static void -+invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s) -+__asm__("invoke_copy_to_stack") __attribute__((unused)); -+ -+static void -+invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s) -+{ -+ const PRUint8 NUM_ARG_REGS = 6-1; // -1 for "this" pointer -+ -+ for(PRUint32 i = 0; i < paramCount; i++, d++, s++) -+ { -+ if(s->IsPtrData()) -+ { -+ *d = (PRUint64)s->ptr; -+ continue; -+ } -+ switch(s->type) -+ { -+ case nsXPTType::T_I8 : *d = (PRUint64)s->val.i8; break; -+ case nsXPTType::T_I16 : *d = (PRUint64)s->val.i16; break; -+ case nsXPTType::T_I32 : *d = (PRUint64)s->val.i32; break; -+ case nsXPTType::T_I64 : *d = (PRUint64)s->val.i64; break; -+ case nsXPTType::T_U8 : *d = (PRUint64)s->val.u8; break; -+ case nsXPTType::T_U16 : *d = (PRUint64)s->val.u16; break; -+ case nsXPTType::T_U32 : *d = (PRUint64)s->val.u32; break; -+ case nsXPTType::T_U64 : *d = (PRUint64)s->val.u64; break; -+ case nsXPTType::T_FLOAT : -+ if(i < NUM_ARG_REGS) -+ { -+ // convert floats to doubles if they are to be passed -+ // via registers so we can just deal with doubles later -+ union { PRUint64 u64; double d; } t; -+ t.d = (double)s->val.f; -+ *d = t.u64; -+ } -+ else -+ // otherwise copy to stack normally -+ *d = (PRUint64)s->val.u32; -+ break; -+ case nsXPTType::T_DOUBLE : *d = (PRUint64)s->val.u64; break; -+ case nsXPTType::T_BOOL : *d = (PRUint64)s->val.b; break; -+ case nsXPTType::T_CHAR : *d = (PRUint64)s->val.c; break; -+ case nsXPTType::T_WCHAR : *d = (PRUint64)s->val.wc; break; -+ default: -+ // all the others are plain pointer types -+ *d = (PRUint64)s->val.p; -+ break; -+ } -+ } -+} -+ -+/* -+ * XPTC_PUBLIC_API(nsresult) -+ * XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex, -+ * PRUint32 paramCount, nsXPTCVariant* params, void* vt) -+ */ -+__asm__( -+ "#### XPTC_InvokeByIndex ####\n" -+".text\n\t" -+ ".align 5\n\t" -+ ".globl XPTC_InvokeByIndex\n\t" -+ ".ent XPTC_InvokeByIndex\n" -+"XPTC_InvokeByIndex:\n\t" -+ ".frame $15,32,$26,0\n\t" -+ ".mask 0x4008000,-32\n\t" -+ "ldgp $29,0($27)\n" -+"$XPTC_InvokeByIndex..ng:\n\t" -+ "subq $30,32,$30\n\t" -+ "stq $26,0($30)\n\t" -+ "stq $15,8($30)\n\t" -+ "bis $30,$30,$15\n\t" -+ ".prologue 1\n\t" -+ -+ /* -+ * Allocate enough stack space to hold the greater of 6 or "paramCount"+1 -+ * parameters. (+1 for "this" pointer) Room for at least 6 parameters -+ * is required for storage of those passed via registers. -+ */ -+ -+ "bis $31,5,$2\n\t" /* count = MAX(5, "paramCount") */ -+ "cmplt $2,$18,$1\n\t" -+ "cmovne $1,$18,$2\n\t" -+ "s8addq $2,16,$1\n\t" /* room for count+1 params (8 bytes each) */ -+ "bic $1,15,$1\n\t" /* stack space is rounded up to 0 % 16 */ -+ "subq $30,$1,$30\n\t" -+ -+ "stq $16,0($30)\n\t" /* save "that" (as "this" pointer) */ -+ "stq $17,16($15)\n\t" /* save "methodIndex" */ -+ -+ "addq $30,8,$16\n\t" /* pass stack pointer */ -+ "bis $18,$18,$17\n\t" /* pass "paramCount" */ -+ "bis $19,$19,$18\n\t" /* pass "params" */ -+ "bsr $26,$invoke_copy_to_stack..ng\n\t" /* call invoke_copy_to_stack */ -+ -+ /* -+ * Copy the first 6 parameters to registers and remove from stack frame. -+ * Both the integer and floating point registers are set for each parameter -+ * except the first which is the "this" pointer. (integer only) -+ * The floating point registers are all set as doubles since the -+ * invoke_copy_to_stack function should have converted the floats. -+ */ -+ "ldq $16,0($30)\n\t" /* integer registers */ -+ "ldq $17,8($30)\n\t" -+ "ldq $18,16($30)\n\t" -+ "ldq $19,24($30)\n\t" -+ "ldq $20,32($30)\n\t" -+ "ldq $21,40($30)\n\t" -+ "ldt $f17,8($30)\n\t" /* floating point registers */ -+ "ldt $f18,16($30)\n\t" -+ "ldt $f19,24($30)\n\t" -+ "ldt $f20,32($30)\n\t" -+ "ldt $f21,40($30)\n\t" -+ -+ "addq $30,48,$30\n\t" /* remove params from stack */ -+ -+ /* -+ * Call the virtual function with the constructed stack frame. -+ */ -+ "bis $16,$16,$1\n\t" /* load "this" */ -+ "ldq $2,16($15)\n\t" /* load "methodIndex" */ -+ "ldq $1,0($1)\n\t" /* load vtable */ -+#if 0 -+ "s8addq $2,16,$2\n\t" /* vtable index = "methodIndex" * 8 + 16 */ -+#else -+ "mulq $2, 8, $2\n\t" -+ "addq $2, 0, $2\n\t" /* vtable index = "methodIndex" * 16 + 24 */ -+#endif -+ "addq $1,$2,$1\n\t" -+ "ldq $27,0($1)\n\t" /* load address of function */ -+ "jsr $26,($27),0\n\t" /* call virtual function */ -+ "ldgp $29,0($26)\n\t" -+ -+ "bis $15,$15,$30\n\t" -+ "ldq $26,0($30)\n\t" -+ "ldq $15,8($30)\n\t" -+ "addq $30,32,$30\n\t" -+ "ret $31,($26),1\n\t" -+ ".end XPTC_InvokeByIndex" -+ ); -+ ---- xpcom/reflect/xptcall/src/md/unix/xptcstubs_freebsd_alpha.cpp.orig Tue May 27 01:37:30 2003 -+++ xpcom/reflect/xptcall/src/md/unix/xptcstubs_freebsd_alpha.cpp Tue May 27 01:37:04 2003 -@@ -0,0 +1,269 @@ -+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -+/* ***** BEGIN LICENSE BLOCK ***** -+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1 -+ * -+ * The contents of this file are subject to the Netscape Public License -+ * Version 1.1 (the "License"); you may not use this file except in -+ * compliance with the License. You may obtain a copy of the License at -+ * http://www.mozilla.org/NPL/ -+ * -+ * Software distributed under the License is distributed on an "AS IS" basis, -+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -+ * for the specific language governing rights and limitations under the -+ * License. -+ * -+ * The Original Code is mozilla.org code. -+ * -+ * The Initial Developer of the Original Code is -+ * Netscape Communications Corporation. -+ * Portions created by the Initial Developer are Copyright (C) 1999 -+ * the Initial Developer. All Rights Reserved. -+ * -+ * Contributor(s): -+ * -+ * Alternatively, the contents of this file may be used under the terms of -+ * either the GNU General Public License Version 2 or later (the "GPL"), or -+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -+ * in which case the provisions of the GPL or the LGPL are applicable instead -+ * of those above. If you wish to allow use of your version of this file only -+ * under the terms of either the GPL or the LGPL, and not to allow others to -+ * use your version of this file under the terms of the NPL, indicate your -+ * decision by deleting the provisions above and replace them with the notice -+ * and other provisions required by the GPL or the LGPL. If you do not delete -+ * the provisions above, a recipient may use your version of this file under -+ * the terms of any one of the NPL, the GPL or the LGPL. -+ * -+ * ***** END LICENSE BLOCK ***** */ -+ -+/* Implement shared vtbl methods. */ -+ -+/* contributed by Glen Nakamura <glen.nakamura@usa.net> */ -+ -+#include <sys/types.h> -+#include <machine/cpu.h> -+#include "xptcprivate.h" -+ -+/* Prototype specifies unmangled function name and disables unused warning */ -+static nsresult -+PrepareAndDispatch(nsXPTCStubBase* self, uint32 methodIndex, PRUint64* args) -+__asm__("PrepareAndDispatch") __attribute__((unused)); -+ -+static nsresult -+PrepareAndDispatch(nsXPTCStubBase* self, uint32 methodIndex, PRUint64* args) -+{ -+ const PRUint8 PARAM_BUFFER_COUNT = 16; -+ const PRUint8 NUM_ARG_REGS = 6-1; // -1 for "this" pointer -+ -+ nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; -+ nsXPTCMiniVariant* dispatchParams = NULL; -+ nsIInterfaceInfo* iface_info = NULL; -+ const nsXPTMethodInfo* info; -+ PRUint8 paramCount; -+ PRUint8 i; -+ nsresult result = NS_ERROR_FAILURE; -+ -+ NS_ASSERTION(self,"no self"); -+ -+ self->GetInterfaceInfo(&iface_info); -+ NS_ASSERTION(iface_info,"no interface info"); -+ -+ iface_info->GetMethodInfo(PRUint16(methodIndex), &info); -+ NS_ASSERTION(info,"no interface info"); -+ -+ paramCount = info->GetParamCount(); -+ -+ // setup variant array pointer -+ if(paramCount > PARAM_BUFFER_COUNT) -+ dispatchParams = new nsXPTCMiniVariant[paramCount]; -+ else -+ dispatchParams = paramBuffer; -+ NS_ASSERTION(dispatchParams,"no place for params"); -+ -+ // args[0] to args[NUM_ARG_REGS] hold floating point register values -+ PRUint64* ap = args + NUM_ARG_REGS; -+ for(i = 0; i < paramCount; i++, ap++) -+ { -+ const nsXPTParamInfo& param = info->GetParam(i); -+ const nsXPTType& type = param.GetType(); -+ nsXPTCMiniVariant* dp = &dispatchParams[i]; -+ -+ if(param.IsOut() || !type.IsArithmetic()) -+ { -+ dp->val.p = (void*) *ap; -+ continue; -+ } -+ // else -+ switch(type) -+ { -+ case nsXPTType::T_I8 : dp->val.i8 = (PRInt8) *ap; break; -+ case nsXPTType::T_I16 : dp->val.i16 = (PRInt16) *ap; break; -+ case nsXPTType::T_I32 : dp->val.i32 = (PRInt32) *ap; break; -+ case nsXPTType::T_I64 : dp->val.i64 = (PRInt64) *ap; break; -+ case nsXPTType::T_U8 : dp->val.u8 = (PRUint8) *ap; break; -+ case nsXPTType::T_U16 : dp->val.u16 = (PRUint16) *ap; break; -+ case nsXPTType::T_U32 : dp->val.u32 = (PRUint32) *ap; break; -+ case nsXPTType::T_U64 : dp->val.u64 = (PRUint64) *ap; break; -+ case nsXPTType::T_FLOAT : -+ if(i < NUM_ARG_REGS) -+ { -+ // floats passed via registers are stored as doubles -+ // in the first NUM_ARG_REGS entries in args -+ dp->val.u64 = (PRUint64) args[i]; -+ dp->val.f = (float) dp->val.d; // convert double to float -+ } -+ else -+ dp->val.u32 = (PRUint32) *ap; -+ break; -+ case nsXPTType::T_DOUBLE : -+ // doubles passed via registers are also stored -+ // in the first NUM_ARG_REGS entries in args -+ dp->val.u64 = (i < NUM_ARG_REGS) ? args[i] : *ap; -+ break; -+ case nsXPTType::T_BOOL : dp->val.b = (PRBool) *ap; break; -+ case nsXPTType::T_CHAR : dp->val.c = (char) *ap; break; -+ case nsXPTType::T_WCHAR : dp->val.wc = (PRUnichar) *ap; break; -+ default: -+ NS_ASSERTION(0, "bad type"); -+ break; -+ } -+ } -+ -+ result = self->CallMethod((PRUint16)methodIndex, info, dispatchParams); -+ -+ NS_RELEASE(iface_info); -+ -+ if(dispatchParams != paramBuffer) -+ delete [] dispatchParams; -+ -+ return result; -+} -+ -+/* -+ * SharedStub() -+ * Collects arguments and calls PrepareAndDispatch. The "methodIndex" is -+ * passed to this function via $1 to preserve the argument registers. -+ */ -+__asm__( -+ "#### SharedStub ####\n" -+".text\n\t" -+ ".align 5\n\t" -+ ".ent SharedStub\n" -+"SharedStub:\n\t" -+ ".frame $30,96,$26,0\n\t" -+ ".mask 0x4000000,-96\n\t" -+ "ldgp $29,0($27)\n" -+"$SharedStub..ng:\n\t" -+ "subq $30,96,$30\n\t" -+ "stq $26,0($30)\n\t" -+ ".prologue 1\n\t" -+ -+ /* -+ * Store arguments passed via registers to the stack. -+ * Floating point registers are stored as doubles and converted -+ * to floats in PrepareAndDispatch if necessary. -+ */ -+ "stt $f17,16($30)\n\t" /* floating point registers */ -+ "stt $f18,24($30)\n\t" -+ "stt $f19,32($30)\n\t" -+ "stt $f20,40($30)\n\t" -+ "stt $f21,48($30)\n\t" -+ "stq $17,56($30)\n\t" /* integer registers */ -+ "stq $18,64($30)\n\t" -+ "stq $19,72($30)\n\t" -+ "stq $20,80($30)\n\t" -+ "stq $21,88($30)\n\t" -+ -+ /* -+ * Call PrepareAndDispatch function. -+ */ -+ "bis $1,$1,$17\n\t" /* pass "methodIndex" */ -+ "addq $30,16,$18\n\t" /* pass "args" */ -+ "bsr $26,$PrepareAndDispatch..ng\n\t" -+ -+ "ldq $26,0($30)\n\t" -+ "addq $30,96,$30\n\t" -+ "ret $31,($26),1\n\t" -+ ".end SharedStub" -+ ); -+ -+#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 /* G++ V3 ABI */ -+/* -+ * nsresult nsXPTCStubBase::Stub##n() -+ * Sets register $1 to "methodIndex" and jumps to SharedStub. -+ */ -+#define STUB_ENTRY(n) \ -+__asm__( \ -+ "#### Stub"#n" ####\n" \ -+".text\n\t" \ -+ ".align 5\n\t" \ -+ ".globl _ZN14nsXPTCStubBase5Stub"#n"Ev\n\t" \ -+ ".ent _ZN14nsXPTCStubBase5Stub"#n"Ev\n" \ -+"_ZN14nsXPTCStubBase5Stub"#n"Ev:\n\t" \ -+ ".frame $30,0,$26,0\n\t" \ -+ "ldgp $29,0($27)\n" \ -+"$_ZN14nsXPTCStubBase5Stub"#n"Ev..ng:\n\t" \ -+ ".prologue 1\n\t" \ -+ "lda $1,"#n"\n\t" \ -+ "br $31,$SharedStub..ng\n\t" \ -+ ".end _ZN14nsXPTCStubBase5Stub"#n"Ev" \ -+ ); \ -+__asm__( \ -+ "#### Stub"#n" ####\n" \ -+".text\n\t" \ -+ ".align 5\n\t" \ -+ ".globl _ZN14nsXPTCStubBase6Stub"#n"Ev\n\t" \ -+ ".ent _ZN14nsXPTCStubBase6Stub"#n"Ev\n" \ -+"_ZN14nsXPTCStubBase6Stub"#n"Ev:\n\t" \ -+ ".frame $30,0,$26,0\n\t" \ -+ "ldgp $29,0($27)\n" \ -+"$_ZN14nsXPTCStubBase6Stub"#n"Ev..ng:\n\t" \ -+ ".prologue 1\n\t" \ -+ "lda $1,"#n"\n\t" \ -+ "br $31,$SharedStub..ng\n\t" \ -+ ".end _ZN14nsXPTCStubBase6Stub"#n"Ev" \ -+ ); \ -+__asm__( \ -+ "#### Stub"#n" ####\n" \ -+".text\n\t" \ -+ ".align 5\n\t" \ -+ ".globl _ZN14nsXPTCStubBase7Stub"#n"Ev\n\t" \ -+ ".ent _ZN14nsXPTCStubBase7Stub"#n"Ev\n" \ -+"_ZN14nsXPTCStubBase7Stub"#n"Ev:\n\t" \ -+ ".frame $30,0,$26,0\n\t" \ -+ "ldgp $29,0($27)\n" \ -+"$_ZN14nsXPTCStubBase7Stub"#n"Ev..ng:\n\t" \ -+ ".prologue 1\n\t" \ -+ "lda $1,"#n"\n\t" \ -+ "br $31,$SharedStub..ng\n\t" \ -+ ".end _ZN14nsXPTCStubBase7Stub"#n"Ev" \ -+ ); -+#else -+/* -+ * nsresult nsXPTCStubBase::Stub##n() -+ * Sets register $1 to "methodIndex" and jumps to SharedStub. -+ */ -+#define STUB_ENTRY(n) \ -+nsresult nsXPTCStubBase::Stub##n() \ -+{ \ -+ nsresult result; \ -+__asm__ __volatile__( \ -+ "ldah $29,0($27)\n\t" \ -+ "lda $29,0($29)\n\t" \ -+ "lda $1, "#n"\n\t" \ -+ "br $31, $SharedStub..ng\n\t" \ -+ "mov $0, %0\n\t" \ -+ : "=r" (result) \ -+ ); \ -+ return result; \ -+} -+#endif -+ -+#define SENTINEL_ENTRY(n) \ -+nsresult nsXPTCStubBase::Sentinel##n() \ -+{ \ -+ NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \ -+ return NS_ERROR_NOT_IMPLEMENTED; \ -+} -+ -+#include "xptcstubsdef.inc" -+ diff --git a/www/firefox3-devel/files/patch-xptcall-sparc64 b/www/firefox3-devel/files/patch-xptcall-sparc64 deleted file mode 100644 index 9599a8a71..000000000 --- a/www/firefox3-devel/files/patch-xptcall-sparc64 +++ /dev/null @@ -1,327 +0,0 @@ ---- /dev/null Mon May 26 13:22:00 2003 -+++ xpcom/reflect/xptcall/src/md/unix/xptcstubs_sparc64_freebsd.cpp Mon May 26 04:12:55 2003 -@@ -0,0 +1,123 @@ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -+ * -+ * The contents of this file are subject to the Mozilla Public -+ * License Version 1.1 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS -+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -+ * implied. See the License for the specific language governing -+ * rights and limitations under the License. -+ * -+ * The Original Code is mozilla.org code. -+ * -+ * The Initial Developer of the Original Code is Netscape -+ * Communications Corporation. Portions created by Netscape are -+ * Copyright (C) 2001 Netscape Communications Corporation. All -+ * Rights Reserved. -+ * -+ * Contributor(s): -+ * Stuart Parmenter <pavlov@netscape.com> -+ */ -+ -+/* Implement shared vtbl methods. */ -+ -+#include "xptcprivate.h" -+ -+#if defined(sparc) || defined(__sparc__) -+ -+extern "C" nsresult -+PrepareAndDispatch(nsXPTCStubBase* self, PRUint64 methodIndex, PRUint64* args) -+{ -+ -+#define PARAM_BUFFER_COUNT 16 -+ -+ nsXPTCMiniVariant paramBuffer[PARAM_BUFFER_COUNT]; -+ nsXPTCMiniVariant* dispatchParams = NULL; -+ nsIInterfaceInfo* iface_info = NULL; -+ const nsXPTMethodInfo* info; -+ PRUint8 paramCount; -+ PRUint8 i; -+ nsresult result = NS_ERROR_FAILURE; -+ -+ NS_ASSERTION(self,"no self"); -+ -+ self->GetInterfaceInfo(&iface_info); -+ NS_ASSERTION(iface_info,"no interface info"); -+ -+ iface_info->GetMethodInfo(PRUint16(methodIndex), &info); -+ NS_ASSERTION(info,"no interface info"); -+ -+ paramCount = info->GetParamCount(); -+ -+ // setup variant array pointer -+ if(paramCount > PARAM_BUFFER_COUNT) -+ dispatchParams = new nsXPTCMiniVariant[paramCount]; -+ else -+ dispatchParams = paramBuffer; -+ NS_ASSERTION(dispatchParams,"no place for params"); -+ -+ PRUint64* ap = args; -+ for(i = 0; i < paramCount; i++, ap++) -+ { -+ const nsXPTParamInfo& param = info->GetParam(i); -+ const nsXPTType& type = param.GetType(); -+ nsXPTCMiniVariant* dp = &dispatchParams[i]; -+ -+ if(param.IsOut() || !type.IsArithmetic()) -+ { -+ dp->val.p = (void*) *ap; -+ continue; -+ } -+ // else -+ switch(type) -+ { -+ case nsXPTType::T_I8 : dp->val.i8 = *((PRInt64*) ap); break; -+ case nsXPTType::T_I16 : dp->val.i16 = *((PRInt64*) ap); break; -+ case nsXPTType::T_I32 : dp->val.i32 = *((PRInt64*) ap); break; -+ case nsXPTType::T_DOUBLE : dp->val.d = *((double*) ap); break; -+ case nsXPTType::T_U64 : dp->val.u64 = *((PRUint64*) ap); break; -+ case nsXPTType::T_I64 : dp->val.i64 = *((PRInt64*) ap); break; -+ case nsXPTType::T_U8 : dp->val.u8 = *((PRUint64*) ap); break; -+ case nsXPTType::T_U16 : dp->val.u16 = *((PRUint64*)ap); break; -+ case nsXPTType::T_U32 : dp->val.u32 = *((PRUint64*)ap); break; -+ case nsXPTType::T_FLOAT : dp->val.f = ((float*) ap)[1]; break; -+ case nsXPTType::T_BOOL : dp->val.b = *((PRInt64*) ap); break; -+ case nsXPTType::T_CHAR : dp->val.c = *((PRUint64*) ap); break; -+ case nsXPTType::T_WCHAR : dp->val.wc = *((PRInt64*) ap); break; -+ default: -+ NS_ASSERTION(0, "bad type"); -+ break; -+ } -+ } -+ -+ result = self->CallMethod((PRUint16)methodIndex, info, dispatchParams); -+ -+ NS_RELEASE(iface_info); -+ -+ if(dispatchParams != paramBuffer) -+ delete [] dispatchParams; -+ -+ return result; -+} -+ -+extern "C" int SharedStub(int, int*); -+ -+#define STUB_ENTRY(n) \ -+nsresult nsXPTCStubBase::Stub##n() \ -+{ \ -+ int dummy; /* defeat tail-call optimization */ \ -+ return SharedStub(n, &dummy); \ -+} -+ -+#define SENTINEL_ENTRY(n) \ -+nsresult nsXPTCStubBase::Sentinel##n() \ -+{ \ -+ NS_ASSERTION(0,"nsXPTCStubBase::Sentinel called"); \ -+ return NS_ERROR_NOT_IMPLEMENTED; \ -+} -+ -+#include "xptcstubsdef.inc" -+ -+#endif /* sparc || __sparc__ */ ---- /dev/null Mon May 26 13:22:00 2003 -+++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_sparc64_freebsd.s Mon May 26 04:06:09 2003 -@@ -0,0 +1,104 @@ -+/* -*- Mode: asm; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -+ * -+ * The contents of this file are subject to the Mozilla Public -+ * License Version 1.1 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS -+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -+ * implied. See the License for the specific language governing -+ * rights and limitations under the License. -+ * -+ * The Original Code is mozilla.org code. -+ * -+ * The Initial Developer of the Original Code is Netscape -+ * Communications Corporation. Portions created by Netscape are -+ * Copyright (C) 2001 Netscape Communications Corporation. All -+ * Rights Reserved. -+ * -+ * Contributor(s): -+ * Stuart Parmenter <pavlov@netscape.com> -+ * Chris Seawood <cls@seawood.org> -+ */ -+ -+/* -+ Platform specific code to invoke XPCOM methods on native objects -+ for sparcv9 Solaris. -+ -+ See the SPARC Compliance Definition (SCD) Chapter 3 -+ for more information about what is going on here, including -+ the use of BIAS (0x7ff). -+ The SCD is available from http://www.sparc.com/. -+*/ -+ -+ .global XPTC_InvokeByIndex -+ .type XPTC_InvokeByIndex, #function -+ -+/* -+ XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex, -+ PRUint32 paramCount, nsXPTCVariant* params); -+ -+*/ -+XPTC_InvokeByIndex: -+ save %sp,-(128 + 64),%sp ! room for the register window and -+ ! struct pointer, rounded up to 0 % 64 -+ sll %i2,4,%l0 ! assume the worst case -+ ! paramCount * 2 * 8 bytes -+ cmp %l0, 0 ! are there any args? If not, -+ be .invoke ! no need to copy args to stack -+ nop -+ -+ sub %sp,%l0,%sp ! create the additional stack space -+ add %sp,0x7ff+136,%o0 ! step past the register window, the -+ ! struct result pointer and the 'this' slot -+ mov %i2,%o1 ! paramCount -+ call invoke_copy_to_stack -+ mov %i3,%o2 ! params -+ -+! -+! load arguments from stack into the outgoing registers -+! BIAS is 0x7ff (2047) -+! -+ -+! load the %o1..5 64bit (extended word) output registers registers -+ ldx [%sp + 0x7ff + 136],%o1 ! %i1 -+ ldx [%sp + 0x7ff + 144],%o2 ! %i2 -+ ldx [%sp + 0x7ff + 152],%o3 ! %i3 -+ ldx [%sp + 0x7ff + 160],%o4 ! %i4 -+ ldx [%sp + 0x7ff + 168],%o5 ! %i5 -+ -+! load the even number double registers starting with %d2 -+ ldd [%sp + 0x7ff + 136],%f2 -+ ldd [%sp + 0x7ff + 144],%f4 -+ ldd [%sp + 0x7ff + 152],%f6 -+ ldd [%sp + 0x7ff + 160],%f8 -+ ldd [%sp + 0x7ff + 168],%f10 -+ ldd [%sp + 0x7ff + 176],%f12 -+ ldd [%sp + 0x7ff + 184],%f14 -+ ldd [%sp + 0x7ff + 192],%f16 -+ ldd [%sp + 0x7ff + 200],%f18 -+ ldd [%sp + 0x7ff + 208],%f20 -+ ldd [%sp + 0x7ff + 216],%f22 -+ ldd [%sp + 0x7ff + 224],%f24 -+ ldd [%sp + 0x7ff + 232],%f26 -+ ldd [%sp + 0x7ff + 240],%f28 -+ ldd [%sp + 0x7ff + 248],%f30 -+ -+! -+! calculate the target address from the vtable -+! -+.invoke: -+ sll %i1,3,%l0 ! index *= 8 -+! add %l0,16,%l0 ! there are 2 extra entries in the vTable (16bytes) -+ ldx [%i0],%l1 ! *that --> address of vtable -+ ldx [%l0 + %l1],%l0 ! that->vtable[index * 8 + 16] --> address -+ -+ jmpl %l0,%o7 ! call the routine -+ mov %i0,%o0 ! move 'this' pointer to out register -+ -+ mov %o0,%i0 ! propagate return value -+ ret -+ restore -+ -+ .size XPTC_InvokeByIndex, .-XPTC_InvokeByIndex ---- /dev/null Mon May 26 14:00:00 2003 -+++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_sparc64_freebsd.cpp Mon May 26 14:00:49 2003 -@@ -0,0 +1,91 @@ -+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- -+ * -+ * The contents of this file are subject to the Mozilla Public -+ * License Version 1.1 (the "License"); you may not use this file -+ * except in compliance with the License. You may obtain a copy of -+ * the License at http://www.mozilla.org/MPL/ -+ * -+ * Software distributed under the License is distributed on an "AS -+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -+ * implied. See the License for the specific language governing -+ * rights and limitations under the License. -+ * -+ * The Original Code is mozilla.org code. -+ * -+ * The Initial Developer of the Original Code is Netscape -+ * Communications Corporation. Portions created by Netscape are -+ * Copyright (C) 2001 Netscape Communications Corporation. All -+ * Rights Reserved. -+ * -+ * Contributor(s): -+ * Stuart Parmenter <pavlov@netscape.com> -+ * Chris Seawood <cls@seawood.org> -+ */ -+ -+ -+/* Platform specific code to invoke XPCOM methods on native objects */ -+ -+#include "xptcprivate.h" -+ -+#if !defined(__sparc) && !defined(__sparc__) -+#error "This code is for Sparc only" -+#endif -+ -+/* Prototype specifies unmangled function name */ -+extern "C" PRUint64 -+invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s); -+ -+extern "C" PRUint64 -+invoke_copy_to_stack(PRUint64* d, PRUint32 paramCount, nsXPTCVariant* s) -+{ -+ /* -+ We need to copy the parameters for this function to locals and use them -+ from there since the parameters occupy the same stack space as the stack -+ we're trying to populate. -+ */ -+ PRUint64 *l_d = d; -+ nsXPTCVariant *l_s = s; -+ PRUint64 l_paramCount = paramCount; -+ PRUint64 regCount = 0; // return the number of registers to load from the stack -+ -+ for(PRUint64 i = 0; i < l_paramCount; i++, l_d++, l_s++) -+ { -+ if (regCount < 5) regCount++; -+ -+ if (l_s->IsPtrData()) -+ { -+ *l_d = (PRUint64)l_s->ptr; -+ continue; -+ } -+ switch (l_s->type) -+ { -+ case nsXPTType::T_I8 : *((PRInt64*)l_d) = l_s->val.i8; break; -+ case nsXPTType::T_I16 : *((PRInt64*)l_d) = l_s->val.i16; break; -+ case nsXPTType::T_I32 : *((PRInt64*)l_d) = l_s->val.i32; break; -+ case nsXPTType::T_I64 : *((PRInt64*)l_d) = l_s->val.i64; break; -+ -+ case nsXPTType::T_U8 : *((PRUint64*)l_d) = l_s->val.u8; break; -+ case nsXPTType::T_U16 : *((PRUint64*)l_d) = l_s->val.u16; break; -+ case nsXPTType::T_U32 : *((PRUint64*)l_d) = l_s->val.u32; break; -+ case nsXPTType::T_U64 : *((PRUint64*)l_d) = l_s->val.u64; break; -+ -+ /* in the case of floats, we want to put the bits in to the -+ 64bit space right justified... floats in the paramter array on -+ sparcv9 use odd numbered registers.. %f1, %f3, so we have to skip -+ the space that would be occupied by %f0, %f2, etc. -+ */ -+ case nsXPTType::T_FLOAT : *(((float*)l_d) + 1) = l_s->val.f; break; -+ case nsXPTType::T_DOUBLE: *((double*)l_d) = l_s->val.d; break; -+ case nsXPTType::T_BOOL : *((PRInt64*)l_d) = l_s->val.b; break; -+ case nsXPTType::T_CHAR : *((PRUint64*)l_d) = l_s->val.c; break; -+ case nsXPTType::T_WCHAR : *((PRInt64*)l_d) = l_s->val.wc; break; -+ -+ default: -+ // all the others are plain pointer types -+ *((void**)l_d) = l_s->val.p; -+ break; -+ } -+ } -+ -+ return regCount; -+} |