diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-30 17:30:35 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-30 17:30:35 +0200 |
| commit | 58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a (patch) | |
| tree | 87527422732ec9dc022fcd4f0e21b4b36d3f4470 /libs/kstd/gdb/result.py | |
| parent | 3e87bb1da9e4980286d0d44b29f22a5dc8bb33d5 (diff) | |
| download | kernel-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.py | 51 |
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 |
