[Lldb-commits] [lldb] [lldb] Fix SBMemoryRegionInfoListExtensions iter to yield unique refe… (PR #144815)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Jun 18 17:28:13 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Zyn (zyn-li)
<details>
<summary>Changes</summary>
The `__iter__` method in `SBMemoryRegionInfoListExtensions` reused the same `SBMemoryRegionInfo` object reference across all iterations, only updating its content in each loop. This caused all yielded objects to be references to the same instance.
Moved the object creation inside the loop to ensure each iteration yields a unique instance:
### Testing
Updated the existing test in `**TestFindInMemory.py**` to:
1. **Iterator vs Index Access Comparison**: Collects regions via iteration and compares their data with regions accessed by index to ensure they match
2. **Data Integrity Verification**: Confirms that different regions have different base addresses (would fail before the fix since all collected regions had the same data)
The test validates both that the iterator works correctly and that each yielded object contains the correct data for its respective memory region.
---
Full diff: https://github.com/llvm/llvm-project/pull/144815.diff
2 Files Affected:
- (modified) lldb/bindings/interface/SBMemoryRegionInfoListExtensions.i (+1-1)
- (modified) lldb/test/API/python_api/find_in_memory/TestFindInMemory.py (+21-3)
``````````diff
diff --git a/lldb/bindings/interface/SBMemoryRegionInfoListExtensions.i b/lldb/bindings/interface/SBMemoryRegionInfoListExtensions.i
index 29c0179c0ffe3..f565f45880119 100644
--- a/lldb/bindings/interface/SBMemoryRegionInfoListExtensions.i
+++ b/lldb/bindings/interface/SBMemoryRegionInfoListExtensions.i
@@ -9,8 +9,8 @@
'''Iterate over all the memory regions in a lldb.SBMemoryRegionInfoList object.'''
import lldb
size = self.GetSize()
- region = lldb.SBMemoryRegionInfo()
for i in range(size):
+ region = lldb.SBMemoryRegionInfo()
self.GetMemoryRegionAtIndex(i, region)
yield region
%}
diff --git a/lldb/test/API/python_api/find_in_memory/TestFindInMemory.py b/lldb/test/API/python_api/find_in_memory/TestFindInMemory.py
index 1ef37d2ec9898..4eabbb6e46774 100644
--- a/lldb/test/API/python_api/find_in_memory/TestFindInMemory.py
+++ b/lldb/test/API/python_api/find_in_memory/TestFindInMemory.py
@@ -154,14 +154,32 @@ def test_find_in_memory_unaligned(self):
self.assertEqual(addr, lldb.LLDB_INVALID_ADDRESS)
def test_memory_info_list_iterable(self):
- """Make sure the SBMemoryRegionInfoList is iterable"""
+ """Make sure the SBMemoryRegionInfoList is iterable and each yielded object is unique"""
self.assertTrue(self.process, PROCESS_IS_VALID)
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
info_list = self.process.GetMemoryRegions()
self.assertTrue(info_list.GetSize() > 0)
+
+ collected_info = []
try:
- for info in info_list:
- pass
+ for region in info_list:
+ collected_info.append(region)
except Exception:
self.fail("SBMemoryRegionInfoList is not iterable")
+
+ self.assertTrue(len(collected_info) >= 2, "Need at least 2 items")
+ self.assertEqual(len(collected_info), info_list.GetSize(), "Should have collected all items")
+
+ for i in range(len(collected_info)):
+ region = lldb.SBMemoryRegionInfo()
+ info_list.GetMemoryRegionAtIndex(i, region)
+
+ self.assertEqual(collected_info[i].GetRegionBase(), region.GetRegionBase(),
+ f"items {i}: iterator data should match index access data")
+ self.assertEqual(collected_info[i].GetRegionEnd(), region.GetRegionEnd(),
+ f"items {i}: iterator data should match index access data")
+
+ if len(collected_info) >= 2:
+ self.assertNotEqual(collected_info[0].GetRegionBase(), collected_info[1].GetRegionBase(),
+ "Different items should have different base addresses")
``````````
</details>
https://github.com/llvm/llvm-project/pull/144815
More information about the lldb-commits
mailing list