Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Here is an update patch for 3.4 branch with the following fixes:
  * Added missing #if OSL_DEBUG_LEVEL > 1
  * Initialized pPrecede to 0 in constructor

Thanks,

--
Cedric

----- Mail original -----
Hi all,

Could some of you please review this commit to be backported to the
3.4.3 branch fixing a nasty crasher with loads of dupes (fdo#39510)?

http://cgit.freedesktop.org/libreoffice/writer/commit/?id=9ecab7

Thanks for your reviews.

--
Cédric Bosdonnat
LibreOffice hacker
http://documentfoundation.org
OOo Eclipse Integration developer
http://cedric.bosdonnat.free.fr

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

From 68b27b713285ddee7b44bb9f57e01066e28eb1b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= <cedric.bosdonnat.ooo@free.fr>
Date: Tue, 23 Aug 2011 11:36:42 +0200
Subject: [PATCH] cherry-picked core:cc3d0d and fixed a few things

---
 sw/source/core/inc/cntfrm.hxx     |   10 ++++++++++
 sw/source/core/inc/flowfrm.hxx    |   12 +++++++++++-
 sw/source/core/inc/sectfrm.hxx    |    4 ++++
 sw/source/core/inc/tabfrm.hxx     |    4 ++++
 sw/source/core/layout/flowfrm.cxx |   15 ++++++---------
 sw/source/core/text/xmldump.cxx   |   25 +++++++++++++++++++++++++
 6 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/sw/source/core/inc/cntfrm.hxx b/sw/source/core/inc/cntfrm.hxx
index 898715b..5aab722 100644
--- a/sw/source/core/inc/cntfrm.hxx
+++ b/sw/source/core/inc/cntfrm.hxx
@@ -84,6 +84,8 @@ public:
 
     inline const SwCntntFrm *GetFollow() const;
     inline              SwCntntFrm *GetFollow();
+    inline const SwCntntFrm *GetPrecede() const;
+    inline       SwCntntFrm *GetPrecede();
     SwTxtFrm* FindMaster() const;
 
         //Layoutabhaengiges Cursortravelling
@@ -147,6 +149,14 @@ inline SwCntntFrm *SwCntntFrm::GetFollow()
 {
     return (SwCntntFrm*)SwFlowFrm::GetFollow();
 }
+inline const SwCntntFrm *SwCntntFrm::GetPrecede() const
+{
+    return (const SwCntntFrm*)SwFlowFrm::GetPrecede();
+}
+inline SwCntntFrm *SwCntntFrm::GetPrecede()
+{
+    return (SwCntntFrm*)SwFlowFrm::GetPrecede();
+}
 
 #endif
 
diff --git a/sw/source/core/inc/flowfrm.hxx b/sw/source/core/inc/flowfrm.hxx
index da3e5ca..bc9557a 100644
--- a/sw/source/core/inc/flowfrm.hxx
+++ b/sw/source/core/inc/flowfrm.hxx
@@ -115,6 +115,7 @@ class SwFlowFrm
 protected:
 
     SwFlowFrm *pFollow;
+    SwFlowFrm *pPrecede;
 
     sal_Bool bIsFollow :1;     //Ist's ein Follow
     sal_Bool bLockJoin :1;     //Join (und damit deleten) verboten wenn sal_True!
@@ -171,7 +172,10 @@ public:
     const  SwFlowFrm *GetFollow() const           { return pFollow;   }
            SwFlowFrm *GetFollow()                 { return pFollow;   }
            sal_Bool      IsAnFollow( const SwFlowFrm *pFlow ) const;
-    inline void          SetFollow( SwFlowFrm *pNew ) { pFollow = pNew; }
+    inline void       SetFollow( SwFlowFrm *pNew );
+
+    const  SwFlowFrm *GetPrecede() const   { return pPrecede;   }
+           SwFlowFrm *GetPrecede()         { return pPrecede;   }
 
     sal_Bool IsJoinLocked() const { return bLockJoin; }
     sal_Bool IsAnyJoinLocked() const { return bLockJoin || HasLockedFollow(); }
@@ -249,6 +253,12 @@ inline sal_Bool SwFlowFrm::IsFwdMoveAllowed()
     return rThis.GetIndPrev() != 0;
 }
 
+inline void SwFlowFrm::SetFollow( SwFlowFrm *pNew )
+{
+    pFollow = pNew;
+    if ( pFollow != NULL )
+        pFollow->pPrecede = this;
+}
 
 #endif
 
