PNS Debug/regresions: Fix some memory leaks

This commit is contained in:
Roberto Fernandez Bautista 2024-01-28 20:07:44 +01:00 committed by Alex Shvartzkop
parent effed5dfdf
commit 70f14277d1
4 changed files with 59 additions and 40 deletions

View File

@ -69,7 +69,8 @@ PNS_LOG_FILE::PNS_LOG_FILE() :
m_routerSettings.reset( new PNS::ROUTING_SETTINGS( nullptr, "" ) ); m_routerSettings.reset( new PNS::ROUTING_SETTINGS( nullptr, "" ) );
} }
std::shared_ptr<SHAPE> parseShape( SHAPE_TYPE expectedType, wxStringTokenizer& aTokens )
std::shared_ptr<SHAPE> PNS_LOG_FILE::parseShape( SHAPE_TYPE expectedType, wxStringTokenizer& aTokens )
{ {
SHAPE_TYPE type = static_cast<SHAPE_TYPE> ( wxAtoi( aTokens.GetNextToken() ) ); SHAPE_TYPE type = static_cast<SHAPE_TYPE> ( wxAtoi( aTokens.GetNextToken() ) );
@ -119,15 +120,15 @@ bool PNS_LOG_FILE::parseCommonPnsProps( PNS::ITEM* aItem, const wxString& cmd,
return false; return false;
} }
PNS::SEGMENT* PNS_LOG_FILE::parsePnsSegmentFromString( wxStringTokenizer& aTokens ) std::unique_ptr<PNS::SEGMENT> PNS_LOG_FILE::parsePnsSegmentFromString( wxStringTokenizer& aTokens )
{ {
PNS::SEGMENT* seg = new PNS::SEGMENT(); std::unique_ptr<PNS::SEGMENT> seg( new PNS::SEGMENT() );
while( aTokens.CountTokens() ) while( aTokens.CountTokens() )
{ {
wxString cmd = aTokens.GetNextToken(); wxString cmd = aTokens.GetNextToken();
if( !parseCommonPnsProps( seg, cmd, aTokens ) ) if( !parseCommonPnsProps( seg.get(), cmd, aTokens ) )
{ {
if( cmd == wxS( "shape" ) ) if( cmd == wxS( "shape" ) )
{ {
@ -145,15 +146,15 @@ PNS::SEGMENT* PNS_LOG_FILE::parsePnsSegmentFromString( wxStringTokenizer& aToken
return seg; return seg;
} }
PNS::VIA* PNS_LOG_FILE::parsePnsViaFromString( wxStringTokenizer& aTokens ) std::unique_ptr<PNS::VIA> PNS_LOG_FILE::parsePnsViaFromString( wxStringTokenizer& aTokens )
{ {
PNS::VIA* via = new PNS::VIA(); std::unique_ptr<PNS::VIA> via( new PNS::VIA() );
while( aTokens.CountTokens() ) while( aTokens.CountTokens() )
{ {
wxString cmd = aTokens.GetNextToken(); wxString cmd = aTokens.GetNextToken();
if( !parseCommonPnsProps( via, cmd, aTokens ) ) if( !parseCommonPnsProps( via.get(), cmd, aTokens ) )
{ {
if( cmd == wxS( "shape" ) ) if( cmd == wxS( "shape" ) )
{ {
@ -178,7 +179,7 @@ PNS::VIA* PNS_LOG_FILE::parsePnsViaFromString( wxStringTokenizer& aTokens )
} }
PNS::ITEM* PNS_LOG_FILE::parseItemFromString( wxStringTokenizer& aTokens ) std::unique_ptr<PNS::ITEM> PNS_LOG_FILE::parseItemFromString( wxStringTokenizer& aTokens )
{ {
wxString type = aTokens.GetNextToken(); wxString type = aTokens.GetNextToken();
@ -409,8 +410,8 @@ bool PNS_LOG_FILE::Load( const wxFileName& logFileName, REPORTER* aRpt )
} }
else if ( cmd == wxT( "added" ) ) else if ( cmd == wxT( "added" ) )
{ {
PNS::ITEM* item = parseItemFromString( tokens ); m_parsed_items.push_back( parseItemFromString( tokens ) );
m_commitState.m_addedItems.push_back( item ); m_commitState.m_addedItems.push_back( m_parsed_items.back().get() );
} }
else if ( cmd == wxT( "removed" ) ) else if ( cmd == wxT( "removed" ) )
{ {

View File

@ -55,16 +55,14 @@ public:
struct COMMIT_STATE struct COMMIT_STATE
{ {
COMMIT_STATE() {}; COMMIT_STATE(){};
COMMIT_STATE( const COMMIT_STATE& aOther ) : COMMIT_STATE( const COMMIT_STATE& aOther ) :
m_removedIds( aOther.m_removedIds ), m_removedIds( aOther.m_removedIds ), m_addedItems( aOther.m_addedItems )
m_addedItems( aOther.m_addedItems )
{ {
} }
std::set<KIID> m_removedIds; std::set<KIID> m_removedIds;
std::vector<PNS::ITEM*> m_addedItems; std::vector<PNS::ITEM*> m_addedItems;
bool Compare( const COMMIT_STATE& aOther ); bool Compare( const COMMIT_STATE& aOther );
}; };
@ -91,19 +89,22 @@ public:
private: private:
bool parseCommonPnsProps( PNS::ITEM* aItem, const wxString& cmd, wxStringTokenizer& aTokens ); bool parseCommonPnsProps( PNS::ITEM* aItem, const wxString& cmd, wxStringTokenizer& aTokens );
PNS::SEGMENT* parsePnsSegmentFromString( wxStringTokenizer& aTokens ); std::unique_ptr<PNS::SEGMENT> parsePnsSegmentFromString( wxStringTokenizer& aTokens );
PNS::VIA* parsePnsViaFromString( wxStringTokenizer& aTokens ); std::unique_ptr<PNS::VIA> parsePnsViaFromString( wxStringTokenizer& aTokens );
PNS::ITEM* parseItemFromString( wxStringTokenizer& aTokens ); std::unique_ptr<PNS::ITEM> parseItemFromString( wxStringTokenizer& aTokens );
std::shared_ptr<SHAPE> parseShape( SHAPE_TYPE expectedType, wxStringTokenizer& aTokens );
private: private:
std::shared_ptr<SETTINGS_MANAGER> m_settingsMgr; std::shared_ptr<SETTINGS_MANAGER> m_settingsMgr;
std::unique_ptr<PNS::ROUTING_SETTINGS> m_routerSettings; std::unique_ptr<PNS::ROUTING_SETTINGS> m_routerSettings;
std::vector<PNS::LOGGER::EVENT_ENTRY> m_events; std::vector<PNS::LOGGER::EVENT_ENTRY> m_events;
std::shared_ptr<BOARD> m_board; std::shared_ptr<BOARD> m_board;
COMMIT_STATE m_commitState; COMMIT_STATE m_commitState;
PNS::ROUTER_MODE m_mode; std::vector<std::unique_ptr<PNS::ITEM>> m_parsed_items;
PNS::ROUTER_MODE m_mode;
}; };
#endif #endif

View File

@ -108,6 +108,7 @@ PNS_DEBUG_STAGE::PNS_DEBUG_STAGE()
PNS_DEBUG_STAGE::~PNS_DEBUG_STAGE() PNS_DEBUG_STAGE::~PNS_DEBUG_STAGE()
{ {
delete m_entries;
} }
@ -123,6 +124,8 @@ PNS_TEST_DEBUG_DECORATOR::PNS_TEST_DEBUG_DECORATOR( REPORTER* aReporter ) :
PNS_TEST_DEBUG_DECORATOR::~PNS_TEST_DEBUG_DECORATOR() PNS_TEST_DEBUG_DECORATOR::~PNS_TEST_DEBUG_DECORATOR()
{ {
for( PNS_DEBUG_STAGE* stage : m_stages )
delete stage;
// fixme: I know it's a hacky tool but it should clean after itself at some point... // fixme: I know it's a hacky tool but it should clean after itself at some point...
} }
@ -261,7 +264,7 @@ void PNS_TEST_DEBUG_DECORATOR::NewStage( const wxString& name, int iter,
stage->m_name = name; stage->m_name = name;
stage->m_iter = iter; stage->m_iter = iter;
m_stages.push_back( new PNS_DEBUG_STAGE ); m_stages.push_back( stage );
m_activeEntry = m_stages.back()->m_entries; m_activeEntry = m_stages.back()->m_entries;
} }

View File

@ -75,7 +75,7 @@ bool runSingleTest( REPORTER* aReporter, wxString name, wxString testDirPath )
int main( int argc, char* argv[] ) int main( int argc, char* argv[] )
{ {
int passed = 0, failed = 0; int passed = 0, failed = 0;
@ -108,6 +108,26 @@ struct PNS_TEST_CASE
}; };
class FIXTURE_LOGGER
{
public:
FIXTURE_LOGGER()
{
m_Log = new KI_TEST::CONSOLE_LOG;
m_Reporter = new KI_TEST::CONSOLE_MSG_REPORTER( m_Log );
}
~FIXTURE_LOGGER()
{
delete m_Reporter;
delete m_Log;
}
KI_TEST::CONSOLE_LOG* m_Log;
KI_TEST::CONSOLE_MSG_REPORTER* m_Reporter;
};
class PNS_TEST_FIXTURE class PNS_TEST_FIXTURE
{ {
public: public:
@ -118,20 +138,14 @@ public:
PNS_LOG_FILE logFile; PNS_LOG_FILE logFile;
PNS_LOG_PLAYER player; PNS_LOG_PLAYER player;
if( !m_log ) if( !logFile.Load( wxString( aTestData->GetDataPath() ), m_logger.m_Reporter ) )
m_log = new KI_TEST::CONSOLE_LOG;
if( !m_reporter )
m_reporter = new KI_TEST::CONSOLE_MSG_REPORTER( m_log );
if( !logFile.Load( wxString( aTestData->GetDataPath() ), m_reporter ) )
{ {
m_reporter->Report( wxString::Format( "Failed to load test '%s' from '%s'", m_logger.m_Reporter->Report( wxString::Format( "Failed to load test '%s' from '%s'",
aTestData->GetName(), aTestData->GetDataPath() ), aTestData->GetName(), aTestData->GetDataPath() ),
RPT_SEVERITY_ERROR ); RPT_SEVERITY_ERROR );
} }
player.SetReporter( m_reporter ); player.SetReporter( m_logger.m_Reporter );
player.ReplayLog( &logFile, 0 ); player.ReplayLog( &logFile, 0 );
bool pass = player.CompareResults( &logFile ); bool pass = player.CompareResults( &logFile );
@ -139,12 +153,12 @@ public:
BOOST_TEST_FAIL( "replay results inconsistent with reference reslts" ); BOOST_TEST_FAIL( "replay results inconsistent with reference reslts" );
} }
static KI_TEST::CONSOLE_LOG* m_log; static FIXTURE_LOGGER m_logger;
static KI_TEST::CONSOLE_MSG_REPORTER* m_reporter;
}; };
KI_TEST::CONSOLE_LOG* PNS_TEST_FIXTURE::m_log = nullptr;
KI_TEST::CONSOLE_MSG_REPORTER* PNS_TEST_FIXTURE::m_reporter = nullptr; FIXTURE_LOGGER PNS_TEST_FIXTURE::m_logger;
std::vector<PNS_TEST_CASE*> createTestCases() std::vector<PNS_TEST_CASE*> createTestCases()
{ {