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)