summaryrefslogtreecommitdiff
path: root/lldb/bindings
diff options
context:
space:
mode:
authorDave Lee <davelee.com@gmail.com>2023-02-03 08:45:44 -0800
committerDave Lee <davelee.com@gmail.com>2023-02-08 10:46:26 -0800
commit3ff636729d067801039b3a37618f6ce0dd1c3d24 (patch)
tree22a48d087319e4571c4bfa4594d0b3600619c46c /lldb/bindings
parent5d07e0448e38d4be0cc7b1079d72b5e3644e941c (diff)
downloadllvm-3ff636729d067801039b3a37618f6ce0dd1c3d24.tar.gz
[lldb] Accept negative indexes in __getitem__
To the Python bindings, add support for Python-like negative indexes. While was using `script`, I tried to access a thread's bottom frame with `thread.frame[-1]`, but that failed. This change updates the `__getitem__` implementations to support negative indexes as one would expect in Python. Differential Revision: https://reviews.llvm.org/D143282
Diffstat (limited to 'lldb/bindings')
-rw-r--r--lldb/bindings/interface/SBBreakpoint.i7
-rw-r--r--lldb/bindings/interface/SBInstructionList.i4
-rw-r--r--lldb/bindings/interface/SBModule.i9
-rw-r--r--lldb/bindings/interface/SBProcess.i7
-rw-r--r--lldb/bindings/interface/SBSymbolContextList.i5
-rw-r--r--lldb/bindings/interface/SBTarget.i3
-rw-r--r--lldb/bindings/interface/SBThread.i7
-rw-r--r--lldb/bindings/interface/SBTypeCategory.i3
-rw-r--r--lldb/bindings/interface/SBTypeEnumMember.i3
-rw-r--r--lldb/bindings/interface/SBValue.i7
-rw-r--r--lldb/bindings/interface/SBValueList.i3
11 files changed, 40 insertions, 18 deletions
diff --git a/lldb/bindings/interface/SBBreakpoint.i b/lldb/bindings/interface/SBBreakpoint.i
index a7048309edd9..a61874d8ebd8 100644
--- a/lldb/bindings/interface/SBBreakpoint.i
+++ b/lldb/bindings/interface/SBBreakpoint.i
@@ -273,8 +273,11 @@ public:
return 0
def __getitem__(self, key):
- if type(key) is int and key < len(self):
- return self.sbbreakpoint.GetLocationAtIndex(key)
+ if isinstance(key, int):
+ count = len(self)
+ if -count <= key < count:
+ key %= count
+ return self.sbbreakpoint.GetLocationAtIndex(key)
return None
def get_locations_access_object(self):
diff --git a/lldb/bindings/interface/SBInstructionList.i b/lldb/bindings/interface/SBInstructionList.i
index b51c0374c3ad..e80452e3bed5 100644
--- a/lldb/bindings/interface/SBInstructionList.i
+++ b/lldb/bindings/interface/SBInstructionList.i
@@ -83,7 +83,9 @@ public:
'''Access instructions by integer index for array access or by lldb.SBAddress to find an instruction that matches a section offset address object.'''
if type(key) is int:
# Find an instruction by index
- if key < len(self):
+ count = len(self)
+ if -count <= key < count:
+ key %= count
return self.GetInstructionAtIndex(key)
elif type(key) is SBAddress:
# Find an instruction using a lldb.SBAddress object
diff --git a/lldb/bindings/interface/SBModule.i b/lldb/bindings/interface/SBModule.i
index de476f706261..f181d96a55f9 100644
--- a/lldb/bindings/interface/SBModule.i
+++ b/lldb/bindings/interface/SBModule.i
@@ -415,7 +415,8 @@ public:
def __getitem__(self, key):
count = len(self)
if type(key) is int:
- if key < count:
+ if -count <= key < count:
+ key %= count
return self.sbmodule.GetSymbolAtIndex(key)
elif type(key) is str:
matches = []
@@ -476,7 +477,8 @@ public:
def __getitem__(self, key):
count = len(self)
if type(key) is int:
- if key < count:
+ if -count <= key < count:
+ key %= count
return self.sbmodule.GetSectionAtIndex(key)
elif type(key) is str:
for idx in range(count):
@@ -511,7 +513,8 @@ public:
def __getitem__(self, key):
count = len(self)
if type(key) is int:
- if key < count:
+ if -count <= key < count:
+ key %= count
return self.sbmodule.GetCompileUnitAtIndex(key)
elif type(key) is str:
is_full_path = key[0] == '/'
diff --git a/lldb/bindings/interface/SBProcess.i b/lldb/bindings/interface/SBProcess.i
index 0ef558459e84..01da4274ed20 100644
--- a/lldb/bindings/interface/SBProcess.i
+++ b/lldb/bindings/interface/SBProcess.i
@@ -487,8 +487,11 @@ public:
return 0
def __getitem__(self, key):
- if type(key) is int and key < len(self):
- return self.sbprocess.GetThreadAtIndex(key)
+ if isinstance(key, int):
+ count = len(self)
+ if -count <= key < count:
+ key %= count
+ return self.sbprocess.GetThreadAtIndex(key)
return None
def get_threads_access_object(self):
diff --git a/lldb/bindings/interface/SBSymbolContextList.i b/lldb/bindings/interface/SBSymbolContextList.i
index 14566b3e3720..7bbeed72cf8d 100644
--- a/lldb/bindings/interface/SBSymbolContextList.i
+++ b/lldb/bindings/interface/SBSymbolContextList.i
@@ -74,8 +74,9 @@ public:
def __getitem__(self, key):
count = len(self)
- if type(key) is int:
- if key < count:
+ if isinstance(key, int):
+ if -count <= key < count:
+ key %= count
return self.GetContextAtIndex(key)
else:
raise IndexError
diff --git a/lldb/bindings/interface/SBTarget.i b/lldb/bindings/interface/SBTarget.i
index e887762b8313..6529f8f6aa1d 100644
--- a/lldb/bindings/interface/SBTarget.i
+++ b/lldb/bindings/interface/SBTarget.i
@@ -1001,7 +1001,8 @@ public:
def __getitem__(self, key):
num_modules = self.sbtarget.GetNumModules()
if type(key) is int:
- if key < num_modules:
+ if -num_modules <= key < num_modules:
+ key %= num_modules
return self.sbtarget.GetModuleAtIndex(key)
elif type(key) is str:
if key.find('/') == -1:
diff --git a/lldb/bindings/interface/SBThread.i b/lldb/bindings/interface/SBThread.i
index 1e46bd6e21f6..8317e17a299d 100644
--- a/lldb/bindings/interface/SBThread.i
+++ b/lldb/bindings/interface/SBThread.i
@@ -434,8 +434,11 @@ public:
return 0
def __getitem__(self, key):
- if type(key) is int and key < self.sbthread.GetNumFrames():
- return self.sbthread.GetFrameAtIndex(key)
+ if isinstance(key, int):
+ count = len(self)
+ if -count <= key < count:
+ key %= count
+ return self.sbthread.GetFrameAtIndex(key)
return None
def get_frames_access_object(self):
diff --git a/lldb/bindings/interface/SBTypeCategory.i b/lldb/bindings/interface/SBTypeCategory.i
index b762bf8a95a3..f8af390c24be 100644
--- a/lldb/bindings/interface/SBTypeCategory.i
+++ b/lldb/bindings/interface/SBTypeCategory.i
@@ -147,7 +147,8 @@ namespace lldb {
def __getitem__(self, key):
num_items = len(self)
if type(key) is int:
- if key < num_items:
+ if -num_items <= key < num_items:
+ key %= num_items
return self.get_at_index_function(self.sbcategory,key)
elif type(key) is str:
return self.get_by_name_function(self.sbcategory,SBTypeNameSpecifier(key))
diff --git a/lldb/bindings/interface/SBTypeEnumMember.i b/lldb/bindings/interface/SBTypeEnumMember.i
index b41901027245..986cb87531c1 100644
--- a/lldb/bindings/interface/SBTypeEnumMember.i
+++ b/lldb/bindings/interface/SBTypeEnumMember.i
@@ -121,7 +121,8 @@ public:
def __getitem__(self, key):
num_elements = self.GetSize()
if type(key) is int:
- if key < num_elements:
+ if -num_elements <= key < num_elements:
+ key %= num_elements
return self.GetTypeEnumMemberAtIndex(key)
elif type(key) is str:
for idx in range(num_elements):
diff --git a/lldb/bindings/interface/SBValue.i b/lldb/bindings/interface/SBValue.i
index bc66a4ae28f8..335667f97e9c 100644
--- a/lldb/bindings/interface/SBValue.i
+++ b/lldb/bindings/interface/SBValue.i
@@ -459,8 +459,11 @@ public:
return 0
def __getitem__(self, key):
- if type(key) is int and key < len(self):
- return self.sbvalue.GetChildAtIndex(key)
+ if isinstance(key, int):
+ count = len(self)
+ if -count <= key < count:
+ key %= count
+ return self.sbvalue.GetChildAtIndex(key)
return None
def get_child_access_object(self):
diff --git a/lldb/bindings/interface/SBValueList.i b/lldb/bindings/interface/SBValueList.i
index e03b5c649db9..4488b5d6fa90 100644
--- a/lldb/bindings/interface/SBValueList.i
+++ b/lldb/bindings/interface/SBValueList.i
@@ -146,7 +146,8 @@ public:
# Access with "int" to get Nth item in the list
#------------------------------------------------------------
if type(key) is int:
- if key < count:
+ if -count <= key < count:
+ key %= count
return self.GetValueAtIndex(key)
#------------------------------------------------------------
# Access with "str" to get values by name