@@ -411,3 +411,55 @@ def to_string(self):
411
411
if self .empty_cont ():
412
412
return 'empty %s' % self .type_name
413
413
return '%s' % self .type_name
414
+
415
+
416
+ @add_printer
417
+ class Boost_Property_Tree :
418
+ "Printer for boost::property_tree::basic_ptree"
419
+ printer_name = 'boost::property_tree'
420
+ min_supported_version = (1 , 42 , 0 )
421
+ max_supported_version = last_supported_boost_version
422
+ template_name = 'boost::property_tree::basic_ptree'
423
+
424
+ def __init__ (self , v ):
425
+ self ._value = v
426
+ subs_type = get_inner_type (self ._value .type , "subs" );
427
+ container_type = get_inner_type (subs_type , "base_container" );
428
+ self ._container_value_type = get_inner_type (container_type , "value_type" );
429
+
430
+ container = v ['m_children' ].cast (container_type .pointer ()).dereference ()
431
+ self ._node_count = container ['node_count' ]
432
+ #message('node count: ' + str(self._node_count))
433
+
434
+ ptr_size = gdb .lookup_type ('void' ).pointer ().sizeof
435
+ elem_size = self ._container_value_type .sizeof + (self ._container_value_type .sizeof % ptr_size )
436
+ #message('elem_size: ' + str(elem_size))
437
+
438
+ header_holder_subtype = container_type .fields ()[1 ].type
439
+ assert str (header_holder_subtype ).strip ().startswith ('boost::multi_index::detail::header_holder' )
440
+ head_node = container .cast (header_holder_subtype )['member' ].dereference ()
441
+ #message('head_node.type.sizeof: ' + str(head_node.type.sizeof))
442
+
443
+ self ._index_offset = head_node .type .sizeof - 2 * ptr_size
444
+ #message('index_offset: ' + str(self._index_offset))
445
+ self ._head_index_ptr = intptr (head_node .address ) + self ._index_offset
446
+ #message('head_index_ptr: ' + hex(self._head_index_ptr))
447
+
448
+ def children (self ):
449
+ if not self ._node_count :
450
+ return Boost_Multi_Index .empty_iterator ()
451
+
452
+ get_next_ptr = Boost_Multi_Index .sequenced_iterator .get_next_ptr
453
+ node = get_next_ptr (self ._head_index_ptr )
454
+ while node != self ._head_index_ptr :
455
+ val_ptr = Boost_Multi_Index .get_val_ptr (node , self ._index_offset )
456
+ val = parse_and_eval ('*(' + str (self ._container_value_type ) + '*)' + str (val_ptr ))
457
+ yield ('key' , val ["first" ])
458
+ yield ('val' , val ["second" ])
459
+ node = get_next_ptr (node )
460
+
461
+ def display_hint (self ):
462
+ return 'map'
463
+
464
+ def to_string (self ):
465
+ return self ._value ["m_data" ]
0 commit comments