[llvm-branch-commits] [lldb] [lldb] Raise error if in-place operators can't modify lldb.value (PR #214298)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Aug 6 06:19:17 PDT 2026


https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/214298

>From 75b72b845c4bef1831d6afa277f5bdda28f2f64e Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Wed, 5 Aug 2026 19:43:25 +0200
Subject: [PATCH] [lldb] Raise error if in-place operators can't modify
 lldb.value

---
 lldb/bindings/python/python-extensions.swig   | 35 +++++++++++--------
 .../value/value_wrap/TestValueAPIWrapper.py   | 12 +++----
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/lldb/bindings/python/python-extensions.swig b/lldb/bindings/python/python-extensions.swig
index 80e7e23e0c13c..1b2f8a500a234 100644
--- a/lldb/bindings/python/python-extensions.swig
+++ b/lldb/bindings/python/python-extensions.swig
@@ -454,74 +454,81 @@ class value(object):
     def __truediv__(self, other):
         return int(self) / int(other)
 
+    def _set_value(self, val):
+        if not isinstance(val, str):
+            val = str(val)
+        err = SBError()
+        if not self.sbvalue.SetValueFromCString(val, err):
+            raise ValueError(f"Failed to set value: {err.GetCString()}")
+
     def __iadd__(self, other):
         result = self.__add__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __isub__(self, other):
         result = self.__sub__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __imul__(self, other):
         result = self.__mul__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __idiv__(self, other):
         result = self.__div__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __itruediv__(self, other):
         result = self.__truediv__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ifloordiv__(self, other):
         result =  self.__floordiv__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __imod__(self, other):
         result =  self.__mod__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ipow__(self, other):
         result = self.__pow__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ipow__(self, other, modulo=None):
         result = self.__pow__(other, modulo)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ilshift__(self, other):
         result = self.__lshift__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __irshift__(self, other):
         result =  self.__rshift__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __iand__(self, other):
         result =  self.__and__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ixor__(self, other):
         result =  self.__xor__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __ior__(self, other):
         result =  self.__or__(other)
-        self.sbvalue.SetValueFromCString (str(result))
+        self._set_value(result)
         return result
 
     def __neg__(self):
diff --git a/lldb/test/API/python_api/value/value_wrap/TestValueAPIWrapper.py b/lldb/test/API/python_api/value/value_wrap/TestValueAPIWrapper.py
index d515b61924ab0..14df2e3937a89 100644
--- a/lldb/test/API/python_api/value/value_wrap/TestValueAPIWrapper.py
+++ b/lldb/test/API/python_api/value/value_wrap/TestValueAPIWrapper.py
@@ -226,13 +226,13 @@ def test_in_place_modifiers(self):
         self.assertEqual(kind, 6)
 
         # Test __itruediv__(other).
-        kind /= 2
-        self.assertEqual(kind, 3)
-        self.assertIsInstance(kind, float)
-        kind = engine.kind
-        # Keeps its value, because we try to set "3.0".
-        # FIXME: Raise error here.
+        with self.assertRaisesRegex(
+            ValueError,
+            r"^Failed to set value: '3\.0' is not a valid integer string value$",
+        ):
+            kind /= 2
         self.assertEqual(kind, 6)
+        self.assertIsInstance(kind, lldb.value)
 
         # Test __ifloordiv__(other).
         kind //= 5



More information about the llvm-branch-commits mailing list