diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/kstd/gdb/__init__.py | 2 | ||||
| -rw-r--r-- | libs/kstd/gdb/smart_pointers.py | 36 |
2 files changed, 34 insertions, 4 deletions
diff --git a/libs/kstd/gdb/__init__.py b/libs/kstd/gdb/__init__.py index 4c4b3415..26a38e3b 100644 --- a/libs/kstd/gdb/__init__.py +++ b/libs/kstd/gdb/__init__.py @@ -6,6 +6,7 @@ from .smart_pointers import ( KstdUniquePtrPrinter, KstdSharedPtrPrinter, KstdObserverPtrPrinter, + KstdWeakPtrPrinter, ) @@ -15,6 +16,7 @@ def build_pretty_printers(): 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) + pp.add_printer("weak_ptr", "^kstd::weak_ptr<.*>$", KstdWeakPtrPrinter) 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 30c90dc1..572fee94 100644 --- a/libs/kstd/gdb/smart_pointers.py +++ b/libs/kstd/gdb/smart_pointers.py @@ -27,21 +27,21 @@ class KstdSharedPtrPrinter(gdb.ValuePrinter): self.__type = val.type.template_argument(0) def to_string(self): - pointer = self.__val["m_storage"] + pointer = self.__val["m_pointer"] control_block = self.__val["m_control_block"] if int(pointer) == 0 or int(control_block) == 0: return f"shared_ptr<{self.__type}> (empty)" - strong_refs = int(control_block["strong_count"]["_M_i"]) - weak_refs = int(control_block["weak_count"]["_M_i"]) + strong_refs = int(control_block["m_strong_count"]["_M_i"]) + weak_refs = int(control_block["m_weak_count"]["_M_i"]) return ( f"shared_ptr<{self.__type}> use count {strong_refs}, weak count {weak_refs}" ) def children(self): - pointer = self.__val["m_storage"] + pointer = self.__val["m_pointer"] control_block = self.__val["m_control_block"] if int(pointer) != 0: @@ -51,6 +51,34 @@ class KstdSharedPtrPrinter(gdb.ValuePrinter): return None +class KstdWeakPtrPrinter(gdb.ValuePrinter): + def __init__(self, val): + self.__val = val + self.__type = val.type.template_argument(0) + + def to_string(self): + pointer = self.__val["m_pointer"] + control_block = self.__val["m_control_block"] + + if int(pointer) == 0 or int(control_block) == 0: + return f"weak_ptr<{self.__type}> (empty)" + + strong_refs = int(control_block["m_strong_count"]["_M_i"]) + weak_refs = int(control_block["m_weak_count"]["_M_i"]) + return ( + f"weak_ptr<{self.__type}> use count {strong_refs}, weak count {weak_refs}" + ) + + def children(self): + pointer = self.__val["m_pointer"] + + if int(pointer) != 0: + yield ("get()", pointer.dereference()) + + def display_hint(self): + return None + + class KstdObserverPtrPrinter(gdb.ValuePrinter): def __init__(self, val): self.__val = val |
