@@ -18,70 +18,79 @@ def unwrap_unique_or_non_null(unique_or_nonnull):
18
18
return ptr if ptr .type .code == gdb .TYPE_CODE_PTR else ptr [ptr .type .fields ()[0 ]]
19
19
20
20
21
- class EnumProvider :
21
+ # GDB 14 has a tag class that indicates that extension methods are ok
22
+ # to call. Use of this tag only requires that printers hide local
23
+ # attributes and methods by prefixing them with "_".
24
+ if hasattr (gdb , 'ValuePrinter' ):
25
+ printer_base = gdb .ValuePrinter
26
+ else :
27
+ printer_base = object
28
+
29
+
30
+ class EnumProvider (printer_base ):
22
31
def __init__ (self , valobj ):
23
32
content = valobj [valobj .type .fields ()[0 ]]
24
33
fields = content .type .fields ()
25
- self .empty = len (fields ) == 0
26
- if not self .empty :
34
+ self ._empty = len (fields ) == 0
35
+ if not self ._empty :
27
36
if len (fields ) == 1 :
28
37
discriminant = 0
29
38
else :
30
39
discriminant = int (content [fields [0 ]]) + 1
31
- self .active_variant = content [fields [discriminant ]]
32
- self .name = fields [discriminant ].name
33
- self .full_name = "{}::{}" .format (valobj .type .name , self .name )
40
+ self ._active_variant = content [fields [discriminant ]]
41
+ self ._name = fields [discriminant ].name
42
+ self ._full_name = "{}::{}" .format (valobj .type .name , self ._name )
34
43
else :
35
- self .full_name = valobj .type .name
44
+ self ._full_name = valobj .type .name
36
45
37
46
def to_string (self ):
38
- return self .full_name
47
+ return self ._full_name
39
48
40
49
def children (self ):
41
- if not self .empty :
42
- yield self .name , self .active_variant
50
+ if not self ._empty :
51
+ yield self ._name , self ._active_variant
43
52
44
53
45
- class StdStringProvider :
54
+ class StdStringProvider ( printer_base ) :
46
55
def __init__ (self , valobj ):
47
- self .valobj = valobj
56
+ self ._valobj = valobj
48
57
vec = valobj ["vec" ]
49
- self .length = int (vec ["len" ])
50
- self .data_ptr = unwrap_unique_or_non_null (vec ["buf" ]["ptr" ])
58
+ self ._length = int (vec ["len" ])
59
+ self ._data_ptr = unwrap_unique_or_non_null (vec ["buf" ]["ptr" ])
51
60
52
61
def to_string (self ):
53
- return self .data_ptr .lazy_string (encoding = "utf-8" , length = self .length )
62
+ return self ._data_ptr .lazy_string (encoding = "utf-8" , length = self ._length )
54
63
55
64
@staticmethod
56
65
def display_hint ():
57
66
return "string"
58
67
59
68
60
- class StdOsStringProvider :
69
+ class StdOsStringProvider ( printer_base ) :
61
70
def __init__ (self , valobj ):
62
- self .valobj = valobj
63
- buf = self .valobj ["inner" ]["inner" ]
71
+ self ._valobj = valobj
72
+ buf = self ._valobj ["inner" ]["inner" ]
64
73
is_windows = "Wtf8Buf" in buf .type .name
65
74
vec = buf [ZERO_FIELD ] if is_windows else buf
66
75
67
- self .length = int (vec ["len" ])
68
- self .data_ptr = unwrap_unique_or_non_null (vec ["buf" ]["ptr" ])
76
+ self ._length = int (vec ["len" ])
77
+ self ._data_ptr = unwrap_unique_or_non_null (vec ["buf" ]["ptr" ])
69
78
70
79
def to_string (self ):
71
- return self .data_ptr .lazy_string (encoding = "utf-8" , length = self .length )
80
+ return self ._data_ptr .lazy_string (encoding = "utf-8" , length = self ._length )
72
81
73
82
def display_hint (self ):
74
83
return "string"
75
84
76
85
77
- class StdStrProvider :
86
+ class StdStrProvider ( printer_base ) :
78
87
def __init__ (self , valobj ):
79
- self .valobj = valobj
80
- self .length = int (valobj ["length" ])
81
- self .data_ptr = valobj ["data_ptr" ]
88
+ self ._valobj = valobj
89
+ self ._length = int (valobj ["length" ])
90
+ self ._data_ptr = valobj ["data_ptr" ]
82
91
83
92
def to_string (self ):
84
- return self .data_ptr .lazy_string (encoding = "utf-8" , length = self .length )
93
+ return self ._data_ptr .lazy_string (encoding = "utf-8" , length = self ._length )
85
94
86
95
@staticmethod
87
96
def display_hint ():
@@ -103,139 +112,139 @@ def _enumerate_array_elements(element_ptrs):
103
112
104
113
yield key , element
105
114
106
- class StdSliceProvider :
115
+ class StdSliceProvider ( printer_base ) :
107
116
def __init__ (self , valobj ):
108
- self .valobj = valobj
109
- self .length = int (valobj ["length" ])
110
- self .data_ptr = valobj ["data_ptr" ]
117
+ self ._valobj = valobj
118
+ self ._length = int (valobj ["length" ])
119
+ self ._data_ptr = valobj ["data_ptr" ]
111
120
112
121
def to_string (self ):
113
- return "{}(size={})" .format (self .valobj .type , self .length )
122
+ return "{}(size={})" .format (self ._valobj .type , self ._length )
114
123
115
124
def children (self ):
116
125
return _enumerate_array_elements (
117
- self .data_ptr + index for index in xrange (self .length )
126
+ self ._data_ptr + index for index in xrange (self ._length )
118
127
)
119
128
120
129
@staticmethod
121
130
def display_hint ():
122
131
return "array"
123
132
124
- class StdVecProvider :
133
+ class StdVecProvider ( printer_base ) :
125
134
def __init__ (self , valobj ):
126
- self .valobj = valobj
127
- self .length = int (valobj ["len" ])
128
- self .data_ptr = unwrap_unique_or_non_null (valobj ["buf" ]["ptr" ])
135
+ self ._valobj = valobj
136
+ self ._length = int (valobj ["len" ])
137
+ self ._data_ptr = unwrap_unique_or_non_null (valobj ["buf" ]["ptr" ])
129
138
130
139
def to_string (self ):
131
- return "Vec(size={})" .format (self .length )
140
+ return "Vec(size={})" .format (self ._length )
132
141
133
142
def children (self ):
134
143
return _enumerate_array_elements (
135
- self .data_ptr + index for index in xrange (self .length )
144
+ self ._data_ptr + index for index in xrange (self ._length )
136
145
)
137
146
138
147
@staticmethod
139
148
def display_hint ():
140
149
return "array"
141
150
142
151
143
- class StdVecDequeProvider :
152
+ class StdVecDequeProvider ( printer_base ) :
144
153
def __init__ (self , valobj ):
145
- self .valobj = valobj
146
- self .head = int (valobj ["head" ])
147
- self .size = int (valobj ["len" ])
148
- self .cap = int (valobj ["buf" ]["cap" ])
149
- self .data_ptr = unwrap_unique_or_non_null (valobj ["buf" ]["ptr" ])
154
+ self ._valobj = valobj
155
+ self ._head = int (valobj ["head" ])
156
+ self ._size = int (valobj ["len" ])
157
+ self ._cap = int (valobj ["buf" ]["cap" ])
158
+ self ._data_ptr = unwrap_unique_or_non_null (valobj ["buf" ]["ptr" ])
150
159
151
160
def to_string (self ):
152
- return "VecDeque(size={})" .format (self .size )
161
+ return "VecDeque(size={})" .format (self ._size )
153
162
154
163
def children (self ):
155
164
return _enumerate_array_elements (
156
- (self .data_ptr + ((self .head + index ) % self .cap )) for index in xrange (self .size )
165
+ (self ._data_ptr + ((self ._head + index ) % self ._cap )) for index in xrange (self ._size )
157
166
)
158
167
159
168
@staticmethod
160
169
def display_hint ():
161
170
return "array"
162
171
163
172
164
- class StdRcProvider :
173
+ class StdRcProvider ( printer_base ) :
165
174
def __init__ (self , valobj , is_atomic = False ):
166
- self .valobj = valobj
167
- self .is_atomic = is_atomic
168
- self .ptr = unwrap_unique_or_non_null (valobj ["ptr" ])
169
- self .value = self .ptr ["data" if is_atomic else "value" ]
170
- self .strong = self .ptr ["strong" ]["v" if is_atomic else "value" ]["value" ]
171
- self .weak = self .ptr ["weak" ]["v" if is_atomic else "value" ]["value" ] - 1
175
+ self ._valobj = valobj
176
+ self ._is_atomic = is_atomic
177
+ self ._ptr = unwrap_unique_or_non_null (valobj ["ptr" ])
178
+ self ._value = self ._ptr ["data" if is_atomic else "value" ]
179
+ self ._strong = self ._ptr ["strong" ]["v" if is_atomic else "value" ]["value" ]
180
+ self ._weak = self ._ptr ["weak" ]["v" if is_atomic else "value" ]["value" ] - 1
172
181
173
182
def to_string (self ):
174
- if self .is_atomic :
175
- return "Arc(strong={}, weak={})" .format (int (self .strong ), int (self .weak ))
183
+ if self ._is_atomic :
184
+ return "Arc(strong={}, weak={})" .format (int (self ._strong ), int (self ._weak ))
176
185
else :
177
- return "Rc(strong={}, weak={})" .format (int (self .strong ), int (self .weak ))
186
+ return "Rc(strong={}, weak={})" .format (int (self ._strong ), int (self ._weak ))
178
187
179
188
def children (self ):
180
- yield "value" , self .value
181
- yield "strong" , self .strong
182
- yield "weak" , self .weak
189
+ yield "value" , self ._value
190
+ yield "strong" , self ._strong
191
+ yield "weak" , self ._weak
183
192
184
193
185
- class StdCellProvider :
194
+ class StdCellProvider ( printer_base ) :
186
195
def __init__ (self , valobj ):
187
- self .value = valobj ["value" ]["value" ]
196
+ self ._value = valobj ["value" ]["value" ]
188
197
189
198
def to_string (self ):
190
199
return "Cell"
191
200
192
201
def children (self ):
193
- yield "value" , self .value
202
+ yield "value" , self ._value
194
203
195
204
196
- class StdRefProvider :
205
+ class StdRefProvider ( printer_base ) :
197
206
def __init__ (self , valobj ):
198
- self .value = valobj ["value" ].dereference ()
199
- self .borrow = valobj ["borrow" ]["borrow" ]["value" ]["value" ]
207
+ self ._value = valobj ["value" ].dereference ()
208
+ self ._borrow = valobj ["borrow" ]["borrow" ]["value" ]["value" ]
200
209
201
210
def to_string (self ):
202
- borrow = int (self .borrow )
211
+ borrow = int (self ._borrow )
203
212
if borrow >= 0 :
204
213
return "Ref(borrow={})" .format (borrow )
205
214
else :
206
215
return "Ref(borrow_mut={})" .format (- borrow )
207
216
208
217
def children (self ):
209
- yield "*value" , self .value
210
- yield "borrow" , self .borrow
218
+ yield "*value" , self ._value
219
+ yield "borrow" , self ._borrow
211
220
212
221
213
- class StdRefCellProvider :
222
+ class StdRefCellProvider ( printer_base ) :
214
223
def __init__ (self , valobj ):
215
- self .value = valobj ["value" ]["value" ]
216
- self .borrow = valobj ["borrow" ]["value" ]["value" ]
224
+ self ._value = valobj ["value" ]["value" ]
225
+ self ._borrow = valobj ["borrow" ]["value" ]["value" ]
217
226
218
227
def to_string (self ):
219
- borrow = int (self .borrow )
228
+ borrow = int (self ._borrow )
220
229
if borrow >= 0 :
221
230
return "RefCell(borrow={})" .format (borrow )
222
231
else :
223
232
return "RefCell(borrow_mut={})" .format (- borrow )
224
233
225
234
def children (self ):
226
- yield "value" , self .value
227
- yield "borrow" , self .borrow
235
+ yield "value" , self ._value
236
+ yield "borrow" , self ._borrow
228
237
229
238
230
- class StdNonZeroNumberProvider :
239
+ class StdNonZeroNumberProvider ( printer_base ) :
231
240
def __init__ (self , valobj ):
232
241
fields = valobj .type .fields ()
233
242
assert len (fields ) == 1
234
243
field = list (fields )[0 ]
235
- self .value = str (valobj [field .name ])
244
+ self ._value = str (valobj [field .name ])
236
245
237
246
def to_string (self ):
238
- return self .value
247
+ return self ._value
239
248
240
249
241
250
# Yields children (in a provider's sense of the word) for a BTreeMap.
@@ -280,15 +289,15 @@ def cast_to_internal(node):
280
289
yield child
281
290
282
291
283
- class StdBTreeSetProvider :
292
+ class StdBTreeSetProvider ( printer_base ) :
284
293
def __init__ (self , valobj ):
285
- self .valobj = valobj
294
+ self ._valobj = valobj
286
295
287
296
def to_string (self ):
288
- return "BTreeSet(size={})" .format (self .valobj ["map" ]["length" ])
297
+ return "BTreeSet(size={})" .format (self ._valobj ["map" ]["length" ])
289
298
290
299
def children (self ):
291
- inner_map = self .valobj ["map" ]
300
+ inner_map = self ._valobj ["map" ]
292
301
for i , (child , _ ) in enumerate (children_of_btree_map (inner_map )):
293
302
yield "[{}]" .format (i ), child
294
303
@@ -297,15 +306,15 @@ def display_hint():
297
306
return "array"
298
307
299
308
300
- class StdBTreeMapProvider :
309
+ class StdBTreeMapProvider ( printer_base ) :
301
310
def __init__ (self , valobj ):
302
- self .valobj = valobj
311
+ self ._valobj = valobj
303
312
304
313
def to_string (self ):
305
- return "BTreeMap(size={})" .format (self .valobj ["length" ])
314
+ return "BTreeMap(size={})" .format (self ._valobj ["length" ])
306
315
307
316
def children (self ):
308
- for i , (key , val ) in enumerate (children_of_btree_map (self .valobj )):
317
+ for i , (key , val ) in enumerate (children_of_btree_map (self ._valobj )):
309
318
yield "key{}" .format (i ), key
310
319
yield "val{}" .format (i ), val
311
320
@@ -315,124 +324,124 @@ def display_hint():
315
324
316
325
317
326
# BACKCOMPAT: rust 1.35
318
- class StdOldHashMapProvider :
327
+ class StdOldHashMapProvider ( printer_base ) :
319
328
def __init__ (self , valobj , show_values = True ):
320
- self .valobj = valobj
321
- self .show_values = show_values
322
-
323
- self .table = self .valobj ["table" ]
324
- self .size = int (self .table ["size" ])
325
- self .hashes = self .table ["hashes" ]
326
- self .hash_uint_type = self .hashes .type
327
- self .hash_uint_size = self .hashes .type .sizeof
328
- self .modulo = 2 ** self .hash_uint_size
329
- self .data_ptr = self .hashes [ZERO_FIELD ]["pointer" ]
330
-
331
- self .capacity_mask = int (self .table ["capacity_mask" ])
332
- self .capacity = (self .capacity_mask + 1 ) % self .modulo
333
-
334
- marker = self .table ["marker" ].type
335
- self .pair_type = marker .template_argument (0 )
336
- self .pair_type_size = self .pair_type .sizeof
337
-
338
- self .valid_indices = []
339
- for idx in range (self .capacity ):
340
- data_ptr = self .data_ptr .cast (self .hash_uint_type .pointer ())
329
+ self ._valobj = valobj
330
+ self ._show_values = show_values
331
+
332
+ self ._table = self ._valobj ["table" ]
333
+ self ._size = int (self ._table ["size" ])
334
+ self ._hashes = self ._table ["hashes" ]
335
+ self ._hash_uint_type = self ._hashes .type
336
+ self ._hash_uint_size = self ._hashes .type .sizeof
337
+ self ._modulo = 2 ** self ._hash_uint_size
338
+ self ._data_ptr = self ._hashes [ZERO_FIELD ]["pointer" ]
339
+
340
+ self ._capacity_mask = int (self ._table ["capacity_mask" ])
341
+ self ._capacity = (self ._capacity_mask + 1 ) % self ._modulo
342
+
343
+ marker = self ._table ["marker" ].type
344
+ self ._pair_type = marker .template_argument (0 )
345
+ self ._pair_type_size = self ._pair_type .sizeof
346
+
347
+ self ._valid_indices = []
348
+ for idx in range (self ._capacity ):
349
+ data_ptr = self ._data_ptr .cast (self ._hash_uint_type .pointer ())
341
350
address = data_ptr + idx
342
351
hash_uint = address .dereference ()
343
352
hash_ptr = hash_uint [ZERO_FIELD ]["pointer" ]
344
353
if int (hash_ptr ) != 0 :
345
- self .valid_indices .append (idx )
354
+ self ._valid_indices .append (idx )
346
355
347
356
def to_string (self ):
348
- if self .show_values :
349
- return "HashMap(size={})" .format (self .size )
357
+ if self ._show_values :
358
+ return "HashMap(size={})" .format (self ._size )
350
359
else :
351
- return "HashSet(size={})" .format (self .size )
360
+ return "HashSet(size={})" .format (self ._size )
352
361
353
362
def children (self ):
354
- start = int (self .data_ptr ) & ~ 1
363
+ start = int (self ._data_ptr ) & ~ 1
355
364
356
- hashes = self .hash_uint_size * self .capacity
357
- align = self .pair_type_size
358
- len_rounded_up = (((((hashes + align ) % self .modulo - 1 ) % self .modulo ) & ~ (
359
- (align - 1 ) % self .modulo )) % self .modulo - hashes ) % self .modulo
365
+ hashes = self ._hash_uint_size * self ._capacity
366
+ align = self ._pair_type_size
367
+ len_rounded_up = (((((hashes + align ) % self ._modulo - 1 ) % self ._modulo ) & ~ (
368
+ (align - 1 ) % self ._modulo )) % self ._modulo - hashes ) % self ._modulo
360
369
361
370
pairs_offset = hashes + len_rounded_up
362
- pairs_start = gdb .Value (start + pairs_offset ).cast (self .pair_type .pointer ())
371
+ pairs_start = gdb .Value (start + pairs_offset ).cast (self ._pair_type .pointer ())
363
372
364
- for index in range (self .size ):
365
- table_index = self .valid_indices [index ]
366
- idx = table_index & self .capacity_mask
373
+ for index in range (self ._size ):
374
+ table_index = self ._valid_indices [index ]
375
+ idx = table_index & self ._capacity_mask
367
376
element = (pairs_start + idx ).dereference ()
368
- if self .show_values :
377
+ if self ._show_values :
369
378
yield "key{}" .format (index ), element [ZERO_FIELD ]
370
379
yield "val{}" .format (index ), element [FIRST_FIELD ]
371
380
else :
372
381
yield "[{}]" .format (index ), element [ZERO_FIELD ]
373
382
374
383
def display_hint (self ):
375
- return "map" if self .show_values else "array"
384
+ return "map" if self ._show_values else "array"
376
385
377
386
378
- class StdHashMapProvider :
387
+ class StdHashMapProvider ( printer_base ) :
379
388
def __init__ (self , valobj , show_values = True ):
380
- self .valobj = valobj
381
- self .show_values = show_values
389
+ self ._valobj = valobj
390
+ self ._show_values = show_values
382
391
383
- table = self .table ()
392
+ table = self ._table ()
384
393
table_inner = table ["table" ]
385
394
capacity = int (table_inner ["bucket_mask" ]) + 1
386
395
ctrl = table_inner ["ctrl" ]["pointer" ]
387
396
388
- self .size = int (table_inner ["items" ])
389
- self .pair_type = table .type .template_argument (0 ).strip_typedefs ()
397
+ self ._size = int (table_inner ["items" ])
398
+ self ._pair_type = table .type .template_argument (0 ).strip_typedefs ()
390
399
391
- self .new_layout = not table_inner .type .has_key ("data" )
392
- if self .new_layout :
393
- self .data_ptr = ctrl .cast (self .pair_type .pointer ())
400
+ self ._new_layout = not table_inner .type .has_key ("data" )
401
+ if self ._new_layout :
402
+ self ._data_ptr = ctrl .cast (self ._pair_type .pointer ())
394
403
else :
395
- self .data_ptr = table_inner ["data" ]["pointer" ]
404
+ self ._data_ptr = table_inner ["data" ]["pointer" ]
396
405
397
- self .valid_indices = []
406
+ self ._valid_indices = []
398
407
for idx in range (capacity ):
399
408
address = ctrl + idx
400
409
value = address .dereference ()
401
410
is_presented = value & 128 == 0
402
411
if is_presented :
403
- self .valid_indices .append (idx )
412
+ self ._valid_indices .append (idx )
404
413
405
- def table (self ):
406
- if self .show_values :
407
- hashbrown_hashmap = self .valobj ["base" ]
408
- elif self .valobj .type .fields ()[0 ].name == "map" :
414
+ def _table (self ):
415
+ if self ._show_values :
416
+ hashbrown_hashmap = self ._valobj ["base" ]
417
+ elif self ._valobj .type .fields ()[0 ].name == "map" :
409
418
# BACKCOMPAT: rust 1.47
410
419
# HashSet wraps std::collections::HashMap, which wraps hashbrown::HashMap
411
- hashbrown_hashmap = self .valobj ["map" ]["base" ]
420
+ hashbrown_hashmap = self ._valobj ["map" ]["base" ]
412
421
else :
413
422
# HashSet wraps hashbrown::HashSet, which wraps hashbrown::HashMap
414
- hashbrown_hashmap = self .valobj ["base" ]["map" ]
423
+ hashbrown_hashmap = self ._valobj ["base" ]["map" ]
415
424
return hashbrown_hashmap ["table" ]
416
425
417
426
def to_string (self ):
418
- if self .show_values :
419
- return "HashMap(size={})" .format (self .size )
427
+ if self ._show_values :
428
+ return "HashMap(size={})" .format (self ._size )
420
429
else :
421
- return "HashSet(size={})" .format (self .size )
430
+ return "HashSet(size={})" .format (self ._size )
422
431
423
432
def children (self ):
424
- pairs_start = self .data_ptr
433
+ pairs_start = self ._data_ptr
425
434
426
- for index in range (self .size ):
427
- idx = self .valid_indices [index ]
428
- if self .new_layout :
435
+ for index in range (self ._size ):
436
+ idx = self ._valid_indices [index ]
437
+ if self ._new_layout :
429
438
idx = - (idx + 1 )
430
439
element = (pairs_start + idx ).dereference ()
431
- if self .show_values :
440
+ if self ._show_values :
432
441
yield "key{}" .format (index ), element [ZERO_FIELD ]
433
442
yield "val{}" .format (index ), element [FIRST_FIELD ]
434
443
else :
435
444
yield "[{}]" .format (index ), element [ZERO_FIELD ]
436
445
437
446
def display_hint (self ):
438
- return "map" if self .show_values else "array"
447
+ return "map" if self ._show_values else "array"
0 commit comments