Files
clang-p2996/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp
Jonas Devlieghere b852fb1ec5 [lldb] Move ValueObject into its own library (NFC) (#113393)
ValueObject is part of lldbCore for historical reasons, but conceptually
it deserves to be its own library. This does introduce a (link-time) circular
dependency between lldbCore and lldbValueObject, which is unfortunate
but probably unavoidable because so many things in LLDB rely on
ValueObject. We already have cycles and these libraries are never built
as dylibs so while this doesn't improve the situation, it also doesn't
make things worse.

The header includes were updated with the following command:

```
find . -type f -exec sed -i.bak "s%include \"lldb/Core/ValueObject%include \"lldb/ValueObject/ValueObject%" '{}' \;
```
2024-10-24 20:20:48 -07:00

89 lines
2.6 KiB
C++

//===-- LibCxxRangesRefView.cpp -------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "LibCxx.h"
#include "lldb/DataFormatters/FormattersHelpers.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/ValueObject/ValueObject.h"
#include "llvm/ADT/APSInt.h"
using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::formatters;
namespace lldb_private {
namespace formatters {
class LibcxxStdRangesRefViewSyntheticFrontEnd
: public SyntheticChildrenFrontEnd {
public:
LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default;
llvm::Expected<uint32_t> CalculateNumChildren() override {
// __range_ will be the sole child of this type
return 1;
}
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
// Since we only have a single child, return it
assert(idx == 0);
return m_range_sp;
}
lldb::ChildCacheState Update() override;
bool MightHaveChildren() override { return true; }
size_t GetIndexOfChildWithName(ConstString name) override {
// We only have a single child
return 0;
}
private:
/// Pointer to the dereferenced __range_ member
lldb::ValueObjectSP m_range_sp = nullptr;
};
lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::
LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
: SyntheticChildrenFrontEnd(*valobj_sp) {
if (valobj_sp)
Update();
}
lldb::ChildCacheState
lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::Update() {
ValueObjectSP range_ptr =
GetChildMemberWithName(m_backend, {ConstString("__range_")});
if (!range_ptr)
return lldb::ChildCacheState::eRefetch;
lldb_private::Status error;
m_range_sp = range_ptr->Dereference(error);
return error.Success() ? lldb::ChildCacheState::eReuse
: lldb::ChildCacheState::eRefetch;
}
lldb_private::SyntheticChildrenFrontEnd *
LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,
lldb::ValueObjectSP valobj_sp) {
if (!valobj_sp)
return nullptr;
CompilerType type = valobj_sp->GetCompilerType();
if (!type.IsValid())
return nullptr;
return new LibcxxStdRangesRefViewSyntheticFrontEnd(valobj_sp);
}
} // namespace formatters
} // namespace lldb_private