Skip to content

Commit ebaeecc

Browse files
authored
[lldb] Use early returns in TypeSystemClang::IsPossibleDynamicType (llvm#137630)
Remove a couple of levels of indentation before I need to add another one to fix a bug.
1 parent da70992 commit ebaeecc

File tree

1 file changed

+88
-109
lines changed

1 file changed

+88
-109
lines changed

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 88 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -3579,129 +3579,108 @@ bool TypeSystemClang::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
35793579
CompilerType *dynamic_pointee_type,
35803580
bool check_cplusplus,
35813581
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+
35823593
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;
35973603

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;
36163614
}
3617-
break;
3615+
}
3616+
set_dynamic_pointee_type(
3617+
llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
3618+
return true;
36183619

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;
36243624

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;
36313630

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;
36323645
default:
3633-
break;
3646+
return false;
36343647
}
36353648

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;
36773656

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;
36873667

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+
}
36973672

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;
37013678
}
3679+
break;
3680+
3681+
default:
3682+
break;
37023683
}
3703-
if (dynamic_pointee_type)
3704-
dynamic_pointee_type->Clear();
37053684
return false;
37063685
}
37073686

0 commit comments

Comments
 (0)