basctl/source/basicide/basides1.cxx |    2 -
 basic/source/classes/sb.cxx         |   37 +++++++++++++++---------------------
 basic/source/classes/sbunoobj.cxx   |    4 +--
 basic/source/classes/sbxmod.cxx     |   20 ++++++-------------
 basic/source/runtime/runtime.cxx    |    6 ++---
 include/basic/sbmod.hxx             |   12 ++++++-----
 6 files changed, 36 insertions(+), 45 deletions(-)

New commits:
commit 2b4734c8a4c1b414375c987c840a30c30e913854
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Mon Aug 26 20:49:43 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Aug 27 09:41:48 2024 +0200

    SbClassModuleObject never take a non-null arg
    
    Change-Id: I1be4710a32355c104ba25005ec4f46c6f650b9c0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172443
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/basctl/source/basicide/basides1.cxx 
b/basctl/source/basicide/basides1.cxx
index 43453a89a8b1..e42c645ee9d8 100644
--- a/basctl/source/basicide/basides1.cxx
+++ b/basctl/source/basicide/basides1.cxx
@@ -1523,7 +1523,7 @@ VclPtr<ModulWindow> Shell::ShowActiveModuleWindow( 
StarBASIC const * pBasic )
 
     SbModule* pActiveModule = StarBASIC::GetActiveModule();
     if (SbClassModuleObject* pCMO = 
dynamic_cast<SbClassModuleObject*>(pActiveModule))
-        pActiveModule = pCMO->getClassModule();
+        pActiveModule = &pCMO->getClassModule();
 
     DBG_ASSERT( pActiveModule, "No active module in ErrorHdl!?" );
     if ( pActiveModule )
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 1f1714fe7377..e2fe5dfb3059 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -604,23 +604,23 @@ SbxObjectRef createUserTypeImpl( const OUString& 
rClassName )
     return pRetObj;
 }
 
-SbClassModuleObject::SbClassModuleObject( SbModule* pClassModule )
-    : SbModule( pClassModule->GetName() )
-    , mpClassModule( pClassModule )
+SbClassModuleObject::SbClassModuleObject(SbModule& rClassModule)
+    : SbModule(rClassModule.GetName())
+    , mrClassModule(rClassModule)
     , mbInitializeEventDone( false )
 {
-    aOUSource = pClassModule->aOUSource;
-    aComment = pClassModule->aComment;
-    pImage = pClassModule->pImage;
-    pBreaks = pClassModule->pBreaks;
+    aOUSource = rClassModule.aOUSource;
+    aComment = rClassModule.aComment;
+    pImage = rClassModule.pImage;
+    pBreaks = rClassModule.pBreaks;
 
-    SetClassName( pClassModule->GetName() );
+    SetClassName(rClassModule.GetName());
 
     // Allow search only internally
     ResetFlag( SbxFlagBits::GlobalSearch );
 
     // Copy the methods from original class module
-    SbxArray* pClassMethods = pClassModule->GetMethods().get();
+    SbxArray* pClassMethods = rClassModule.GetMethods().get();
     sal_uInt32 nMethodCount = pClassMethods->Count();
     sal_uInt32 i;
     for( i = 0 ; i < nMethodCount ; i++ )
@@ -678,7 +678,7 @@ SbClassModuleObject::SbClassModuleObject( SbModule* 
pClassModule )
     }
 
     // Copy the properties from original class module
-    SbxArray* pClassProps = pClassModule->GetProperties();
+    SbxArray* pClassProps = rClassModule.GetProperties();
     sal_uInt32 nPropertyCount = pClassProps->Count();
     for( i = 0 ; i < nPropertyCount ; i++ )
     {
@@ -719,17 +719,17 @@ SbClassModuleObject::SbClassModuleObject( SbModule* 
pClassModule )
                         SbClassModuleObject* pClassModuleObj = 
dynamic_cast<SbClassModuleObject*>( pObjBase );
                         if( pClassModuleObj != nullptr )
                         {
-                            SbModule* pLclClassModule = 
pClassModuleObj->getClassModule();
-                            SbClassModuleObject* pNewObj = new 
SbClassModuleObject( pLclClassModule );
+                            SbModule& rLclClassModule = 
pClassModuleObj->getClassModule();
+                            SbClassModuleObject* pNewObj = new 
SbClassModuleObject(rLclClassModule);
                             pNewObj->SetName( pProp->GetName() );
-                            pNewObj->SetParent( pLclClassModule->pParent );
+                            pNewObj->SetParent(rLclClassModule.pParent);
                             pNewProp->PutObject( pNewObj );
                         }
                         else if( aObjClass.equalsIgnoreAsciiCase( "Collection" 
) )
                         {
                             BasicCollection* pNewCollection = new 
BasicCollection( u"Collection"_ustr );
                             pNewCollection->SetName( pProp->GetName() );
-                            pNewCollection->SetParent( pClassModule->pParent );
+                            pNewCollection->SetParent(rClassModule.pParent);
                             pNewProp->PutObject( pNewCollection );
                         }
                     }
