diff options
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 |