diff --git a/sw/source/core/inc/sectfrm.hxx b/sw/source/core/inc/sectfrm.hxx
index f9f7a2e..20f68f6 100644
--- a/sw/source/core/inc/sectfrm.hxx
+++ b/sw/source/core/inc/sectfrm.hxx
@@ -128,6 +128,10 @@ public:
 
     bool IsBalancedSection() const;
 
+#if OSL_DEBUG_LEVEL > 1
+    virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer);
+#endif
+
     DECL_FIXEDMEMPOOL_NEWDEL(SwSectionFrm)
 };
 
diff --git a/sw/source/core/inc/tabfrm.hxx b/sw/source/core/inc/tabfrm.hxx
index a81b25b..8e2e507 100644
--- a/sw/source/core/inc/tabfrm.hxx
+++ b/sw/source/core/inc/tabfrm.hxx
@@ -216,6 +216,10 @@ public:
     sal_uInt16 GetBottomLineSize() const;
     // <-- collapsing
 
+#if OSL_DEBUG_LEVEL > 1
+    virtual void dumpAsXmlAttributes(xmlTextWriterPtr writer);
+#endif
+
     DECL_FIXEDMEMPOOL_NEWDEL(SwTabFrm)
 };
 
diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx
index 9ba8202..51cb49b 100644
--- a/sw/source/core/layout/flowfrm.cxx
+++ b/sw/source/core/layout/flowfrm.cxx
@@ -81,7 +81,8 @@ sal_Bool SwFlowFrm::bMoveBwdJump = sal_False;
 
 SwFlowFrm::SwFlowFrm( SwFrm &rFrm ) :
     rThis( rFrm ),
-    pFollow( 0 )
+    pFollow( 0 ),
+    pPrecede( 0 )
 {
     bLockJoin = bIsFollow = bCntntLock = bOwnFtnNum =
         bFtnLock = bFlyLock = sal_False;
@@ -691,16 +692,12 @@ SwTxtFrm* SwCntntFrm::FindMaster() const
 {
     OSL_ENSURE( IsFollow(), "SwCntntFrm::FindMaster(): !IsFollow" );
 
-    const SwCntntFrm* pCnt = GetPrevCntntFrm();
+    const SwCntntFrm* pPrec = GetPrecede();
 
-    while ( pCnt )
+    if ( pPrec && pPrec->HasFollow() && pPrec->GetFollow() == this )
     {
-        if ( pCnt->HasFollow() && pCnt->GetFollow() == this )
-        {
-            OSL_ENSURE( pCnt->IsTxtFrm(), "NoTxtFrm with follow found" );
-            return (SwTxtFrm*)pCnt;
-        }
-        pCnt = pCnt->GetPrevCntntFrm();
+        OSL_ENSURE( pPrec->IsTxtFrm(), "NoTxtFrm with follow found" );
+        return ( SwTxtFrm* )pPrec;
     }
 
     OSL_FAIL( "Follow ist lost in Space." );
diff --git a/sw/source/core/text/xmldump.cxx b/sw/source/core/text/xmldump.cxx
index 3209fba..2d76660 100644
--- a/sw/source/core/text/xmldump.cxx
+++ b/sw/source/core/text/xmldump.cxx
@@ -29,6 +29,8 @@
 #include "precompiled_sw.hxx"
 
 #include "frame.hxx"
+#include "sectfrm.hxx"
+#include "tabfrm.hxx"
 #include "txtfrm.hxx"
 #include "porlin.hxx"
 #include "porlay.hxx"
@@ -311,6 +313,29 @@ void SwTxtFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
     SwFrm::dumpAsXmlAttributes( writer );
     if ( HasFollow() )
         xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() );
+
+    if ( pPrecede != NULL )
+        xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", 
(SwTxtFrm*)pPrecede );
+}
+
+void SwSectionFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
+{
+    SwFrm::dumpAsXmlAttributes( writer );
+    if ( HasFollow() )
+        xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() );
+
+    if ( pPrecede != NULL )
+        xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", 
(SwSectionFrm*)pPrecede );
+}
+
+void SwTabFrm::dumpAsXmlAttributes( xmlTextWriterPtr writer )
+{
+    SwFrm::dumpAsXmlAttributes( writer );
+    if ( HasFollow() )
+        xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "follow" ), "%p", GetFollow() );
+
+    if ( pPrecede != NULL )
+        xmlTextWriterWriteFormatAttribute( writer, BAD_CAST( "precede" ), "%p", 
(SwTabFrm*)pPrecede );
 }
 
 #endif
-- 
1.7.3.4


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.