You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2012/07/24 15:17:53 UTC
svn commit: r1365035 - /subversion/trunk/tools/dev/gdb-py/svndbg/printers.py
Author: julianfoad
Date: Tue Jul 24 13:17:53 2012
New Revision: 1365035
URL: http://svn.apache.org/viewvc?rev=1365035&view=rev
Log:
Add GDB pretty-printing support for svn mergeinfo data types:
svn_merge_range_t, svn_mergeinfo_t.
* tools/dev/gdb-py/svndbg/printers.py
(children_of_apr_array): New function.
(SvnMergeRangePrinter, SvnRangelistPrinter, SvnMergeinfoPrinter): New
pretty-printers.
(SvnMergeinfoCatalogPrinter): Return the result as a formatted string
rather than a list of children.
(build_libsvn_printers): Add the new pretty-printers.
Modified:
subversion/trunk/tools/dev/gdb-py/svndbg/printers.py
Modified: subversion/trunk/tools/dev/gdb-py/svndbg/printers.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dev/gdb-py/svndbg/printers.py?rev=1365035&r1=1365034&r2=1365035&view=diff
==============================================================================
--- subversion/trunk/tools/dev/gdb-py/svndbg/printers.py (original)
+++ subversion/trunk/tools/dev/gdb-py/svndbg/printers.py Tue Jul 24 13:17:53 2012
@@ -156,6 +156,14 @@ class AprArrayPrinter:
def display_hint(self):
return 'array'
+def children_of_apr_array(array, value_type):
+ """Iterate over an 'apr_array_header_t' GDB value, in the way required for
+ a pretty-printer 'children' method when the display-hint is 'array'.
+ Cast the value pointers to VALUE_TYPE."""
+ nelts = int(array['nelts'])
+ elts = array['elts'].reinterpret_cast(value_type.pointer())
+ for i in range(nelts):
+ yield str(i), elts[i]
########################################################################
@@ -179,26 +187,84 @@ class SvnStringPrinter:
def display_hint(self):
return 'string'
-class SvnMergeinfoCatalogPrinter:
- """for svn_mergeinfo_catalog_t"""
+class SvnMergeRangePrinter:
+ def __init__(self, val):
+ if val.type.code == gdb.TYPE_CODE_PTR and val:
+ self.val = val.dereference()
+ else:
+ self.val = val
+
+ def to_string(self):
+ if not self.val:
+ return 'NULL'
+
+ r = self.val
+ rs = str(r['start']) + '-' + str(r['end'])
+ if not r['inheritable']:
+ rs += '*'
+ return rs
+
+ def display_hint(self):
+ return 'string'
+
+class SvnRangelistPrinter:
+ def __init__(self, val):
+ if val.type.code == gdb.TYPE_CODE_PTR and val:
+ self.array = val.dereference()
+ else:
+ self.array = val
+ self.svn_merge_range_t = gdb.lookup_type('svn_merge_range_t')
+
+ def to_string(self):
+ if not self.array:
+ return 'NULL'
+
+ s = ''
+ for key, val in children_of_apr_array(self.array,
+ self.svn_merge_range_t.pointer()):
+ if s:
+ s += ','
+ s += SvnMergeRangePrinter(val).to_string()
+ return s
+
+ def display_hint(self):
+ return 'string'
+
+class SvnMergeinfoPrinter:
+ """for svn_mergeinfo_t"""
def __init__(self, val):
self.hash_p = val
+ self.svn_rangelist_t = gdb.lookup_type('svn_rangelist_t')
def to_string(self):
if self.hash_p == 0:
return 'NULL'
- return 'mergeinfo catalog of ' + str(apr_hash_count(self.hash_p)) + ' items'
- def children(self):
+ s = ''
+ for key, val in children_of_apr_hash(self.hash_p,
+ self.svn_rangelist_t.pointer()):
+ if s:
+ s += '; '
+ s += key + ':' + SvnRangelistPrinter(val).to_string()
+ return '{ ' + s + ' }'
+
+class SvnMergeinfoCatalogPrinter:
+ """for svn_mergeinfo_catalog_t"""
+ def __init__(self, val):
+ self.hash_p = val
+ self.svn_mergeinfo_t = gdb.lookup_type('svn_mergeinfo_t')
+
+ def to_string(self):
if self.hash_p == 0:
- # Return [] here so GDB prints just the 'NULL' of to_string();
- # returning 'None' here would give a 'not iterable' error.
- return []
- mergeinfoType = gdb.lookup_type('svn_mergeinfo_t')
- return children_as_map(children_of_apr_hash(self.hash_p, mergeinfoType))
+ return 'NULL'
- def display_hint(self):
- return 'map'
+ s = ''
+ for key, val in children_of_apr_hash(self.hash_p,
+ self.svn_mergeinfo_t):
+ if s:
+ s += ',\n '
+ s += "'" + key + "': " + SvnMergeinfoPrinter(val).to_string()
+ return '{ ' + s + ' }'
########################################################################
@@ -271,6 +337,16 @@ def build_libsvn_printers():
SvnStringPrinter)
libsvn_printer2.add_printer('svn_client__pathrev_t', r'^svn_client__pathrev_t$',
SvnPathrevPrinter)
+ libsvn_printer2.add_printer('svn_merge_range_t', r'^svn_merge_range_t$',
+ SvnMergeRangePrinter)
+ libsvn_printer2.add_printer('svn_merge_range_t *', r'^svn_merge_range_t \*$',
+ SvnMergeRangePrinter)
+ libsvn_printer2.add_printer('svn_rangelist_t', r'^svn_rangelist_t$',
+ SvnRangelistPrinter)
+ libsvn_printer2.add_printer('svn_rangelist_t *', r'^svn_rangelist_t \*$',
+ SvnRangelistPrinter)
+ libsvn_printer2.add_printer('svn_mergeinfo_t', r'^svn_mergeinfo_t$',
+ SvnMergeinfoPrinter)
libsvn_printer2.add_printer('svn_mergeinfo_catalog_t', r'^svn_mergeinfo_catalog_t$',
SvnMergeinfoCatalogPrinter)