diff options
Diffstat (limited to 'source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp')
| -rw-r--r-- | source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp b/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp index 0cdb0b26cf3bd..489ac4d960721 100644 --- a/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp +++ b/source/Plugins/Language/CPlusPlus/LibCxxBitset.cpp @@ -79,17 +79,24 @@ ValueObjectSP BitsetFrontEnd::GetChildAtIndex(size_t idx) {    CompilerType type;    ValueObjectSP chunk;    // For small bitsets __first_ is not an array, but a plain size_t. -  if (m_first->GetCompilerType().IsArrayType(&type, nullptr, nullptr)) -    chunk = m_first->GetChildAtIndex( -        idx / type.GetBitSize(ctx.GetBestExecutionContextScope()), true); -  else { +  if (m_first->GetCompilerType().IsArrayType(&type, nullptr, nullptr)) { +    llvm::Optional<uint64_t> bit_size = +        type.GetBitSize(ctx.GetBestExecutionContextScope()); +    if (!bit_size || *bit_size == 0) +      return {}; +    chunk = m_first->GetChildAtIndex(idx / *bit_size, true); +  } else {      type = m_first->GetCompilerType();      chunk = m_first;    }    if (!type || !chunk) -    return ValueObjectSP(); +    return {}; -  size_t chunk_idx = idx % type.GetBitSize(ctx.GetBestExecutionContextScope()); +  llvm::Optional<uint64_t> bit_size = +      type.GetBitSize(ctx.GetBestExecutionContextScope()); +  if (!bit_size || *bit_size == 0) +    return {}; +  size_t chunk_idx = idx % *bit_size;    uint8_t value = !!(chunk->GetValueAsUnsigned(0) & (uint64_t(1) << chunk_idx));    DataExtractor data(&value, sizeof(value), m_byte_order, m_byte_size);  | 
