ValueObject.cpp revision 9ae7cef26612773c6b3422834cec83f0fbb2cf8c
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"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
25427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
26e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham#include "lldb/Core/ValueObjectDynamicValue.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton#include "lldb/Core/ValueObjectMemory.h"
29e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata#include "lldb/Core/ValueObjectSyntheticFilter.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
32cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton
33f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata#include "lldb/Interpreter/ScriptInterpreterPython.h"
34f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
351674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
394ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
40b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
43eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata#include "lldb/Utility/RefCounter.h"
4786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granatausing namespace lldb_utility;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
57fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ValueObject &parent) :
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
59fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (&parent),
60dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (parent.GetUpdatePoint ()),
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
6617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
6717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
6817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
694ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
7047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(parent.GetManager()),
7117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
7217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
7347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
74e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
7547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
7611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
7723ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
7823ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
7923ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
8023ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
81e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
8223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_user_id_of_forced_summary(0),
8317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
8417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
8517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
86427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
8700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    m_pointers_point_to_load_addrs (false),
881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
89886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
909762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
91e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
9286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject(this);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
98fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// ValueObject constructor
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ValueObject (ExecutionContextScope *exe_scope) :
101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    UserID (++g_value_obj_uid), // Unique identifier for every value object
102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_parent (NULL),
103dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_update_point (exe_scope),
104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_name (),
105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_data (),
106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value (),
107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_error (),
108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_str (),
109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_str (),
110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_location_str (),
111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_summary_str (),
112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_object_desc_str (),
11347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager(),
114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children (),
115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_synthetic_children (),
11647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_dynamic_value (NULL),
117e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_synthetic_value(NULL),
11847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_deref_valobj(NULL),
119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_format (eFormatDefault),
12023ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_format_mgr_revision(0),
12123ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_summary_format(),
12223ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_forced_summary_format(),
12323ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_last_value_format(),
124e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_last_synthetic_filter(),
12523ba377314a2836f491c650c86e50766e741dcf2Enrico Granata    m_user_id_of_forced_summary(0),
126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_is_valid (false),
127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_value_did_change (false),
128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_children_count_valid (false),
129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_old_value_valid (false),
130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_pointers_point_to_load_addrs (false),
1311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    m_is_deref_of_parent (false),
132886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    m_is_array_item_for_pointer(false),
1339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    m_is_bitfield_for_scalar(false),
134e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    m_is_expression_path_child(false),
13586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    m_dump_printable_counter(0)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager = new ValueObjectManager();
13847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_manager->ManageObject (this);
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// Destructor
143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham//----------------------------------------------------------------------
144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::~ValueObject ()
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
149886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::UpdateValueIfNeeded (bool update_format)
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1511391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
152886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (update_format)
153886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        UpdateFormatsIfNeeded();
1541391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
155d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
156d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
157d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
158d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
159d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool first_update = m_update_point.IsFirstEvaluation();
161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_update_point.NeedsUpdating())
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_update_point.SetUpdated();
165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Save the old value using swap to avoid a string copy which
167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // also will clear our m_value_str
168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_value_str.empty())
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = false;
171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_valid = true;
175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_old_value_str.swap (m_value_str);
176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_value_str.clear();
177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
180f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        const bool value_was_valid = GetValueIsValid();
182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueDidChange (false);
183ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_error.Clear();
185ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Call the pure virtual function to update the value
187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        bool success = UpdateValue ();
188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        SetValueIsValid (success);
190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (first_update)
192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (false);
193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else if (!m_value_did_change && success == false)
194fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
195fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // The value wasn't gotten successfully, so we mark this
196fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // as changed if the value used to be valid and now isn't
197fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            SetValueDidChange (value_was_valid);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2031391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granatavoid
2041391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::UpdateFormatsIfNeeded()
2051391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata{
2061391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    /*printf("CHECKING FOR UPDATES. I am at revision %d, while the format manager is at revision %d\n",
2071391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           m_last_format_mgr_revision,
2081391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata           Debugger::ValueFormats::GetCurrentRevision());*/
2091a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (HasCustomSummaryFormat() && m_update_point.GetUpdateID() != m_user_id_of_forced_summary)
2101a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
2111a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClearCustomSummaryFormat();
2121a102087f54079c25c8827afac6153a44ca535daEnrico Granata        m_summary_str.clear();
2131a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
2148a717e596312951672ecd8c54df2d255e6da20baEnrico Granata    if (m_last_format_mgr_revision != Debugger::Formatting::ValueFormats::GetCurrentRevision())
2151391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
2161391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_summary_format.get())
217f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            m_last_summary_format.reset((StringSummaryFormat*)NULL);
2181391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        if (m_last_value_format.get())
219e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_value_format.reset(/*(ValueFormat*)NULL*/);
220e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (m_last_synthetic_filter.get())
221e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            m_last_synthetic_filter.reset(/*(SyntheticFilter*)NULL*/);
2229ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata
2239ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = NULL;
2248a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
225e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        Debugger::Formatting::ValueFormats::Get(*this, m_last_value_format);
2268a717e596312951672ecd8c54df2d255e6da20baEnrico Granata        Debugger::Formatting::GetSummaryFormat(*this, m_last_summary_format);
227e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        Debugger::Formatting::GetSyntheticFilter(*this, m_last_synthetic_filter);
2288a717e596312951672ecd8c54df2d255e6da20baEnrico Granata
2298a717e596312951672ecd8c54df2d255e6da20baEnrico Granata        m_last_format_mgr_revision = Debugger::Formatting::ValueFormats::GetCurrentRevision();
230f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
231f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        ClearUserVisibleData();
2321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
2331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata}
2341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
238e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    UpdateValueIfNeeded();
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
243bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg ClaytonValueObject::GetError()
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
245bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton    UpdateValueIfNeeded();
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
256fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetLocationAsCString ()
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
258fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded())
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
2706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
313fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::ResolveValue (Scalar &scalar)
3140baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
3150baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ExecutionContext exe_ctx;
316fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
317fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
318fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
3190baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
3200baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return scalar.IsValid();
3210baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
3220baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
3230baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
32417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
337fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueDidChange ()
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
339fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    GetValueAsCString ();
34017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
353917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
354917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
355917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        UpdateValueIfNeeded();
356917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (idx < GetNumChildren())
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
358917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        // Check if we have already made the child value object?
359917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (can_create && m_children[idx] == NULL)
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
361917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // No we haven't created the child at this index, so lets have our
362917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            // subclass do it and cache the result for quick future access.
363917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            m_children[idx] = CreateChildAtIndex (idx, false, 0);
364e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
365917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
366917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_children[idx] != NULL)
367917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            return m_children[idx]->GetSP();
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
377462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3855d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
390917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    // We may need to update our value if we are dynamic
391917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (IsPossibleDynamicType ())
392917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        UpdateValueIfNeeded();
393917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
394917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::vector<uint32_t> child_indexes;
395917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
396917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    void *clang_type = GetClangType();
397917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
398917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
399917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      clang_type,
400917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      name.GetCString(),
401917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      omit_empty_base_classes,
402917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                                      child_indexes);
403917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (num_child_indexes > 0)
404e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
405917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
406917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
407e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
408917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        child_sp = GetChildAtIndex(*pos, can_create);
409917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        for (++pos; pos != end; ++pos)
410917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        {
411917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            if (child_sp)
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
413917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
414917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp = new_child_sp;
415917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            }
416917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            else
417917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            {
418917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                child_sp.reset();
419e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
420917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name)
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name.SetCString(name);
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45547da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject *
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
458bba1d8aa03489141fbd06c6bcea8706ef5fac1e8Jim Ingham    ValueObject *valobj = NULL;
459e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
460917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool omit_empty_base_classes = true;
46124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    bool ignore_array_bounds = synthetic_array_member;
462917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    std::string child_name_str;
463917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_byte_size = 0;
464917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    int32_t child_byte_offset = 0;
465917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_size = 0;
466917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    uint32_t child_bitfield_bit_offset = 0;
467917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_base_class = false;
468917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    bool child_is_deref_of_parent = false;
469917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
470917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    const bool transparent_pointers = synthetic_array_member == false;
471917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang::ASTContext *clang_ast = GetClangAST();
472917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t clang_type = GetClangType();
473917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    clang_type_t child_clang_type;
474917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
475917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    ExecutionContext exe_ctx;
476917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
477917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
478917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
479917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_ast,
480917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  GetName().GetCString(),
481917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  clang_type,
482917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  idx,
483917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  transparent_pointers,
484917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  omit_empty_base_classes,
48524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                  ignore_array_bounds,
486917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_name_str,
487917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_size,
488917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_byte_offset,
489917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_size,
490917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_bitfield_bit_offset,
491917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_base_class,
492917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                                                  child_is_deref_of_parent);
493917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    if (child_clang_type && child_byte_size)
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
495917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (synthetic_index)
496917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_byte_offset += child_byte_size * synthetic_index;
497917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
498917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        ConstString child_name;
499917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (!child_name_str.empty())
500917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            child_name.SetCString (child_name_str.c_str());
501917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
502917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        valobj = new ValueObjectChild (*this,
503917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       clang_ast,
504917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_clang_type,
505917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_name,
506917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_size,
507917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_byte_offset,
508917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_size,
509917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_bitfield_bit_offset,
510917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_base_class,
511917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton                                       child_is_deref_of_parent);
512917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton        if (m_pointers_point_to_load_addrs)
513917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton            valobj->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
51647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    return valobj;
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
520fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetSummaryAsCString ()
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
522fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded ())
5231391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    {
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
526f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            SummaryFormat *summary_format = GetSummaryFormat().get();
5271a102087f54079c25c8827afac6153a44ca535daEnrico Granata
5281a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (summary_format)
5291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            {
530f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                m_summary_str = summary_format->FormatObject(GetSP());
5311391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata            }
532f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            else
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
534f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                clang_type_t clang_type = GetClangType();
535f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
53690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                // Do some default printout for function pointers
537f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                if (clang_type)
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
539f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    StreamString sstr;
540f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    clang_type_t elem_or_pointee_clang_type;
541f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
542f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          GetClangAST(),
543f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                          &elem_or_pointee_clang_type));
544f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
545f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    ExecutionContextScope *exe_scope = GetExecutionContextScope();
546f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                    if (exe_scope)
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
54890d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                        if (ClangASTContext::IsFunctionPointerType (clang_type))
549fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
550f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            AddressType func_ptr_address_type = eAddressTypeInvalid;
551f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
552fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
553f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
554f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
555f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                switch (func_ptr_address_type)
55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
557f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeInvalid:
558f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeFile:
559f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
560f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
561f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeLoad:
56203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
563f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Address so_addr;
564f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        Target *target = exe_scope->CalculateTarget();
565f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        if (target && target->GetSectionLoadList().IsEmpty() == false)
566fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        {
567f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
568f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            {
569f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                so_addr.Dump (&sstr,
570f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              exe_scope,
571f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleResolvedDescription,
572f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                              Address::DumpStyleSectionNameOffset);
573f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                            }
574fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                        }
57503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
576f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
578f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                case eAddressTypeHost:
579f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    break;
580f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
581f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            }
582f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (sstr.GetSize() > 0)
583f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            {
584f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.assign (1, '(');
585f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (sstr.GetData(), sstr.GetSize());
586f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_summary_str.append (1, ')');
587fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            }
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5991a102087f54079c25c8827afac6153a44ca535daEnrico Granatabool
6001a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::IsCStringContainer(bool check_pointer)
6011a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6021a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6031a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(),
6041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6061a102087f54079c25c8827afac6153a44ca535daEnrico Granata    bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6071a102087f54079c25c8827afac6153a44ca535daEnrico Granata            ClangASTContext::IsCharType (elem_or_pointee_clang_type));
6081a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!is_char_arr_ptr)
6091a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return false;
6101a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!check_pointer)
6111a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6121a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.Test(ClangASTContext::eTypeIsArray))
6131a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return true;
6141a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6151a102087f54079c25c8827afac6153a44ca535daEnrico Granata    AddressType cstr_address_type = eAddressTypeInvalid;
6161a102087f54079c25c8827afac6153a44ca535daEnrico Granata    cstr_address = GetAddressOf (cstr_address_type, true);
6171a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return (cstr_address != LLDB_INVALID_ADDRESS);
6181a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
6191a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6201a102087f54079c25c8827afac6153a44ca535daEnrico Granatavoid
6211a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ReadPointedString(Stream& s,
6221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                               Error& error,
62386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               uint32_t max_length,
62486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               bool honor_array,
62586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                               lldb::Format item_format)
6261a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
6271a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6281a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (max_length == 0)
62986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        max_length = 128;   // FIXME this should be a setting, or a formatting parameter
6301a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6311a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t clang_type = GetClangType();
6321a102087f54079c25c8827afac6153a44ca535daEnrico Granata    clang_type_t elem_or_pointee_clang_type;
6331a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
6341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          GetClangAST(),
6351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                          &elem_or_pointee_clang_type));
6361a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
6371a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
6381a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
6391a102087f54079c25c8827afac6153a44ca535daEnrico Granata        ExecutionContextScope *exe_scope = GetExecutionContextScope();
6401a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (exe_scope)
6411a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
6421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Target *target = exe_scope->CalculateTarget();
6431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (target != NULL)
6441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
6451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
6461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    AddressType cstr_address_type = eAddressTypeInvalid;
6471a102087f54079c25c8827afac6153a44ca535daEnrico Granata
6481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    size_t cstr_len = 0;
6491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    bool capped_data = false;
6501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (type_flags.Test (ClangASTContext::eTypeIsArray))
6511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have an array
6531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_len = ClangASTContext::GetArraySize (clang_type);
65486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > max_length)
6551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
65686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            capped_data = true;
65786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
6581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
6591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetAddressOf (cstr_address_type, true);
6601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
6611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
6621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        // We have a pointer
6641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        cstr_address = GetPointerValue (cstr_address_type, true);
6651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
6661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (cstr_address != LLDB_INVALID_ADDRESS)
6671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
6681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Address cstr_so_addr (NULL, cstr_address);
6691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        DataExtractor data;
6701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        size_t bytes_read = 0;
6711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        std::vector<char> data_buffer;
6721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        bool prefer_file_cache = false;
67386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        if (cstr_len > 0 && honor_array)
6741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
6751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize(cstr_len);
6761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
6771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            bytes_read = target->ReadMemory (cstr_so_addr,
6781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             prefer_file_cache,
6791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             &data_buffer.front(),
6801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             cstr_len,
6811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                             error);
6821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (bytes_read > 0)
6831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
6841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
6851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
6861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
68786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
6881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
6891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           bytes_read,        // How many bytes to print?
6901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
6911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
6921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
6931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
6941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (capped_data)
6951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    s << "...";
6961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                s << '"';
6971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
6981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
6991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
7001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
70186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            cstr_len = max_length;
70286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                            const size_t k_max_buf_size = 64;
7031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.resize (k_max_buf_size + 1);
7041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            // NULL terminate in case we don't get the entire C string
7051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data_buffer.back() = '\0';
7061a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7081a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
7101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            while ((bytes_read = target->ReadMemory (cstr_so_addr,
7111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     prefer_file_cache,
7121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     &data_buffer.front(),
7131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     k_max_buf_size,
7141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                                     error)) > 0)
7151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
7161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                size_t len = strlen(&data_buffer.front());
7171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len == 0)
7181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
7191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len > bytes_read)
7201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    len = bytes_read;
72186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len > cstr_len)
72286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    len = cstr_len;
7231a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                data.Dump (&s,
7251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // Start offset in "data"
72686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                           item_format,
7271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           1,                 // Size of item (1 byte for a char!)
7281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           len,               // How many bytes to print?
7291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           UINT32_MAX,        // num per line
7301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           LLDB_INVALID_ADDRESS,// base address
7311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0,                 // bitfield bit size
7321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                           0);                // bitfield bit offset
7331a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                if (len < k_max_buf_size)
7351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                    break;
73686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                if (len >= cstr_len)
73786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                {
73886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    s << "...";
73986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                    break;
74086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                }
74186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                                cstr_len -= len;
7421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                cstr_so_addr.Slide (k_max_buf_size);
7431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
7441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            s << '"';
7451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
7461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
7471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
7481a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
7491a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7501a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
7511a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
7521a102087f54079c25c8827afac6153a44ca535daEnrico Granata        error.SetErrorString("impossible to read a string from this object");
7531a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
7541a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
7551a102087f54079c25c8827afac6153a44ca535daEnrico Granata
7564ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
757fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetObjectDescription ()
7584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
759886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
760fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!UpdateValueIfNeeded ())
7614ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
762886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
763886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    if (!m_object_desc_str.empty())
764886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        return m_object_desc_str.c_str();
765886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
766fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *exe_scope = GetExecutionContextScope();
767fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope == NULL)
768fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return NULL;
769fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
7704ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
771b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
7724ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
773b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
774b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
7754ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
776b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
777b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
7784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
7790e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
7800e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
78170c55622e15857e232cf4777a502fa5fe40e785bJim Ingham        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
7820e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
7830e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
7840e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
78570c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            bool is_signed;
78670c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
78770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham                || ClangASTContext::IsPointerType (opaque_qual_type))
78870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            {
7890e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
79070c55622e15857e232cf4777a502fa5fe40e785bJim Ingham            }
7910e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
7920e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
7930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
7940de37195f17fefb536157b3296a18999116b8125Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this))
7954ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
7964ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
7974ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
798e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
799e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
800e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
801e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
802e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
8034ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
806fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::GetValueAsCString ()
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
809462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
811fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (UpdateValueIfNeeded())
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
8196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
8206916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
8216916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
823f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
826f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                            if (m_last_value_format)
8271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            {
828f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                m_value_str = m_last_value_format->FormatObject(GetSP());
8291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            }
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
83182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            {
832f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                StreamString sstr;
833f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                Format format = GetFormat();
834f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (format == eFormatDefault)
835f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        format = (m_is_bitfield_for_scalar ? eFormatUnsigned :
836f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                        ClangASTType::GetFormat(clang_type));
837f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
838f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
839f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 clang_type,               // The clang type to display
840f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 &sstr,
841f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 format,                   // Format to display this type with
842f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 m_data,                   // Data to extract from
843f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 0,                        // Byte offset into "m_data"
844f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetByteSize(),            // Byte size of item in "m_data"
845f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitSize(),     // Bitfield bit size
846f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                 GetBitfieldBitOffset()))  // Bitfield bit offset
847f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.swap(sstr.GetString());
848f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                else
849f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                {
850f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_error.SetErrorStringWithFormat ("unsufficient data for value (only %u of %u bytes available)",
851f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      m_data.GetByteSize(),
852f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                                                      GetByteSize());
853f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                    m_value_str.clear();
854f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata                                }
85582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                            }
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
87154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
87254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
87354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
87617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
87717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
87817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
87917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
88017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
88117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
88217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
890de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// this call should only return pointers to data that needs no special memory management
891de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// (either because they are hardcoded strings, or because they are backed by some other
892de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata// object); returning any new()-ed or malloc()-ed data here, will lead to leaks!
893886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granataconst char *
894886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataValueObject::GetPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display,
895886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                                        lldb::Format custom_format)
896886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
89786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
89886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    RefCounter ref(&m_dump_printable_counter);
89986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
90090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != lldb::eFormatInvalid)
901886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        SetFormat(custom_format);
902886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
903886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    const char * return_value;
904886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
905886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    switch(val_obj_display)
906886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
907886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayValue:
908886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetValueAsCString();
909886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
910886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplaySummary:
911886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetSummaryAsCString();
912886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
913886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        case eDisplayLanguageSpecific:
914886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            return_value = GetObjectDescription();
915886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            break;
916f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata        case eDisplayLocation:
917f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            return_value = GetLocationAsCString();
918f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata            break;
919886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
920886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
92186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // this code snippet might lead to endless recursion, thus we use a RefCounter here to
92286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    // check that we are not looping endlessly
92386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (!return_value && (m_dump_printable_counter < 3))
9249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
9259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // try to pick the other choice
9269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (val_obj_display == eDisplayValue)
9279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            return_value = GetSummaryAsCString();
9289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        else if (val_obj_display == eDisplaySummary)
929de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        {
930de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            if (ClangASTContext::IsAggregateType (GetClangType()) == true)
931de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            {
932de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                // this thing has no value
933de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = "<no summary defined for this datatype>";
934de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            }
935de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata            else
936de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                return_value = GetValueAsCString();
937de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata        }
9389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
939886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
940de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata    return (return_value ? return_value : "<no printable representation>");
9419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
9429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
943886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
9449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
9459762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::DumpPrintableRepresentation(Stream& s,
9469762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         ValueObjectRepresentationStyle val_obj_display,
9479762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                         lldb::Format custom_format)
9489762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
94986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    clang_type_t elem_or_pointee_type;
95186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
9521a102087f54079c25c8827afac6153a44ca535daEnrico Granata
95386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
95486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata         && val_obj_display == ValueObject::eDisplayValue)
9551a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
95686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // when being asked to get a printable display an array or pointer type directly,
95786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // try to "do the right thing"
95886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
95986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (IsCStringContainer(true) &&
96086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCString ||
96186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatCharArray ||
96286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatChar ||
96386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata             custom_format == lldb::eFormatVectorOfChar)) // print char[] & char* directly
96486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
96586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            Error error;
96686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            ReadPointedString(s,
96786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              error,
96886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              0,
96986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatVectorOfChar) ||
97086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                              (custom_format == lldb::eFormatCharArray));
97186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return !error.Fail();
97286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
97386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
97486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (custom_format == lldb::eFormatEnum)
97586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
97686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
97786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // this only works for arrays, because I have no way to know when
97886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        // the pointed memory ends, and no special \0 end of data marker
97986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if (flags.Test(ClangASTContext::eTypeIsArray))
98086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        {
98186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatBytes) ||
98286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatBytesWithASCII))
98386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
98486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
98586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
98686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
98786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
98886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
98986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
99086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
99186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
99286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
99386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
99486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
99586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
996de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
99786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
99886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
99986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, custom_format);
100086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
100186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
100286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
100386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
100486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
100586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
100686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
100786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            if ((custom_format == lldb::eFormatVectorOfChar) ||
100886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat32) ||
100986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfFloat64) ||
101086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt16) ||
101186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt32) ||
101286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt64) ||
101386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfSInt8) ||
101486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt128) ||
101586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt16) ||
101686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt32) ||
101786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt64) ||
101886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                (custom_format == lldb::eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly
101986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            {
102086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                uint32_t count = GetNumChildren();
102186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                lldb::Format format = FormatManager::GetSingleItemFormat(custom_format);
102386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << '[';
102586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                for (uint32_t low = 0; low < count; low++)
102686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                {
102786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
102886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (low)
102986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        s << ',';
103086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
103186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    ValueObjectSP child = GetChildAtIndex(low,true);
103286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    if (!child.get())
103386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    {
1034de4059f2f6a864f5af102a59b56602183b9239bdEnrico Granata                        s << "<invalid child>";
103586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                        continue;
103686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    }
103786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                    child->DumpPrintableRepresentation(s, ValueObject::eDisplayValue, format);
103886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                }
103986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                s << ']';
104186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata                return true;
104386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            }
104486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        }
104586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata
104686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        if ((custom_format == lldb::eFormatBoolean) ||
104786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatBinary) ||
104886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatChar) ||
104986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatCharPrintable) ||
105086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexFloat) ||
105186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDecimal) ||
105286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatHex) ||
105386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatFloat) ||
105486e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOctal) ||
105586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatOSType) ||
105686e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode16) ||
105786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnicode32) ||
105886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatUnsigned) ||
105986e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatPointer) ||
106086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplexInteger) ||
106186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatComplex) ||
106286e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            (custom_format == lldb::eFormatDefault)) // use the [] operator
106386e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata            return false;
10641a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
106586e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    const char *targetvalue = GetPrintableRepresentation(val_obj_display, custom_format);
106690d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (targetvalue)
106786e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        s.PutCString(targetvalue);
106886e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    bool var_success = (targetvalue != NULL);
106990d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (custom_format != eFormatInvalid)
107086e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata        SetFormat(eFormatDefault);
107186e7c3ecb82655e77581ec042aa6b31753a42afcEnrico Granata    return var_success;
1072886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
1073886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
107403e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
1075b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetAddressOf (AddressType &address_type, bool scalar_is_load_address)
1076f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
1077e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!UpdateValueIfNeeded())
1078e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return LLDB_INVALID_ADDRESS;
1079e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1080f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
1081f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
1082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
1083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
1084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
1086f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
1091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
1092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
1093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
1094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
1095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
1097f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
1098f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
1099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
1101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
1102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
1104b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonValueObject::GetPointerValue (AddressType &address_type, bool scalar_is_load_address)
110503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
110603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
110703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
1108e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1109e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (!UpdateValueIfNeeded())
1110e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return address;
1111e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
111303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
111403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
111503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
111603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
111703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
111803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
111903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
112003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
112103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
112203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
112303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
112403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
112503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
112603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
112703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
112803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
112903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
113003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
113103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
113203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
113303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
1134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1135427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
1136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
1137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
113803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
113903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
114003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::SetValueFromCString (const char *value_str)
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
1146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!UpdateValueIfNeeded())
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
1150462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
1153bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1169801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = ull_val;
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
1185801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_value.GetScalar() = sll_val;
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
119454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
1199cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                m_data.SetByteOrder(lldb::endian::InlHostByteOrder());
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
1202462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
1231fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_update_point.SetNeedsUpdate();
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1238b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
1239b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
1240b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
1241f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t opaque_qual_type = GetClangType();
1242b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (opaque_qual_type == NULL)
1243b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        return lldb::eLanguageTypeC;
1244b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1245b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    // If the type is a reference, then resolve it to what it refers to first:
1246b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
1247b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (qual_type->isAnyPointerType())
1248b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
1249b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (qual_type->isObjCObjectPointerType())
1250b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1251b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1252b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        clang::QualType pointee_type (qual_type->getPointeeType());
1253b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->getCXXRecordDeclForPointerType() != NULL)
1254b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
1255b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCObjectOrInterfaceType())
1256b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1257b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCClassType())
1258b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1259b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
1260b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    else
1261b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
1262b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (ClangASTContext::IsObjCClassType (opaque_qual_type))
1263b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
1264974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        if (ClangASTContext::IsCXXClassType (opaque_qual_type))
1265b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
1266b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
1267b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
1268b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    return lldb::eLanguageTypeC;
1269b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
1270b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
127247da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
127447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    m_synthetic_children[key] = valobj;
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
128147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
128347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        synthetic_child_sp = pos->second->GetSP();
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1290462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129370c55622e15857e232cf4777a502fa5fe40e785bJim Inghambool
129424b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::IsArrayType ()
129524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
129624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return ClangASTContext::IsArrayType (GetClangType());
129724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
129824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
129924b03108fe8d672bf96b2cfd491e99e601f03218Greg Claytonbool
13009762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::IsScalarType ()
13019762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
13029762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return ClangASTContext::IsScalarType (GetClangType());
13039762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
13049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
13059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granatabool
130670c55622e15857e232cf4777a502fa5fe40e785bJim InghamValueObject::IsIntegerType (bool &is_signed)
130770c55622e15857e232cf4777a502fa5fe40e785bJim Ingham{
130870c55622e15857e232cf4777a502fa5fe40e785bJim Ingham    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
130970c55622e15857e232cf4777a502fa5fe40e785bJim Ingham}
1310f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131482f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
131582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton}
131682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
131782f0746880b4a6b18bcf8666670140f5b4a56791Greg Claytonbool
131882f0746880b4a6b18bcf8666670140f5b4a56791Greg ClaytonValueObject::IsPossibleCPlusPlusDynamicType ()
131982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton{
132082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1323917c000e77fcf657099f59085d6436d179a39ea4Greg Claytonbool
1324917c000e77fcf657099f59085d6436d179a39ea4Greg ClaytonValueObject::IsPossibleDynamicType ()
1325917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton{
1326917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1327917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton}
1328917c000e77fcf657099f59085d6436d179a39ea4Greg Clayton
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
134024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
134347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            ValueObject *synthetic_child;
134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
134647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            synthetic_child = CreateChildAtIndex(0, true, index);
134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
134947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            if (synthetic_child)
135047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            {
135147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                AddSyntheticChild(index_const_str, synthetic_child);
135247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                synthetic_child_sp = synthetic_child->GetSP();
1353886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->SetName(index_str);
1354886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                synthetic_child_sp->m_is_array_item_for_pointer = true;
135547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            }
135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1360642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
136124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// This allows you to create an array member using and index
136224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// that doesn't not fall in the normal bounds of the array.
136324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// Many times structure can be defined as:
136424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// struct Collection
136524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// {
136624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     uint32_t item_count;
136724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton//     Item item_array[0];
136824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// };
136924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// The size of the "item_array" is 1, but many times in practice
137024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton// there are more items in "item_array".
137124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
137224b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObjectSP
137324b03108fe8d672bf96b2cfd491e99e601f03218Greg ClaytonValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
137424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton{
137524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    ValueObjectSP synthetic_child_sp;
137624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    if (IsArrayType ())
137724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    {
137824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        char index_str[64];
137924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        snprintf(index_str, sizeof(index_str), "[%i]", index);
138024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        ConstString index_const_str(index_str);
138124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // Check if we have already created a synthetic array member in this
138224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        // valid object. If we have we will re-use it.
138324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        synthetic_child_sp = GetSyntheticChild (index_const_str);
138424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        if (!synthetic_child_sp)
138524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        {
138624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            ValueObject *synthetic_child;
138724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // We haven't made a synthetic array member for INDEX yet, so
138824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // lets make one and cache it for any future reference.
138924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            synthetic_child = CreateChildAtIndex(0, true, index);
139024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
139124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            // Cache the value if we got one back...
139224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            if (synthetic_child)
139324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            {
139424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                AddSyntheticChild(index_const_str, synthetic_child);
139524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp = synthetic_child->GetSP();
139624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp->SetName(index_str);
139724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                synthetic_child_sp->m_is_array_item_for_pointer = true;
139824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton            }
139924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        }
140024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    }
140124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton    return synthetic_child_sp;
140224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton}
140324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton
14049762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObjectSP
14059762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico GranataValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
14069762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata{
14079762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    ValueObjectSP synthetic_child_sp;
14089762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    if (IsScalarType ())
14099762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    {
14109762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        char index_str[64];
14119762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
14129762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        ConstString index_const_str(index_str);
14139762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // Check if we have already created a synthetic array member in this
14149762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        // valid object. If we have we will re-use it.
14159762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        synthetic_child_sp = GetSyntheticChild (index_const_str);
14169762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        if (!synthetic_child_sp)
14179762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        {
14189762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            ValueObjectChild *synthetic_child;
14199762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // We haven't made a synthetic array member for INDEX yet, so
14209762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // lets make one and cache it for any future reference.
14219762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            synthetic_child = new ValueObjectChild(*this,
14229762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangAST(),
14239762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetClangType(),
14249762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      index_const_str,
14259762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      GetByteSize(),
14269762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      0,
14279762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      to-from+1,
14289762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      from,
14299762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false,
14309762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                                                      false);
14319762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
14329762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            // Cache the value if we got one back...
14339762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            if (synthetic_child)
14349762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            {
14359762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                AddSyntheticChild(index_const_str, synthetic_child);
14369762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp = synthetic_child->GetSP();
14379762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->SetName(index_str);
14389762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata                synthetic_child_sp->m_is_bitfield_for_scalar = true;
14399762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata            }
14409762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata        }
14419762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    }
14429762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata    return synthetic_child_sp;
14439762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
14449762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
1445e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// your expression path needs to have a leading . or ->
1446e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// (unless it somehow "looks like" an array, in which case it has
1447e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// a leading [ symbol). while the [ is meaningful and should be shown
1448e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to the user, . and -> are just parser design, but by no means
1449e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// added information for the user.. strip them off
1450e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatastatic const char*
1451e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataSkipLeadingExpressionPathSeparators(const char* expression)
1452e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1453e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!expression || !expression[0])
1454e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression;
1455e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '.')
1456e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+1;
1457e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (expression[0] == '-' && expression[1] == '>')
1458e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return expression+2;
1459e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return expression;
1460e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1461e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1462e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatalldb::ValueObjectSP
1463e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
1464e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1465e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ValueObjectSP synthetic_child_sp;
1466e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    ConstString name_const_string(expression);
1467e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // Check if we have already created a synthetic array member in this
1468e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    // valid object. If we have we will re-use it.
1469e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    synthetic_child_sp = GetSyntheticChild (name_const_string);
1470e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (!synthetic_child_sp)
1471e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    {
1472e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // We haven't made a synthetic array member for expression yet, so
1473e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // lets make one and cache it for any future reference.
1474e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        synthetic_child_sp = GetValueForExpressionPath(expression);
1475e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1476e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        // Cache the value if we got one back...
1477e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        if (synthetic_child_sp.get())
1478e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        {
1479e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            AddSyntheticChild(name_const_string, synthetic_child_sp.get());
1480e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            synthetic_child_sp->SetName(SkipLeadingExpressionPathSeparators(expression));
1481e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            synthetic_child_sp->m_is_expression_path_child = true;
1482e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        }
1483e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    }
1484e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    return synthetic_child_sp;
1485e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1486e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1487e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granatavoid
1488e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::CalculateSyntheticValue (lldb::SyntheticValueType use_synthetic)
1489e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1490e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1491e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1492e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1493e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    UpdateFormatsIfNeeded();
1494e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1495e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1496e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return;
1497e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
14989ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata    if (m_synthetic_value == NULL)
14999ae7cef26612773c6b3422834cec83f0fbb2cf8cEnrico Granata        m_synthetic_value = new ValueObjectSynthetic(*this, m_last_synthetic_filter);
1500e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1501e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1502e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1503e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamvoid
150410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::CalculateDynamicValue (lldb::DynamicValueType use_dynamic)
1505642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
150610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
150710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return;
150810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
150947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (!m_dynamic_value && !IsDynamic())
1510e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
1511e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        Process *process = m_update_point.GetProcess();
1512e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool worth_having_dynamic_value = false;
1513642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
1514e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
1516e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        // hard code this everywhere.
1517e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        lldb::LanguageType known_type = GetObjectRuntimeLanguage();
1518e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC)
1519e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1520e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
1521e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (runtime)
1522e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
1523e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1524e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        else
1525e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
1526e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus);
1527e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (cpp_runtime)
1528e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
1529e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1530e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (!worth_having_dynamic_value)
1531e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            {
1532e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                LanguageRuntime *objc_runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC);
1533e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                if (objc_runtime)
153410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
1535e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            }
1536e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
1537e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1538e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (worth_having_dynamic_value)
153910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
154047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham
154147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//        if (worth_having_dynamic_value)
154247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham//            printf ("Adding dynamic value %s (%p) to (%p) - manager %p.\n", m_name.GetCString(), m_dynamic_value, this, m_manager);
1543e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
1544e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
1545e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham}
1546e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
154747da810225d8674eb9158bcf5f1f5b847cbaeedfJim InghamValueObjectSP
154810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim InghamValueObject::GetDynamicValue (DynamicValueType use_dynamic)
1549e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham{
155010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (use_dynamic == lldb::eNoDynamicValues)
155110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        return ValueObjectSP();
155210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
155310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (!IsDynamic() && m_dynamic_value == NULL)
1554e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    {
155510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        CalculateDynamicValue(use_dynamic);
1556e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    }
155747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_dynamic_value)
155847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_dynamic_value->GetSP();
155947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    else
156047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
1561642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
156266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1563e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// GetDynamicValue() returns a NULL SharedPointer if the object is not dynamic
1564e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// or we do not really want a dynamic VO. this method instead returns this object
1565e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// itself when making it synthetic has no meaning. this makes it much simpler
1566e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata// to replace the SyntheticValue for the ValueObject
1567e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObjectSP
1568e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico GranataValueObject::GetSyntheticValue (SyntheticValueType use_synthetic)
1569e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata{
1570e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (use_synthetic == lldb::eNoSyntheticFilter)
1571e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1572e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1573e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    UpdateFormatsIfNeeded();
1574e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1575e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_last_synthetic_filter.get() == NULL)
1576e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1577e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1578e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    CalculateSyntheticValue(use_synthetic);
1579e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
1580e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    if (m_synthetic_value)
1581e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return m_synthetic_value->GetSP();
1582e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    else
1583e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        return GetSP();
1584e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata}
1585e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
158600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Claytonbool
158700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetBaseClassPath (Stream &s)
158800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
158900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (IsBaseClass())
159000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1591e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
159200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        clang_type_t clang_type = GetClangType();
159300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        std::string cxx_class_name;
159400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
159500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (this_had_base_class)
159600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        {
159700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (parent_had_base_class)
159800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString("::");
159900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            s.PutCString(cxx_class_name.c_str());
160000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        }
160100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        return parent_had_base_class || this_had_base_class;
160200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
160300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return false;
160400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
160500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
160600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
160700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject *
160800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg ClaytonValueObject::GetNonBaseClassParent()
160900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton{
1610e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (GetParent())
161100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
1612e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        if (GetParent()->IsBaseClass())
1613e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent()->GetNonBaseClassParent();
161400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        else
1615e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            return GetParent();
161600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    }
161700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    return NULL;
161800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton}
161966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
162066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
16211391a391072a4b25c21b7198733ef7aa47a616c7Enrico GranataValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
1622bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
162300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    const bool is_deref_of_parent = IsDereferenceOfParent ();
162400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
162590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
16261391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
16271391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
16281391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        // the eHonorPointers mode is meant to produce strings in this latter format
16291391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        s.PutCString("*(");
16301391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
163100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
16321391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    ValueObject* parent = GetParent();
16331391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
16341391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (parent)
16351391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
1636886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
1637886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // if we are a deref_of_parent just because we are synthetic array
1638886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // members made up to allow ptr[%d] syntax to work in variable
1639886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    // printing, then add our name ([%d]) to the expression path
164090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata    if (m_is_array_item_for_pointer && epformat == eHonorPointers)
1641886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        s.PutCString(m_name.AsCString());
16421391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
164300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    if (!IsBaseClass())
164400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton    {
164500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        if (!is_deref_of_parent)
1646bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
164700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            ValueObject *non_base_class_parent = GetNonBaseClassParent();
164800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (non_base_class_parent)
1649bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
165000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
165100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (non_base_class_parent_clang_type)
165200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
165300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
165400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
165590d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                    if (parent && parent->IsDereferenceOfParent() && epformat == eHonorPointers)
165600c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    {
165700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("->");
165800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
16591391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    else
16601391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    {
16611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
16621391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
16631391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutCString("->");
16641391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
16651391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
16661391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
16671391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        {
16681391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                            s.PutChar('.');
16691391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                        }
167000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    }
167100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
1672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
167300c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton
167400c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            const char *name = GetName().GetCString();
167500c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (name)
1676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
167700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                if (qualify_cxx_base_classes)
167800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                {
167900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                    if (GetBaseClassPath (s))
168000c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                        s.PutCString("::");
168100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                }
168200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                s.PutCString(name);
1683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1684bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
1685bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
1686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
16871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    if (is_deref_of_parent && epformat == eDereferencePointers) {
168800c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        s.PutChar(')');
16891391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata    }
1690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
1691bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1692ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1693ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath(const char* expression,
1694ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const char** first_unparsed,
1695ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathScanEndReason* reason_to_stop,
1696ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathEndResultType* final_value_type,
1697ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       const GetValueForExpressionPathOptions& options,
1698ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                       ExpressionPathAftermath* final_task_on_target)
1699ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1700ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1701ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    const char* dummy_first_unparsed;
1702ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
1703ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathEndResultType dummy_final_value_type;
1704ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
1705ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1706ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
1707ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
1708ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
1709ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
1710ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           options,
1711ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
1712ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1713ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
1714ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1715ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ret_val;
1716ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1717ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
1718ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1719ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eDereference)
1720ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1721ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1722ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->Dereference(error);
1723ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1724ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1725ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eDereferencingFailed;
1726ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1727ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1728ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1729ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1730ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1731ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1732ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1733ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1734ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1735ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (*final_task_on_target == ValueObject::eTakeAddress)
1736ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1737ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            Error error;
1738ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            ValueObjectSP final_value = ret_val->AddressOf(error);
1739ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            if (error.Fail() || !final_value.get())
1740ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1741ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eTakingAddressFailed;
1742ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_value_type = ValueObject::eInvalid;
1743ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
1744ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1745ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            else
1746ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1747ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_task_on_target = ValueObject::eNothing;
1748ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return final_value;
1749ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1750ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1751ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
1752ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
1753ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
1754ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
17551a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
17561a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::GetValuesForExpressionPath(const char* expression,
17571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
17581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
17591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
17601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_value_type,
17611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
17621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* final_task_on_target)
17631a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
17641a102087f54079c25c8827afac6153a44ca535daEnrico Granata    const char* dummy_first_unparsed;
17651a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathScanEndReason dummy_reason_to_stop;
17661a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathEndResultType dummy_final_value_type;
17671a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eNothing;
17681a102087f54079c25c8827afac6153a44ca535daEnrico Granata
17691a102087f54079c25c8827afac6153a44ca535daEnrico Granata    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
17701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
17711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
17721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_value_type ? final_value_type : &dummy_final_value_type,
17731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           options,
17741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
17751a102087f54079c25c8827afac6153a44ca535daEnrico Granata
17761a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!ret_val.get()) // if there are errors, I add nothing to the list
17771a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
17781a102087f54079c25c8827afac6153a44ca535daEnrico Granata
17791a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (*reason_to_stop != eArrayRangeOperatorMet)
17801a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
17811a102087f54079c25c8827afac6153a44ca535daEnrico Granata        // I need not expand a range, just post-process the final value and return
17821a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!final_task_on_target || *final_task_on_target == ValueObject::eNothing)
17831a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
17841a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(ret_val);
17851a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
17861a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
17871a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (ret_val.get() && *final_value_type == ePlain) // I can only deref and takeaddress of plain objects
17881a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
17891a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eDereference)
17901a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
17911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
17921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->Dereference(error);
17931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
17941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
17951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eDereferencingFailed;
17961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
17971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
17981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
17991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
18001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
18021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
18031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
18041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18051a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
18061a102087f54079c25c8827afac6153a44ca535daEnrico Granata            if (*final_task_on_target == ValueObject::eTakeAddress)
18071a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
18081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                Error error;
18091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                ValueObjectSP final_value = ret_val->AddressOf(error);
18101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (error.Fail() || !final_value.get())
18111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eTakingAddressFailed;
18131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_value_type = ValueObject::eInvalid;
18141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
18151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else
18171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
18181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_task_on_target = ValueObject::eNothing;
18191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    list->Append(final_value);
18201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 1;
18211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
18221a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
18231a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
18241a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
18251a102087f54079c25c8827afac6153a44ca535daEnrico Granata    else
18261a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
18271a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
18281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          first_unparsed ? first_unparsed : &dummy_first_unparsed,
18291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          ret_val,
18301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          list,
18311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
18321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_value_type ? final_value_type : &dummy_final_value_type,
18331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          options,
18341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                          final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
18351a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
18361a102087f54079c25c8827afac6153a44ca535daEnrico Granata    // in any non-covered case, just do the obviously right thing
18371a102087f54079c25c8827afac6153a44ca535daEnrico Granata    list->Append(ret_val);
18381a102087f54079c25c8827afac6153a44ca535daEnrico Granata    return 1;
18391a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
18401a102087f54079c25c8827afac6153a44ca535daEnrico Granata
1841ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granatalldb::ValueObjectSP
1842ff78238a2ebc66a683dded02c2f99fba85077d05Enrico GranataValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
1843ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const char** first_unparsed,
1844ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathScanEndReason* reason_to_stop,
1845ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathEndResultType* final_result,
1846ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            const GetValueForExpressionPathOptions& options,
1847ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                            ExpressionPathAftermath* what_next)
1848ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata{
1849ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    ValueObjectSP root = GetSP();
1850ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1851ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (!root.get())
1852ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        return ValueObjectSP();
1853ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1854ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    *first_unparsed = expression_cstr;
1855ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1856ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    while (true)
1857ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    {
1858ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1859ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
1860ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1861ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
18621a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
18631a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
18641a102087f54079c25c8827afac6153a44ca535daEnrico Granata
18651a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
18661a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
18671a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
1868ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1869ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        if (!expression_cstr || *expression_cstr == '\0')
1870ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1871ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            *reason_to_stop = ValueObject::eEndOfString;
1872ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            return root;
1873ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
1874ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
1875ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        switch (*expression_cstr)
1876ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        {
1877ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '-':
1878ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1879ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax &&
18801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
1881ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1882ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1883ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eArrowInsteadOfDot;
1884ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1885ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1886ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
18871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
18881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) &&
1889ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    options.m_no_fragile_ivar)
1890ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1891ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1892ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eFragileIVarNotAllowed;
1893ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1894ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1895ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1896ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (expression_cstr[1] != '>')
1897ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1898ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1899ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
1900ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1901ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1902ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1903ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip the -
1904ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1905ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '.': // or fallthrough from ->
1906ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
1907ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
19081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
1909ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1910ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1911ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eDotInsteadOfArrow;
1912ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
1913ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
1914ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1915ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                expression_cstr++; // skip .
1916ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *next_separator = strpbrk(expression_cstr+1,"-.[");
1917ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                ConstString child_name;
1918ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!next_separator) // if no other separator just expand this last layer
1919ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1920ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCString (expression_cstr);
1921ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
1922ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // we know we are done, so just return
1923ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1924ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = '\0';
1925ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEndOfString;
1926ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
1927ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
1928ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1929ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
1930ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1931ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1932ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
1933ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1934ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1935ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1936ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1937ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // other layers do expand
1938ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1939ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
1940ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    root = root->GetChildMemberWithName(child_name, true);
1941ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (root.get()) // store the new root and move on
1942ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1943ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = next_separator;
1944ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::ePlain;
1945ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        continue;
1946ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1947ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
1948ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1949ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1950ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eNoSuchChild;
1951ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1952ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1953ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1954ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1955ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
1956ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
1957ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            case '[':
1958ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
19591a102087f54079c25c8827afac6153a44ca535daEnrico 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*
1960ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
19611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
1962ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1963ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1964ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
1965ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1966ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1967ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1968ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
1969ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1970ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1971ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
1972ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1973ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1974ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1975ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1976ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
1977ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
19781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
1979ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1980ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
1981ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
1982ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
1983ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
1984ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1985ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
1986ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
1987ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr+2;
1988ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
1989ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eUnboundedRange;
1990ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
1991ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
1992ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
1993ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
1994ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
1995ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
1996ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
1997ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *first_unparsed = expression_cstr;
1998ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
1999ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    *final_result = ValueObject::eInvalid;
2000ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    return ValueObjectSP();
2001ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2002ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2003ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2004ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2005ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2006ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2007ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2008ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2009ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2010ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2011ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2012ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2013ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2014ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
20151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2016ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2017ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr+2;
2018ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2019ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eUnboundedRange;
2020ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2021ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2022ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2023ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2024ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2025ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
2026ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2027ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2028ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2029ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2030ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    // from here on we do have a valid index
20311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2032ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
203324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
203424b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (!child_valobj_sp)
203524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
203624b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        if (child_valobj_sp)
203724b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        {
203824b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            root = child_valobj_sp;
203924b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *first_unparsed = end+1; // skip ]
204024b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            *final_result = ValueObject::ePlain;
204124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                            continue;
204224b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        }
204324b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                        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                    }
20511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2052ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2053ff78238a2ebc66a683dded02c2f99fba85077d05Enrico 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
20541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2055ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2056ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            Error error;
2057ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->Dereference(error);
2058ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (error.Fail() || !root.get())
2059ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2060ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2061ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
2062ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2063ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2064ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2065ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2066ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2067ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *what_next = eNothing;
2068ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2069ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2070ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2071ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2072ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2073ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
2074ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            if (!root.get())
2075ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2076ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = expression_cstr;
2077ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
2078ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::eInvalid;
2079ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                return ValueObjectSP();
2080ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2081ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            else
2082ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            {
2083ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *first_unparsed = end+1; // skip ]
2084ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                *final_result = ValueObject::ePlain;
2085ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                                continue;
2086ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            }
2087ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2088ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2089ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
2090ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2091ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
2092ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2093ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2094ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2095ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2096ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2097ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2098ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2099ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
2100ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2101ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2102ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2103ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2104ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2105ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2106ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2107ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2108ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                else // we have a low and a high index
2109ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                {
2110ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    char *end = NULL;
2111ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
2112ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an 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                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
2120ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2121ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2122ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2123ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
2124ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eInvalid;
2125ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return ValueObjectSP();
2126ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2127ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    if (index_lower > index_higher) // swap indices if required
2128ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2129ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        unsigned long temp = index_lower;
2130ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_lower = index_higher;
2131ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        index_higher = temp;
2132ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
2134ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2135ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
2136ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (!root.get())
2137ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2138ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2139ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
2140ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2141ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2142ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2143ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2144ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2145ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = end+1; // skip ]
2146ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eBitfieldRangeOperatorMet;
2147ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eBitfield;
2148ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return root;
2149ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2150ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
21511a102087f54079c25c8827afac6153a44ca535daEnrico 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
2152ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                             *what_next == ValueObject::eDereference &&
21531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2154ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2155ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        Error error;
2156ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        root = root->Dereference(error);
2157ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        if (error.Fail() || !root.get())
2158ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2159ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *first_unparsed = expression_cstr;
2160ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
2161ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *final_result = ValueObject::eInvalid;
2162ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            return ValueObjectSP();
2163ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2164ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        else
2165ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        {
2166ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            *what_next = ValueObject::eNothing;
2167ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                            continue;
2168ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        }
2169ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2170ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    else
2171ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    {
2172ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *first_unparsed = expression_cstr;
2173ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *reason_to_stop = ValueObject::eArrayRangeOperatorMet;
2174ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        *final_result = ValueObject::eBoundedRange;
2175ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                        return root;
2176ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                    }
2177ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                }
2178ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2179ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2180ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            default: // some non-separator is in the way
2181ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            {
2182ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *first_unparsed = expression_cstr;
2183ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
2184ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                *final_result = ValueObject::eInvalid;
2185ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                return ValueObjectSP();
2186ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata                break;
2187ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata            }
2188ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        }
2189ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    }
2190ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata}
2191ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata
21921a102087f54079c25c8827afac6153a44ca535daEnrico Granataint
21931a102087f54079c25c8827afac6153a44ca535daEnrico GranataValueObject::ExpandArraySliceExpression(const char* expression_cstr,
21941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const char** first_unparsed,
21951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectSP root,
21961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        lldb::ValueObjectListSP& list,
21971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathScanEndReason* reason_to_stop,
21981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathEndResultType* final_result,
21991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        const GetValueForExpressionPathOptions& options,
22001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                        ExpressionPathAftermath* what_next)
22011a102087f54079c25c8827afac6153a44ca535daEnrico Granata{
22021a102087f54079c25c8827afac6153a44ca535daEnrico Granata    if (!root.get())
22031a102087f54079c25c8827afac6153a44ca535daEnrico Granata        return 0;
22041a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22051a102087f54079c25c8827afac6153a44ca535daEnrico Granata    *first_unparsed = expression_cstr;
22061a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22071a102087f54079c25c8827afac6153a44ca535daEnrico Granata    while (true)
22081a102087f54079c25c8827afac6153a44ca535daEnrico Granata    {
22091a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22101a102087f54079c25c8827afac6153a44ca535daEnrico Granata        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
22111a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22121a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t root_clang_type = root->GetClangType();
22131a102087f54079c25c8827afac6153a44ca535daEnrico Granata        lldb::clang_type_t pointee_clang_type;
22141a102087f54079c25c8827afac6153a44ca535daEnrico Granata        Flags root_clang_type_info,pointee_clang_type_info;
22151a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22161a102087f54079c25c8827afac6153a44ca535daEnrico Granata        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
22171a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (pointee_clang_type)
22181a102087f54079c25c8827afac6153a44ca535daEnrico Granata            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
22191a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22201a102087f54079c25c8827afac6153a44ca535daEnrico Granata        if (!expression_cstr || *expression_cstr == '\0')
22211a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
22221a102087f54079c25c8827afac6153a44ca535daEnrico Granata            *reason_to_stop = ValueObject::eEndOfString;
22231a102087f54079c25c8827afac6153a44ca535daEnrico Granata            list->Append(root);
22241a102087f54079c25c8827afac6153a44ca535daEnrico Granata            return 1;
22251a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
22261a102087f54079c25c8827afac6153a44ca535daEnrico Granata
22271a102087f54079c25c8827afac6153a44ca535daEnrico Granata        switch (*expression_cstr)
22281a102087f54079c25c8827afac6153a44ca535daEnrico Granata        {
22291a102087f54079c25c8827afac6153a44ca535daEnrico Granata            case '[':
22301a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
22311a102087f54079c25c8827afac6153a44ca535daEnrico 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*
22321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
22331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
22341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
22361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorInvalid;
22371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
22381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
22391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
22401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
22411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
22431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorNotAllowed;
22441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
22451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
22461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
22471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
22481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
22491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
22501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
22511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
22531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
22541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
22551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
22561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
22571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else // expand this into list
22581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        int max_index = root->GetNumChildren() - 1;
22601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        for (int index = 0; index < max_index; index++)
22611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
22621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
22631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
22641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
22651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
22661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr+2;
22671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
22681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
22691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return max_index; // tell me number of items I added to the VOList
22701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
22711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
22721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *separator_position = ::strchr(expression_cstr+1,'-');
22731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
22741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!close_bracket_position) // if there is no ], this is a syntax error
22751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
22761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *first_unparsed = expression_cstr;
22771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *reason_to_stop = ValueObject::eUnexpectedSymbol;
22781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    *final_result = ValueObject::eInvalid;
22791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    return 0;
22801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
22811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
22821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
22831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
22841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
22851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
22861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
22881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
22891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
22901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
22911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
22921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
22931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
22941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
22951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
22961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            int max_index = root->GetNumChildren() - 1;
22971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            for (int index = 0; index < max_index; index++)
22981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
22991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                ValueObjectSP child =
23001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
23011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(child);
23021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr+2;
23041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return max_index; // tell me number of items I added to the VOList
23071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eEmptyRangeNotAllowed;
23121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    // from here on we do have a valid index
23171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
23181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetChildAtIndex(index, true);
23201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
23211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
23241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
23301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
23311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
23341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
23371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23381a102087f54079c25c8827afac6153a44ca535daEnrico 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
23391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
23401a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            Error error;
23421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->Dereference(error);
23431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (error.Fail() || !root.get())
23441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
23461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eDereferencingFailed;
23471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
23481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
23491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
23511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *what_next = eNothing;
23531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                continue;
23541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
23571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
23591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            if (!root.get())
23601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23611a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = expression_cstr;
23621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eNoSuchChild;
23631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eInvalid;
23641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 0;
23651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            else
23671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            {
23681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                list->Append(root);
23691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *first_unparsed = end+1; // skip ]
23701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                *final_result = ValueObject::eValueObjectList;
23721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                return 1;
23731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            }
23741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23751a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23761a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
23771a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
23781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index, index, true);
23791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
23801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
23821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
23831a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
23841a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
23851a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23861a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
23871a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
23881a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
23891a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
23901a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
23911a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
23921a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
23931a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
23941a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
23951a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
23961a102087f54079c25c8827afac6153a44ca535daEnrico Granata                else // we have a low and a high index
23971a102087f54079c25c8827afac6153a44ca535daEnrico Granata                {
23981a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    char *end = NULL;
23991a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
24001a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != separator_position) // if something weird is in our way return an error
24011a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24021a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24031a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24041a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24051a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24061a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24071a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
24081a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
24091a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24101a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = expression_cstr;
24111a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eUnexpectedSymbol;
24121a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eInvalid;
24131a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return 0;
24141a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24151a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (index_lower > index_higher) // swap indices if required
24161a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24171a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        unsigned long temp = index_lower;
24181a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_lower = index_higher;
24191a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        index_higher = temp;
24201a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24211a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
24221a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24231a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
24241a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (!root.get())
24251a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24261a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24271a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eNoSuchChild;
24281a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24291a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24301a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24311a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24321a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24331a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(root);
24341a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = end+1; // skip ]
24351a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24361a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eValueObjectList;
24371a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 1;
24381a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24391a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24401a102087f54079c25c8827afac6153a44ca535daEnrico 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
24411a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             *what_next == ValueObject::eDereference &&
24421a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
24431a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24441a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        Error error;
24451a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        root = root->Dereference(error);
24461a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        if (error.Fail() || !root.get())
24471a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24481a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *first_unparsed = expression_cstr;
24491a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *reason_to_stop = ValueObject::eDereferencingFailed;
24501a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *final_result = ValueObject::eInvalid;
24511a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            return 0;
24521a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24531a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        else
24541a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24551a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            *what_next = ValueObject::eNothing;
24561a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            continue;
24571a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24581a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24591a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    else
24601a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    {
24612bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen                        for (unsigned long index = index_lower;
24621a102087f54079c25c8827afac6153a44ca535daEnrico Granata                             index <= index_higher; index++)
24631a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        {
24641a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            ValueObjectSP child =
24651a102087f54079c25c8827afac6153a44ca535daEnrico Granata                                root->GetChildAtIndex(index, true);
24661a102087f54079c25c8827afac6153a44ca535daEnrico Granata                            list->Append(child);
24671a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        }
24681a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *first_unparsed = end+1;
24691a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *reason_to_stop = ValueObject::eRangeOperatorExpanded;
24701a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        *final_result = ValueObject::eValueObjectList;
24711a102087f54079c25c8827afac6153a44ca535daEnrico Granata                        return index_higher-index_lower+1; // tell me number of items I added to the VOList
24721a102087f54079c25c8827afac6153a44ca535daEnrico Granata                    }
24731a102087f54079c25c8827afac6153a44ca535daEnrico Granata                }
24741a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
24751a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
24761a102087f54079c25c8827afac6153a44ca535daEnrico Granata            default: // some non-[ separator, or something entirely wrong, is in the way
24771a102087f54079c25c8827afac6153a44ca535daEnrico Granata            {
24781a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *first_unparsed = expression_cstr;
24791a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *reason_to_stop = ValueObject::eUnexpectedSymbol;
24801a102087f54079c25c8827afac6153a44ca535daEnrico Granata                *final_result = ValueObject::eInvalid;
24811a102087f54079c25c8827afac6153a44ca535daEnrico Granata                return 0;
24821a102087f54079c25c8827afac6153a44ca535daEnrico Granata                break;
24831a102087f54079c25c8827afac6153a44ca535daEnrico Granata            }
24841a102087f54079c25c8827afac6153a44ca535daEnrico Granata        }
24851a102087f54079c25c8827afac6153a44ca535daEnrico Granata    }
24861a102087f54079c25c8827afac6153a44ca535daEnrico Granata}
24871a102087f54079c25c8827afac6153a44ca535daEnrico Granata
2488bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
248966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
249066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
249166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
249266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
249366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
249466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
249566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
249666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
249766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
249866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
249966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
250010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    lldb::DynamicValueType use_dynamic,
2501e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    bool use_synth,
2502bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
25037f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    bool flat_output,
25047f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    uint32_t omit_summary_depth
250566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
250666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
250782f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton    if (valobj)
250866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
250982f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        bool update_success = valobj->UpdateValueIfNeeded ();
251082f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton
251182f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton        if (update_success && use_dynamic != lldb::eNoDynamicValues)
2512e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        {
251310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            ValueObject *dynamic_value = valobj->GetDynamicValue(use_dynamic).get();
2514e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham            if (dynamic_value)
2515e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                valobj = dynamic_value;
2516e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        }
2517e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2518bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
2519bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2520f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
2521bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
2522f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
2523f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
2524bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2525bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
2526bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2527bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
252866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2529bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
2530bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2531fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                s.Printf("%s: ", valobj->GetLocationAsCString());
2532bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
253366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2534bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
253566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2536a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
253700c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton            if (show_types || (curr_depth == 0 && !flat_output))
2538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>"));
253966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
254066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2541bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
2542bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2543b01000fd063629facd45044f137446fb748ee179Greg Clayton                // If we are showing types, also qualify the C++ base classes
2544b01000fd063629facd45044f137446fb748ee179Greg Clayton                const bool qualify_cxx_base_classes = show_types;
2545b01000fd063629facd45044f137446fb748ee179Greg Clayton                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
2546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
2547bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
2549bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
2550bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
2551bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
2552bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
2553bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2554fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (!scope_already_checked && !valobj->IsInScope())
2555bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
255682f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton                err_cstr = "out of scope";
2557bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
255866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
255966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2560bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
25611391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata        const char *sum_cstr = NULL;
25621a102087f54079c25c8827afac6153a44ca535daEnrico Granata        SummaryFormat* entry = valobj->GetSummaryFormat().get();
2563bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
25647f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        if (omit_summary_depth > 0)
25657f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            entry = NULL;
25667f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata
2567bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
2568bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
2569fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            val_cstr = valobj->GetValueAsCString();
2570bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
2571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
257266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
257366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
257466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
257582f0746880b4a6b18bcf8666670140f5b4a56791Greg Clayton            s.Printf (" <%s>\n", err_cstr);
257666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
257766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
257866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
2579f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
2580bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
2581bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
25821391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata
25837f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                sum_cstr = (omit_summary_depth == 0) ? valobj->GetSummaryAsCString() : NULL;
258466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
25851391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // We must calculate this value in realtime because entry might alter this variable's value
25861391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                // (e.g. by saying ${var%fmt}) and render precached values useless
25871391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                if (val_cstr && (!entry || entry->DoesPrintValue() || !sum_cstr))
25881391a391072a4b25c21b7198733ef7aa47a616c7Enrico Granata                    s.Printf(" %s", valobj->GetValueAsCString());
258966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
259090d207ede88604e278f68ee1b02600a35e56dd14Enrico Granata                if (sum_cstr)
2591886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                {
2592886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // for some reason, using %@ (ObjC description) in a summary string, makes
2593886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // us believe we need to reset ourselves, thus invalidating the content of
2594886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // sum_cstr. Thus, IF we had a valid sum_cstr before, but it is now empty
2595886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    // let us recalculate it!
2596886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    if (sum_cstr[0] == '\0')
2597886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", valobj->GetSummaryAsCString());
2598886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                    else
2599886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                        s.Printf(" %s", sum_cstr);
2600886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
2601bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2602bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
2603bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
2604fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    const char *object_desc = valobj->GetObjectDescription();
2605bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
2606bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
2607bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2608e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
2609bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
2610886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                }
261166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
261266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
261366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
261466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2615f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
2616f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
2617f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
2618f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
2619f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
2620f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2621f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
2622f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
2623f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
2624f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2625f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
2626f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
2627f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
2628f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
2629f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
2630b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType ptr_address_type;
2631f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
2632f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2633f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2634f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
2635f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
2636f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
2637f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
2638f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
2639f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
2640f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
2641f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
2642f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
2643f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
2644f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
2645f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
264666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2647886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
264866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2649e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    ValueObjectSP synth_vobj = valobj->GetSyntheticValue(use_synth ?
2650e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eUseSyntheticFilter :
2651e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                                         lldb::eNoSyntheticFilter);
2652e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                    const uint32_t num_children = synth_vobj->GetNumChildren();
2653bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
265466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
2655bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
265666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
2657bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
2658bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
2659bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2660bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
2661bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2662bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
26633f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
2664bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
2665bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2666bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2667bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
2668bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2669e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                            ValueObjectSP child_sp(synth_vobj->GetChildAtIndex(idx, true));
2670bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
2671bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
2672bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
2673bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
2674bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
2675f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
2676bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
2677bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
2678bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
2679bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
2680bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
2681e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham                                                 use_dynamic,
2682e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata                                                 use_synth,
2683bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
26847f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 flat_output,
26857f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                                                 omit_summary_depth > 1 ? omit_summary_depth - 1 : 0);
2686bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
2687bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
2688bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
2689bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
2690bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
2691bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
2692bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
269366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
269466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
2695bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
2696bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2697bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
2698bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
2700bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2701bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
2702bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
2703bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
2704bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
2705bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
2706bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
270766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
2708bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
2709bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
271066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
271166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
271266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
271366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
271466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
2715bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
271666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
2717bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
271866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
271966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
272066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
272166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
272266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
272366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
2724427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2725427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
2726fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::CreateConstantValue (const ConstString &name)
2727427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2728427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
2729427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2730fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (UpdateValueIfNeeded() && m_error.Success())
2731427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2732fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        ExecutionContextScope *exe_scope = GetExecutionContextScope();
2733fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_scope)
2734fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2735fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            ExecutionContext exe_ctx;
2736fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            exe_scope->CalculateExecutionContext(exe_ctx);
2737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2738fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            clang::ASTContext *ast = GetClangAST ();
2739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2740fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            DataExtractor data;
2741fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetByteOrder (m_data.GetByteOrder());
2742fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            data.SetAddressByteSize(m_data.GetAddressByteSize());
2743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2744801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule());
2745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
274647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            valobj_sp = ValueObjectConstResult::Create (exe_scope,
274747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        ast,
274847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        GetClangType(),
274947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        name,
275047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                        data);
2751fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2752427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2753fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2754fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!valobj_sp)
2755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
275647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
2757427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2758427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
2759427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2760427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2761427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
2762bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
2763427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
276447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
276547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2766e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2767c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
2768c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
2769427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
277124b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton        bool ignore_array_bounds = false;
2772427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
2774427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
2775427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
2776427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
2777427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
2778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
277900c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton        bool child_is_deref_of_parent = false;
2780427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
2781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
2783427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
278458513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
278558513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        ExecutionContext exe_ctx;
278658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        GetExecutionContextScope()->CalculateExecutionContext (exe_ctx);
278758513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
278858513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
278958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham                                                                      clang_ast,
2790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
2791427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
2792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
2793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
2794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
279524b03108fe8d672bf96b2cfd491e99e601f03218Greg Clayton                                                                      ignore_array_bounds,
2796427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
2797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
2798427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
2800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
280100c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_base_class,
280200c3ae7dac4cf9654d1569735c41e58fb2fd8969Greg Clayton                                                                      child_is_deref_of_parent);
2803a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (child_clang_type && child_byte_size)
2804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2805427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
2806427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
2807427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
2808427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
280947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            m_deref_valobj = new ValueObjectChild (*this,
281047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   clang_ast,
281147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_clang_type,
281247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_name,
281347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_size,
281447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_byte_offset,
281547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_size,
281647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_bitfield_bit_offset,
281747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_base_class,
281847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                   child_is_deref_of_parent);
2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2821c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
282247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham    if (m_deref_valobj)
2823c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
2824c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
282547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return m_deref_valobj->GetSP();
2826c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
2827427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
2828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2829c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
2830b01000fd063629facd45044f137446fb748ee179Greg Clayton        GetExpressionPath(strm, true);
2831c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2832c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
2833c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
2834c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
2835c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
283647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham        return ValueObjectSP();
2837427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2838427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2839427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2840e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Inghamlldb::ValueObjectSP
2841c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
2842427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
2843e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_addr_of_valobj_sp)
2844e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return m_addr_of_valobj_sp;
2845e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
2846b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    AddressType address_type = eAddressTypeInvalid;
2847427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
2848427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
2849c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
2850427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
2851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
2852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
2853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
2854c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
2855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
2856c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
2857c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
2858b01000fd063629facd45044f137446fb748ee179Greg Clayton                GetExpressionPath(expr_path_strm, true);
2859c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
2860c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
2861427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2862c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
2863427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
2864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
2865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
2867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
2868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
2869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
2870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
2871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
2872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
287347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (GetExecutionContextScope(),
287447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ast,
287547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
287647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          ConstString (name.c_str()),
287747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          addr,
287847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          eAddressTypeInvalid,
287947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                          m_data.GetAddressByteSize());
2880427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
2881427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
2882427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
2884427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
2885e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    return m_addr_of_valobj_sp;
2886427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
2887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
28880039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
28890039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
28900039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
28910039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
28920039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
28930039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
28940039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
28950039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
28960039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
28970039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
28980039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
28990039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
29000039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29010039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
29020039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
29030039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
29040039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               clang_ast_type);
29050039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
29060039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
29070039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
29080039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29090039e68f8b6f7f15011f58a36621bec046ef5244Greg Claytonlldb::ValueObjectSP
29100039e68f8b6f7f15011f58a36621bec046ef5244Greg ClaytonValueObject::CastPointerType (const char *name, TypeSP &type_sp)
29110039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton{
29120039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::ValueObjectSP valobj_sp;
29130039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    AddressType address_type;
29140039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    const bool scalar_is_load_address = true;
29150039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    lldb::addr_t ptr_value = GetPointerValue (address_type, scalar_is_load_address);
29160039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29170039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    if (ptr_value != LLDB_INVALID_ADDRESS)
29180039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    {
29190039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        Address ptr_addr (NULL, ptr_value);
29200039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29210039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton        valobj_sp = ValueObjectMemory::Create (GetExecutionContextScope(),
29220039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               name,
29230039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               ptr_addr,
29240039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton                                               type_sp);
29250039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    }
29260039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton    return valobj_sp;
29270039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton}
29280039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
29290039e68f8b6f7f15011f58a36621bec046ef5244Greg Clayton
2930fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint () :
2931dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_thread_id (LLDB_INVALID_UID),
2932dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
2933fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
2934fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
2935fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2936fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
2937fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update (true),
2938dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update (true),
293991635093b0282d888fcde84a276ae518643c7fcaJim Ingham    m_thread_id (LLDB_INVALID_THREAD_ID),
2940dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_stop_id (0)
2941dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson
2942fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
2943fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext exe_ctx;
2944fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContextScope *computed_exe_scope = exe_scope;  // If use_selected is true, we may find a better scope,
2945fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                            // and if so we want to cache that not the original.
2946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_scope)
2947fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        exe_scope->CalculateExecutionContext(exe_ctx);
2948fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (exe_ctx.target != NULL)
2949fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
2950fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_target_sp = exe_ctx.target->GetSP();
2951fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2952fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (exe_ctx.process == NULL)
2953fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.target->GetProcessSP();
2954fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
2955fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp = exe_ctx.process->GetSP();
2956fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2957fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_process_sp != NULL)
2958fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
2959fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stop_id = m_process_sp->GetStopID();
2960fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = NULL;
2961fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2962fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (exe_ctx.thread == NULL)
2963fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
2964fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (use_selected)
2965fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
2966fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    thread = m_process_sp->GetThreadList().GetSelectedThread().get();
2967fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (thread)
2968fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        computed_exe_scope = thread;
2969fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2970fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
2971fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
2972fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                thread = exe_ctx.thread;
2973fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2974fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
2975fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
2976fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = thread->GetIndexID();
2977fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (exe_ctx.frame == NULL)
2978fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
2979fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (use_selected)
2980fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
2981fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        StackFrame *frame = exe_ctx.thread->GetSelectedFrame().get();
2982fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        if (frame)
2983fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        {
2984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            m_stack_id = frame->GetStackID();
2985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                            computed_exe_scope = frame;
2986fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        }
2987fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
2988fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
2989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
2990fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id = exe_ctx.frame->GetStackID();
2991fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
2992fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
2993fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
2994fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = computed_exe_scope;
2995fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
2996fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
2997fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
2998fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope (rhs.m_exe_scope),
2999dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_needs_update(true),
3000dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_first_update(true),
3001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_target_sp (rhs.m_target_sp),
3002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_process_sp (rhs.m_process_sp),
3003fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_thread_id (rhs.m_thread_id),
3004fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stack_id (rhs.m_stack_id),
3005fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_stop_id (0)
3006fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3007fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3008fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3009fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::~EvaluationPoint ()
3010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3011fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3012fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3013fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamExecutionContextScope *
3014fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::GetExecutionContextScope ()
3015fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3016fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // We have to update before giving out the scope, or we could be handing out stale pointers.
3017fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    SyncWithProcessState();
3018fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3019fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return m_exe_scope;
3020fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3021fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3022fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// This function checks the EvaluationPoint against the current process state.  If the current
3023fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// state matches the evaluation point, or the evaluation point is already invalid, then we return
3024fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// false, meaning "no change".  If the current state is different, we update our state, and return
3025fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3026fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham// future calls to NeedsUpdate will return true.
3027fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3028fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3029fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SyncWithProcessState()
3030fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3031fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we're already invalid, we don't need to do anything, and nothing has changed:
3032fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_stop_id == LLDB_INVALID_UID)
3033fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3034fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // Can't update with an invalid state.
3035fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = false;
3036fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3037fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3038fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3039fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If we don't have a process nothing can change.
3040fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_process_sp)
3041fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3042fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3043fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // If our stop id is the current stop ID, nothing has changed:
3044e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    uint32_t cur_stop_id = m_process_sp->GetStopID();
3045e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (m_stop_id == cur_stop_id)
3046fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3047fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3048e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3049e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    // In either case, we aren't going to be able to sync with the process state.
3050e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    if (cur_stop_id == 0)
3051e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham        return false;
3052e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham
3053e41494a9092e15192012a5e0a8a1ffd66c70b8bbJim Ingham    m_stop_id = cur_stop_id;
3054fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_needs_update = true;
3055fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = m_process_sp.get();
3056fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3057fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // Something has changed, so we will return true.  Now make sure the thread & frame still exist, and if either
3058fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // doesn't, mark ourselves as invalid.
3059fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3060fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (m_thread_id != LLDB_INVALID_THREAD_ID)
3061fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3062fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Thread *our_thread = m_process_sp->GetThreadList().FindThreadByIndexID (m_thread_id).get();
3063fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (our_thread == NULL)
3064bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        {
306591635093b0282d888fcde84a276ae518643c7fcaJim Ingham            SetInvalid();
3066bafc86e11a23ad23112f67a99e42aac7b0f207d7Greg Clayton        }
3067fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3068fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3069fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_exe_scope = our_thread;
3070fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3071fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_stack_id.IsValid())
3072fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3073fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *our_frame = our_thread->GetFrameWithStackID (m_stack_id).get();
3074fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (our_frame == NULL)
3075fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    SetInvalid();
3076fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3077fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_exe_scope = our_frame;
3078fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3079fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3080fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3081fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return true;
3082fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3083fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3084ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
3085ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamValueObject::EvaluationPoint::SetUpdated ()
3086ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
3087ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_first_update = false;
3088ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_needs_update = false;
3089ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (m_process_sp)
3090ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_stop_id = m_process_sp->GetStopID();
3091ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
3092ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3093ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Inghambool
3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim InghamValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
3096fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham{
3097fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!IsValid())
3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        return false;
3099fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3100fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    bool needs_update = false;
3101fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    m_exe_scope = NULL;
3102fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3103fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    // The target has to be non-null, and the
3104fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    Target *target = exe_scope->CalculateTarget();
3105fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (target != NULL)
3106fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3107fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Target *old_target = m_target_sp.get();
3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        assert (target == old_target);
3109fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        Process *process = exe_scope->CalculateProcess();
3110fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (process != NULL)
3111fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3112fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // FOR NOW - assume you can't update variable objects across process boundaries.
3113fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Process *old_process = m_process_sp.get();
3114fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            assert (process == old_process);
3115fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3116fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            lldb::user_id_t stop_id = process->GetStopID();
3117fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (stop_id != m_stop_id)
3118fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3119fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3120fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stop_id = stop_id;
3121fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3122fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // See if we're switching the thread or stack context.  If no thread is given, this is
3123fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // being evaluated in a global context.
3124fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            Thread *thread = exe_scope->CalculateThread();
3125fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (thread != NULL)
3126fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3127fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                lldb::user_id_t new_thread_index = thread->GetIndexID();
3128fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_thread_index != m_thread_id)
3129fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3130fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3131fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = new_thread_index;
3132fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3133fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3134fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3135fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                StackFrame *new_frame = exe_scope->CalculateStackFrame();
3136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (new_frame != NULL)
3137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3138fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    if (new_frame->GetStackID() != m_stack_id)
3139fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    {
3140fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        needs_update = true;
3141fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                        m_stack_id = new_frame->GetStackID();
3142fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    }
3143fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                else
3145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3146fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3149fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3150fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            else
3151fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3152fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // If this had been given a thread, and now there is none, we should update.
3153fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                // Otherwise we don't have to do anything.
3154fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                if (m_thread_id != LLDB_INVALID_UID)
3155fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                {
3156fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_thread_id = LLDB_INVALID_UID;
3157fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    m_stack_id.Clear();
3158fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                    needs_update = true;
3159fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                }
3160fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3161fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        else
3163fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3164fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // If there is no process, then we don't need to update anything.
3165fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            // But if we're switching from having a process to not, we should try to update.
3166fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            if (m_process_sp.get() != NULL)
3167fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            {
3168fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                needs_update = true;
3169fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_process_sp.reset();
3170fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_thread_id = LLDB_INVALID_UID;
3171fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                m_stack_id.Clear();
3172fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            }
3173fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3174fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3175fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    else
3176fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    {
3177fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // If there's no target, nothing can change so we don't need to update anything.
3178fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        // But if we're switching from having a target to not, we should try to update.
3179fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        if (m_target_sp.get() != NULL)
3180fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        {
3181fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            needs_update = true;
3182fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_target_sp.reset();
3183fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_process_sp.reset();
3184fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_thread_id = LLDB_INVALID_UID;
3185fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham            m_stack_id.Clear();
3186fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        }
3187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    }
3188fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_needs_update)
3189fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham        m_needs_update = needs_update;
3190fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham
3191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    return needs_update;
3192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham}
3193f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata
3194f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granatavoid
3195f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico GranataValueObject::ClearUserVisibleData()
3196f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata{
3197f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_location_str.clear();
3198f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_value_str.clear();
3199f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_summary_str.clear();
3200f7a9b14c2c02d2fa9fad586c19f29d77533fcc09Enrico Granata    m_object_desc_str.clear();
32012bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen}
3202