[lldb] Support comparing FileSpec against Python strings (#190690)

We got a bug report where someone was iterating over the modules and
wanted to verify that the module name was empty and noticed it didn't
trigger.

```
for module in target.module_iter():
  if module.file is None or module.file == "":
    # Do something
```

My initial hypothesis was that we were somehow skipping modules, but
upon further investigation, it was the string comparison that was the
culprit. The reporter (reasonably) expected the `file` property to
return a string, but in reality it returns a SBFileSpec.

This could be avoided by explicitly comparing with an empty FileSpec,
but that seems needlessly tedious.

```
for module in target.module_iter():
  if module.file is None or module.file == lldb.SBFileSpec(""):
    # Do something
```

Instead, add support for comparing a SBFileSpec against a string.

rdar://174166420
This commit is contained in:
Jonas Devlieghere
2026-04-07 09:28:11 -07:00
committed by GitHub
parent 894fb64bc1
commit cf784ac314
2 changed files with 46 additions and 0 deletions

View File

@@ -6,8 +6,19 @@ STRING_EXTENSION_OUTSIDE(SBFileSpec)
# operator== is a free function, which swig does not handle, so we inject # operator== is a free function, which swig does not handle, so we inject
# our own equality operator here # our own equality operator here
def __eq__(self, other): def __eq__(self, other):
if isinstance(other, str):
other = SBFileSpec(other)
if not isinstance(other, SBFileSpec):
return NotImplemented
return not self.__ne__(other) return not self.__ne__(other)
def __ne__(self, other):
if isinstance(other, str):
other = SBFileSpec(other)
if not isinstance(other, SBFileSpec):
return NotImplemented
return _lldb.SBFileSpec___ne__(self, other)
fullpath = property(str, None, doc='''A read only property that returns the fullpath as a python string.''') fullpath = property(str, None, doc='''A read only property that returns the fullpath as a python string.''')
basename = property(GetFilename, None, doc='''A read only property that returns the path basename as a python string.''') basename = property(GetFilename, None, doc='''A read only property that returns the path basename as a python string.''')
dirname = property(GetDirectory, None, doc='''A read only property that returns the path directory name as a python string.''') dirname = property(GetDirectory, None, doc='''A read only property that returns the path directory name as a python string.''')

View File

@@ -0,0 +1,35 @@
"""
Test SBFileSpec APIs, with emphasis on equality comparisons against strings.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
class FileSpecAPITestCase(TestBase):
NO_DEBUG_INFO_TESTCASE = True
def test_filespec_eq(self):
"""Test SBFileSpec equality comparisons."""
empty = lldb.SBFileSpec()
self.assertTrue(empty == lldb.SBFileSpec())
self.assertTrue(empty == "")
self.assertTrue(empty == lldb.SBFileSpec(""))
self.assertFalse(empty != "")
self.assertTrue(not empty)
self.assertFalse(empty is None)
def test_filespec_eq_path(self):
"""Test SBFileSpec equality with non-empty path strings."""
spec = lldb.SBFileSpec("/a/b")
self.assertTrue(spec == "/a/b")
self.assertFalse(spec == "/a/c")
self.assertFalse(spec != "/a/b")
self.assertTrue(spec != "/a/c")
def test_filespec_eq_other_type(self):
"""Test SBFileSpec equality with unsupported types returns False."""
spec = lldb.SBFileSpec()
self.assertFalse(spec == 42)
self.assertFalse(spec == [])