@@ -3579,129 +3579,108 @@ bool TypeSystemClang::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
3579
3579
CompilerType *dynamic_pointee_type,
3580
3580
bool check_cplusplus,
3581
3581
bool check_objc) {
3582
+ if (dynamic_pointee_type)
3583
+ dynamic_pointee_type->Clear ();
3584
+ if (!type)
3585
+ return false ;
3586
+
3587
+ auto set_dynamic_pointee_type = [&](clang::QualType type) {
3588
+ if (dynamic_pointee_type)
3589
+ dynamic_pointee_type->SetCompilerType (weak_from_this (),
3590
+ type.getAsOpaquePtr ());
3591
+ };
3592
+
3582
3593
clang::QualType pointee_qual_type;
3583
- if (type) {
3584
- clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3585
- bool success = false ;
3586
- const clang::Type::TypeClass type_class = qual_type->getTypeClass ();
3587
- switch (type_class) {
3588
- case clang::Type::Builtin:
3589
- if (check_objc &&
3590
- llvm::cast<clang::BuiltinType>(qual_type)->getKind () ==
3591
- clang::BuiltinType::ObjCId) {
3592
- if (dynamic_pointee_type)
3593
- dynamic_pointee_type->SetCompilerType (weak_from_this (), type);
3594
- return true ;
3595
- }
3596
- break ;
3594
+ clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3595
+ switch (qual_type->getTypeClass ()) {
3596
+ case clang::Type::Builtin:
3597
+ if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind () ==
3598
+ clang::BuiltinType::ObjCId) {
3599
+ set_dynamic_pointee_type (qual_type);
3600
+ return true ;
3601
+ }
3602
+ return false ;
3597
3603
3598
- case clang::Type::ObjCObjectPointer:
3599
- if (check_objc) {
3600
- if (const auto *objc_pointee_type =
3601
- qual_type->getPointeeType ().getTypePtrOrNull ()) {
3602
- if (const auto *objc_object_type =
3603
- llvm::dyn_cast_or_null<clang::ObjCObjectType>(
3604
- objc_pointee_type)) {
3605
- if (objc_object_type->isObjCClass ())
3606
- return false ;
3607
- }
3608
- }
3609
- if (dynamic_pointee_type)
3610
- dynamic_pointee_type->SetCompilerType (
3611
- weak_from_this (),
3612
- llvm::cast<clang::ObjCObjectPointerType>(qual_type)
3613
- ->getPointeeType ()
3614
- .getAsOpaquePtr ());
3615
- return true ;
3604
+ case clang::Type::ObjCObjectPointer:
3605
+ if (!check_objc)
3606
+ return false ;
3607
+ if (const auto *objc_pointee_type =
3608
+ qual_type->getPointeeType ().getTypePtrOrNull ()) {
3609
+ if (const auto *objc_object_type =
3610
+ llvm::dyn_cast_or_null<clang::ObjCObjectType>(
3611
+ objc_pointee_type)) {
3612
+ if (objc_object_type->isObjCClass ())
3613
+ return false ;
3616
3614
}
3617
- break ;
3615
+ }
3616
+ set_dynamic_pointee_type (
3617
+ llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType ());
3618
+ return true ;
3618
3619
3619
- case clang::Type::Pointer:
3620
- pointee_qual_type =
3621
- llvm::cast<clang::PointerType>(qual_type)->getPointeeType ();
3622
- success = true ;
3623
- break ;
3620
+ case clang::Type::Pointer:
3621
+ pointee_qual_type =
3622
+ llvm::cast<clang::PointerType>(qual_type)->getPointeeType ();
3623
+ break ;
3624
3624
3625
- case clang::Type::LValueReference:
3626
- case clang::Type::RValueReference:
3627
- pointee_qual_type =
3628
- llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType ();
3629
- success = true ;
3630
- break ;
3625
+ case clang::Type::LValueReference:
3626
+ case clang::Type::RValueReference:
3627
+ pointee_qual_type =
3628
+ llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType ();
3629
+ break ;
3631
3630
3631
+ default :
3632
+ return false ;
3633
+ }
3634
+
3635
+ // Check to make sure what we are pointing to is a possible dynamic C++ type
3636
+ // We currently accept any "void *" (in case we have a class that has been
3637
+ // watered down to an opaque pointer) and virtual C++ classes.
3638
+ switch (pointee_qual_type.getCanonicalType ()->getTypeClass ()) {
3639
+ case clang::Type::Builtin:
3640
+ switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind ()) {
3641
+ case clang::BuiltinType::UnknownAny:
3642
+ case clang::BuiltinType::Void:
3643
+ set_dynamic_pointee_type (pointee_qual_type);
3644
+ return true ;
3632
3645
default :
3633
- break ;
3646
+ return false ;
3634
3647
}
3635
3648
3636
- if (success) {
3637
- // Check to make sure what we are pointing too is a possible dynamic C++
3638
- // type We currently accept any "void *" (in case we have a class that
3639
- // has been watered down to an opaque pointer) and virtual C++ classes.
3640
- const clang::Type::TypeClass pointee_type_class =
3641
- pointee_qual_type.getCanonicalType ()->getTypeClass ();
3642
- switch (pointee_type_class) {
3643
- case clang::Type::Builtin:
3644
- switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind ()) {
3645
- case clang::BuiltinType::UnknownAny:
3646
- case clang::BuiltinType::Void:
3647
- if (dynamic_pointee_type)
3648
- dynamic_pointee_type->SetCompilerType (
3649
- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3650
- return true ;
3651
- default :
3652
- break ;
3653
- }
3654
- break ;
3655
-
3656
- case clang::Type::Record:
3657
- if (check_cplusplus) {
3658
- clang::CXXRecordDecl *cxx_record_decl =
3659
- pointee_qual_type->getAsCXXRecordDecl ();
3660
- if (cxx_record_decl) {
3661
- bool is_complete = cxx_record_decl->isCompleteDefinition ();
3662
-
3663
- if (is_complete)
3664
- success = cxx_record_decl->isDynamicClass ();
3665
- else {
3666
- if (std::optional<ClangASTMetadata> metadata =
3667
- GetMetadata (cxx_record_decl))
3668
- success = metadata->GetIsDynamicCXXType ();
3669
- else {
3670
- is_complete = GetType (pointee_qual_type).GetCompleteType ();
3671
- if (is_complete)
3672
- success = cxx_record_decl->isDynamicClass ();
3673
- else
3674
- success = false ;
3675
- }
3676
- }
3649
+ case clang::Type::Record: {
3650
+ if (!check_cplusplus)
3651
+ return false ;
3652
+ clang::CXXRecordDecl *cxx_record_decl =
3653
+ pointee_qual_type->getAsCXXRecordDecl ();
3654
+ if (!cxx_record_decl)
3655
+ return false ;
3677
3656
3678
- if (success) {
3679
- if (dynamic_pointee_type)
3680
- dynamic_pointee_type->SetCompilerType (
3681
- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3682
- return true ;
3683
- }
3684
- }
3685
- }
3686
- break ;
3657
+ bool success;
3658
+ if (cxx_record_decl->isCompleteDefinition ())
3659
+ success = cxx_record_decl->isDynamicClass ();
3660
+ else if (std::optional<ClangASTMetadata> metadata =
3661
+ GetMetadata (cxx_record_decl))
3662
+ success = metadata->GetIsDynamicCXXType ();
3663
+ else if (GetType (pointee_qual_type).GetCompleteType ())
3664
+ success = cxx_record_decl->isDynamicClass ();
3665
+ else
3666
+ success = false ;
3687
3667
3688
- case clang::Type::ObjCObject:
3689
- case clang::Type::ObjCInterface:
3690
- if (check_objc) {
3691
- if (dynamic_pointee_type)
3692
- dynamic_pointee_type->SetCompilerType (
3693
- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3694
- return true ;
3695
- }
3696
- break ;
3668
+ if (success)
3669
+ set_dynamic_pointee_type (pointee_qual_type);
3670
+ return success;
3671
+ }
3697
3672
3698
- default :
3699
- break ;
3700
- }
3673
+ case clang::Type::ObjCObject:
3674
+ case clang::Type::ObjCInterface:
3675
+ if (check_objc) {
3676
+ set_dynamic_pointee_type (pointee_qual_type);
3677
+ return true ;
3701
3678
}
3679
+ break ;
3680
+
3681
+ default :
3682
+ break ;
3702
3683
}
3703
- if (dynamic_pointee_type)
3704
- dynamic_pointee_type->Clear ();
3705
3684
return false ;
3706
3685
}
3707
3686
0 commit comments