From 1246e00478fb5ab2a357de17066fd8738395d9f1 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 4 May 2026 08:20:42 +0200 Subject: debug: split gdb modules --- libs/kstd/gdb/__init__.py | 20 +++++++++++++++++ libs/kstd/gdb/smart_pointers.py | 50 +++++++++++++++++++++++++++++++++++++++++ libs/kstd/gdb/std_types.py | 15 +++++++++++++ libs/kstd/gdb/string.py | 27 ++++++++++++++++++++++ libs/kstd/gdb/vector.py | 22 ++++++++++++++++++ 5 files changed, 134 insertions(+) create mode 100644 libs/kstd/gdb/__init__.py create mode 100644 libs/kstd/gdb/smart_pointers.py create mode 100644 libs/kstd/gdb/std_types.py create mode 100644 libs/kstd/gdb/string.py create mode 100644 libs/kstd/gdb/vector.py (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py new file mode 100644 index 0000000..fc5e8fb --- /dev/null +++ b/libs/kstd/gdb/__init__.py @@ -0,0 +1,20 @@ +import gdb.printing + +from .vector import KstdVectorPrinter +from .string import KstdStringPrinter +from .std_types import StdBytePrinter +from .smart_pointers import KstdUniquePtrPrinter, KstdSharedPtrPrinter + + +def build_pretty_printers(): + pp = gdb.printing.RegexpCollectionPrettyPrinter("kstd") + pp.add_printer("vector", "^kstd::vector<.*>$", KstdVectorPrinter) + pp.add_printer("string", "^kstd::string$", KstdStringPrinter) + pp.add_printer("std_byte", "^std::byte$", StdBytePrinter) + pp.add_printer("unique_ptr", "^kstd::unique_ptr<.*>$", KstdUniquePtrPrinter) + pp.add_printer("shared_ptr", "^kstd::shared_ptr<.*>$", KstdSharedPtrPrinter) + return pp + + +def register_printers(objfile): + gdb.printing.register_pretty_printer(objfile, build_pretty_printers(), replace=True) diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py new file mode 100644 index 0000000..6e4a4f9 --- /dev/null +++ b/libs/kstd/gdb/smart_pointers.py @@ -0,0 +1,50 @@ +import gdb + + +class KstdUniquePtrPrinter: + + def __init__(self, val): + self.val = val + self.type = val.type.template_argument(0) + + def to_string(self): + 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.val["pointer"] + if int(pointer) != 0: + yield ("get()", pointer) + yield ("*get()", pointer.dereference()) + + +class KstdSharedPtrPrinter: + + def __init__(self, val): + self.val = val + self.type = val.type.template_argument(0) + + def to_string(self): + pointer = self.val["pointer"] + control_block = self.val["control"] + + if int(pointer) == 0 or int(control_block) == 0: + return f"kstd::shared_ptr<{self.type}> (empty)" + + strong_refs = int(control_block["shared_count"]["_M_i"]) + weak_refs = int(control_block["weak_count"]["_M_i"]) + + return f"kstd::shared_ptr<{self.type}> (use_count={strong_refs}, weak_count={weak_refs})" + + def children(self): + pointer = self.val["pointer"] + control_block = self.val["control"] + + if int(pointer) != 0: + yield ("get()", pointer) + yield ("*get()", pointer.dereference()) + + if int(control_block) != 0: + yield ("[control_block]", control_block.dereference()) diff --git a/libs/kstd/gdb/std_types.py b/libs/kstd/gdb/std_types.py new file mode 100644 index 0000000..78d094c --- /dev/null +++ b/libs/kstd/gdb/std_types.py @@ -0,0 +1,15 @@ +import gdb + + +class StdBytePrinter: + + def __init__(self, val): + self.val = val + + def to_string(self): + try: + uint8_type = gdb.lookup_type("unsigned char") + numeric_value = int(self.val.cast(uint8_type)) + return f"{numeric_value:#04x}" + except gdb.error: + return f"" diff --git a/libs/kstd/gdb/string.py b/libs/kstd/gdb/string.py new file mode 100644 index 0000000..8230b21 --- /dev/null +++ b/libs/kstd/gdb/string.py @@ -0,0 +1,27 @@ +import gdb + + +class KstdStringPrinter: + + def __init__(self, val): + self.val = val + + def to_string(self): + storage = self.val["m_storage"] + storage_size = int(storage["m_size"]) + + if storage_size <= 0: + return '""' + + data_pointer = storage["m_data"] + string_length = storage_size - 1 + + try: + if hasattr(data_pointer, "lazy_string"): + return data_pointer.lazy_string(encoding="utf-8", length=string_length) + return data_pointer.string(encoding="utf-8", length=string_length) + except gdb.error: + return "" + + def display_hint(self): + return "string" diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py new file mode 100644 index 0000000..597ffdc --- /dev/null +++ b/libs/kstd/gdb/vector.py @@ -0,0 +1,22 @@ +import gdb + + +class KstdVectorPrinter: + + def __init__(self, val): + self.val = val + self.type = val.type.template_argument(0) + + def to_string(self): + size = int(self.val["m_size"]) + capacity = int(self.val["m_capacity"]) + return f"kstd::vector of length {size}, capacity {capacity}" + + def children(self): + size = int(self.val["m_size"]) + data_pointer = self.val["m_data"] + for i in range(size): + yield (f"[{i}]", (data_pointer + i).dereference()) + + def display_hint(self): + return "array" -- cgit v1.2.3 From 78e42a1b6e0a857865be1e60f82871ac13c91bb1 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 4 May 2026 12:01:01 +0200 Subject: debug: improve pretty printer implementations --- libs/kstd/gdb/smart_pointers.py | 43 +++++++++++++++++++++-------------------- libs/kstd/gdb/std_types.py | 8 +++----- libs/kstd/gdb/string.py | 4 ++-- libs/kstd/gdb/vector.py | 19 +++++++++--------- 4 files changed, 37 insertions(+), 37 deletions(-) (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index 6e4a4f9..3e5da02 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -1,50 +1,51 @@ import gdb +from teachos import TeachOSBasePrinter -class KstdUniquePtrPrinter: - +class KstdUniquePtrPrinter(TeachOSBasePrinter): def __init__(self, val): - self.val = val - self.type = val.type.template_argument(0) + super().__init__(val) + self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.val["pointer"] + pointer = self.value["pointer"] if int(pointer) == 0: - return f"kstd::unique_ptr<{self.type}> (empty)" - return f"kstd::unique_ptr<{self.type}>" + return f"kstd::unique_ptr<{self.__type}> (empty)" + return f"kstd::unique_ptr<{self.__type}>" def children(self): - pointer = self.val["pointer"] + pointer = self.value["pointer"] if int(pointer) != 0: - yield ("get()", pointer) - yield ("*get()", pointer.dereference()) + yield ("[object]", pointer.dereference()) + yield from super().children() -class KstdSharedPtrPrinter: +class KstdSharedPtrPrinter(TeachOSBasePrinter): def __init__(self, val): - self.val = val - self.type = val.type.template_argument(0) + super().__init__(val) + self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.val["pointer"] - control_block = self.val["control"] + pointer = self.value["pointer"] + control_block = self.value["control"] if int(pointer) == 0 or int(control_block) == 0: - return f"kstd::shared_ptr<{self.type}> (empty)" + return f"kstd::shared_ptr<{self.__type}> (empty)" strong_refs = int(control_block["shared_count"]["_M_i"]) weak_refs = int(control_block["weak_count"]["_M_i"]) - return f"kstd::shared_ptr<{self.type}> (use_count={strong_refs}, weak_count={weak_refs})" + return f"kstd::shared_ptr<{self.__type}> (use_count={strong_refs}, weak_count={weak_refs})" def children(self): - pointer = self.val["pointer"] - control_block = self.val["control"] + pointer = self.value["pointer"] + control_block = self.value["control"] if int(pointer) != 0: - yield ("get()", pointer) - yield ("*get()", pointer.dereference()) + yield ("[object]", pointer.dereference()) if int(control_block) != 0: yield ("[control_block]", control_block.dereference()) + + yield from super().children() diff --git a/libs/kstd/gdb/std_types.py b/libs/kstd/gdb/std_types.py index 78d094c..deb5c58 100644 --- a/libs/kstd/gdb/std_types.py +++ b/libs/kstd/gdb/std_types.py @@ -1,15 +1,13 @@ import gdb +from teachos import TeachOSBasePrinter -class StdBytePrinter: - - def __init__(self, val): - self.val = val +class StdBytePrinter(TeachOSBasePrinter): def to_string(self): try: uint8_type = gdb.lookup_type("unsigned char") - numeric_value = int(self.val.cast(uint8_type)) + numeric_value = int(self.value.cast(uint8_type)) return f"{numeric_value:#04x}" except gdb.error: return f"" diff --git a/libs/kstd/gdb/string.py b/libs/kstd/gdb/string.py index 8230b21..2688061 100644 --- a/libs/kstd/gdb/string.py +++ b/libs/kstd/gdb/string.py @@ -4,10 +4,10 @@ import gdb class KstdStringPrinter: def __init__(self, val): - self.val = val + self.__val = val def to_string(self): - storage = self.val["m_storage"] + storage = self.__val["m_storage"] storage_size = int(storage["m_size"]) if storage_size <= 0: diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py index 597ffdc..4340ef4 100644 --- a/libs/kstd/gdb/vector.py +++ b/libs/kstd/gdb/vector.py @@ -1,20 +1,21 @@ import gdb +from teachos import TeachOSBasePrinter -class KstdVectorPrinter: - +class KstdVectorPrinter(TeachOSBasePrinter): def __init__(self, val): - self.val = val - self.type = val.type.template_argument(0) + super().__init__(val) + self.__type = val.type.template_argument(0) def to_string(self): - size = int(self.val["m_size"]) - capacity = int(self.val["m_capacity"]) - return f"kstd::vector of length {size}, capacity {capacity}" + size = int(self.value["m_size"]) + capacity = int(self.value["m_capacity"]) + return f"kstd::vector<{self.__type}> (size={size}, capacity={capacity})" def children(self): - size = int(self.val["m_size"]) - data_pointer = self.val["m_data"] + yield from super().children() + size = int(self.value["m_size"]) + data_pointer = self.value["m_data"] for i in range(size): yield (f"[{i}]", (data_pointer + i).dereference()) -- cgit v1.2.3 From 0ea43527332b7e5f1cfec6007506aa54e8f628cb Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 May 2026 09:12:05 +0000 Subject: debug: enable libstdc++ helpers --- libs/kstd/gdb/__init__.py | 2 -- libs/kstd/gdb/std_types.py | 13 ------------- 2 files changed, 15 deletions(-) delete mode 100644 libs/kstd/gdb/std_types.py (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py index fc5e8fb..2d61539 100644 --- a/libs/kstd/gdb/__init__.py +++ b/libs/kstd/gdb/__init__.py @@ -2,7 +2,6 @@ import gdb.printing from .vector import KstdVectorPrinter from .string import KstdStringPrinter -from .std_types import StdBytePrinter from .smart_pointers import KstdUniquePtrPrinter, KstdSharedPtrPrinter @@ -10,7 +9,6 @@ def build_pretty_printers(): pp = gdb.printing.RegexpCollectionPrettyPrinter("kstd") pp.add_printer("vector", "^kstd::vector<.*>$", KstdVectorPrinter) pp.add_printer("string", "^kstd::string$", KstdStringPrinter) - pp.add_printer("std_byte", "^std::byte$", StdBytePrinter) pp.add_printer("unique_ptr", "^kstd::unique_ptr<.*>$", KstdUniquePtrPrinter) pp.add_printer("shared_ptr", "^kstd::shared_ptr<.*>$", KstdSharedPtrPrinter) return pp diff --git a/libs/kstd/gdb/std_types.py b/libs/kstd/gdb/std_types.py deleted file mode 100644 index deb5c58..0000000 --- a/libs/kstd/gdb/std_types.py +++ /dev/null @@ -1,13 +0,0 @@ -import gdb -from teachos import TeachOSBasePrinter - - -class StdBytePrinter(TeachOSBasePrinter): - - def to_string(self): - try: - uint8_type = gdb.lookup_type("unsigned char") - numeric_value = int(self.value.cast(uint8_type)) - return f"{numeric_value:#04x}" - except gdb.error: - return f"" -- cgit v1.2.3 From 35829497bdc0e00aa8f32b1855079fa5e2e0b084 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 May 2026 11:41:31 +0200 Subject: debug: align kstd printers with std ones --- libs/kstd/gdb/smart_pointers.py | 13 ++++++------- libs/kstd/gdb/vector.py | 10 ++++------ 2 files changed, 10 insertions(+), 13 deletions(-) (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index 3e5da02..0c14c77 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -16,7 +16,7 @@ class KstdUniquePtrPrinter(TeachOSBasePrinter): def children(self): pointer = self.value["pointer"] if int(pointer) != 0: - yield ("[object]", pointer.dereference()) + yield ("get()", pointer.dereference()) yield from super().children() @@ -31,21 +31,20 @@ class KstdSharedPtrPrinter(TeachOSBasePrinter): control_block = self.value["control"] if int(pointer) == 0 or int(control_block) == 0: - return f"kstd::shared_ptr<{self.__type}> (empty)" + return f"shared_ptr<{self.__type}> (empty)" strong_refs = int(control_block["shared_count"]["_M_i"]) weak_refs = int(control_block["weak_count"]["_M_i"]) - return f"kstd::shared_ptr<{self.__type}> (use_count={strong_refs}, weak_count={weak_refs})" + return ( + f"shared_ptr<{self.__type}> use count {strong_refs}, weak count {weak_refs}" + ) def children(self): pointer = self.value["pointer"] control_block = self.value["control"] if int(pointer) != 0: - yield ("[object]", pointer.dereference()) - - if int(control_block) != 0: - yield ("[control_block]", control_block.dereference()) + yield ("get()", pointer.dereference()) yield from super().children() diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py index 4340ef4..b3604de 100644 --- a/libs/kstd/gdb/vector.py +++ b/libs/kstd/gdb/vector.py @@ -3,17 +3,12 @@ from teachos import TeachOSBasePrinter class KstdVectorPrinter(TeachOSBasePrinter): - def __init__(self, val): - super().__init__(val) - self.__type = val.type.template_argument(0) - def to_string(self): size = int(self.value["m_size"]) capacity = int(self.value["m_capacity"]) - return f"kstd::vector<{self.__type}> (size={size}, capacity={capacity})" + return f"vector of length {size}, capacity {capacity}" def children(self): - yield from super().children() size = int(self.value["m_size"]) data_pointer = self.value["m_data"] for i in range(size): @@ -21,3 +16,6 @@ class KstdVectorPrinter(TeachOSBasePrinter): def display_hint(self): return "array" + + def num_children(self): + return int(self.value["m_size"]) -- cgit v1.2.3 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/kstd/gdb') 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 From fb09cd6633b26ef2cfb4f21b8cd852611cfe59d8 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Thu, 7 May 2026 12:17:01 +0200 Subject: debug: add support for kstd::observer_ptr --- libs/kstd/gdb/__init__.py | 7 ++++++- libs/kstd/gdb/smart_pointers.py | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py index 2d61539..c5d1e53 100644 --- a/libs/kstd/gdb/__init__.py +++ b/libs/kstd/gdb/__init__.py @@ -2,7 +2,11 @@ import gdb.printing from .vector import KstdVectorPrinter from .string import KstdStringPrinter -from .smart_pointers import KstdUniquePtrPrinter, KstdSharedPtrPrinter +from .smart_pointers import ( + KstdUniquePtrPrinter, + KstdSharedPtrPrinter, + KstdObserverPtrPrinter, +) def build_pretty_printers(): @@ -11,6 +15,7 @@ def build_pretty_printers(): pp.add_printer("string", "^kstd::string$", KstdStringPrinter) pp.add_printer("unique_ptr", "^kstd::unique_ptr<.*>$", KstdUniquePtrPrinter) pp.add_printer("shared_ptr", "^kstd::shared_ptr<.*>$", KstdSharedPtrPrinter) + pp.add_printer("observer_ptr", "^kstd::observer_ptr<.*>$", KstdObserverPtrPrinter) return pp diff --git a/libs/kstd/gdb/smart_pointers.py b/libs/kstd/gdb/smart_pointers.py index b94d466..f6e8a45 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -49,3 +49,20 @@ class KstdSharedPtrPrinter(gdb.ValuePrinter): def display_hint(self): return None + + +class KstdObserverPtrPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__type = val.type.template_argument(0) + self.__pointer = val["m_ptr"] + + def to_string(self): + return f"{(self.__pointer)}" + + def children(self): + if int(self.__pointer) != 0: + yield ("get()", self.__pointer.dereference()) + + def display_hint(self): + return None -- cgit v1.2.3 From 2cb7a2575e8eb46df36dae108fae661b91801540 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 10 May 2026 12:18:01 +0200 Subject: debug: add pretty printer for boot modules registry --- libs/kstd/gdb/vector.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'libs/kstd/gdb') diff --git a/libs/kstd/gdb/vector.py b/libs/kstd/gdb/vector.py index 69f8ca2..f11e064 100644 --- a/libs/kstd/gdb/vector.py +++ b/libs/kstd/gdb/vector.py @@ -2,24 +2,37 @@ import gdb class KstdVectorPrinter(gdb.ValuePrinter): - def __init__(self, val): + class Iterator: + def __init__(self, begin: gdb.Value, end: gdb.Value): + self._item = begin + self._end = end + self._count = 0 + + def __iter__(self): + return self + + def __next__(self): + count = self._count + self._count = count + 1 + + if self._item == self._end: + raise StopIteration + + element = self._item.dereference() + self._item = self._item + 1 + return (f"[{count}]", element) + + def __init__(self, val: gdb.Value): self.__val = val self.__size = int(val["m_size"]) self.__capacity = int(val["m_capacity"]) + self.__data = val["m_data"] def to_string(self): return f"vector of length {self.__size}, capacity {self.__capacity}" def children(self): - 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") + return self.Iterator(self.__data, self.__data + self.__size) def display_hint(self): return "array" -- cgit v1.2.3