@@ -423,9 +423,80 @@ bool lldb_private::formatters::swift::UnsafeTypeSummaryProvider(
423
423
return true ;
424
424
}
425
425
426
+ static std::vector<ValueObjectSP>
427
+ ExtractChildrenFromSwiftPointerValueObject (ValueObjectSP valobj_sp,
428
+ SwiftUnsafeType &unsafe_ptr) {
429
+ if (!valobj_sp)
430
+ return {};
431
+
432
+ lldb::ProcessSP process_sp (valobj_sp->GetProcessSP ());
433
+
434
+ if (!process_sp)
435
+ return {};
436
+
437
+ const addr_t start_addr = unsafe_ptr.GetStartAddress ();
438
+ const size_t num_children = unsafe_ptr.GetCount ();
439
+ const CompilerType element_type = unsafe_ptr.GetElementType ();
440
+
441
+ auto stride = element_type.GetByteStride (process_sp.get ());
442
+ if (!stride)
443
+ return {};
444
+
445
+ auto element_stride = *stride;
446
+ size_t buffer_size = num_children * element_stride;
447
+ if (buffer_size > 512 * 1024 * 1024 ) {
448
+ LLDB_LOG (GetLog (LLDBLog::DataFormatters),
449
+ " Suspiciously large object: num_children={0}, stride={1}" ,
450
+ num_children, element_stride);
451
+ return {};
452
+ }
453
+
454
+ std::unique_ptr<lldb_private::WritableDataBuffer> buffer_up (
455
+ new DataBufferHeap (buffer_size, 0 ));
456
+ Status error;
457
+ size_t read_bytes = process_sp->ReadMemory (start_addr, buffer_up->GetBytes (),
458
+ buffer_size, error);
459
+
460
+ if (!read_bytes || error.Fail ())
461
+ return {};
462
+
463
+ auto ptr_size = process_sp->GetAddressByteSize ();
464
+ auto order = process_sp->GetByteOrder ();
465
+ DataExtractor buffer_data (buffer_up->GetBytes (), buffer_up->GetByteSize (),
466
+ order, ptr_size);
467
+
468
+ std::vector<ValueObjectSP> children;
469
+ auto exe_ctx_ref = valobj_sp->GetExecutionContextRef ();
470
+ // UnsafePointer/UnsafeMutablePointer have a `pointee` property.
471
+ if (unsafe_ptr.HasPointee ()) {
472
+ DataExtractor data (buffer_data, 0 , element_stride);
473
+ children.push_back (ValueObject::CreateValueObjectFromData (
474
+ " pointee" , data, exe_ctx_ref, element_type));
475
+ return children;
476
+ }
477
+
478
+ for (size_t i = 0 ; i < num_children; i++) {
479
+ StreamString idx_name;
480
+ idx_name.Printf (" [%zu]" , i);
481
+ DataExtractor data (buffer_data, i * element_stride, element_stride);
482
+ children.push_back (ValueObject::CreateValueObjectFromData (
483
+ idx_name.GetString (), data, exe_ctx_ref, element_type));
484
+ }
485
+
486
+ return children;
487
+ }
488
+
426
489
namespace lldb_private {
427
490
namespace formatters {
428
491
namespace swift {
492
+ std::vector<ValueObjectSP>
493
+ ExtractChildrenFromSwiftPointerValueObject (ValueObjectSP valobj_sp) {
494
+ auto unsafe_ptr = ::SwiftUnsafeType::Create (*valobj_sp.get ());
495
+ unsafe_ptr->Update ();
496
+ return ::ExtractChildrenFromSwiftPointerValueObject (valobj_sp,
497
+ *unsafe_ptr.get ());
498
+ }
499
+
429
500
class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
430
501
public:
431
502
UnsafeTypeSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
@@ -437,12 +508,7 @@ class UnsafeTypeSyntheticFrontEnd : public SwiftBasicTypeSyntheticFrontEnd {
437
508
size_t GetIndexOfChildWithName (ConstString name) override ;
438
509
439
510
private:
440
- ExecutionContextRef m_exe_ctx_ref;
441
- uint8_t m_ptr_size;
442
- lldb::ByteOrder m_order;
443
-
444
511
std::unique_ptr<SwiftUnsafeType> m_unsafe_ptr;
445
- size_t m_element_stride;
446
512
WritableDataBufferSP m_buffer_sp;
447
513
std::vector<ValueObjectSP> m_children;
448
514
};
@@ -458,8 +524,6 @@ lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::
458
524
if (!process_sp)
459
525
return ;
460
526
461
- m_ptr_size = process_sp->GetAddressByteSize ();
462
- m_order = process_sp->GetByteOrder ();
463
527
464
528
m_unsafe_ptr = ::SwiftUnsafeType::Create (*valobj_sp.get ());
465
529
@@ -491,62 +555,15 @@ bool lldb_private::formatters::swift::UnsafeTypeSyntheticFrontEnd::Update() {
491
555
ValueObjectSP valobj_sp = m_backend.GetSP ();
492
556
if (!valobj_sp)
493
557
return false ;
494
- m_exe_ctx_ref = valobj_sp->GetExecutionContextRef ();
495
558
496
- lldb::ProcessSP process_sp (valobj_sp->GetProcessSP ());
497
- if (!process_sp)
498
- return false ;
499
559
if (!m_unsafe_ptr)
500
560
return false ;
501
561
if (!m_unsafe_ptr->Update ())
502
562
return false ;
503
563
504
- const addr_t start_addr = m_unsafe_ptr->GetStartAddress ();
505
564
const size_t num_children = CalculateNumChildren ();
506
- const CompilerType element_type = m_unsafe_ptr->GetElementType ();
507
-
508
- auto stride = element_type.GetByteStride (process_sp.get ());
509
- if (!stride)
510
- return false ;
511
-
512
- m_element_stride = *stride;
513
- if (m_children.empty ()) {
514
- size_t buffer_size = num_children * m_element_stride;
515
- if (buffer_size > 512 *1024 *1024 ) {
516
- LLDB_LOG (GetLog (LLDBLog::DataFormatters),
517
- " Suspiciously large object: num_children={0}, stride={1}" ,
518
- num_children, m_element_stride);
519
- return false ;
520
- }
521
- m_buffer_sp.reset (new DataBufferHeap (buffer_size, 0 ));
522
-
523
- Status error;
524
- size_t read_bytes = process_sp->ReadMemory (
525
- start_addr, m_buffer_sp->GetBytes (), buffer_size, error);
526
-
527
- if (!read_bytes || error.Fail ())
528
- return false ;
529
-
530
- DataExtractor buffer_data (m_buffer_sp->GetBytes (),
531
- m_buffer_sp->GetByteSize (), m_order, m_ptr_size);
532
-
533
- // UnsafePointer/UnsafeMutablePointer have a `pointee` property.
534
- if (m_unsafe_ptr->HasPointee ()) {
535
- DataExtractor data (buffer_data, 0 , m_element_stride);
536
- m_children.push_back (CreateValueObjectFromData (
537
- " pointee" , data, m_exe_ctx_ref, element_type));
538
- return true ;
539
- }
540
-
541
- for (size_t i = 0 ; i < num_children; i++) {
542
- StreamString idx_name;
543
- idx_name.Printf (" [%zu]" , i);
544
- DataExtractor data (buffer_data, i * m_element_stride, m_element_stride);
545
- m_children.push_back (CreateValueObjectFromData (
546
- idx_name.GetString (), data, m_exe_ctx_ref, element_type));
547
- }
548
- }
549
-
565
+ m_children = ::ExtractChildrenFromSwiftPointerValueObject (valobj_sp,
566
+ *m_unsafe_ptr.get ());
550
567
return m_children.size () == num_children;
551
568
}
552
569
0 commit comments