summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Prantl <adrian-prantl@users.noreply.github.com>2023-11-08 09:54:41 -0800
committerGitHub <noreply@github.com>2023-11-08 09:54:41 -0800
commit767ce07c2d4c312188623441979d620b9708ee99 (patch)
treeccc34f77ade48ef9ed5f3625aa39f9010e6950a9
parent5ef446790f4d9820999bfb2dd5f180c3e7cfdcb6 (diff)
Simplify ValueObject::GetQualifiedRepresentationIfAvailable(). (#71559)
I received a couple of nullptr-deref crash reports with no line numbers in this function. The way the function was written it was a bit diffucult to keep track of when result_sp could be null, so this patch simplifies the function to make it more obvious when a nullptr can be contained in the variable.
-rw-r--r--lldb/source/Core/ValueObject.cpp36
1 files changed, 16 insertions, 20 deletions
diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp
index bdb1bef633d8..a7f7ee64282d 100644
--- a/lldb/source/Core/ValueObject.cpp
+++ b/lldb/source/Core/ValueObject.cpp
@@ -2594,34 +2594,30 @@ ValueObjectSP ValueObject::CreateConstantValue(ConstString name) {
ValueObjectSP ValueObject::GetQualifiedRepresentationIfAvailable(
lldb::DynamicValueType dynValue, bool synthValue) {
- ValueObjectSP result_sp(GetSP());
-
+ ValueObjectSP result_sp;
switch (dynValue) {
case lldb::eDynamicCanRunTarget:
case lldb::eDynamicDontRunTarget: {
- if (!result_sp->IsDynamic()) {
- if (result_sp->GetDynamicValue(dynValue))
- result_sp = result_sp->GetDynamicValue(dynValue);
- }
+ if (!IsDynamic())
+ result_sp = GetDynamicValue(dynValue);
} break;
case lldb::eNoDynamicValues: {
- if (result_sp->IsDynamic()) {
- if (result_sp->GetStaticValue())
- result_sp = result_sp->GetStaticValue();
- }
+ if (IsDynamic())
+ result_sp = GetStaticValue();
} break;
}
+ if (!result_sp)
+ result_sp = GetSP();
+ assert(result_sp);
- if (synthValue) {
- if (!result_sp->IsSynthetic()) {
- if (result_sp->GetSyntheticValue())
- result_sp = result_sp->GetSyntheticValue();
- }
- } else {
- if (result_sp->IsSynthetic()) {
- if (result_sp->GetNonSyntheticValue())
- result_sp = result_sp->GetNonSyntheticValue();
- }
+ bool is_synthetic = result_sp->IsSynthetic();
+ if (synthValue && !is_synthetic) {
+ if (auto synth_sp = result_sp->GetSyntheticValue())
+ return synth_sp;
+ }
+ if (!synthValue && is_synthetic) {
+ if (auto non_synth_sp = result_sp->GetNonSyntheticValue())
+ return non_synth_sp;
}
return result_sp;