@@ -833,6 +833,22 @@ SwiftLanguageRuntime::GetNumChildren(CompilerType type,
833
833
type.GetMangledTypeName ().GetString ());
834
834
}
835
835
836
+ if (auto *ati = llvm::dyn_cast<swift::reflection::ArrayTypeInfo>(ti)) {
837
+ LLDB_LOG (GetLog (LLDBLog::Types), " {0}: ArrayTypeInfo()" ,
838
+ type.GetMangledTypeName ().GetCString ());
839
+ auto *el_ti = ati->getElementTypeInfo ();
840
+ if (!el_ti)
841
+ return llvm::createStringError (" Array without element type info: " +
842
+ type.GetMangledTypeName ().GetString ());
843
+ // We could also get the value out of the mangled type name, but
844
+ // this is cheaper.
845
+ unsigned stride = el_ti->getStride ();
846
+ if (!stride)
847
+ return llvm::createStringError (" Array without element stride: " +
848
+ type.GetMangledTypeName ().GetString ());
849
+ return ati->getSize () / stride;
850
+ }
851
+
836
852
LogUnimplementedTypeKind (__FUNCTION__, type);
837
853
return llvm::createStringError (" GetNumChildren unimplemented for type " +
838
854
type.GetMangledTypeName ().GetString ());
@@ -1451,6 +1467,40 @@ llvm::Expected<CompilerType> SwiftLanguageRuntime::GetChildCompilerTypeAtIndex(
1451
1467
" is out of bounds (" + llvm::Twine (i - 1 ) +
1452
1468
" )" );
1453
1469
}
1470
+ // Fixed array.
1471
+ if (auto *ati = llvm::dyn_cast<swift::reflection::ArrayTypeInfo>(ti)) {
1472
+ LLDB_LOG (GetLog (LLDBLog::Types), " {0}: ArrayTypeInfo()" ,
1473
+ type.GetMangledTypeName ().GetCString ());
1474
+ auto *el_ti = ati->getElementTypeInfo ();
1475
+ if (!el_ti)
1476
+ return llvm::createStringError (" array without element type info: " +
1477
+ type.GetMangledTypeName ().GetString ());
1478
+ child_name.clear ();
1479
+ llvm::raw_string_ostream (child_name) << idx;
1480
+ child_byte_size = el_ti->getSize ();
1481
+ child_byte_offset = el_ti->getStride () * idx;
1482
+ if (!ignore_array_bounds &&
1483
+ (int64_t )child_byte_offset > (int64_t )ati->getSize ())
1484
+ return llvm::createStringError (" array index out of bounds" );
1485
+
1486
+ child_bitfield_bit_size = 0 ;
1487
+ child_bitfield_bit_offset = 0 ;
1488
+ child_is_base_class = false ;
1489
+ child_is_deref_of_parent = false ;
1490
+ language_flags = 0 ;
1491
+
1492
+ swift::Demangle::Demangler dem;
1493
+ swift::Demangle::NodePointer global =
1494
+ dem.demangleSymbol (type.GetMangledTypeName ().GetStringRef ());
1495
+ using Kind = Node::Kind;
1496
+ auto *dem_array_type = swift_demangle::ChildAtPath (
1497
+ global, {Kind::TypeMangling, Kind::Type, Kind::BuiltinFixedArray});
1498
+ if (!dem_array_type || dem_array_type->getNumChildren () != 2 )
1499
+ return llvm::createStringError (" Expected fixed array, but found: " +
1500
+ type.GetMangledTypeName ().GetString ());
1501
+ return ts->RemangleAsType (dem, dem_array_type->getChild (1 ),
1502
+ ts->GetManglingFlavor ());
1503
+ }
1454
1504
if (llvm::dyn_cast_or_null<swift::reflection::BuiltinTypeInfo>(ti)) {
1455
1505
// Clang enums have an artificial rawValue property. We could
1456
1506
// consider handling them here, but
0 commit comments