""" Test SBLineEntry APIs, particularly synthetic line entries. """ import os import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class SBLineEntryTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True def test_synthetic_line_entry(self): """Test that synthetic LineEntry objects (created via SBAPI) can be valid without a valid address range and can be set in SBSymbolContext.""" # Test creating a synthetic line entry via SBAPI. line_entry = lldb.SBLineEntry() self.assertFalse( line_entry.IsValid(), "Default constructed line entry should be invalid" ) # Set line number - this should mark the line entry as synthetic. line_entry.SetLine(42) self.assertTrue( line_entry.IsValid(), "Line entry should be valid after setting line, even without address", ) self.assertEqual(line_entry.GetLine(), 42) # Set file and column. file_spec = lldb.SBFileSpec(os.path.join(self.getSourceDir(), "test.cpp"), True) line_entry.SetFileSpec(file_spec) line_entry.SetColumn(10) self.assertEqual(line_entry.GetColumn(), 10) self.assertEqual(line_entry.GetFileSpec().GetFilename(), "test.cpp") # Verify address range is still invalid (synthetic). start_addr = line_entry.GetStartAddress() self.assertFalse( start_addr.IsValid(), "Synthetic line entry should not have valid address" ) # Test setting synthetic line entry in symbol context. sym_ctx = lldb.SBSymbolContext() sym_ctx.SetLineEntry(line_entry) retrieved_line_entry = sym_ctx.GetLineEntry() self.assertTrue( retrieved_line_entry.IsValid(), "Retrieved line entry should be valid" ) self.assertEqual(retrieved_line_entry.GetLine(), 42) self.assertEqual(retrieved_line_entry.GetColumn(), 10) self.assertEqual(retrieved_line_entry.GetFileSpec().GetFilename(), "test.cpp") def test_line_entry_validity_without_address(self): """Test that line entries created via SBAPI are valid without addresses.""" line_entry = lldb.SBLineEntry() # Initially invalid. self.assertFalse(line_entry.IsValid()) # Still invalid with just a file spec. file_spec = lldb.SBFileSpec("foo.cpp", True) line_entry.SetFileSpec(file_spec) self.assertFalse( line_entry.IsValid(), "Line entry should be invalid without line number" ) # Valid once line number is set (marks as synthetic). line_entry.SetLine(100) self.assertTrue( line_entry.IsValid(), "Line entry should be valid with line number set" ) # Verify no valid address range. self.assertFalse(line_entry.GetStartAddress().IsValid()) self.assertFalse(line_entry.GetEndAddress().IsValid()) def test_line_entry_column(self): """Test setting and getting column information on synthetic line entries.""" line_entry = lldb.SBLineEntry() line_entry.SetLine(50) # Default column should be 0. self.assertEqual(line_entry.GetColumn(), 0) # Set column. line_entry.SetColumn(25) self.assertEqual(line_entry.GetColumn(), 25) # Verify line entry is still valid. self.assertTrue(line_entry.IsValid()) def test_non_synthetic_line_entry_requires_line_number(self): """Test that non-synthetic line entries with addresses still require a line number to be valid.""" # A line entry is always invalid without a line number, regardless of whether it has an address. line_entry = lldb.SBLineEntry() self.assertFalse( line_entry.IsValid(), "Line entry should be invalid without line number" ) # Even with a file spec, it's still invalid. file_spec = lldb.SBFileSpec("test.cpp", True) line_entry.SetFileSpec(file_spec) self.assertFalse( line_entry.IsValid(), "Line entry should be invalid without line number" ) # Only after setting a line number does it become valid. line_entry.SetLine(42) self.assertTrue( line_entry.IsValid(), "Line entry should be valid with line number" ) def test_symbol_context_with_synthetic_line_entry(self): """Test that SBSymbolContext correctly stores and retrieves synthetic line entries.""" # Create a synthetic line entry. line_entry = lldb.SBLineEntry() line_entry.SetLine(123) line_entry.SetColumn(45) file_spec = lldb.SBFileSpec("source.cpp", True) line_entry.SetFileSpec(file_spec) # Create symbol context and set line entry. sym_ctx = lldb.SBSymbolContext() sym_ctx.SetLineEntry(line_entry) # Retrieve and verify. retrieved = sym_ctx.GetLineEntry() self.assertTrue(retrieved.IsValid()) self.assertEqual(retrieved.GetLine(), 123) self.assertEqual(retrieved.GetColumn(), 45) self.assertEqual(retrieved.GetFileSpec().GetFilename(), "source.cpp") # Verify it's still synthetic (no valid address). self.assertFalse(retrieved.GetStartAddress().IsValid())