@@ -319,6 +319,32 @@ def children(self):
319
319
yield (str (index ), (gdb_ptr + ((tail + index ) % cap )).dereference ())
320
320
321
321
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
+
322
348
class RustStdBTreeSetPrinter (object ):
323
349
def __init__ (self , val ):
324
350
self .__val = val
@@ -328,21 +354,16 @@ def display_hint():
328
354
return "array"
329
355
330
356
def to_string (self ):
331
- (length , data_ptr ) = \
332
- rustpp .extract_length_and_ptr_from_std_btreeset (self .__val )
333
357
return (self .__val .type .get_unqualified_type_name () +
334
- ("(len: %i)" % length ))
358
+ ("(len: %i)" % self . __val . get_wrapped_value ()[ 'map' ][ ' length' ] ))
335
359
336
360
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
346
367
347
368
348
369
class RustStdBTreeMapPrinter (object ):
@@ -354,26 +375,17 @@ def display_hint():
354
375
return "map"
355
376
356
377
def to_string (self ):
357
- (length , data_ptr ) = \
358
- rustpp .extract_length_and_ptr_from_std_btreemap (self .__val )
359
378
return (self .__val .type .get_unqualified_type_name () +
360
- ("(len: %i)" % length ))
379
+ ("(len: %i)" % self . __val . get_wrapped_value ()[ ' length' ] ))
361
380
362
381
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
377
389
378
390
379
391
class RustStdStringPrinter (object ):
0 commit comments