@@ -40,31 +40,12 @@ def print_struct_val(val, internal_dict):
4040
4141 if is_vec_slice (val ):
4242 return print_vec_slice_val (val , internal_dict )
43+ elif is_std_vec (val ):
44+ return print_std_vec_val (val , internal_dict )
4345 else :
4446 return print_struct_val_starting_from (0 , val , internal_dict )
4547
4648
47- def print_vec_slice_val (val , internal_dict ):
48- length = val .GetChildAtIndex (1 ).GetValueAsUnsigned ()
49-
50- data_ptr_val = val .GetChildAtIndex (0 )
51- data_ptr_type = data_ptr_val .GetType ()
52- assert data_ptr_type .IsPointerType ()
53-
54- element_type = data_ptr_type .GetPointeeType ()
55- element_type_size = element_type .GetByteSize ()
56-
57- start_address = data_ptr_val .GetValueAsUnsigned ()
58-
59- def render_element (i ):
60- address = start_address + i * element_type_size
61- element_val = val .CreateValueFromAddress (val .GetName () +
62- ("[%s]" % i ), address , element_type )
63- return print_val (element_val , internal_dict )
64-
65- return "&[%s]" % (', ' .join ([render_element (i ) for i in range (length )]))
66-
67-
6849def print_struct_val_starting_from (field_start_index , val , internal_dict ):
6950 '''
7051 Prints a struct, tuple, or tuple struct value with Rust syntax.
@@ -100,6 +81,16 @@ def render_child(child_index):
10081 this += field_name + ": "
10182
10283 field_val = val .GetChildAtIndex (child_index )
84+
85+ if not field_val .IsValid ():
86+ field = t .GetFieldAtIndex (child_index )
87+ # LLDB is not good at handling zero-sized values, so we have to help
88+ # it a little
89+ if field .GetType ().GetByteSize () == 0 :
90+ return this + extract_type_name (field .GetType ().GetName ())
91+ else :
92+ return this + "<invalid value>"
93+
10394 return this + print_val (field_val , internal_dict )
10495
10596 body = separator .join ([render_child (idx ) for idx in range (field_start_index , num_children )])
@@ -195,6 +186,30 @@ def print_fixed_size_vec_val(val, internal_dict):
195186 return output
196187
197188
189+ def print_vec_slice_val (val , internal_dict ):
190+ length = val .GetChildAtIndex (1 ).GetValueAsUnsigned ()
191+
192+ data_ptr_val = val .GetChildAtIndex (0 )
193+ data_ptr_type = data_ptr_val .GetType ()
194+
195+ return "&[%s]" % print_array_of_values (val .GetName (),
196+ data_ptr_val ,
197+ length ,
198+ internal_dict )
199+
200+
201+ def print_std_vec_val (val , internal_dict ):
202+ length = val .GetChildAtIndex (1 ).GetValueAsUnsigned ()
203+
204+ # Vec<> -> Unique<> -> NonZero<> -> *T
205+ data_ptr_val = val .GetChildAtIndex (0 ).GetChildAtIndex (0 ).GetChildAtIndex (0 )
206+ data_ptr_type = data_ptr_val .GetType ()
207+
208+ return "vec![%s]" % print_array_of_values (val .GetName (),
209+ data_ptr_val ,
210+ length ,
211+ internal_dict )
212+
198213#=--------------------------------------------------------------------------------------------------
199214# Helper Functions
200215#=--------------------------------------------------------------------------------------------------
@@ -243,3 +258,44 @@ def is_vec_slice(val):
243258
244259 type_name = extract_type_name (ty .GetName ()).replace ("&'static" , "&" ).replace (" " , "" )
245260 return type_name .startswith ("&[" ) and type_name .endswith ("]" )
261+
262+ def is_std_vec (val ):
263+ ty = val .GetType ()
264+ if ty .GetTypeClass () != lldb .eTypeClassStruct :
265+ return False
266+
267+ if ty .GetNumberOfFields () != 3 :
268+ return False
269+
270+ if ty .GetFieldAtIndex (0 ).GetName () != "ptr" :
271+ return False
272+
273+ if ty .GetFieldAtIndex (1 ).GetName () != "len" :
274+ return False
275+
276+ if ty .GetFieldAtIndex (2 ).GetName () != "cap" :
277+ return False
278+
279+ return ty .GetName ().startswith ("collections::vec::Vec<" )
280+
281+
282+ def print_array_of_values (array_name , data_ptr_val , length , internal_dict ):
283+ '''Prints a contigous memory range, interpreting it as values of the
284+ pointee-type of data_ptr_val.'''
285+
286+ data_ptr_type = data_ptr_val .GetType ()
287+ assert data_ptr_type .IsPointerType ()
288+
289+ element_type = data_ptr_type .GetPointeeType ()
290+ element_type_size = element_type .GetByteSize ()
291+
292+ start_address = data_ptr_val .GetValueAsUnsigned ()
293+
294+ def render_element (i ):
295+ address = start_address + i * element_type_size
296+ element_val = data_ptr_val .CreateValueFromAddress (array_name + ("[%s]" % i ),
297+ address ,
298+ element_type )
299+ return print_val (element_val , internal_dict )
300+
301+ return ', ' .join ([render_element (i ) for i in range (length )])
0 commit comments