aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/gdb/smart_pointers.py
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd/gdb/smart_pointers.py')
-rw-r--r--libs/kstd/gdb/smart_pointers.py50
1 files changed, 50 insertions, 0 deletions
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())