svx/source/unodraw/unoshape.cxx |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

New commits:
commit 1167bfefe539417a24016f2c4e69f39ed10d2624
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon May 22 11:49:17 2023 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Tue May 23 13:49:35 2023 +0200

    avoid some ref-counting traffic in SvxShape::Notify
    
    which is quite a hot method
    
    Change-Id: I7fe6557d48cff8c9312b4dbcd24c215f16b9fcfc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152139
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/svx/source/unodraw/unoshape.cxx b/svx/source/unodraw/unoshape.cxx
index 8494f493513d..32695605dfb0 100644
--- a/svx/source/unodraw/unoshape.cxx
+++ b/svx/source/unodraw/unoshape.cxx
@@ -950,19 +950,20 @@ void SvxShape::Notify( SfxBroadcaster&, const SfxHint& 
rHint ) noexcept
     // do cheap checks first, this method is hot
     if (rHint.GetId() != SfxHintId::ThisIsAnSdrHint)
         return;
-    rtl::Reference<SdrObject> pSdrObject(mxSdrObject);
-    if( !pSdrObject )
+    if( !mxSdrObject )
         return;
     const SdrHint* pSdrHint = static_cast<const SdrHint*>(&rHint);
     // #i55919# SdrHintKind::ObjectChange is only interesting if it's for this 
object
     if ((pSdrHint->GetKind() != SdrHintKind::ModelCleared) &&
-         (pSdrHint->GetKind() != SdrHintKind::ObjectChange || 
pSdrHint->GetObject() != pSdrObject.get() ))
+         (pSdrHint->GetKind() != SdrHintKind::ObjectChange || 
pSdrHint->GetObject() != mxSdrObject.get() ))
         return;
 
-    uno::Reference< uno::XInterface > xSelf( pSdrObject->getWeakUnoShape() );
+    // prevent object being deleted from under us
+    rtl::Reference<SdrObject> xSdrSelf(mxSdrObject);
+    uno::Reference< uno::XInterface > xSelf( mxSdrObject->getWeakUnoShape() );
     if( !xSelf.is() )
     {
-        EndListening(pSdrObject->getSdrModelFromSdrObject());
+        EndListening(mxSdrObject->getSdrModelFromSdrObject());
         mxSdrObject.clear();
         return;
     }
@@ -973,9 +974,8 @@ void SvxShape::Notify( SfxBroadcaster&, const SfxHint& 
rHint ) noexcept
     }
     else // (pSdrHint->GetKind() == SdrHintKind::ModelCleared)
     {
-        EndListening(pSdrObject->getSdrModelFromSdrObject());
-        pSdrObject->setUnoShape(nullptr);
-        pSdrObject.clear();
+        EndListening(mxSdrObject->getSdrModelFromSdrObject());
+        mxSdrObject->setUnoShape(nullptr);
         mxSdrObject.clear();
 
         if(!mpImpl->mbDisposing)

Reply via email to