Commit c200ec93 authored by charras's avatar charras
Browse files

Fixed: eeschemas sometimes crashes after a component with aliases is modified in libedit

parent b24118eb
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -126,13 +126,13 @@ int LibraryEntryCompare( const CMP_LIB_ENTRY* aItem1, const CMP_LIB_ENTRY* aItem
 *  (like 74LS00, 74HC00 ... and many op amps )
 *  (like 74LS00, 74HC00 ... and many op amps )
 */
 */


LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aComponent,
LIB_ALIAS::LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent,
                      CMP_LIBRARY* aLibrary ) :
                      CMP_LIBRARY* aLibrary ) :
    CMP_LIB_ENTRY( ALIAS, aName, aLibrary )
    CMP_LIB_ENTRY( ALIAS, aName, aLibrary )
{
{
    wxASSERT( aComponent != NULL && aComponent->isComponent() );
    wxASSERT( aRootComponent != NULL && aRootComponent->isComponent() );


    root = aComponent;
    root = aRootComponent;
}
}




+3 −1
Original line number Original line Diff line number Diff line
@@ -515,11 +515,13 @@ protected:
     * @note - Do not delete the root component.  The root component is owned
     * @note - Do not delete the root component.  The root component is owned
     *         by library the component is part of.  Deleting the root component
     *         by library the component is part of.  Deleting the root component
     *         will likely cause EESchema to crash.
     *         will likely cause EESchema to crash.
     *         Or, if the root component is deleted, aliases must be deleted or their .root member
     *         must be changed to point a new root component
     */
     */
    LIB_COMPONENT* root;
    LIB_COMPONENT* root;


public:
public:
    LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aComponent,
    LIB_ALIAS( const wxString& aName, LIB_COMPONENT* aRootComponent,
               CMP_LIBRARY* aLibrary = NULL );
               CMP_LIBRARY* aLibrary = NULL );
    LIB_ALIAS( LIB_ALIAS& aAlias, CMP_LIBRARY* aLibrary = NULL );
    LIB_ALIAS( LIB_ALIAS& aAlias, CMP_LIBRARY* aLibrary = NULL );
    ~LIB_ALIAS();
    ~LIB_ALIAS();
+27 −44
Original line number Original line Diff line number Diff line
@@ -356,60 +356,43 @@ library <%s>" ),
LIB_COMPONENT* CMP_LIBRARY::ReplaceComponent( LIB_COMPONENT* aOldComponent,
LIB_COMPONENT* CMP_LIBRARY::ReplaceComponent( LIB_COMPONENT* aOldComponent,
                                              LIB_COMPONENT* aNewComponent )
                                              LIB_COMPONENT* aNewComponent )
{
{
    wxASSERT( aOldComponent != NULL && aNewComponent != NULL
    wxASSERT( aOldComponent != NULL );
              && aOldComponent->GetName().CmpNoCase( aNewComponent->GetName() )== 0 );
    wxASSERT( aNewComponent != NULL );
    wxASSERT( aOldComponent->GetName().CmpNoCase( aNewComponent->GetName() )== 0 );


    size_t i;
    size_t i;
    int index;
    LIB_ALIAS* alias;


    if( aOldComponent->m_AliasList != aNewComponent->m_AliasList )
    LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aNewComponent, this );
    {

        /* Remove extra aliases. */
    /* We want to remove the old root component, so we must remove old aliases.
     * even if they are not modified, because their root component will be removed
    */
    for( i = 0; i < aOldComponent->m_AliasList.GetCount(); i++ )
    for( i = 0; i < aOldComponent->m_AliasList.GetCount(); i++ )
    {
    {
             index =
/*        wxLogDebug( wxT( "Removing alias <%s> from component <%s> in library <%s>." ),
                aNewComponent->m_AliasList.Index( aOldComponent->m_AliasList[ i ] );

            if( index != wxNOT_FOUND )
                continue;

            wxLogDebug( wxT( "Removing extra alias <%s> from component <%s> in library <%s>." ),
                    GetChars( aOldComponent->m_AliasList[ i ] ),
                    GetChars( aOldComponent->m_AliasList[ i ] ),
                    GetChars( aOldComponent->GetName() ),
                    GetChars( aOldComponent->GetName() ),
                    GetChars( fileName.GetName() ) );
                    GetChars( fileName.GetName() ) );

*/
        RemoveEntry( aOldComponent->m_AliasList[ i ] );
        RemoveEntry( aOldComponent->m_AliasList[ i ] );
    }
    }


        /* Add new aliases. */
    /* Now, add current aliases. */
    for( i = 0; i < aNewComponent->m_AliasList.GetCount(); i++ )
    for( i = 0; i < aNewComponent->m_AliasList.GetCount(); i++ )
    {
    {
             index = aOldComponent->m_AliasList.Index( aNewComponent->m_AliasList[ i ] );
/*        wxLogDebug( wxT( "Adding alias <%s> from component <%s> in library <%s>." ),

            if( index != wxNOT_FOUND
                || FindEntry( aNewComponent->m_AliasList[ i ] ) != NULL )
                continue;

            wxLogDebug( wxT( "Adding extra alias <%s> from component <%s> in library <%s>." ),
                    GetChars( aNewComponent->m_AliasList[ i ] ),
                    GetChars( aNewComponent->m_AliasList[ i ] ),
                    GetChars( aNewComponent->GetName() ),
                    GetChars( aNewComponent->GetName() ),
                    GetChars( fileName.GetName() ) );
                    GetChars( fileName.GetName() ) );

*/
            alias = new LIB_ALIAS( aNewComponent->m_AliasList[ i ], aNewComponent );
        LIB_ALIAS* alias = new LIB_ALIAS( aNewComponent->m_AliasList[ i ], newCmp );
        entries.push_back( alias );
        entries.push_back( alias );
    }
    }
    }


    RemoveEntry( aOldComponent->GetName() );
    RemoveEntry( aOldComponent->GetName() );

    LIB_COMPONENT* newCmp = new LIB_COMPONENT( *aNewComponent, this );

    if( newCmp == NULL )
        return NULL;

    entries.push_back( (CMP_LIB_ENTRY*) newCmp );
    entries.push_back( (CMP_LIB_ENTRY*) newCmp );
    entries.sort();
    entries.sort();

    isModified = true;
    isModified = true;
    return newCmp;
    return newCmp;
}
}