82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
import gdb
|
|
import gdb.printing
|
|
|
|
class SharedPointerPrinter:
|
|
"Print a shared_ptr or weak_ptr"
|
|
|
|
class _iterator:
|
|
def __init__(self, sharedPointer):
|
|
self.sharedPointer = sharedPointer
|
|
self.managedValue = sharedPointer.val['_M_ptr']
|
|
self.count = 0
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
if self.managedValue == 0:
|
|
raise StopIteration
|
|
self.count = self.count + 1
|
|
if (self.count == 1):
|
|
return ('Use count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_use_count'])
|
|
elif (self.count == 2):
|
|
return ('Weak count', self.sharedPointer.val['_M_refcount']['_M_pi']['_M_weak_count'] - 1)
|
|
elif (self.count == 3):
|
|
return ('Managed value', self.managedValue)
|
|
else:
|
|
raise StopIteration
|
|
|
|
def __init__ (self, typename, val):
|
|
self.typename = typename
|
|
self.val = val
|
|
|
|
def children (self):
|
|
return self._iterator(self)
|
|
|
|
def to_string (self):
|
|
state = 'empty'
|
|
refcounts = self.val['_M_refcount']['_M_pi']
|
|
if refcounts != 0:
|
|
usecount = refcounts['_M_use_count']
|
|
weakcount = refcounts['_M_weak_count']
|
|
if usecount == 0:
|
|
state = 'expired, weakcount %d' % weakcount
|
|
else:
|
|
state = 'usecount %d, weakcount %d' % (usecount, weakcount - 1)
|
|
return '%s (%s) to %s' % (self.typename, state, self.val['_M_ptr'])
|
|
|
|
class UniquePointerPrinter:
|
|
"Print a unique_ptr"
|
|
|
|
class _iterator:
|
|
def __init__(self, uniquePointer):
|
|
self.uniquePointer = uniquePointer
|
|
self.managedValue = uniquePointer.val['_M_t']['_M_head_impl']
|
|
self.count = 0
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
if self.managedValue == 0 or self.count == 1:
|
|
raise StopIteration
|
|
self.count = self.count + 1
|
|
return ('Managed value', self.managedValue)
|
|
|
|
def __init__ (self, typename, val):
|
|
self.val = val
|
|
|
|
def children (self):
|
|
return self._iterator(self)
|
|
|
|
def to_string (self):
|
|
v = self.val['_M_t']['_M_head_impl']
|
|
return ('std::unique_ptr<%s> containing %s' % (str(v.type.target()),
|
|
str(v)))
|
|
|
|
def mk_pretty_printers():
|
|
pp = gdb.printing.RegexpCollectionPrettyPrinter("myprinters")
|
|
pp.add_printer('shared_ptr', '^std::shared_ptr', SharedPointerPrinter)
|
|
pp.add_printer('unique_ptr', '^std::unique_ptr', UniquePointerPrinter)
|
|
return pp
|