aboutsummaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-08-30 17:46:56 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-08-30 17:46:56 +0200
commitf27132d968df8fd59748b024ba549b5cd3f980ca (patch)
tree64b11885585176adf02993660ecd48eaae2d53b5 /libs
parent58fe72ab83ab6490b9a09e71f5762f2a12bd2c5a (diff)
downloadkernel-f27132d968df8fd59748b024ba549b5cd3f980ca.tar.xz
kernel-f27132d968df8fd59748b024ba549b5cd3f980ca.zip
kstd/gdb: add flat_map printer
Diffstat (limited to 'libs')
-rw-r--r--libs/kstd/gdb/__init__.py2
-rw-r--r--libs/kstd/gdb/flat_map.py50
2 files changed, 52 insertions, 0 deletions
diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py
index 018b31f2..a4aee9cd 100644
--- a/libs/kstd/gdb/__init__.py
+++ b/libs/kstd/gdb/__init__.py
@@ -1,6 +1,7 @@
import gdb.printing
+from .flat_map import KstdFlatMapPrinter
from .error_code import KstdErrorCodePrinter
from .result import KstdResultPrinter
from .smart_pointers import (
@@ -17,6 +18,7 @@ from .vector import KstdVectorPrinter
def build_pretty_printers():
pp = gdb.printing.RegexpCollectionPrettyPrinter("kstd")
pp.add_printer("vector", "^kstd::vector<.*>$", KstdVectorPrinter)
+ pp.add_printer("flat_map", "^kstd::flat_map<.*>$", KstdFlatMapPrinter)
pp.add_printer("string", "^kstd::basic_string<.*>$", KstdStringPrinter)
pp.add_printer("unique_ptr", "^kstd::unique_ptr<.*>$", KstdUniquePtrPrinter)
pp.add_printer("shared_ptr", "^kstd::shared_ptr<.*>$", KstdSharedPtrPrinter)
diff --git a/libs/kstd/gdb/flat_map.py b/libs/kstd/gdb/flat_map.py
new file mode 100644
index 00000000..f5f37cb5
--- /dev/null
+++ b/libs/kstd/gdb/flat_map.py
@@ -0,0 +1,50 @@
+import gdb
+
+
+class KstdFlatMapPrinter(gdb.ValuePrinter):
+ class _Iterator:
+ def __init__(self, keys_ptr, vals_ptr, size):
+ self._keys = keys_ptr
+ self._vals = vals_ptr
+ self._size = size
+ self._count = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ index = self._count // 2
+ if index >= self._size:
+ raise StopIteration
+
+ if self._count % 2 == 0:
+ item = (self._keys + index).dereference()
+ else:
+ item = (self._vals + index).dereference()
+
+ result = (f"[{self._count}]", item)
+ self._count += 1
+ return result
+
+ def __init__(self, val):
+ self.__val = val
+ containers = val["m_containers"]
+ keys_vector = containers["keys"]
+ vals_vector = containers["values"]
+ self.__size = int(keys_vector["m_size"])
+ self.__keys_ptr = keys_vector["m_data"]
+ self.__vals_ptr = vals_vector["m_data"]
+ self.__key_type = val.type.template_argument(0)
+ self.__val_type = val.type.template_argument(1)
+
+ def to_string(self):
+ return f"flat_map<{self.__key_type}, {self.__val_type}> with {self.__size} entries"
+
+ def children(self):
+ return self._Iterator(self.__keys_ptr, self.__vals_ptr, self.__size)
+
+ def display_hint(self):
+ return "map"
+
+ def num_children(self):
+ return self.__size * 2