ValueObject.cpp revision 21f37ad875d4f50d1b4b3d307e120f6d27103730
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ValueObject.cpp -----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObject.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
13eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include <stdlib.h>
14eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/Support/raw_ostream.h"
18b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "clang/AST/Type.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
221391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata#include "lldb/Core/Debugger.h"
23979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata#include "lldb/Core/Log.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
26427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
27e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h"
30e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
33cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton
34f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h"
35f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
361674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
404ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
41b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
42afb7c85df796f74262917e44dd68f668dade3911Enrico Granata#include "lldb/Target/ObjCLanguageRuntime.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
45eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata#include "lldb/Utility/RefCounter.h"
4986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
59fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) :
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
61fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (&parent),
62dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (parent.GetUpdatePoint ()),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
6717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
6817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
6917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
7017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
714ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
7247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(parent.GetManager()),
7317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
7417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
7547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
76e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
7747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
7811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
7923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
807dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    m_last_format_mgr_dynamic(parent.m_last_format_mgr_dynamic),
8123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
8223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
8323ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
84e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
8521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_user_id_of_forced_summary(),
8617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
8717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
8817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
9000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_pointers_point_to_load_addrs (false),
911391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
92886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
94e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
95979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    m_is_child_at_offset(false),
96441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata    m_is_expression_result(parent.m_is_expression_result),
9786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject(this);
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) :
106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    UserID (++g_value_obj_uid), // Unique identifier for every value object
107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (NULL),
108dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (exe_scope),
109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_name (),
110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_data (),
111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value (),
112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_error (),
113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_str (),
114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_str (),
115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_location_str (),
116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_summary_str (),
117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_object_desc_str (),
11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(),
119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children (),
120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_synthetic_children (),
12147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
122e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
12347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_format (eFormatDefault),
12523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
126afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    m_last_format_mgr_dynamic(lldb::eNoDynamicValues),
12723ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
12823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
12923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
130e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
13121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_user_id_of_forced_summary(),
132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_is_valid (false),
133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_did_change (false),
134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children_count_valid (false),
135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_valid (false),
136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_pointers_point_to_load_addrs (false),
1371391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
138886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
1399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
140e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
141979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    m_is_child_at_offset(false),
142afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    m_is_expression_result(false),
14386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager = new ValueObjectManager();
14647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject (this);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor
151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject ()
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
157886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format)
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
159afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return UpdateValueIfNeeded(m_last_format_mgr_dynamic, update_format);
160afb7c85df796f74262917e44dd68f668dade3911Enrico Granata}
161afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
162afb7c85df796f74262917e44dd68f668dade3911Enrico Granatabool
163afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateValueIfNeeded (lldb::DynamicValueType use_dynamic, bool update_format)
164afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{
1651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
166886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (update_format)
167afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateFormatsIfNeeded(use_dynamic);
1681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
169d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
170d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
171d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
172d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
173d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool first_update = m_update_point.IsFirstEvaluation();
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_update_point.NeedsUpdating())
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_update_point.SetUpdated();
179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Save the old value using swap to avoid a string copy which
181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // also will clear our m_value_str
182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_value_str.empty())
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = false;
185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = true;
189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_str.swap (m_value_str);
190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_value_str.clear();
191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
194f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const bool value_was_valid = GetValueIsValid();
196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueDidChange (false);
197ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.Clear();
199ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Call the pure virtual function to update the value
201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        bool success = UpdateValue ();
202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (success);
204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (first_update)
206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (false);
207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else if (!m_value_did_change && success == false)
208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // The value wasn't gotten successfully, so we mark this
210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // as changed if the value used to be valid and now isn't
211fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (value_was_valid);
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2171391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid
218afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::UpdateFormatsIfNeeded(lldb::DynamicValueType use_dynamic)
2191391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{
220979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
221979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (log)
222979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        log->Printf("checking for FormatManager revisions. VO named %s is at revision %d, while the format manager is at revision %d",
223979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata           GetName().GetCString(),
2241391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           m_last_format_mgr_revision,
225979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata           Debugger::Formatting::ValueFormats::GetCurrentRevision());
22621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (HasCustomSummaryFormat() && m_update_point.GetModID() != m_user_id_of_forced_summary)
2271a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
2281a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClearCustomSummaryFormat();
2291a102087f54079c25c8827afac6153a44ca535daEnrico Granata        m_summary_str.clear();
2301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
231afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if ( (m_last_format_mgr_revision != Debugger::Formatting::ValueFormats::GetCurrentRevision()) ||
232afb7c85df796f74262917e44dd68f668dade3911Enrico Granata          m_last_format_mgr_dynamic != use_dynamic)
2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
2341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_summary_format.get())
235f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            m_last_summary_format.reset((StringSummaryFormat*)NULL);
2361391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_value_format.get())
237e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_value_format.reset(/*(ValueFormat*)NULL*/);
238e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (m_last_synthetic_filter.get())
239e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_synthetic_filter.reset(/*(SyntheticFilter*)NULL*/);
2409ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata
2419ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = NULL;
2428a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
243441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata        Debugger::Formatting::ValueFormats::Get(*this, lldb::eNoDynamicValues, m_last_value_format);
244afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        Debugger::Formatting::GetSummaryFormat(*this, use_dynamic, m_last_summary_format);
245afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        Debugger::Formatting::GetSyntheticFilter(*this, use_dynamic, m_last_synthetic_filter);
2468a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
2478a717e596312951672ecd8c54df2d255e6da20baEnrico Granata        m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision();
248afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        m_last_format_mgr_dynamic = use_dynamic;
249f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
250f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
2511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
2521391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata}
2531391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
257afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateValueIfNeeded(false);
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
262bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError()
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
264afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateValueIfNeeded(false);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
275fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString ()
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
277afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (UpdateValueIfNeeded(false))
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
2896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
332fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar)
3330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
334c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
335c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    {
336c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        ExecutionContext exe_ctx;
337c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
338c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        if (exe_scope)
339c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata            exe_scope->CalculateExecutionContext(exe_ctx);
340c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
341c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        return scalar.IsValid();
342c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    }
343c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata    else
344c92eb4004a354b0ea085b610b2ba991e575b1c32Enrico Granata        return false;
3450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
3460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
3470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
34817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
361fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange ()
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
363fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    GetValueAsCString ();
36417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
377917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
378917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
379afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
380917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (idx < GetNumChildren())
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
382917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Check if we have already made the child value object?
383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (can_create && m_children[idx] == NULL)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // No we haven't created the child at this index, so lets have our
386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // subclass do it and cache the result for quick future access.
387917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            m_children[idx] = CreateChildAtIndex (idx, false, 0);
388e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
389917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_children[idx] != NULL)
391917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return m_children[idx]->GetSP();
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
401462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4095d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
416afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        UpdateValueIfNeeded(false);
417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::vector<uint32_t> child_indexes;
419917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    void *clang_type = GetClangType();
421917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
422917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
423917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      clang_type,
424917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      name.GetCString(),
425917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      omit_empty_base_classes,
426917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      child_indexes);
427917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (num_child_indexes > 0)
428e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
429917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
430917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
431e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
432917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        child_sp = GetChildAtIndex(*pos, can_create);
433917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        for (++pos; pos != end; ++pos)
434917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
435917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (child_sp)
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
437917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
438917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp = new_child_sp;
439917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
440917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
441917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
442917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp.reset();
443e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
444917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47347da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
476bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham    ValueObject *valobj = NULL;
477e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
47924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds = synthetic_array_member;
480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::string child_name_str;
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_byte_size = 0;
482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    int32_t child_byte_offset = 0;
483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_size = 0;
484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_offset = 0;
485917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_base_class = false;
486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_deref_of_parent = false;
487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const bool transparent_pointers = synthetic_array_member == false;
489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t clang_type = GetClangType();
491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t child_clang_type;
492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    ExecutionContext exe_ctx;
494917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_ast,
498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  GetName().GetCString(),
499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_type,
500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  idx,
501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  transparent_pointers,
502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  omit_empty_base_classes,
50324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                  ignore_array_bounds,
504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_name_str,
505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_size,
506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_offset,
507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_size,
508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_offset,
509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_base_class,
510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_deref_of_parent);
511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (child_clang_type && child_byte_size)
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (synthetic_index)
514917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_byte_offset += child_byte_size * synthetic_index;
515917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
516917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        ConstString child_name;
517917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (!child_name_str.empty())
518917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_name.SetCString (child_name_str.c_str());
519917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
520917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        valobj = new ValueObjectChild (*this,
521917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       clang_ast,
522917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_clang_type,
523917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_name,
524917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_size,
525917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_offset,
526917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_size,
527917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_offset,
528917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_base_class,
529917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_deref_of_parent);
530917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_pointers_point_to_load_addrs)
531917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
533e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
53447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
538fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString ()
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5407dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (UpdateValueIfNeeded (true))
5411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
544f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            SummaryFormat *summary_format = GetSummaryFormat().get();
5451a102087f54079c25c8827afac6153a44ca535daEnrico Granata
5461a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (summary_format)
5471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
548f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                m_summary_str = summary_format->FormatObject(GetSP());
5491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            }
550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            else
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
552f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                clang_type_t clang_type = GetClangType();
553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
55490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                // Do some default printout for function pointers
555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                if (clang_type)
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    StreamString sstr;
558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    clang_type_t elem_or_pointee_clang_type;
559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
560f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          GetClangAST(),
561f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          &elem_or_pointee_clang_type));
562f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    ExecutionContextScope *exe_scope = GetExecutionContextScope();
564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    if (exe_scope)
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
56690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                        if (ClangASTContext::IsFunctionPointerType (clang_type))
567fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            AddressType func_ptr_address_type = eAddressTypeInvalid;
569f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
570fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                switch (func_ptr_address_type)
57403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
575f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeInvalid:
576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeFile:
577f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
579f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeLoad:
58003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Address so_addr;
582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Target *target = exe_scope->CalculateTarget();
583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        if (target && target->GetSectionLoadList().IsEmpty() == false)
584fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        {
585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            {
587f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                so_addr.Dump (&sstr,
588f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              exe_scope,
589f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleResolvedDescription,
590f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleSectionNameOffset);
591f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            }
592fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        }
59303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
594f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
596f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeHost:
597f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
598f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
599f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            }
600f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (sstr.GetSize() > 0)
601f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
602f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.assign (1, '(');
603f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (sstr.GetData(), sstr.GetSize());
604f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (1, ')');
605fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6171a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool
6181a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer)
6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6201a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6211a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(),
6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6241a102087f54079c25c8827afac6153a44ca535daEnrico Granata    bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6251a102087f54079c25c8827afac6153a44ca535daEnrico Granata            ClangASTContext::IsCharType (elem_or_pointee_clang_type));
6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!is_char_arr_ptr)
6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return false;
6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!check_pointer)
6291a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.Test(ClangASTContext::eTypeIsArray))
6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6331a102087f54079c25c8827afac6153a44ca535daEnrico Granata    AddressType cstr_address_type = eAddressTypeInvalid;
6341a102087f54079c25c8827afac6153a44ca535daEnrico Granata    cstr_address = GetAddressOf (cstr_address_type, true);
6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return (cstr_address != LLDB_INVALID_ADDRESS);
6361a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
6371a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6381a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid
6391a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s,
6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                               Error& error,
64186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               uint32_t max_length,
64286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               bool honor_array,
64386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               lldb::Format item_format)
6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (max_length == 0)
64786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        max_length = 128;   // FIXME this should be a setting, or a formatting parameter
6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t clang_type = GetClangType();
6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6541a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
6561a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
6571a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
6581a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (exe_scope)
6591a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
6601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Target *target = exe_scope->CalculateTarget();
661979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                if (target == NULL)
662979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                {
663979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    s << "<no target to read from>";
664979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                }
665979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                else
6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    AddressType cstr_address_type = eAddressTypeInvalid;
6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    size_t cstr_len = 0;
6711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    bool capped_data = false;
6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (type_flags.Test (ClangASTContext::eTypeIsArray))
6731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have an array
6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_len = ClangASTContext::GetArraySize (clang_type);
67686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > max_length)
6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
67886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            capped_data = true;
67986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetAddressOf (cstr_address_type, true);
6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
6831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
6841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have a pointer
6861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetPointerValue (cstr_address_type, true);
6871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
688979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    if (cstr_address == LLDB_INVALID_ADDRESS)
689979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    {
690979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                        s << "<invalid address for data>";
691979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    }
692979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                    else
6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Address cstr_so_addr (NULL, cstr_address);
6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        DataExtractor data;
6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        size_t bytes_read = 0;
6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        std::vector<char> data_buffer;
6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        bool prefer_file_cache = false;
69986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > 0 && honor_array)
7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
7011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize(cstr_len);
7021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            bytes_read = target->ReadMemory (cstr_so_addr,
7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             prefer_file_cache,
7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             &data_buffer.front(),
7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             cstr_len,
7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             error);
7081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (bytes_read > 0)
7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
71386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           bytes_read,        // How many bytes to print?
7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (capped_data)
7211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    s << "...";
7221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
724979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            else
725979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "\"<data not available>\"";
7261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
72986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
73086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            const size_t k_max_buf_size = 64;
7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize (k_max_buf_size + 1);
7321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            // NULL terminate in case we don't get the entire C string
7331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.back() = '\0';
7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7361a102087f54079c25c8827afac6153a44ca535daEnrico Granata
737979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            bool any_data = false;
738979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
7401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            while ((bytes_read = target->ReadMemory (cstr_so_addr,
7411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     prefer_file_cache,
7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     &data_buffer.front(),
7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     k_max_buf_size,
7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     error)) > 0)
7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
746979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                any_data = true;
7471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                size_t len = strlen(&data_buffer.front());
7481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len == 0)
7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len > bytes_read)
7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    len = bytes_read;
75286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len > cstr_len)
75386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    len = cstr_len;
7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
75786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           len,               // How many bytes to print?
7601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7641a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len < k_max_buf_size)
7661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
76786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len >= cstr_len)
76886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                {
76986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    s << "...";
77086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    break;
77186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                }
77286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                cstr_len -= len;
7731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                cstr_so_addr.Slide (k_max_buf_size);
7741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
775979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
776979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                            if (any_data == false)
777979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                s << "<data not available>";
778979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
7821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
7831a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
7841a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7851a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
7861a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
7871a102087f54079c25c8827afac6153a44ca535daEnrico Granata        error.SetErrorString("impossible to read a string from this object");
788979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        s << "<not a string object>";
7891a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7901a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
7911a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7924ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
793fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription ()
7944ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
7967dfb1bb0c83c8472e6736c380e816158c4916acdEnrico Granata    if (!UpdateValueIfNeeded (true))
7974ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
798886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
799886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (!m_object_desc_str.empty())
800886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        return m_object_desc_str.c_str();
801886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
802fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
803fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope == NULL)
804fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return NULL;
805fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
8064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
807b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
8084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
809b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
810b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
8114ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
812b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
813b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
8144ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
8150e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
8160e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
81770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
8180e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
8190e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
8200e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
82170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            bool is_signed;
82270c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
82370c55622e15857e232cf4777a502fa5fe40e785bJim Ingham                || ClangASTContext::IsPointerType (opaque_qual_type))
82470c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            {
8250e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
82670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            }
8270e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
8280e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
8290e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
8300de37195f17fefb536157b3296a18999116b8125Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this))
8314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
8324ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
8334ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
834e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
835e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
836e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
837e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
838e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
8394ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
842fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString ()
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
845462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
847afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
8556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
8566916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
8576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
859f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
862afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (m_format == lldb::eFormatDefault && m_last_value_format)
8631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
864f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_value_str = m_last_value_format->FormatObject(GetSP());
8651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
86782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
868f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                StreamString sstr;
869f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                Format format = GetFormat();
870f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (format == eFormatDefault)
871f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        format = (m_is_bitfield_for_scalar ? eFormatUnsigned :
872f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        ClangASTType::GetFormat(clang_type));
873f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
874f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
875f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 clang_type,               // The clang type to display
876f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 &sstr,
877f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 format,                   // Format to display this type with
878f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 m_data,                   // Data to extract from
879f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 0,                        // Byte offset into "m_data"
880f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetByteSize(),            // Byte size of item in "m_data"
881f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitSize(),     // Bitfield bit size
882f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitOffset()))  // Bitfield bit offset
883f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.swap(sstr.GetString());
884f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                else
885f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                {
886f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)",
887f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      m_data.GetByteSize(),
888f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      GetByteSize());
889f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.clear();
890f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
89182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
90754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
90854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
90954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
91217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
91317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
91417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
91517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
91617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
91717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
91817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
926afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// if > 8bytes, 0 is returned. this method should mostly be used
927afb7c85df796f74262917e44dd68f668dade3911Enrico Granata// to read address values out of pointers
928afb7c85df796f74262917e44dd68f668dade3911Enrico Granataunsigned long long
929afb7c85df796f74262917e44dd68f668dade3911Enrico GranataValueObject::GetValueAsUnsigned()
930afb7c85df796f74262917e44dd68f668dade3911Enrico Granata{
931afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    // If our byte size is zero this is an aggregate type that has children
932afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
933afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    {
934afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        if (UpdateValueIfNeeded(true))
935afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        {
936afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            uint32_t offset = 0;
937afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            return m_data.GetMaxU64(&offset,
938afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                    m_data.GetByteSize());
939afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        }
940afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    }
941afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return 0;
942afb7c85df796f74262917e44dd68f668dade3911Enrico Granata}
943afb7c85df796f74262917e44dd68f668dade3911Enrico Granata
9444e5397c1127d698c61df295f30909e573a1c9876Enrico Granatabool
9454e5397c1127d698c61df295f30909e573a1c9876Enrico GranataValueObject::GetPrintableRepresentation(Stream& s,
9464e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                                        ValueObjectRepresentationStyle val_obj_display,
947886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                        lldb::Format custom_format)
948886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
94986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    RefCounter ref(&m_dump_printable_counter);
95186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95290d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != lldb::eFormatInvalid)
953886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        SetFormat(custom_format);
954886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
955886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const char * return_value;
95680b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata    std::string alloc_mem;
957886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
958886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    switch(val_obj_display)
959886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
960886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayValue:
961886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetValueAsCString();
962886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
963886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplaySummary:
964886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetSummaryAsCString();
965886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
966886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayLanguageSpecific:
967886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetObjectDescription();
968886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
969f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        case eDisplayLocation:
970f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            return_value = GetLocationAsCString();
971f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            break;
9724e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        case eDisplayChildrenCount:
9734e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        {
97480b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            alloc_mem.resize(512);
97580b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            return_value = &alloc_mem[0];
9764e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            int count = GetNumChildren();
97780b01e59bda7984c1f4315f544a1e635de3bbd05Enrico Granata            snprintf((char*)return_value, 512, "%d", count);
9784e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            break;
9794e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        }
9804e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        default:
9814e5397c1127d698c61df295f30909e573a1c9876Enrico Granata            break;
982886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
983886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
98486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // this code snippet might lead to endless recursion, thus we use a RefCounter here to
98586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // check that we are not looping endlessly
98686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (!return_value && (m_dump_printable_counter < 3))
9879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
9889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // try to pick the other choice
9899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (val_obj_display == eDisplayValue)
9909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetSummaryAsCString();
9919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (val_obj_display == eDisplaySummary)
992de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
993de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (ClangASTContext::IsAggregateType (GetClangType()) == true)
994de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            {
9954e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // this thing has no value, and it seems to have no summary
9964e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // some combination of unitialized data and other factors can also
9974e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                // raise this condition, so let's print a nice generic error message
9984e5397c1127d698c61df295f30909e573a1c9876Enrico Granata                return_value = "<no available summary>";
999de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            }
1000de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else
1001de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = GetValueAsCString();
1002de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
10039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
1004886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
10054e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    if (return_value)
10064e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        s.PutCString(return_value);
10074e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    else
10084e5397c1127d698c61df295f30909e573a1c9876Enrico Granata        s.PutCString("<no printable representation>");
10094e5397c1127d698c61df295f30909e573a1c9876Enrico Granata
10104e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // we should only return false here if we could not do *anything*
10114e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // even if we have an error message as output, that's a success
10124e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    // from our callers' perspective, so return true
10134e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    return true;
10144e5397c1127d698c61df295f30909e573a1c9876Enrico Granata
10159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
1016886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
10179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
10189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s,
10199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         ValueObjectRepresentationStyle val_obj_display,
10209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         lldb::Format custom_format)
10219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    clang_type_t elem_or_pointee_type;
102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
10251a102087f54079c25c8827afac6153a44ca535daEnrico Granata
102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata         && val_obj_display == ValueObject::eDisplayValue)
10281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // when being asked to get a printable display an array or pointer type directly,
103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // try to "do the right thing"
103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (IsCStringContainer(true) &&
103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCString ||
103486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatCharArray ||
103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatChar ||
103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly
103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            Error error;
103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            ReadPointedString(s,
104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              error,
104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              0,
104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatVectorOfChar) ||
104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatCharArray));
104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return !error.Fail();
104586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (custom_format == lldb::eFormatEnum)
104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // this only works for arrays, because I have no way to know when
105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // the pointed memory ends, and no special \0 end of data marker
105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (flags.Test(ClangASTContext::eTypeIsArray))
105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatBytes) ||
105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatBytesWithASCII))
105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
106486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
106686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1069de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
107286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format);
107386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
107486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
107686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
107786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
107886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
107986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
108086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatVectorOfChar) ||
108186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat32) ||
108286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat64) ||
108386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt16) ||
108486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt32) ||
108586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt64) ||
108686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt8) ||
108786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt128) ||
108886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt16) ||
108986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt32) ||
109086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt64) ||
109186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly
109286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
109386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
109486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                lldb::Format format = FormatManager::GetSingleItemFormat(custom_format);
109686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
109786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
109886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
109986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
110086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
110186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
110286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
110386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
110486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
110586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
110686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1107de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
110886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
110986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
111086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format);
111186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
111286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
111486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
111686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
111786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
111886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
111986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if ((custom_format == lldb::eFormatBoolean) ||
112086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatBinary) ||
112186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatChar) ||
112286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCharPrintable) ||
112386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexFloat) ||
112486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDecimal) ||
112586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatHex) ||
112686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatFloat) ||
112786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOctal) ||
112886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOSType) ||
112986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode16) ||
113086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode32) ||
113186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnsigned) ||
113286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatPointer) ||
113386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexInteger) ||
113486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplex) ||
113586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDefault)) // use the [] operator
113686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
11371a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
11384e5397c1127d698c61df295f30909e573a1c9876Enrico Granata    bool var_success = GetPrintableRepresentation(s, val_obj_display, custom_format);
113990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != eFormatInvalid)
114086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        SetFormat(eFormatDefault);
114186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    return var_success;
1142886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
1143886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
114403e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
1145b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address)
1146f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
1147afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1148e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return LLDB_INVALID_ADDRESS;
1149e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1150f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
1151f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
1152f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
1153f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
1154f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1155f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
1156f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1157f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1158f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1159f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1160f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
1162f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
1163f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1164f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
1165f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1166f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1167f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1168f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
1169f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
1170f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
1171f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
1172f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1173f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
1174b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address)
117503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
117603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
117703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
1178e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1179afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
1180e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return address;
1181e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1182f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
118303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
118403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
118503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
118603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
118703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
118803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
118903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
119003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
119103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
119203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
119303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
119403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
119503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
119603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
119703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
119803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
119903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
120003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
120103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
120203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
120303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
120803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
120903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
121003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str)
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
1216afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (!UpdateValueIfNeeded(false))
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
1220462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
1223bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
123921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            Value::ValueType value_type = m_value.GetValueType();
124021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            switch (value_type)
124121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            {
124221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            case Value::eValueTypeLoadAddress:
124321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            case Value::eValueTypeHostAddress:
124421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                // The value in these cases lives in the data.  So update the data:
124521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
124621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                break;
124721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            case Value::eValueTypeScalar:
124821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                m_value.GetScalar() = ull_val;
124921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                break;
125021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            case Value::eValueTypeFileAddress:
125121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                // Try to convert the file address to a load address and then write the new value there.
125221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                break;
125321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            }
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1269801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = sll_val;
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
127854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
1283cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                m_data.SetByteOrder(lldb::endian::InlHostByteOrder());
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
1286462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
1315fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_update_point.SetNeedsUpdate();
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1322b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
1323b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
1324b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
1325afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    return ClangASTType::GetMinimumLanguage (GetClangAST(),
1326afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                             GetClangType());
1327b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
1328b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
133047da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_synthetic_children[key] = valobj;
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
133947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
134147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        synthetic_child_sp = pos->second->GetSP();
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1348462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135170c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool
135224b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType ()
135324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
135424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return ClangASTContext::IsArrayType (GetClangType());
135524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
135624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
135724b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool
13589762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType ()
13599762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
13609762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsScalarType (GetClangType());
13619762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
13629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
13639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
136470c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed)
136570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{
136670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
136770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham}
1368f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
137282f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
137382f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
137482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
137582f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
137682f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType ()
137782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
137882f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1381917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
1382917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType ()
1383917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
1384917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1385917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
1386917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
139424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
140147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            ValueObject *synthetic_child;
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
140447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            synthetic_child = CreateChildAtIndex(0, true, index);
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
140747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            if (synthetic_child)
140847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            {
140947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                AddSyntheticChild(index_const_str, synthetic_child);
141047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                synthetic_child_sp = synthetic_child->GetSP();
1411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
1412886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->m_is_array_item_for_pointer = true;
141347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            }
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1418642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
141924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index
142024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array.
142124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as:
142224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection
142324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// {
142424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     uint32_t item_count;
142524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     Item item_array[0];
142624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// };
142724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice
142824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array".
142924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
143024b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP
143124b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
143224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
143324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    ValueObjectSP synthetic_child_sp;
143424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    if (IsArrayType ())
143524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    {
143624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        char index_str[64];
143724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        snprintf(index_str, sizeof(index_str), "[%i]", index);
143824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        ConstString index_const_str(index_str);
143924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // Check if we have already created a synthetic array member in this
144024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // valid object. If we have we will re-use it.
144124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        synthetic_child_sp = GetSyntheticChild (index_const_str);
144224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        if (!synthetic_child_sp)
144324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        {
144424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            ValueObject *synthetic_child;
144524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // We haven't made a synthetic array member for INDEX yet, so
144624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // lets make one and cache it for any future reference.
144724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            synthetic_child = CreateChildAtIndex(0, true, index);
144824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
144924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // Cache the value if we got one back...
145024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            if (synthetic_child)
145124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            {
145224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                AddSyntheticChild(index_const_str, synthetic_child);
145324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp = synthetic_child->GetSP();
1454979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
145524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp->m_is_array_item_for_pointer = true;
145624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            }
145724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        }
145824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    }
145924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return synthetic_child_sp;
146024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
146124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
14629762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP
14639762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
14649762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
14659762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP synthetic_child_sp;
14669762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (IsScalarType ())
14679762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
14689762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char index_str[64];
14699762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
14709762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        ConstString index_const_str(index_str);
14719762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // Check if we have already created a synthetic array member in this
14729762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // valid object. If we have we will re-use it.
14739762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        synthetic_child_sp = GetSyntheticChild (index_const_str);
14749762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (!synthetic_child_sp)
14759762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
14769762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            ValueObjectChild *synthetic_child;
14779762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // We haven't made a synthetic array member for INDEX yet, so
14789762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // lets make one and cache it for any future reference.
14799762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            synthetic_child = new ValueObjectChild(*this,
14809762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangAST(),
14819762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangType(),
14829762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      index_const_str,
14839762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetByteSize(),
14849762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      0,
14859762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      to-from+1,
14869762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      from,
14879762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false,
14889762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false);
14899762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
14909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // Cache the value if we got one back...
14919762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            if (synthetic_child)
14929762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            {
14939762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                AddSyntheticChild(index_const_str, synthetic_child);
14949762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp = synthetic_child->GetSP();
1495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                synthetic_child_sp->SetName(ConstString(index_str));
14969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->m_is_bitfield_for_scalar = true;
14979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            }
14989762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
14999762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
15009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return synthetic_child_sp;
15019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
15029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatalldb::ValueObjectSP
1504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
1505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
1506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectSP synthetic_child_sp;
1508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    char name_str[64];
1510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    snprintf(name_str, sizeof(name_str), "@%i", offset);
1511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ConstString name_const_str(name_str);
1512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // Check if we have already created a synthetic array member in this
1514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    // valid object. If we have we will re-use it.
1515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_str);
1516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child_sp.get())
1518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return synthetic_child_sp;
1519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (!can_create)
1521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return lldb::ValueObjectSP();
1522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1523979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
1524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetASTContext(),
1525979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetOpaqueQualType(),
1526979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             name_const_str,
1527979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             type.GetTypeByteSize(),
1528979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             offset,
1529979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1530979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             0,
1531979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false,
1532979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata                                                             false);
1533979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (synthetic_child)
1534979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
1535979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        AddSyntheticChild(name_const_str, synthetic_child);
1536979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp = synthetic_child->GetSP();
1537979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->SetName(name_const_str);
1538979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        synthetic_child_sp->m_is_child_at_offset = true;
1539979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
1540979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return synthetic_child_sp;
1541979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
1542979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
1543e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or ->
1544e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has
1545e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown
1546e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means
1547e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off
1548e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char*
1549e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression)
1550e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1551e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!expression || !expression[0])
1552e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression;
1553e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '.')
1554e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+1;
1555e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '-' && expression[1] == '>')
1556e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+2;
1557e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return expression;
1558e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1559e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1560e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP
1561e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
1562e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ValueObjectSP synthetic_child_sp;
1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ConstString name_const_string(expression);
1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // Check if we have already created a synthetic array member in this
1566e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // valid object. If we have we will re-use it.
1567e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_string);
1568e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!synthetic_child_sp)
1569e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    {
1570e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // We haven't made a synthetic array member for expression yet, so
1571e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // lets make one and cache it for any future reference.
1572e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        synthetic_child_sp = GetValueForExpressionPath(expression);
1573e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1574e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // Cache the value if we got one back...
1575e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (synthetic_child_sp.get())
1576e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        {
1577e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1578979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
1579e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            synthetic_child_sp->m_is_expression_path_child = true;
1580e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        }
1581e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    }
1582e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return synthetic_child_sp;
1583e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1584e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid
1586e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic)
1587e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1588e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1589e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1590e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1591afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1592e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1593e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1594e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1595e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
15969ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata    if (m_synthetic_value == NULL)
15979ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter);
1598e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1599e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1600e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1601e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid
160210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic)
1603642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
160410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
160510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return;
160610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
160747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (!m_dynamic_value && !IsDynamic())
1608e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1609979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        Process *process = m_update_point.GetProcessSP().get();
1610e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool worth_having_dynamic_value = false;
1611642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1613e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
1614e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // hard code this everywhere.
1615e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::LanguageType known_type = GetObjectRuntimeLanguage();
1616e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
1617e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1618e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
1619e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (runtime)
1620e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
1621e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1622e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
1623e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1624e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
1625e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (cpp_runtime)
1626e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
1627e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1628e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (!worth_having_dynamic_value)
1629e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
1630e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
1631e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (objc_runtime)
163210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
1633e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
1634e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1635e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1636e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (worth_having_dynamic_value)
163710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
163847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
163947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//        if (worth_having_dynamic_value)
164047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//            printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager);
1641e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1642e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
1643e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
1644e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
164547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
164610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic)
1647e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
164810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
164910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return ValueObjectSP();
165010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
165110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (!IsDynamic() && m_dynamic_value == NULL)
1652e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
165310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        CalculateDynamicValue(use_dynamic);
1654e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
165547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_dynamic_value)
165647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_dynamic_value->GetSP();
165747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
165847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1659642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
166066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1661e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic
1662e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object
1663e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler
1664e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject
1665e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP
1666e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic)
1667e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1668e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1669e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1670e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1671afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1672e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1673e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1674e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1675e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1676e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    CalculateSyntheticValue(use_synthetic);
1677e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1678e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_synthetic_value)
1679e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return m_synthetic_value->GetSP();
1680e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    else
1681e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1682e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1683e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
168400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
1685f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico GranataValueObject::HasSyntheticValue()
1686f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata{
1687f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
1688f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata
1689f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1690f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata        return false;
1691f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata
1692f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata    CalculateSyntheticValue(lldb::eUseSyntheticFilter);
1693f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata
1694f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata    if (m_synthetic_value)
1695f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata        return true;
1696f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata    else
1697f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata        return false;
1698f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata}
1699f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata
1700f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granatabool
170100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
170200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
170300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
170400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1705e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
170600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
170700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
170800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
170900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
171000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
171100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
171200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
171300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
171400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
171500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
171600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
171700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
171800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
171900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
172000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
172100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
172200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
172300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
1724e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (GetParent())
172500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1726e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (GetParent()->IsBaseClass())
1727e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent()->GetNonBaseClassParent();
172800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
1729e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent();
173000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
173100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
173200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
173366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
173466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
17351391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
1736bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
173700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
173800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
173990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
17401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
17411391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
17421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // the eHonorPointers mode is meant to produce strings in this latter format
17431391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s.PutCString("*(");
17441391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
174500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
17461391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    ValueObject* parent = GetParent();
17471391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
17481391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (parent)
17491391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
1750886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
1751886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // if we are a deref_of_parent just because we are synthetic array
1752886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // members made up to allow ptr[%d] syntax to work in variable
1753886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // printing, then add our name ([%d]) to the expression path
175490d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (m_is_array_item_for_pointer && epformat == eHonorPointers)
1755886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        s.PutCString(m_name.AsCString());
17561391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
175700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
175800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
175900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
1760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
176100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
176200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
1763bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
176400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
176500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
176600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
176700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
176800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
176990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                    if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers)
177000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
177100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
177200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
17731391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    else
17741391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    {
17751391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
17761391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17771391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutCString("->");
17781391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
17791391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
17801391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
17811391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
17821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutChar('.');
17831391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
178400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
178500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
178700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
178800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
178900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1790bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
179100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
179200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
179300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
179400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
179500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
179600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1797bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1798bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1799bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1800bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
18011391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
180200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
18031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1804bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1805bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1806ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1807ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression,
1808ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const char** first_unparsed,
1809ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathScanEndReason* reason_to_stop,
1810ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathEndResultType* final_value_type,
1811ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const GetValueForExpressionPathOptions& options,
1812ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathAftermath* final_task_on_target)
1813ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1814ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1815ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* dummy_first_unparsed;
1816ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
1817ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathEndResultType dummy_final_value_type;
1818ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
1819ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1820ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
1821ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
1822ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
1823ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
1824ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           options,
1825ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
1826ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1827ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
1828ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1829ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ret_val;
1830ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1831ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
1832ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1833ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eDereference)
1834ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1835ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1836ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->Dereference(error);
1837ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1838ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1839ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eDereferencingFailed;
1840ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1844ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1845ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eTakeAddress)
1850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1852ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->AddressOf(error);
1853ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1854ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1855ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eTakingAddressFailed;
1856ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1857ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1858ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1860ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1861ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1862ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1863ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1864ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1865ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1866ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
1867ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
1868ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
18691a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
18701a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression,
18711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
18721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
18731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
18741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_value_type,
18751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
18761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* final_task_on_target)
18771a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
18781a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const char* dummy_first_unparsed;
18791a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathEndResultType dummy_final_value_type;
18811a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
18821a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18831a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
18841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
18851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
18861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           options,
18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
18891a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18901a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!ret_val.get()) // if there are errors, I add nothing to the list
18911a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
18921a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18931a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (*reason_to_stop != eArrayRangeOperatorMet)
18941a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
18951a102087f54079c25c8827afac6153a44ca535daEnrico Granata        // I need not expand a range, just post-process the final value and return
18961a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
18971a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
18981a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(ret_val);
18991a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
19001a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
19011a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
19021a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
19031a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eDereference)
19041a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
19051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
19061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->Dereference(error);
19071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
19081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
19091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eDereferencingFailed;
19101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
19111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
19121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
19141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
19151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
19161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
19171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
19181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19191a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
19201a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eTakeAddress)
19211a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
19221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
19231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->AddressOf(error);
19241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
19251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
19261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eTakingAddressFailed;
19271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
19281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
19291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
19311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
19321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
19331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
19341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
19351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
19361a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
19371a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
19381a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
19391a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
19401a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
19411a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
19421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          first_unparsed ? first_unparsed : &dummy_first_unparsed,
19431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          ret_val,
19441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          list,
19451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
19461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_value_type ? final_value_type : &dummy_final_value_type,
19471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          options,
19481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
19491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
19501a102087f54079c25c8827afac6153a44ca535daEnrico Granata    // in any non-covered case, just do the obviously right thing
19511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    list->Append(ret_val);
19521a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return 1;
19531a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
19541a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const char** first_unparsed,
1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathScanEndReason* reason_to_stop,
1959ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathEndResultType* final_result,
1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const GetValueForExpressionPathOptions& options,
1961ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathAftermath* what_next)
1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP root = GetSP();
1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!root.get())
1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ValueObjectSP();
1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    *first_unparsed = expression_cstr;
1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    while (true)
1971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
19761a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
19771a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
19781a102087f54079c25c8827afac6153a44ca535daEnrico Granata
19791a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
19801a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
19811a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (!expression_cstr || *expression_cstr == '\0')
1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            *reason_to_stop = ValueObject::eEndOfString;
1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            return root;
1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        switch (*expression_cstr)
1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '-':
1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax &&
19941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eArrowInsteadOfDot;
1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
20011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
20021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) &&
2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    options.m_no_fragile_ivar)
2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eFragileIVarNotAllowed;
2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (expression_cstr[1] != '>')
2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2015ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip the -
2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '.': // or fallthrough from ->
2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
20221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eDotInsteadOfArrow;
2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip .
2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *next_separator = strpbrk(expression_cstr+1,"-.[");
2031ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                ConstString child_name;
2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!next_separator) // if no other separator just expand this last layer
2033ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2034ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCString (expression_cstr);
2035ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
2036ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // we know we are done, so just return
2037ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2038ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = '\0';
2039ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEndOfString;
2040ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
2041ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2042ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2043ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2044ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2045ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2046ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2047ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2048ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2049ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2050ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2051ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // other layers do expand
2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2054ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // store the new root and move on
2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = next_separator;
2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        continue;
2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '[':
2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
20731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T*
2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2075f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar...
2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2077f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        if (options.m_no_synthetic_children) // ...only chance left is synthetic
2078f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        {
2079f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *first_unparsed = expression_cstr;
2080f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorInvalid;
2081f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *final_result = ValueObject::eInvalid;
2082f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            return ValueObjectSP();
2083f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        }
2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2094ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
20951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2096ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2097ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2098ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2099ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2100ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2101ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2102ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2104ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr+2;
2105ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2106ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eUnboundedRange;
2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
2113ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2114ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
2115ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
2116ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2117ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2118ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2119ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
21321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2133ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr+2;
2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eUnboundedRange;
2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    // from here on we do have a valid index
21481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
215024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
215124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (!child_valobj_sp)
215224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
2153f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        if (!child_valobj_sp)
2154f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            if (root->HasSyntheticValue() && root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetNumChildren() > index)
2155f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                child_valobj_sp = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true);
215624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (child_valobj_sp)
215724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        {
215824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            root = child_valobj_sp;
215924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *first_unparsed = end+1; // skip ]
216024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *final_result = ValueObject::ePlain;
216124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            continue;
216224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        }
216324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        else
2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (*what_next == ValueObject::eDereference &&  // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
21741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            Error error;
2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->Dereference(error);
2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (error.Fail() || !root.get())
2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *what_next = eNothing;
2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2192ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2193f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            if (ClangASTType::GetMinimumLanguage(root->GetClangAST(),
2194f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                                                    root->GetClangType()) == lldb::eLanguageTypeObjC
2195f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                &&
2196f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                ClangASTContext::IsPointerType(ClangASTType::GetPointeeType(root->GetClangType())) == false
2197f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                &&
2198f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                root->HasSyntheticValue()
2199f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                &&
2200f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                options.m_no_synthetic_children == false)
2201f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            {
2202f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                root = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true);
2203f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            }
2204f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            else
2205f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                                root = root->GetSyntheticArrayMemberFromPointer(index, true);
2206ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (!root.get())
2207ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2208ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2209ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
2210ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2211ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2212ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2213ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2214ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2215ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = end+1; // skip ]
2216ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::ePlain;
2217ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2218ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2219ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2220ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2221f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    else if (ClangASTContext::IsScalarType(root_clang_type))
2222ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2223ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
2224ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2225ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2226ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2227ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2228ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2229ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2230ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2231ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
2232ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2233ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2234ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2235ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2236ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2237ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2238ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2239f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    else if (root->HasSyntheticValue() && options.m_no_synthetic_children)
2240f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    {
2241f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        root = root->GetSyntheticValue(lldb::eUseSyntheticFilter)->GetChildAtIndex(index, true);
2242f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        if (!root.get())
2243f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        {
2244f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *first_unparsed = expression_cstr;
2245f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2246f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            *final_result = ValueObject::eInvalid;
2247f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                            return ValueObjectSP();
2248f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        }
2249f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    }
2250f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    else
2251f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    {
2252f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        *first_unparsed = expression_cstr;
2253f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
2254f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        *final_result = ValueObject::eInvalid;
2255f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                        return ValueObjectSP();
2256f669850b51f3898020cbae8fdfd17faf4f18ba02Enrico Granata                    }
2257ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2258ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // we have a low and a high index
2259ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2260ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2261ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
2262ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
2263ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2264ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2265ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2266ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2267ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2268ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2269ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
2270ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2271ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2272ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2273ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2274ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2275ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2276ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2277ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (index_lower > index_higher) // swap indices if required
2278ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2279ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        unsigned long temp = index_lower;
2280ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_lower = index_higher;
2281ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_higher = temp;
2282ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
2284ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2285ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
2286ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2287ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2288ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2289ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2290ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2291ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2292ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2293ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2294ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2295ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2296ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2297ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2298ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2299ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2300ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
2302ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                             *what_next == ValueObject::eDereference &&
23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2304ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2305ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        Error error;
2306ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->Dereference(error);
2307ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (error.Fail() || !root.get())
2308ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2309ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2310ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
2311ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2312ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2313ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2314ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2315ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2316ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *what_next = ValueObject::eNothing;
2317ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            continue;
2318ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2319ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2320ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2321ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2322ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2323ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2324ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eBoundedRange;
2325ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2326ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2327ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2328ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2329ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2330ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            default: // some non-separator is in the way
2331ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
2332ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *first_unparsed = expression_cstr;
2333ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
2334ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_result = ValueObject::eInvalid;
2335ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
2336ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2337ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2338ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
2339ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
2340ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
2341ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
23421a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
23431a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr,
23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectSP root,
23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_result,
23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* what_next)
23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!root.get())
23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata    *first_unparsed = expression_cstr;
23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata    while (true)
23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!expression_cstr || *expression_cstr == '\0')
23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata            *reason_to_stop = ValueObject::eEndOfString;
23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(root);
23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata
23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata        switch (*expression_cstr)
23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata            case '[':
23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T*
23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
24011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else // expand this into list
24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        int max_index = root->GetNumChildren() - 1;
24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        for (int index = 0; index < max_index; index++)
24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr+2;
24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return max_index; // tell me number of items I added to the VOList
24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *first_unparsed = expression_cstr;
24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_result = ValueObject::eInvalid;
24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            int max_index = root->GetNumChildren() - 1;
24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            for (int index = 0; index < max_index; index++)
24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                ValueObjectSP child =
24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(child);
24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr+2;
24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return max_index; // tell me number of items I added to the VOList
24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    // from here on we do have a valid index
24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetChildAtIndex(index, true);
24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (*what_next == ValueObject::eDereference &&  // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
24891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
24901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            Error error;
24921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->Dereference(error);
24931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (error.Fail() || !root.get())
24941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
24951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
24961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
24971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
24981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
24991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
25001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
25011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
25021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *what_next = eNothing;
25031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                continue;
25041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
25051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
25071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
25091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (!root.get())
25101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
25111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
25121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
25131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
25141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
25151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
25161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
25171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
25181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(root);
25191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = end+1; // skip ]
25201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eValueObjectList;
25221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 1;
25231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
25241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
25271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
25291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
25301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
25331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
25341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
25351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
25371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
25391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
25401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
25421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
25431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
25461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else // we have a low and a high index
25471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
25481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
25491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
25501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
25511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
25531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
25541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
25551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
25561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
25581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
25591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
25611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
25631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
25641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (index_lower > index_higher) // swap indices if required
25661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        unsigned long temp = index_lower;
25681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_lower = index_higher;
25691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_higher = temp;
25701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
25721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
25741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
25751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
25781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
25791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
25801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
25821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
25841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
25851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
25861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
25871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
25881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
25891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
25901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
25911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             *what_next == ValueObject::eDereference &&
25921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
25931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
25941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Error error;
25951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->Dereference(error);
25961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (error.Fail() || !root.get())
25971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
25981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
25991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
26001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
26011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
26021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
26031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
26041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
26051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *what_next = ValueObject::eNothing;
26061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            continue;
26071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
26081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
26091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
26101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
26112bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen                        for (unsigned long index = index_lower;
26121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             index <= index_higher; index++)
26131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
26141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
26151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
26161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
26171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
26181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = end+1;
26191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
26201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
26211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return index_higher-index_lower+1; // tell me number of items I added to the VOList
26221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
26231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
26241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
26251a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
26261a102087f54079c25c8827afac6153a44ca535daEnrico Granata            default: // some non-[ separator, or something entirely wrong, is in the way
26271a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
26281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *first_unparsed = expression_cstr;
26291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
26301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *final_result = ValueObject::eInvalid;
26311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                return 0;
26321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
26331a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
26341a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
26351a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
26361a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
26371a102087f54079c25c8827afac6153a44ca535daEnrico Granata
2638bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
263966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
264066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
264166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
264266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
264366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
264466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
264566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
264666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
264766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
264866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
264966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
265010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    lldb::DynamicValueType use_dynamic,
2651e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    bool use_synth,
2652bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
26537f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    bool flat_output,
26547f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    uint32_t omit_summary_depth
265566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
265666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
265782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (valobj)
265866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
2659afb7c85df796f74262917e44dd68f668dade3911Enrico Granata        bool update_success = valobj->UpdateValueIfNeeded (use_dynamic, true);
266082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
266182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (update_success && use_dynamic != lldb::eNoDynamicValues)
2662e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
266310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get();
2664e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (dynamic_value)
2665e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                valobj = dynamic_value;
2666e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
2667e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2668bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
2669bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2670f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
2671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
2672f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
2673f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
2674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2675bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
2676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
267866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
2680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2681fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                s.Printf("%s: ", valobj->GetLocationAsCString());
2682bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
268366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
268566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2686a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
268700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
2688afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            {
2689441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                const char* typeName = valobj->GetTypeName().AsCString("<invalid type>");
2690441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                s.Printf("(%s", typeName);
2691441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                // only show dynamic types if the user really wants to see types
2692441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                if (show_types && use_dynamic != lldb::eNoDynamicValues &&
2693441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                    (/*strstr(typeName, "id") == typeName ||*/
2694441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                     ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == lldb::eLanguageTypeObjC))
2695afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                {
2696afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    Process* process = valobj->GetUpdatePoint().GetProcessSP().get();
2697afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    if (process == NULL)
2698441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                        s.Printf(", dynamic type: unknown) ");
2699afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    else
2700afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    {
2701afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
2702afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        if (runtime == NULL)
2703441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                            s.Printf(", dynamic type: unknown) ");
2704afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        else
2705afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        {
2706afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj);
2707afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            if (!runtime->IsValidISA(isa))
2708441f08ca9d17fad237b93a71aeab9dad74ea1258Enrico Granata                                s.Printf(", dynamic type: unknown) ");
2709afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                            else
2710afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                s.Printf(", dynamic type: %s) ",
2711afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                                         runtime->GetActualTypeName(isa).GetCString());
2712afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                        }
2713afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    }
2714afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                }
2715afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                else
2716afb7c85df796f74262917e44dd68f668dade3911Enrico Granata                    s.Printf(") ");
2717afb7c85df796f74262917e44dd68f668dade3911Enrico Granata            }
271866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
271966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2720bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
2721bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2722b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
2723b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
2724b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
2725bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
2726bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2727bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
2728bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2729bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
2730bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
2731bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2732bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2733fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (!scope_already_checked && !valobj->IsInScope())
2734bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
273582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                err_cstr = "out of scope";
2736bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
273766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
273866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2739bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
27401391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        const char *sum_cstr = NULL;
27411a102087f54079c25c8827afac6153a44ca535daEnrico Granata        SummaryFormat* entry = valobj->GetSummaryFormat().get();
2742bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
27437f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        if (omit_summary_depth > 0)
27447f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            entry = NULL;
27457f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
2746bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
2747bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
2748fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            val_cstr = valobj->GetValueAsCString();
2749bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
2750bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
275166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
275266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
275366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
275482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            s.Printf (" <%s>\n", err_cstr);
275566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
275666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
275766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2758f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
2759bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
2760bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
27611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
27627f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL;
276366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
27641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // We must calculate this value in realtime because entry might alter this variable's value
27651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // (e.g. by saying ${var%fmt}) and render precached values useless
27661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
27671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    s.Printf(" %s", valobj->GetValueAsCString());
276866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
276990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                if (sum_cstr)
2770886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
2771886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // for some reason, using %@ (ObjC description) in a summary string, makes
2772886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // us believe we need to reset ourselves, thus invalidating the content of
2773886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty
2774886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // let us recalculate it!
2775886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (sum_cstr[0] == '\0')
2776886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", valobj->GetSummaryAsCString());
2777886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
2778886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", sum_cstr);
2779886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
2780bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2781bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
2782bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
2783fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const char *object_desc = valobj->GetObjectDescription();
2784bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
2785bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
2786bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2787e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
2788bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
2789886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
279066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
279166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
279266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
279366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2794f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
2795f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
2796f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
2797f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
2798f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
2799f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2800f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
2801f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
2802f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
2803f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2804f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
2805f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
2806f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2807f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
2808f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
2809b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType ptr_address_type;
2810f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
2811f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2812f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2813f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
2814f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2815f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
2816f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
2817f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
2818f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
2819f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
2820f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2821f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2822f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
2823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2824f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
282566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2826886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
282766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2828e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ?
2829e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eUseSyntheticFilter :
2830e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eNoSyntheticFilter);
2831e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    const uint32_t num_children = synth_vobj->GetNumChildren();
2832bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
283366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
2834bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
283566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
2836bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
2837bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
2838bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2839bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
2840bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2841bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
28423f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
2843bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
2844bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2845bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2846bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
2847bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2848e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                            ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true));
2849bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
2850bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
2851bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
2852bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
2853bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
2854f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
2855bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
2856bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
2857bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
2858bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
2859bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
2860e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                                 use_dynamic,
2861e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                 use_synth,
2862bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
28637f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 flat_output,
28647f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 omit_summary_depth > 1 ? omit_summary_depth - 1 : 0);
2865bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
2866bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2867bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2868bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
2869bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2870bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
2871bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
287266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
287366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
2874bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
2875bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2876bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
2877bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2878f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
2879bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2880bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2881bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2882bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2883bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
2884bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2885bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
288666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
2887bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
2888bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
288966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
289066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
289166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
289266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
289366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2894bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
289566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2896bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
289766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
289866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
289966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
290066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
290166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
290266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2903427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2904427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
2905fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name)
2906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2907427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
2908427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2909afb7c85df796f74262917e44dd68f668dade3911Enrico Granata    if (UpdateValueIfNeeded(false) && m_error.Success())
2910427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2911fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        ExecutionContextScope *exe_scope = GetExecutionContextScope();
2912fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_scope)
2913fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2914fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            ExecutionContext exe_ctx;
2915fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            exe_scope->CalculateExecutionContext(exe_ctx);
2916427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2917fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            clang::ASTContext *ast = GetClangAST ();
2918427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2919fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            DataExtractor data;
2920fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetByteOrder (m_data.GetByteOrder());
2921fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetAddressByteSize(m_data.GetAddressByteSize());
2922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2923801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule());
2924427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
292547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj_sp = ValueObjectConstResult::Create (exe_scope,
292647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        ast,
292747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        GetClangType(),
292847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        name,
292947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        data);
2930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2931427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2932fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!valobj_sp)
2934427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
293547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
2936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2937427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
2938427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
2941bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
294347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
294447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2945e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2946c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
2947c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
2948427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
295024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        bool ignore_array_bounds = false;
2951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2952427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
2954427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
295800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
2959427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
2961427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
2962427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
296358513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
296458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        ExecutionContext exe_ctx;
296558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
296658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
296758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
296858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                                      clang_ast,
2969427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
2970427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
2971427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
2972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
2973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
297424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                      ignore_array_bounds,
2975427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
2977427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
2978427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
2979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
298000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
298100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
2982a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
2983427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2984427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
2985427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
2986427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
2987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
298847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            m_deref_valobj = new ValueObjectChild (*this,
298947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   clang_ast,
299047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_clang_type,
299147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_name,
299247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_size,
299347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_offset,
299447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_size,
299547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_offset,
299647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_base_class,
299747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_deref_of_parent);
2998427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2999427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
3000c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
300147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
3002c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
3003c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
300447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
3005c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
3006427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
3007427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
3008c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
3009b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
3010c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
3011c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
3012c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3013c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
3014c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
301547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
3016427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
3017427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3018427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3019e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP
3020c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
3021427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
3022e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_addr_of_valobj_sp)
3023e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_addr_of_valobj_sp;
3024e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3025b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeInvalid;
3026427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
3027427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
3028c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
3029427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
3030427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
3031427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
3032427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
3033c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
3034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
3035c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
3036c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
3037b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
3038c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
3039c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
3040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
3041c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
3042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
3043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
3044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
3045427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
3046427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
3047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
3048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
3049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
3050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
3051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
305247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(),
305347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ast,
305447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
305547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ConstString (name.c_str()),
305647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          addr,
305747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          eAddressTypeInvalid,
305847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          m_data.GetAddressByteSize());
3059427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
3060427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
3061427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
3062427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
3063427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
3064e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_addr_of_valobj_sp;
3065427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
3066427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
30670039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30680039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
30690039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
30700039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
30710039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
30720039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
30730039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
30740039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
30750039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30760039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
30770039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
30780039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
30790039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30800039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
30810039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
30820039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
30830039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               clang_ast_type);
30840039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
30850039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
30860039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
30870039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30880039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
30890039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp)
30900039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
30910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
30920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
30930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
30940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
30950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
30960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
30970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
30980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
30990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
31000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
31010039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
31020039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
31030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               type_sp);
31040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
31050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
31060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
31070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () :
3109dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread_id (LLDB_INVALID_UID),
311021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_mod_id ()
3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update (true),
3116dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update (true),
311791635093b0282d888fcde84a276ae518643c7fcaJim Ingham    m_thread_id (LLDB_INVALID_THREAD_ID),
311821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_mod_id ()
3119dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson
3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext exe_ctx;
3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *computed_exe_scope = exe_scope;  // If use_selected is true, we may find a better scope,
3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                            // and if so we want to cache that not the original.
3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_ctx.target != NULL)
3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_target_sp = exe_ctx.target->GetSP();
3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_ctx.process == NULL)
3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.target->GetProcessSP();
3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.process->GetSP();
3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_process_sp != NULL)
3136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
313721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            m_mod_id = m_process_sp->GetModID();
313821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
3139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = NULL;
3140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (exe_ctx.thread == NULL)
3142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (use_selected)
3144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    thread = m_process_sp->GetThreadList().GetSelectedThread().get();
3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (thread)
3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        computed_exe_scope = thread;
3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                thread = exe_ctx.thread;
3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = thread->GetIndexID();
3156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_ctx.frame == NULL)
3157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (use_selected)
3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get();
3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (frame)
3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_stack_id = frame->GetStackID();
3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            computed_exe_scope = frame;
3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id = exe_ctx.frame->GetStackID();
3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = computed_exe_scope;
3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope (rhs.m_exe_scope),
3178dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_needs_update(true),
3179dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update(true),
3180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_target_sp (rhs.m_target_sp),
3181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_process_sp (rhs.m_process_sp),
3182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_thread_id (rhs.m_thread_id),
3183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stack_id (rhs.m_stack_id),
318421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_mod_id ()
3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint ()
3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope *
3193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope ()
3194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // We have to update before giving out the scope, or we could be handing out stale pointers.
3196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    SyncWithProcessState();
3197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3198fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_exe_scope;
3199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3201fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state.  If the current
3202fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return
3203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change".  If the current state is different, we update our state, and return
3204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true.
3206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3208fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState()
3209fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3210fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we're already invalid, we don't need to do anything, and nothing has changed:
321121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (!m_mod_id.IsValid())
3212fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3213fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Can't update with an invalid state.
3214fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = false;
3215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3218fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we don't have a process nothing can change.
3219fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_process_sp)
3220fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3222fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If our stop id is the current stop ID, nothing has changed:
322321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    ProcessModID current_mod_id = m_process_sp->GetModID();
322421f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham
322521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (m_mod_id == current_mod_id)
3226fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3227fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3228e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3229e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // In either case, we aren't going to be able to sync with the process state.
323021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    if (current_mod_id.GetStopID() == 0)
3231e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
3232e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
323321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    m_mod_id = current_mod_id;
3234fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update = true;
3235fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = m_process_sp.get();
3236fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3237fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // Something has changed, so we will return true.  Now make sure the thread & frame still exist, and if either
3238fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // doesn't, mark ourselves as invalid.
3239fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3240fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_thread_id != LLDB_INVALID_THREAD_ID)
3241fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3242fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get();
3243fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (our_thread == NULL)
3244bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        {
324591635093b0282d888fcde84a276ae518643c7fcaJim Ingham            SetInvalid();
3246bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        }
3247fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3248fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3249fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_exe_scope = our_thread;
3250fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3251fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_stack_id.IsValid())
3252fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3253fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get();
3254fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (our_frame == NULL)
3255fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    SetInvalid();
3256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3257fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_exe_scope = our_frame;
3258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3259fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3260fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3261fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return true;
3262fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3263fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3264ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
3265ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated ()
3266ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
3267ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_first_update = false;
3268ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_needs_update = false;
3269ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_process_sp)
327021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    {
327121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham        m_mod_id = m_process_sp->GetModID();
327221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham    }
3273ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
3274ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3275ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3276fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3277fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
3278fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3279fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!IsValid())
3280fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3281fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3282fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool needs_update = false;
3283fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = NULL;
3284fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3285fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // The target has to be non-null, and the
3286fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    Target *target = exe_scope->CalculateTarget();
3287fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (target != NULL)
3288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3289fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Target *old_target = m_target_sp.get();
3290fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        assert (target == old_target);
3291fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Process *process = exe_scope->CalculateProcess();
3292fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (process != NULL)
3293fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3294fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // FOR NOW - assume you can't update variable objects across process boundaries.
3295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Process *old_process = m_process_sp.get();
3296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            assert (process == old_process);
329721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            ProcessModID current_mod_id = process->GetModID();
329821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham            if (m_mod_id != current_mod_id)
3299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3300fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
330121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham                m_mod_id = current_mod_id;
3302fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3303fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // See if we're switching the thread or stack context.  If no thread is given, this is
3304fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // being evaluated in a global context.
3305fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = exe_scope->CalculateThread();
3306fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3307fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3308fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                lldb::user_id_t new_thread_index = thread->GetIndexID();
3309fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_thread_index != m_thread_id)
3310fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3311fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3312fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = new_thread_index;
3313fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3314fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3315fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3316fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *new_frame = exe_scope->CalculateStackFrame();
3317fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_frame != NULL)
3318fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3319fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (new_frame->GetStackID() != m_stack_id)
3320fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3321fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        needs_update = true;
3322fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        m_stack_id = new_frame->GetStackID();
3323fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3324fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3325fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3326fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3327fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3328fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3329fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3330fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3331fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3332fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3333fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // If this had been given a thread, and now there is none, we should update.
3334fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // Otherwise we don't have to do anything.
3335fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (m_thread_id != LLDB_INVALID_UID)
3336fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = LLDB_INVALID_UID;
3338fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3339fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3340fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3341fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3342fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3343fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3344fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3345fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // If there is no process, then we don't need to update anything.
3346fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // But if we're switching from having a process to not, we should try to update.
3347fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_process_sp.get() != NULL)
3348fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3349fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3350fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_process_sp.reset();
3351fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = LLDB_INVALID_UID;
3352fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stack_id.Clear();
3353fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3354fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3355fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3356fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
3357fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3358fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // If there's no target, nothing can change so we don't need to update anything.
3359fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // But if we're switching from having a target to not, we should try to update.
3360fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_target_sp.get() != NULL)
3361fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3362fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            needs_update = true;
3363fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_target_sp.reset();
3364fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp.reset();
3365fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_thread_id = LLDB_INVALID_UID;
3366fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stack_id.Clear();
3367fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3368fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3369fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_needs_update)
3370fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = needs_update;
3371fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3372fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return needs_update;
3373fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3374f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
3375f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid
3376f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData()
3377f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{
3378f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_location_str.clear();
3379f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_value_str.clear();
3380f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_summary_str.clear();
3381f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_object_desc_str.clear();
33822bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen}
3383