blob: ee8404c6b85609e2cb2b7ed91df8f77deef26baa [file] [log] [blame] [edit]
"""
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())