Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Language/CPlusPlus/LibCxxRangesRefView.cpp
39642 views
1
//===-- LibCxxRangesRefView.cpp -------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "LibCxx.h"
10
11
#include "lldb/Core/ValueObject.h"
12
#include "lldb/DataFormatters/FormattersHelpers.h"
13
#include "lldb/Utility/ConstString.h"
14
#include "llvm/ADT/APSInt.h"
15
16
using namespace lldb;
17
using namespace lldb_private;
18
using namespace lldb_private::formatters;
19
20
namespace lldb_private {
21
namespace formatters {
22
23
class LibcxxStdRangesRefViewSyntheticFrontEnd
24
: public SyntheticChildrenFrontEnd {
25
public:
26
LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
27
28
~LibcxxStdRangesRefViewSyntheticFrontEnd() override = default;
29
30
llvm::Expected<uint32_t> CalculateNumChildren() override {
31
// __range_ will be the sole child of this type
32
return 1;
33
}
34
35
lldb::ValueObjectSP GetChildAtIndex(uint32_t idx) override {
36
// Since we only have a single child, return it
37
assert(idx == 0);
38
return m_range_sp;
39
}
40
41
lldb::ChildCacheState Update() override;
42
43
bool MightHaveChildren() override { return true; }
44
45
size_t GetIndexOfChildWithName(ConstString name) override {
46
// We only have a single child
47
return 0;
48
}
49
50
private:
51
/// Pointer to the dereferenced __range_ member
52
lldb::ValueObjectSP m_range_sp = nullptr;
53
};
54
55
lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::
56
LibcxxStdRangesRefViewSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
57
: SyntheticChildrenFrontEnd(*valobj_sp) {
58
if (valobj_sp)
59
Update();
60
}
61
62
lldb::ChildCacheState
63
lldb_private::formatters::LibcxxStdRangesRefViewSyntheticFrontEnd::Update() {
64
ValueObjectSP range_ptr =
65
GetChildMemberWithName(m_backend, {ConstString("__range_")});
66
if (!range_ptr)
67
return lldb::ChildCacheState::eRefetch;
68
69
lldb_private::Status error;
70
m_range_sp = range_ptr->Dereference(error);
71
72
return error.Success() ? lldb::ChildCacheState::eReuse
73
: lldb::ChildCacheState::eRefetch;
74
}
75
76
lldb_private::SyntheticChildrenFrontEnd *
77
LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,
78
lldb::ValueObjectSP valobj_sp) {
79
if (!valobj_sp)
80
return nullptr;
81
CompilerType type = valobj_sp->GetCompilerType();
82
if (!type.IsValid())
83
return nullptr;
84
return new LibcxxStdRangesRefViewSyntheticFrontEnd(valobj_sp);
85
}
86
87
} // namespace formatters
88
} // namespace lldb_private
89
90