Fix Eeschema search segfault.

* The SCH_COLLECTOR m_foundItems was being obsoleted after a pin name search.
  If a library edit changed the found pin name, the cache still held the now
  missing library pin and would segfault on next search due to the cache being
  out of date.
This commit is contained in:
Dick Hollenbeck 2015-04-09 15:37:48 -04:00 committed by Wayne Stambaugh
parent ea11c013b6
commit 659ea5184c
7 changed files with 41 additions and 12 deletions

View File

@ -131,7 +131,7 @@ public:
* @return True if \a aFindReplaceData would result in a search and/or replace change,
* otherwise false.
*/
bool ChangesCompare( SCH_FIND_REPLACE_DATA& aFindReplaceData )
bool ChangesCompare( const SCH_FIND_REPLACE_DATA& aFindReplaceData )
{
return ( (GetFindString() != aFindReplaceData.GetFindString())
|| (GetCompareFlags() != aFindReplaceData.GetCompareFlags()) );

View File

@ -285,6 +285,25 @@ SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference,
}
bool SCH_EDIT_FRAME::IsSearchCacheObsolete( const SCH_FIND_REPLACE_DATA& aSearchCriteria )
{
PART_LIBS* libs = Prj().SchLibs();
int mod_hash = libs->GetModifyHash();
// the cache is obsolete whenever any library changes.
if( mod_hash != m_foundItems.GetLibHash() )
{
m_foundItems.SetForceSearch();
m_foundItems.SetLibHash( mod_hash );
return true;
}
else if( m_foundItems.IsSearchRequired( aSearchCriteria ) )
return true;
else
return false;
}
void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& aEvent )
{
static wxPoint itemPosition; // the actual position of the matched item.
@ -303,7 +322,7 @@ void SCH_EDIT_FRAME::OnFindSchematicItem( wxFindDialogEvent& aEvent )
if( m_foundItems.GetCount() == 0 )
return;
}
else if( m_foundItems.IsSearchRequired( searchCriteria ) )
else if( IsSearchCacheObsolete( searchCriteria ) )
{
if( aEvent.GetFlags() & FR_CURRENT_SHEET_ONLY && g_RootSheet->CountSheets() > 1 )
{

View File

@ -467,7 +467,7 @@ bool SCH_FIND_COLLECTOR::ReplaceItem( SCH_SHEET_PATH* aSheetPath )
bool replaced = item->Replace( m_findReplaceData, aSheetPath );
if( replaced )
m_forceSearch = true;
SetForceSearch();
return replaced;
}
@ -512,7 +512,7 @@ void SCH_FIND_COLLECTOR::Collect( SCH_FIND_REPLACE_DATA& aFindReplaceData,
Empty(); // empty the collection just in case
m_data.clear();
m_foundIndex = 0;
m_forceSearch = false;
SetForceSearch( false );
if( aSheetPath )
{

View File

@ -231,11 +231,15 @@ class SCH_FIND_COLLECTOR : public COLLECTOR
SCH_SHEET_PATH* m_sheetPath;
/// The current found item list index.
int m_foundIndex;
int m_foundIndex;
/// A flag to indicate that the schemtic has been modified and a new search must be
/// performed even if the search criteria hasn't changed.
bool m_forceSearch;
bool m_forceSearch;
/// last known library change hash, used to detect library changes which
/// should trigger cache obsolescence.
int m_lib_hash;
/**
* Function dump
@ -254,7 +258,7 @@ public:
{
SetScanTypes( aScanTypes );
m_foundIndex = 0;
m_forceSearch = false;
SetForceSearch( false );
m_sheetPath = NULL;
}
@ -265,7 +269,10 @@ public:
m_data.clear();
}
void SetForceSearch() { m_forceSearch = true; }
void SetForceSearch( bool doSearch = true ) { m_forceSearch = doSearch; }
int GetLibHash() const { return m_lib_hash; }
void SetLibHash( int aHash ) { m_lib_hash = aHash; }
/**
* Function PassedEnd
@ -294,7 +301,7 @@ public:
/**
* Function IsSearchRequired
* checks the current collector state agaianst \a aFindReplaceData to see if a new search
* checks the current collector state against \a aFindReplaceData to see if a new search
* needs to be performed to update the collector.
*
* @param aFindReplaceData A #SCH_FIND_REPLACE_DATA object containing the search criteria
@ -302,7 +309,7 @@ public:
* @return True if \a aFindReplaceData would require a new search to be performaed or
* the force search flag is true. Otherwise, false is returned.
*/
bool IsSearchRequired( SCH_FIND_REPLACE_DATA& aFindReplaceData )
bool IsSearchRequired( const SCH_FIND_REPLACE_DATA& aFindReplaceData )
{
return m_findReplaceData.ChangesCompare( aFindReplaceData ) || m_forceSearch ||
(m_findReplaceData.IsWrapping() != aFindReplaceData.IsWrapping());

View File

@ -35,6 +35,7 @@
#include <kicad_string.h>
#include <eeschema_id.h>
#include <pgm_base.h>
#include <kiway.h>
#include <class_drawpanel.h>
#include <sch_item_struct.h>
#include <schframe.h>

View File

@ -719,8 +719,7 @@ void SCH_EDIT_FRAME::OnModify()
GetScreen()->SetModify();
GetScreen()->SetSave();
if( m_dlgFindReplace == NULL )
m_foundItems.SetForceSearch();
m_foundItems.SetForceSearch();
}

View File

@ -734,6 +734,9 @@ public:
// General search:
bool IsSearchCacheObsolete( const SCH_FIND_REPLACE_DATA& aSearchCriteria );
private:
/**