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%" '{}' \;
```
89 lines
2.6 KiB
C++
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
|