1
0
mirror of https://github.com/wolfpld/tracy synced 2025-04-30 12:53:51 +00:00

Fix crash when trying to open unavailable source file.

This commit is contained in:
Bartosz Taudul 2020-08-12 19:05:02 +02:00
parent ce1c744de9
commit 8e9a701277
2 changed files with 45 additions and 28 deletions

View File

@ -415,6 +415,11 @@ void SourceView::OpenSymbol( const char* fileName, int line, uint64_t baseAddr,
Disassemble( baseAddr, worker ); Disassemble( baseAddr, worker );
SelectLine( line, &worker, true, symAddr ); SelectLine( line, &worker, true, symAddr );
SelectViewMode();
}
void SourceView::SelectViewMode()
{
if( !m_lines.empty() ) if( !m_lines.empty() )
{ {
if( !m_asm.empty() ) if( !m_asm.empty() )
@ -453,40 +458,49 @@ void SourceView::ParseSource( const char* fileName, const Worker& worker, const
else else
{ {
FILE* f = fopen( view.SourceSubstitution( fileName ), "rb" ); FILE* f = fopen( view.SourceSubstitution( fileName ), "rb" );
assert( f ); if( f )
fseek( f, 0, SEEK_END );
sz = ftell( f );
fseek( f, 0, SEEK_SET );
if( sz > m_dataSize )
{ {
delete[] m_dataBuf; fseek( f, 0, SEEK_END );
m_dataBuf = new char[sz]; sz = ftell( f );
m_dataSize = sz; fseek( f, 0, SEEK_SET );
if( sz > m_dataSize )
{
delete[] m_dataBuf;
m_dataBuf = new char[sz];
m_dataSize = sz;
}
fread( m_dataBuf, 1, sz, f );
m_data = m_dataBuf;
fclose( f );
}
else
{
m_file = nullptr;
} }
fread( m_dataBuf, 1, sz, f );
m_data = m_dataBuf;
fclose( f );
} }
m_tokenizer.Reset(); if( m_file )
auto txt = m_data;
for(;;)
{ {
auto end = txt; m_tokenizer.Reset();
while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++; auto txt = m_data;
m_lines.emplace_back( Line { txt, end, Tokenize( txt, end ) } ); for(;;)
if( *end == '\n' )
{ {
end++; auto end = txt;
if( end - m_data < sz && *end == '\r' ) end++; while( *end != '\n' && *end != '\r' && end - m_data < sz ) end++;
m_lines.emplace_back( Line { txt, end, Tokenize( txt, end ) } );
if( *end == '\n' )
{
end++;
if( end - m_data < sz && *end == '\r' ) end++;
}
else if( *end == '\r' )
{
end++;
if( end - m_data < sz && *end == '\n' ) end++;
}
if( end - m_data == sz ) break;
txt = end;
} }
else if( *end == '\r' )
{
end++;
if( end - m_data < sz && *end == '\n' ) end++;
}
if( end - m_data == sz ) break;
txt = end;
} }
} }
} }
@ -1093,6 +1107,7 @@ void SourceView::RenderSymbolView( const Worker& worker, View& view )
ParseSource( file, worker, view ); ParseSource( file, worker, view );
m_targetLine = line; m_targetLine = line;
SelectLine( line, &worker, true ); SelectLine( line, &worker, true );
SelectViewMode();
} }
ImGui::PopID(); ImGui::PopID();
ImGui::NextColumn(); ImGui::NextColumn();
@ -2552,7 +2567,7 @@ void SourceView::RenderAsmLine( AsmLine& line, uint32_t ipcnt, uint32_t iptotal,
ParseSource( fileName, worker, view ); ParseSource( fileName, worker, view );
m_targetLine = srcline; m_targetLine = srcline;
SelectLine( srcline, &worker, false ); SelectLine( srcline, &worker, false );
m_displayMode = DisplayMixed; SelectViewMode();
} }
else else
{ {

View File

@ -145,6 +145,8 @@ private:
void ParseSource( const char* fileName, const Worker& worker, const View& view ); void ParseSource( const char* fileName, const Worker& worker, const View& view );
bool Disassemble( uint64_t symAddr, const Worker& worker ); bool Disassemble( uint64_t symAddr, const Worker& worker );
void SelectViewMode();
void RenderSimpleSourceView(); void RenderSimpleSourceView();
void RenderSymbolView( const Worker& worker, View& view ); void RenderSymbolView( const Worker& worker, View& view );