@@ -319,6 +319,32 @@ def children(self):
319319 yield (str (index ), (gdb_ptr + ((tail + index ) % cap )).dereference ())
320320
321321
322+ # Yield each key (and optionally value) from a BoxedNode.
323+ def children_of_node (boxed_node , height , want_values ):
324+ ptr = boxed_node ['ptr' ]['pointer' ]
325+ # This is written oddly because we don't want to rely on the field name being `__0`.
326+ node_ptr = ptr [ptr .type .fields ()[0 ]]
327+ if height > 0 :
328+ type_name = str (node_ptr .type .target ()).replace ('LeafNode' , 'InternalNode' )
329+ node_type = gdb .lookup_type (type_name )
330+ node_ptr = node_ptr .cast (node_type .pointer ())
331+ leaf = node_ptr ['data' ]
332+ else :
333+ leaf = node_ptr .dereference ()
334+ keys = leaf ['keys' ]['value' ]['value' ]
335+ if want_values :
336+ values = leaf ['vals' ]['value' ]['value' ]
337+ length = int (leaf ['len' ])
338+ for i in xrange (0 , length + 1 ):
339+ if height > 0 :
340+ for child in children_of_node (node_ptr ['edges' ][i ], height - 1 , want_values ):
341+ yield child
342+ if i < length :
343+ if want_values :
344+ yield (keys [i ], values [i ])
345+ else :
346+ yield keys [i ]
347+
322348class RustStdBTreeSetPrinter (object ):
323349 def __init__ (self , val ):
324350 self .__val = val
@@ -328,21 +354,16 @@ def display_hint():
328354 return "array"
329355
330356 def to_string (self ):
331- (length , data_ptr ) = \
332- rustpp .extract_length_and_ptr_from_std_btreeset (self .__val )
333357 return (self .__val .type .get_unqualified_type_name () +
334- ("(len: %i)" % length ))
358+ ("(len: %i)" % self . __val . get_wrapped_value ()[ 'map' ][ ' length' ] ))
335359
336360 def children (self ):
337- (length , data_ptr ) = \
338- rustpp .extract_length_and_ptr_from_std_btreeset (self .__val )
339- leaf_node = GdbValue (data_ptr .get_wrapped_value ().dereference ())
340- maybe_uninit_keys = leaf_node .get_child_at_index (3 )
341- manually_drop_keys = maybe_uninit_keys .get_child_at_index (1 )
342- keys = manually_drop_keys .get_child_at_index (0 )
343- gdb_ptr = keys .get_wrapped_value ()
344- for index in xrange (length ):
345- yield (str (index ), gdb_ptr [index ])
361+ root = self .__val .get_wrapped_value ()['map' ]['root' ]
362+ node_ptr = root ['node' ]
363+ i = 0
364+ for child in children_of_node (node_ptr , root ['height' ], False ):
365+ yield (str (i ), child )
366+ i = i + 1
346367
347368
348369class RustStdBTreeMapPrinter (object ):
@@ -354,26 +375,17 @@ def display_hint():
354375 return "map"
355376
356377 def to_string (self ):
357- (length , data_ptr ) = \
358- rustpp .extract_length_and_ptr_from_std_btreemap (self .__val )
359378 return (self .__val .type .get_unqualified_type_name () +
360- ("(len: %i)" % length ))
379+ ("(len: %i)" % self . __val . get_wrapped_value ()[ ' length' ] ))
361380
362381 def children (self ):
363- (length , data_ptr ) = \
364- rustpp .extract_length_and_ptr_from_std_btreemap (self .__val )
365- leaf_node = GdbValue (data_ptr .get_wrapped_value ().dereference ())
366- maybe_uninit_keys = leaf_node .get_child_at_index (3 )
367- manually_drop_keys = maybe_uninit_keys .get_child_at_index (1 )
368- keys = manually_drop_keys .get_child_at_index (0 )
369- keys_ptr = keys .get_wrapped_value ()
370- maybe_uninit_vals = leaf_node .get_child_at_index (4 )
371- manually_drop_vals = maybe_uninit_vals .get_child_at_index (1 )
372- vals = manually_drop_vals .get_child_at_index (0 )
373- vals_ptr = vals .get_wrapped_value ()
374- for index in xrange (length ):
375- yield (str (index ), keys_ptr [index ])
376- yield (str (index ), vals_ptr [index ])
382+ root = self .__val .get_wrapped_value ()['root' ]
383+ node_ptr = root ['node' ]
384+ i = 0
385+ for child in children_of_node (node_ptr , root ['height' ], True ):
386+ yield (str (i ), child [0 ])
387+ yield (str (i ), child [1 ])
388+ i = i + 1
377389
378390
379391class RustStdStringPrinter (object ):
0 commit comments