1//===-- ValueObjectConstResult.h --------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_ValueObjectConstResult_h_
11#define liblldb_ValueObjectConstResult_h_
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
17#include "lldb/Core/ValueObject.h"
18
19#include "lldb/Core/ValueObjectConstResultImpl.h"
20
21namespace lldb_private {
22
23//----------------------------------------------------------------------
24// A frozen ValueObject copied into host memory
25//----------------------------------------------------------------------
26class ValueObjectConstResult : public ValueObject
27{
28public:
29    static lldb::ValueObjectSP
30    Create (ExecutionContextScope *exe_scope,
31            lldb::ByteOrder byte_order,
32            uint32_t addr_byte_size,
33            lldb::addr_t address = LLDB_INVALID_ADDRESS);
34
35    static lldb::ValueObjectSP
36    Create (ExecutionContextScope *exe_scope,
37            const ClangASTType &clang_type,
38            const ConstString &name,
39            const DataExtractor &data,
40            lldb::addr_t address = LLDB_INVALID_ADDRESS);
41
42    static lldb::ValueObjectSP
43    Create (ExecutionContextScope *exe_scope,
44            const ClangASTType &clang_type,
45            const ConstString &name,
46            const lldb::DataBufferSP &result_data_sp,
47            lldb::ByteOrder byte_order,
48            uint32_t addr_size,
49            lldb::addr_t address = LLDB_INVALID_ADDRESS);
50
51    static lldb::ValueObjectSP
52    Create (ExecutionContextScope *exe_scope,
53            const ClangASTType &clang_type,
54            const ConstString &name,
55            lldb::addr_t address,
56            AddressType address_type,
57            uint32_t addr_byte_size);
58
59    static lldb::ValueObjectSP
60    Create (ExecutionContextScope *exe_scope,
61            Value &value,
62            const ConstString &name);
63
64    // When an expression fails to evaluate, we return an error
65    static lldb::ValueObjectSP
66    Create (ExecutionContextScope *exe_scope,
67            const Error& error);
68
69    virtual ~ValueObjectConstResult();
70
71    virtual uint64_t
72    GetByteSize();
73
74    virtual lldb::ValueType
75    GetValueType() const;
76
77    virtual size_t
78    CalculateNumChildren();
79
80    virtual ConstString
81    GetTypeName();
82
83    virtual bool
84    IsInScope ();
85
86    void
87    SetByteSize (size_t size);
88
89    virtual lldb::ValueObjectSP
90    Dereference (Error &error);
91
92    virtual ValueObject *
93    CreateChildAtIndex (size_t idx, bool synthetic_array_member, int32_t synthetic_index);
94
95    virtual lldb::ValueObjectSP
96    GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create);
97
98    virtual lldb::ValueObjectSP
99    AddressOf (Error &error);
100
101    virtual lldb::addr_t
102    GetAddressOf (bool scalar_is_load_address = true,
103                  AddressType *address_type = NULL);
104
105    virtual size_t
106    GetPointeeData (DataExtractor& data,
107                    uint32_t item_idx = 0,
108					uint32_t item_count = 1);
109
110    virtual lldb::addr_t
111    GetLiveAddress()
112    {
113        return m_impl.GetLiveAddress();
114    }
115
116    virtual void
117    SetLiveAddress(lldb::addr_t addr = LLDB_INVALID_ADDRESS,
118                   AddressType address_type = eAddressTypeLoad)
119    {
120        m_impl.SetLiveAddress(addr,
121                              address_type);
122    }
123
124    virtual lldb::ValueObjectSP
125    GetDynamicValue (lldb::DynamicValueType valueType);
126
127protected:
128    virtual bool
129    UpdateValue ();
130
131    virtual ClangASTType
132    GetClangTypeImpl ();
133
134    ConstString m_type_name;
135    uint64_t m_byte_size;
136
137    ValueObjectConstResultImpl m_impl;
138
139private:
140    friend class ValueObjectConstResultImpl;
141    ValueObjectConstResult (ExecutionContextScope *exe_scope,
142                            lldb::ByteOrder byte_order,
143                            uint32_t addr_byte_size,
144                            lldb::addr_t address);
145
146    ValueObjectConstResult (ExecutionContextScope *exe_scope,
147                            const ClangASTType &clang_type,
148                            const ConstString &name,
149                            const DataExtractor &data,
150                            lldb::addr_t address);
151
152    ValueObjectConstResult (ExecutionContextScope *exe_scope,
153                            const ClangASTType &clang_type,
154                            const ConstString &name,
155                            const lldb::DataBufferSP &result_data_sp,
156                            lldb::ByteOrder byte_order,
157                            uint32_t addr_size,
158                            lldb::addr_t address);
159
160    ValueObjectConstResult (ExecutionContextScope *exe_scope,
161                            const ClangASTType &clang_type,
162                            const ConstString &name,
163                            lldb::addr_t address,
164                            AddressType address_type,
165                            uint32_t addr_byte_size);
166
167    ValueObjectConstResult (ExecutionContextScope *exe_scope,
168                            const Value &value,
169                            const ConstString &name);
170
171    ValueObjectConstResult (ExecutionContextScope *exe_scope,
172                            const Error& error);
173
174    DISALLOW_COPY_AND_ASSIGN (ValueObjectConstResult);
175};
176
177} // namespace lldb_private
178
179#endif  // liblldb_ValueObjectConstResult_h_
180