@@ -266,6 +266,47 @@ def has_children(self) -> bool:
266
266
return True
267
267
268
268
269
+ class MSVCStrSyntheticProvider :
270
+ __slots__ = ["valobj" , "data_ptr" , "length" ]
271
+
272
+ def __init__ (self , valobj : SBValue , _dict : LLDBOpaque ):
273
+ self .valobj = valobj
274
+ self .update ()
275
+
276
+ def update (self ):
277
+ self .data_ptr = self .valobj .GetChildMemberWithName ("data_ptr" )
278
+ self .length = self .valobj .GetChildMemberWithName ("length" ).GetValueAsUnsigned ()
279
+
280
+ def has_children (self ) -> bool :
281
+ return True
282
+
283
+ def num_children (self ) -> int :
284
+ return self .length
285
+
286
+ def get_child_index (self , name : str ) -> int :
287
+ index = name .lstrip ("[" ).rstrip ("]" )
288
+ if index .isdigit ():
289
+ return int (index )
290
+
291
+ return - 1
292
+
293
+ def get_child_at_index (self , index : int ) -> SBValue :
294
+ if not 0 <= index < self .length :
295
+ return None
296
+ start = self .data_ptr .GetValueAsUnsigned ()
297
+ address = start + index
298
+ element = self .data_ptr .CreateValueFromAddress (
299
+ f"[{ index } ]" , address , self .data_ptr .GetType ().GetPointeeType ()
300
+ )
301
+ return element
302
+
303
+ def get_type_name (self ):
304
+ if self .valobj .GetTypeName ().startswith ("ref_mut" ):
305
+ return "&mut str"
306
+ else :
307
+ return "&str"
308
+
309
+
269
310
class ClangEncodedEnumProvider :
270
311
"""Pretty-printer for 'clang-encoded' enums support implemented in LLDB"""
271
312
@@ -327,6 +368,7 @@ def _getCurrentVariantIndex(self, all_variants: SBValue) -> int:
327
368
default_index = i
328
369
return default_index
329
370
371
+
330
372
class MSVCEnumSyntheticProvider :
331
373
"""
332
374
Synthetic provider for sum-type enums on MSVC. For a detailed explanation of the internals,
@@ -336,6 +378,7 @@ class MSVCEnumSyntheticProvider:
336
378
"""
337
379
338
380
__slots__ = ["valobj" , "variant" , "value" ]
381
+
339
382
def __init__ (self , valobj : SBValue , _dict : LLDBOpaque ):
340
383
self .valobj = valobj
341
384
self .variant : SBValue
@@ -362,30 +405,44 @@ def update(self):
362
405
).GetValueAsUnsigned ()
363
406
if tag == discr :
364
407
self .variant = child
365
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
408
+ self .value = child .GetChildMemberWithName (
409
+ "value"
410
+ ).GetSyntheticValue ()
366
411
return
367
412
else : # if invalid, DISCR must be a range
368
- begin : int = variant_type .GetStaticFieldWithName (
369
- "DISCR_BEGIN"
370
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
371
- end : int = variant_type .GetStaticFieldWithName (
372
- "DISCR_END"
373
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
413
+ begin : int = (
414
+ variant_type .GetStaticFieldWithName ("DISCR_BEGIN" )
415
+ .GetConstantValue (self .valobj .target )
416
+ .GetValueAsUnsigned ()
417
+ )
418
+ end : int = (
419
+ variant_type .GetStaticFieldWithName ("DISCR_END" )
420
+ .GetConstantValue (self .valobj .target )
421
+ .GetValueAsUnsigned ()
422
+ )
374
423
375
424
# begin isn't necessarily smaller than end, so we must test for both cases
376
425
if begin < end :
377
426
if begin <= tag <= end :
378
427
self .variant = child
379
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
428
+ self .value = child .GetChildMemberWithName (
429
+ "value"
430
+ ).GetSyntheticValue ()
380
431
return
381
432
else :
382
433
if tag >= begin or tag <= end :
383
434
self .variant = child
384
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
435
+ self .value = child .GetChildMemberWithName (
436
+ "value"
437
+ ).GetSyntheticValue ()
385
438
return
386
439
else : # if invalid, tag is a 128 bit value
387
- tag_lo : int = self .valobj .GetChildMemberWithName ("tag128_lo" ).GetValueAsUnsigned ()
388
- tag_hi : int = self .valobj .GetChildMemberWithName ("tag128_hi" ).GetValueAsUnsigned ()
440
+ tag_lo : int = self .valobj .GetChildMemberWithName (
441
+ "tag128_lo"
442
+ ).GetValueAsUnsigned ()
443
+ tag_hi : int = self .valobj .GetChildMemberWithName (
444
+ "tag128_hi"
445
+ ).GetValueAsUnsigned ()
389
446
390
447
tag : int = (tag_hi << 64 ) | tag_lo
391
448
@@ -399,30 +456,44 @@ def update(self):
399
456
)
400
457
401
458
if exact_lo .IsValid ():
402
- exact_lo : int = exact_lo .GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
403
- exact_hi : int = variant_type .GetStaticFieldWithName (
404
- "DISCR128_EXACT_HI"
405
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
459
+ exact_lo : int = exact_lo .GetConstantValue (
460
+ self .valobj .target
461
+ ).GetValueAsUnsigned ()
462
+ exact_hi : int = (
463
+ variant_type .GetStaticFieldWithName ("DISCR128_EXACT_HI" )
464
+ .GetConstantValue (self .valobj .target )
465
+ .GetValueAsUnsigned ()
466
+ )
406
467
407
468
discr : int = (exact_hi << 64 ) | exact_lo
408
469
if tag == discr :
409
470
self .variant = child
410
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
471
+ self .value = child .GetChildMemberWithName (
472
+ "value"
473
+ ).GetSyntheticValue ()
411
474
return
412
475
else : # if invalid, DISCR must be a range
413
- begin_lo : int = variant_type .GetStaticFieldWithName (
414
- "DISCR128_BEGIN_LO"
415
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
416
- begin_hi : int = variant_type .GetStaticFieldWithName (
417
- "DISCR128_BEGIN_HI"
418
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
419
-
420
- end_lo : int = variant_type .GetStaticFieldWithName (
421
- "DISCR128_END_LO"
422
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
423
- end_hi : int = variant_type .GetStaticFieldWithName (
424
- "DISCR128_END_HI"
425
- ).GetConstantValue (self .valobj .target ).GetValueAsUnsigned ()
476
+ begin_lo : int = (
477
+ variant_type .GetStaticFieldWithName ("DISCR128_BEGIN_LO" )
478
+ .GetConstantValue (self .valobj .target )
479
+ .GetValueAsUnsigned ()
480
+ )
481
+ begin_hi : int = (
482
+ variant_type .GetStaticFieldWithName ("DISCR128_BEGIN_HI" )
483
+ .GetConstantValue (self .valobj .target )
484
+ .GetValueAsUnsigned ()
485
+ )
486
+
487
+ end_lo : int = (
488
+ variant_type .GetStaticFieldWithName ("DISCR128_END_LO" )
489
+ .GetConstantValue (self .valobj .target )
490
+ .GetValueAsUnsigned ()
491
+ )
492
+ end_hi : int = (
493
+ variant_type .GetStaticFieldWithName ("DISCR128_END_HI" )
494
+ .GetConstantValue (self .valobj .target )
495
+ .GetValueAsUnsigned ()
496
+ )
426
497
427
498
begin = (begin_hi << 64 ) | begin_lo
428
499
end = (end_hi << 64 ) | end_lo
@@ -431,12 +502,16 @@ def update(self):
431
502
if begin < end :
432
503
if begin <= tag <= end :
433
504
self .variant = child
434
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
505
+ self .value = child .GetChildMemberWithName (
506
+ "value"
507
+ ).GetSyntheticValue ()
435
508
return
436
509
else :
437
510
if tag >= begin or tag <= end :
438
511
self .variant = child
439
- self .value = child .GetChildMemberWithName ("value" ).GetSyntheticValue ()
512
+ self .value = child .GetChildMemberWithName (
513
+ "value"
514
+ ).GetSyntheticValue ()
440
515
return
441
516
442
517
def num_children (self ) -> int :
@@ -498,7 +573,7 @@ def MSVCEnumSummaryProvider(valobj: SBValue, _dict: LLDBOpaque) -> str:
498
573
if vars [- 1 ][- 1 ] == ")" :
499
574
vars [- 1 ] = vars [- 1 ][:- 1 ]
500
575
501
- return f' { name } {{{ ", " .join (vars )} }}'
576
+ return f" { name } {{{ ', ' .join (vars )} }}"
502
577
503
578
504
579
class TupleSyntheticProvider :
@@ -681,6 +756,7 @@ def get_type_name(self) -> str:
681
756
682
757
return "" .join ([ref , "[" , name , "]" ])
683
758
759
+
684
760
def StdSliceSummaryProvider (valobj , dict ):
685
761
output = sequence_formatter ("[" , valobj , dict )
686
762
output += "]"
0 commit comments