aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/gdb/result.py
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-08-30 17:30:35 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-08-30 17:30:35 +0200
commit58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a (patch)
tree87527422732ec9dc022fcd4f0e21b4b36d3f4470 /libs/kstd/gdb/result.py
parent3e87bb1da9e4980286d0d44b29f22a5dc8bb33d5 (diff)
downloadkernel-58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a.tar.xz
kernel-58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a.zip
kstd/gdb: add error_code and result printers
Diffstat (limited to 'libs/kstd/gdb/result.py')
-rw-r--r--libs/kstd/gdb/result.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/libs/kstd/gdb/result.py b/libs/kstd/gdb/result.py
new file mode 100644
index 00000000..8cef0fed
--- /dev/null
+++ b/libs/kstd/gdb/result.py
@@ -0,0 +1,51 @@
+import gdb
+
+from .error_code import KstdErrorCodePrinter
+
+
+class KstdResultPrinter(gdb.ValuePrinter):
+ def __init__(self, val):
+ self.__val = val
+ self.__has_value = bool(val["_M_has_value"])
+ try:
+ t = val.type.template_argument(0)
+ self.__is_void = t.code == gdb.TYPE_CODE_VOID
+ except (gdb.error, AttributeError):
+ self.__is_void = False
+
+ @property
+ def _error_code(self):
+ return self.__val["_M_unex"]
+
+ @property
+ def _value(self):
+ return self.__val["_M_val"]
+
+ def _format_value(self, gdb_value):
+ printer = gdb.default_visualizer(gdb_value)
+ if printer is not None:
+ return printer.to_string()
+ s = str(gdb_value)
+ if s.startswith("{"):
+ return str(gdb_value.type.strip_typedefs())
+ return s
+
+ def _format_error(self, error_code_val):
+ printer = KstdErrorCodePrinter(error_code_val)
+ return printer.to_string()
+
+ def to_string(self):
+ if not self.__has_value:
+ return f"failure: {self._format_error(self._error_code)}"
+ if self.__is_void:
+ return "success"
+ return f"success: {self._format_value(self._value)}"
+
+ def children(self):
+ if not self.__has_value:
+ yield ("error", self._error_code)
+ elif not self.__is_void:
+ yield ("value", self._value)
+
+ def display_hint(self):
+ return None