From 6ac1537d07dffa3482bbccf710a77a7316191c2e Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 May 2026 12:09:27 +0200 Subject: debug: use gdb.ValuePrinter base class --- libs/kstd/gdb/smart_pointers.py | 27 ++++++++++++++------------- libs/kstd/gdb/string.py | 2 +- libs/kstd/gdb/units.py | 0 libs/kstd/gdb/vector.py | 25 ++++++++++++++++--------- 4 files changed, 31 insertions(+), 23 deletions(-) create mode 100644 libs/kstd/gdb/units.py (limited to 'libs') diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index 0c14c77..b94d466 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -1,34 +1,34 @@ import gdb -from teachos import TeachOSBasePrinter -class KstdUniquePtrPrinter(TeachOSBasePrinter): +class KstdUniquePtrPrinter(gdb.ValuePrinter): def __init__(self, val): - super().__init__(val) + self.__val = val self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.value["pointer"] + pointer = self.__val["pointer"] if int(pointer) == 0: return f"kstd::unique_ptr<{self.__type}> (empty)" return f"kstd::unique_ptr<{self.__type}>" def children(self): - pointer = self.value["pointer"] + pointer = self.__val["pointer"] if int(pointer) != 0: yield ("get()", pointer.dereference()) - yield from super().children() + def display_hint(self): + return None -class KstdSharedPtrPrinter(TeachOSBasePrinter): +class KstdSharedPtrPrinter(gdb.ValuePrinter): def __init__(self, val): - super().__init__(val) + self.__val = val self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.value["pointer"] - control_block = self.value["control"] + pointer = self.__val["pointer"] + control_block = self.__val["control"] if int(pointer) == 0 or int(control_block) == 0: return f"shared_ptr<{self.__type}> (empty)" @@ -41,10 +41,11 @@ class KstdSharedPtrPrinter(TeachOSBasePrinter): ) def children(self): - pointer = self.value["pointer"] - control_block = self.value["control"] + pointer = self.__val["pointer"] + control_block = self.__val["control"] if int(pointer) != 0: yield ("get()", pointer.dereference()) - yield from super().children() + def display_hint(self): + return None diff --git a/libs/kstd/gdb/string.py b/libs/kstd/gdb/string.py index 2688061..73c22d6 100644 --- a/libs/kstd/gdb/string.py +++ b/libs/kstd/gdb/string.py @@ -1,7 +1,7 @@ import gdb -class KstdStringPrinter: +class KstdStringPrinter(gdb.ValuePrinter): def __init__(self, val): self.__val = val diff --git a/libs/kstd/gdb/units.py b/libs/kstd/gdb/units.py new file mode 100644 index 0000000..e69de29 diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py index b3604de..69f8ca2 100644 --- a/libs/kstd/gdb/vector.py +++ b/libs/kstd/gdb/vector.py @@ -1,21 +1,28 @@ import gdb -from teachos import TeachOSBasePrinter -class KstdVectorPrinter(TeachOSBasePrinter): +class KstdVectorPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__size = int(val["m_size"]) + self.__capacity = int(val["m_capacity"]) + def to_string(self): - size = int(self.value["m_size"]) - capacity = int(self.value["m_capacity"]) - return f"vector of length {size}, capacity {capacity}" + return f"vector of length {self.__size}, capacity {self.__capacity}" def children(self): - size = int(self.value["m_size"]) - data_pointer = self.value["m_data"] - for i in range(size): + data_pointer = self.__val["m_data"] + for i in range(self.__size): yield (f"[{i}]", (data_pointer + i).dereference()) + def child(self, n): + if n < self.__size: + return (f"[{n}]", (self.__val["m_data"] + n).dereference()) + else: + raise gdb.MemoryError("Index out of range") + def display_hint(self): return "array" def num_children(self): - return int(self.value["m_size"]) + return self.__size -- cgit v1.2.3