diff options
| author | Mingming Liu <mingmingl@google.com> | 2025-09-10 15:25:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-10 15:25:31 -0700 |
| commit | 1417dafa1db9cb1b2b09438aa9f53ea5ab6e36e2 (patch) | |
| tree | 57f4b1f313c8cf74eed8819870f39c36ea263c68 /lldb/bindings/interface | |
| parent | 898b813bc8a6d0276bf0f4769f5f2f64b34e632d (diff) | |
| parent | b8cefcb601ddaa18482555c4ff363c01a270c2fe (diff) | |
Merge branch 'main' into users/mingmingl-llvm/samplefdo-profile-formatusers/mingmingl-llvm/samplefdo-profile-format
Diffstat (limited to 'lldb/bindings/interface')
| -rw-r--r-- | lldb/bindings/interface/SBProgressDocstrings.i | 3 | ||||
| -rw-r--r-- | lldb/bindings/interface/SBStructuredDataExtensions.i | 111 |
2 files changed, 109 insertions, 5 deletions
diff --git a/lldb/bindings/interface/SBProgressDocstrings.i b/lldb/bindings/interface/SBProgressDocstrings.i index 4c001d7d5ebc..218d0c973cc4 100644 --- a/lldb/bindings/interface/SBProgressDocstrings.i +++ b/lldb/bindings/interface/SBProgressDocstrings.i @@ -57,8 +57,9 @@ Additionally for Python, progress is supported in a with statement. :: with lldb.SBProgress('Non deterministic progress', 'Detail', lldb.SBDebugger) as progress: for i in range(10): progress.Increment(1) - # The progress object is automatically finalized when the with statement + ... +The progress object is automatically finalized on the exit of the with block. ") lldb::SBProgress; %feature("docstring", diff --git a/lldb/bindings/interface/SBStructuredDataExtensions.i b/lldb/bindings/interface/SBStructuredDataExtensions.i index ca3d0966f9fc..af76cfc5c2db 100644 --- a/lldb/bindings/interface/SBStructuredDataExtensions.i +++ b/lldb/bindings/interface/SBStructuredDataExtensions.i @@ -3,16 +3,119 @@ STRING_EXTENSION_OUTSIDE(SBStructuredData) %extend lldb::SBStructuredData { #ifdef SWIGPYTHON %pythoncode%{ - def __int__(self): - return self.GetSignedInteger() - def __len__(self): '''Return the number of element in a lldb.SBStructuredData object.''' return self.GetSize() def __iter__(self): '''Iterate over all the elements in a lldb.SBStructuredData object.''' - return lldb_iter(self, 'GetSize', 'GetItemAtIndex') + data_type = self.GetType() + if data_type == eStructuredDataTypeArray: + for i in range(self.GetSize()): + yield self.GetItemAtIndex(i).dynamic + return + elif data_type == eStructuredDataTypeDictionary: + keys = SBStringList() + self.GetKeys(keys) + return iter(keys) + else: + raise TypeError(f"cannot iterate {self.type_name(data_type)} type") + + def __getitem__(self, key): + data_type = self.GetType() + if data_type == eStructuredDataTypeArray: + if not isinstance(key, int): + raise TypeError("subscript index must be an integer") + count = len(self) + if -count <= key < count: + key %= count + return self.GetItemAtIndex(key).dynamic + raise IndexError("index out of range") + elif data_type == eStructuredDataTypeDictionary: + if not isinstance(key, str): + raise TypeError("subscript key must be a string") + return self.GetValueForKey(key).dynamic + else: + raise TypeError(f"cannot subscript {self.type_name(data_type)} type") + + def __str__(self): + data_type = self.GetType() + if data_type in ( + eStructuredDataTypeString, + eStructuredDataTypeInteger, + eStructuredDataTypeSignedInteger, + eStructuredDataTypeFloat, + ): + return str(self.dynamic) + else: + return repr(self) + + def __int__(self): + data_type = self.GetType() + if data_type in ( + eStructuredDataTypeInteger, + eStructuredDataTypeSignedInteger, + ): + return self.dynamic + else: + raise TypeError(f"cannot convert {self.type_name(data_type)} to int") + + def __float__(self): + data_type = self.GetType() + if data_type in ( + eStructuredDataTypeFloat, + eStructuredDataTypeInteger, + eStructuredDataTypeSignedInteger, + ): + return float(self.dynamic) + else: + raise TypeError(f"cannot convert {self.type_name(data_type)} to float") + + @property + def dynamic(self): + data_type = self.GetType() + if data_type == eStructuredDataTypeNull: + return None + elif data_type == eStructuredDataTypeBoolean: + return self.GetBooleanValue() + elif data_type == eStructuredDataTypeInteger: + return self.GetUnsignedIntegerValue() + elif data_type == eStructuredDataTypeSignedInteger: + return self.GetSignedIntegerValue() + elif data_type == eStructuredDataTypeFloat: + return self.GetFloatValue() + elif data_type == eStructuredDataTypeString: + size = len(self) or 1023 + return self.GetStringValue(size + 1) + elif data_type == eStructuredDataTypeGeneric: + return self.GetGenericValue() + else: + return self + + @staticmethod + def type_name(t): + if t == eStructuredDataTypeNull: + return "null" + elif t == eStructuredDataTypeBoolean: + return "boolean" + elif t == eStructuredDataTypeInteger: + return "integer" + elif t == eStructuredDataTypeSignedInteger: + return "integer" + elif t == eStructuredDataTypeFloat: + return "float" + elif t == eStructuredDataTypeString: + return "string" + elif t == eStructuredDataTypeArray: + return "array" + elif t == eStructuredDataTypeDictionary: + return "dictionary" + elif t == eStructuredDataTypeGeneric: + return "generic" + elif t == eStructuredDataTypeInvalid: + return "invalid" + else: + raise TypeError(f"unknown structured data type: {t}") %} #endif } |
