@@ -40,31 +40,12 @@ def print_struct_val(val, internal_dict):
40
40
41
41
if is_vec_slice (val ):
42
42
return print_vec_slice_val (val , internal_dict )
43
+ elif is_std_vec (val ):
44
+ return print_std_vec_val (val , internal_dict )
43
45
else :
44
46
return print_struct_val_starting_from (0 , val , internal_dict )
45
47
46
48
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
-
68
49
def print_struct_val_starting_from (field_start_index , val , internal_dict ):
69
50
'''
70
51
Prints a struct, tuple, or tuple struct value with Rust syntax.
@@ -100,6 +81,16 @@ def render_child(child_index):
100
81
this += field_name + ": "
101
82
102
83
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
+
103
94
return this + print_val (field_val , internal_dict )
104
95
105
96
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):
195
186
return output
196
187
197
188
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
+
198
213
#=--------------------------------------------------------------------------------------------------
199
214
# Helper Functions
200
215
#=--------------------------------------------------------------------------------------------------
@@ -243,3 +258,44 @@ def is_vec_slice(val):
243
258
244
259
type_name = extract_type_name (ty .GetName ()).replace ("&'static" , "&" ).replace (" " , "" )
245
260
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