@@ -743,7 +743,7 @@ SbClassModuleObject::SbClassModuleObject( SbModule* 
pClassModule )
         }
     }
     SetModuleType( ModuleType::CLASS );
-    mbVBASupport = pClassModule->mbVBASupport;
+    mbVBASupport = rClassModule.mbVBASupport;
 }
 
 SbClassModuleObject::~SbClassModuleObject()
@@ -874,7 +874,7 @@ SbxObjectRef SbClassFactory::CreateObject( const OUString& 
rClassName )
     if( pVar )
     {
         SbModule* pVarMod = static_cast<SbModule*>(pVar);
-        pRet = new SbClassModuleObject( pVarMod );
+        pRet = new SbClassModuleObject(*pVarMod);
     }
     return pRet;
 }
diff --git a/basic/source/classes/sbunoobj.cxx 
b/basic/source/classes/sbunoobj.cxx
index 247235b6b5e5..4ead3c8cd1d1 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -995,8 +995,8 @@ static Any sbxToUnoValueImpl( const SbxValue* pVar, bool 
bBlockConversionToSmall
             if( auto pClassModuleObj = dynamic_cast<SbClassModuleObject*>( 
xObj.get() ) )
             {
                 Any aRetAny;
-                SbModule* pClassModule = pClassModuleObj->getClassModule();
-                if( pClassModule->createCOMWrapperForIface( aRetAny, 
pClassModuleObj ) )
+                SbModule& rClassModule = pClassModuleObj->getClassModule();
+                if (rClassModule.createCOMWrapperForIface(aRetAny, 
pClassModuleObj))
                     return aRetAny;
             }
             if( dynamic_cast<const SbUnoObject*>( xObj.get() ) == nullptr )
diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx
index 6897f41b2183..55d59da942ec 100644
--- a/basic/source/runtime/runtime.cxx
+++ b/basic/source/runtime/runtime.cxx
@@ -1960,7 +1960,7 @@ void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, 
SbxVariableRef& refVar, b
                             const DimAsNewRecoverItem& rItem = it->second;
                             if( rItem.m_pClassModule != nullptr )
                             {
-                                SbClassModuleObject* pNewObj = new 
SbClassModuleObject( rItem.m_pClassModule );
+                                SbClassModuleObject* pNewObj = new 
SbClassModuleObject(*rItem.m_pClassModule);
                                 pNewObj->SetName( rItem.m_aObjName );
                                 pNewObj->SetParent( rItem.m_pObjParent );
                                 refVar->PutObject( pNewObj );
@@ -1990,9 +1990,9 @@ void SbiRuntime::StepSET_Impl( SbxVariableRef& refVal, 
SbxVariableRef& refVar, b
                             SbClassModuleObject* pClassModuleObj = 
dynamic_cast<SbClassModuleObject*>( pValObjBase );
                             if( pClassModuleObj != nullptr )
                             {
-                                SbModule* pClassModule = 
pClassModuleObj->getClassModule();
+                                SbModule& rClassModule = 
pClassModuleObj->getClassModule();
                                 gaDimAsNewRecoverHash[refVar.get()] =
-                                    DimAsNewRecoverItem( aObjClass, 
pValObj->GetName(), pValObj->GetParent(), pClassModule );
+                                    DimAsNewRecoverItem( aObjClass, 
pValObj->GetName(), pValObj->GetParent(), &rClassModule );
                             }
                             else if( aObjClass.equalsIgnoreAsciiCase( 
"Collection" ) )
                             {
diff --git a/include/basic/sbmod.hxx b/include/basic/sbmod.hxx
index 44ef8205c51a..7c6c9ff53ffe 100644
--- a/include/basic/sbmod.hxx
+++ b/include/basic/sbmod.hxx
@@ -144,11 +144,11 @@ typedef std::vector<SbModuleRef> SbModules;
 // Object class for instances of class modules
 class UNLESS_MERGELIBS(BASIC_DLLPUBLIC) SbClassModuleObject final : public 
SbModule
 {
-    SbModule*   mpClassModule;
+    SbModule&   mrClassModule;
     bool        mbInitializeEventDone;
 
 public:
-    SbClassModuleObject( SbModule* pClassModule );
+    SbClassModuleObject(SbModule& rClassModule);
     virtual ~SbClassModuleObject() override;
 
     // Overridden to support NameAccess etc.
@@ -156,8 +156,10 @@ public:
 
     virtual void Notify( SfxBroadcaster&, const SfxHint& rHint ) override;
 
-    SbModule* getClassModule()
-        { return mpClassModule; }
+    SbModule& getClassModule()
+    {
+        return mrClassModule;
+    }
 
     void triggerInitializeEvent();
     void triggerTerminateEvent();
commit 740194221e096ce437e8ac64fdc49e3957b6918e
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Mon Aug 26 20:44:13 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Tue Aug 27 09:41:41 2024 +0200

    use a shared_ptr for SbiBreakpoints pBreaks as well
    
    Change-Id: I3dec5ffe5fdf937d761c902970a94b73878a2cd9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172441
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 9720031dfc1a..1f1714fe7377 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -612,7 +612,6 @@ SbClassModuleObject::SbClassModuleObject( SbModule* 
pClassModule )
     aOUSource = pClassModule->aOUSource;
     aComment = pClassModule->aComment;
     pImage = pClassModule->pImage;
-    // see comment in destructor about this
     pBreaks = pClassModule->pBreaks;
 
     SetClassName( pClassModule->GetName() );
@@ -755,10 +754,6 @@ SbClassModuleObject::~SbClassModuleObject()
             if( const DocBasicItem* pDocBasicItem = lclFindDocBasicItem( 
pDocBasic ) )
                 if( !pDocBasicItem->isDocClosed() )
                     triggerTerminateEvent();
-
-    // prevent the base class destructor from deleting this because
-    // we do not actually own it
-    pBreaks = nullptr;
 }
 
 void SbClassModuleObject::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx
index 95d751bb0202..81faaaa05f1f 100644
--- a/basic/source/classes/sbxmod.cxx
+++ b/basic/source/classes/sbxmod.cxx
@@ -417,8 +417,8 @@ static bool getDefaultVBAMode( StarBASIC* pb )
 // could be found from other module.
 
 SbModule::SbModule( const OUString& rName, bool bVBASupport )
-         : SbxObject( u"StarBASICModule"_ustr ),
-           pBreaks(nullptr), mbVBASupport(bVBASupport), mbCompat(bVBASupport), 
bIsProxyModule(false)
+    : SbxObject( u"StarBASICModule"_ustr )
+    , mbVBASupport(bVBASupport), mbCompat(bVBASupport), bIsProxyModule(false)
 {
     SetName( rName );
     SetFlag( SbxFlagBits::ExtSearch | SbxFlagBits::GlobalSearch );
@@ -436,7 +436,7 @@ SbModule::~SbModule()
 {
     SAL_INFO("basic","Module named " << GetName() << " is destructing");
     pImage.reset();
-    delete pBreaks;
+    pBreaks.reset();
     pClassData.reset();
     mxWrapper = nullptr;
 }
@@ -1525,7 +1525,7 @@ bool SbModule::SetBP( sal_uInt16 nLine )
     if( !IsBreakable( nLine ) )
         return false;
     if( !pBreaks )
-        pBreaks = new SbiBreakpoints;
+        pBreaks.reset(new SbiBreakpoints);
     auto it = std::find_if(pBreaks->begin(), pBreaks->end(),
         [&nLine](const sal_uInt16 b) { return b <= nLine; });
     if (it != pBreaks->end() && *it == nLine)
@@ -1548,22 +1548,16 @@ bool SbModule::ClearBP( sal_uInt16 nLine )
             [&nLine](const sal_uInt16 b) { return b <= nLine; });
         bRes = (it != pBreaks->end()) && (*it == nLine);
         if (bRes)
-        {
             pBreaks->erase(it);
-        }
-        if( pBreaks->empty() )
-        {
-            delete pBreaks;
-            pBreaks = nullptr;
-        }
+        if (pBreaks->empty())
+            pBreaks.reset();
     }
     return bRes;
 }
 
 void SbModule::ClearAllBP()
 {
-    delete pBreaks;
-    pBreaks = nullptr;
+    pBreaks.reset();
 }
 
 void
diff --git a/include/basic/sbmod.hxx b/include/basic/sbmod.hxx
index 66b90a4f2a52..44ef8205c51a 100644
--- a/include/basic/sbmod.hxx
+++ b/include/basic/sbmod.hxx
@@ -64,7 +64,7 @@ protected:
     OUString            aOUSource;
     OUString            aComment;
     std::shared_ptr<SbiImage> pImage;  // the Image
-    SbiBreakpoints*     pBreaks;       // Breakpoints
+    std::shared_ptr<SbiBreakpoints> pBreaks; // Breakpoints
     std::unique_ptr<SbClassData> pClassData;
     bool mbVBASupport; // Option VBASupport
     bool mbCompat; // Option Compatible

Reply via email to