ValueObject.cpp revision 9db023bd392ede8fc4c92d7dfee64382e08bbd78
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"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectChild.h"
24427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#include "lldb/Core/ValueObjectConstResult.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ValueObjectList.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
314ae519666628cca07c194bf677163009cc2e5a8bJim Ingham#include "lldb/Target/ExecutionContext.h"
32b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/LanguageRuntime.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
35eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton#include "lldb/Target/Target.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::user_id_t g_value_obj_uid = 0;
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ValueObject constructor
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
46bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonValueObject::ValueObject (ValueObject *parent) :
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UserID (++g_value_obj_uid), // Unique identifier for every value object
48bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    m_parent (parent),
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_id (0),    // Value object lists always start at 1, value objects start at zero
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name (),
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_data (),
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_value (),
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_error (),
5417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_str (),
5517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_old_value_str (),
5617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_location_str (),
5717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_summary_str (),
584ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    m_object_desc_str (),
5917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children (),
6017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_synthetic_children (),
6111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_dynamic_value_sp (),
6211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton    m_format (eFormatDefault),
6317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid (false),
6417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change (false),
6517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid (false),
66427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_old_value_valid (false),
67427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_pointers_point_to_load_addrs (false)
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::~ValueObject ()
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruser_id_t
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetUpdateID() const
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_update_id;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::UpdateValueIfNeeded (ExecutionContextScope *exe_scope)
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // If this is a constant value, then our success is predicated on whether
88d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    // we have an error or not
89d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton    if (GetIsConstant())
90d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton        return m_error.Success();
91d171972ecc7788bdb02d3e81420a24841e09a2bfGreg Clayton
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_scope)
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Process *process = exe_scope->CalculateProcess();
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (process)
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const user_id_t stop_id = process->GetStopID();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_update_id != stop_id)
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
10017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                bool first_update = m_update_id == 0;
101ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Save the old value using swap to avoid a string copy which
102ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // also will clear our m_value_str
10317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                if (m_value_str.empty())
10417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                {
10517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_valid = false;
10617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                }
10717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                else
10817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                {
10917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_valid = true;
11017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_old_value_str.swap (m_value_str);
11117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    m_value_str.clear();
11217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                }
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str.clear();
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_summary_str.clear();
1154ae519666628cca07c194bf677163009cc2e5a8bJim Ingham                m_object_desc_str.clear();
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                const bool value_was_valid = GetValueIsValid();
118ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                SetValueDidChange (false);
119ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
120ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                m_error.Clear();
121ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
122ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Call the pure virtual function to update the value
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                UpdateValue (exe_scope);
124ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton
125ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                // Update the fact that we tried to update the value for this
126fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton                // value object whether or not we succeed
127ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                m_update_id = stop_id;
128ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                bool success = m_error.Success();
129ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                SetValueIsValid (success);
13017dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
13117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                if (first_update)
13217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    SetValueDidChange (false);
13317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                else if (!m_value_did_change && success == false)
134ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                {
13517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    // The value wasn't gotten successfully, so we mark this
13617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    // as changed if the value used to be valid and now isn't
13717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                    SetValueDidChange (value_was_valid);
138ca499a544ff3c331099a90402489c92ca0999d54Greg Clayton                }
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error.Success();
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DataExtractor &
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor () const
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDataExtractor &
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetDataExtractor ()
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_data;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Error &
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetError() const
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_error;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetName() const
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_name;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetLocationAsCString (ExecutionContextScope *exe_scope)
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (UpdateValueIfNeeded(exe_scope))
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_location_str.empty())
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (m_value.GetValueType())
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeScalar:
1846916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (reg_info)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info->name)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->name;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        else if (reg_info->alt_name)
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_location_str = reg_info->alt_name;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        break;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_location_str = "scalar";
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeLoadAddress:
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeFileAddress:
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            case Value::eValueTypeHostAddress:
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_location_str.swap(sstr.GetString());
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_location_str.c_str();
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue &
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue()
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Value &
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValue() const
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value;
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
2270baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonValueObject::ResolveValue (ExecutionContextScope *exe_scope, Scalar &scalar)
2280baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
2290baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    ExecutionContext exe_ctx;
2300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    exe_scope->CalculateExecutionContext(exe_ctx);
2310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    scalar = m_value.ResolveValue(&exe_ctx, GetClangAST ());
2320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return scalar.IsValid();
2330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
2340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
2350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Claytonbool
23617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueIsValid () const
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_is_valid;
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueIsValid (bool b)
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_is_valid = b;
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
24917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg ClaytonValueObject::GetValueDidChange (ExecutionContextScope *exe_scope)
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25117dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    GetValueAsCString (exe_scope);
25217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    return m_value_did_change;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueDidChange (bool value_changed)
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_value_did_change = value_changed;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (idx < GetNumChildren())
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already made the child value object?
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (can_create && m_children[idx].get() == NULL)
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // No we haven't created the child at this index, so lets have our
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // subclass do it and cache the result for quick future access.
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_children[idx] = CreateChildAtIndex (idx, false, 0);
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_sp = m_children[idx];
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetIndexOfChildWithName (const ConstString &name)
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
285462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                     GetClangType(),
286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name.GetCString(),
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                     omit_empty_base_classes);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2935d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // when getting a child by name, it could be buried inside some base
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // classes (which really aren't part of the expression path), so we
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // need a vector of indexes that can get us down to the correct child
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<uint32_t> child_indexes;
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *clang_ast = GetClangAST();
298462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *clang_type = GetClangType();
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      clang_type,
302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                                      name.GetCString(),
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      omit_empty_base_classes,
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                                      child_indexes);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP child_sp;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_child_indexes > 0)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        child_sp = GetChildAtIndex(*pos, can_create);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (++pos; pos != end; ++pos)
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (child_sp)
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                child_sp = new_child_sp;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                child_sp.reset();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return child_sp;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetNumChildren ()
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    if (!m_children_count_valid)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetNumChildren (CalculateNumChildren());
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_children.size();
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetNumChildren (uint32_t num_children)
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34217dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton    m_children_count_valid = true;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_children.resize(num_children);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const char *name)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name.SetCString(name);
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetName (const ConstString &name)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_name = name;
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP valobj_sp;
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool omit_empty_base_classes = true;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string child_name_str;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_byte_size = 0;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int32_t child_byte_offset = 0;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_bitfield_bit_size = 0;
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t child_bitfield_bit_offset = 0;
369bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool child_is_base_class = false;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const bool transparent_pointers = synthetic_array_member == false;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *clang_ast = GetClangAST();
372f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t clang_type = GetClangType();
373f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t child_clang_type;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast,
375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                  GetName().GetCString(),
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  clang_type,
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  idx,
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  transparent_pointers,
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  omit_empty_base_classes,
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_name_str,
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_byte_size,
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_byte_offset,
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                  child_bitfield_bit_size,
384bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                                  child_bitfield_bit_offset,
385bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                                  child_is_base_class);
3869db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton    if (child_clang_type && child_byte_size)
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (synthetic_index)
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            child_byte_offset += child_byte_size * synthetic_index;
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString child_name;
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!child_name_str.empty())
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            child_name.SetCString (child_name_str.c_str());
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        valobj_sp.reset (new ValueObjectChild (this,
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               clang_ast,
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_clang_type,
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_name,
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_byte_size,
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_byte_offset,
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               child_bitfield_bit_size,
402bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                               child_bitfield_bit_offset,
403bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                               child_is_base_class));
404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (m_pointers_point_to_load_addrs)
405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            valobj_sp->SetPointersPointToLoadAddrs (m_pointers_point_to_load_addrs);
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return valobj_sp;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSummaryAsCString (ExecutionContextScope *exe_scope)
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (UpdateValueIfNeeded (exe_scope))
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_summary_str.empty())
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
417f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            clang_type_t clang_type = GetClangType();
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // See if this is a pointer to a C string?
42003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (clang_type)
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
42203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                StreamString sstr;
423f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                clang_type_t elem_or_pointee_clang_type;
424f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
425427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetClangAST(),
426427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      &elem_or_pointee_clang_type));
42703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
428f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
429f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    ClangASTContext::IsCharType (elem_or_pointee_clang_type))
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
43103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    Process *process = exe_scope->CalculateProcess();
43203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (process != NULL)
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
434f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
43503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        lldb::AddressType cstr_address_type = eAddressTypeInvalid;
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
437f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        size_t cstr_len = 0;
438f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        if (type_flags.Test (ClangASTContext::eTypeIsArray))
439f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        {
440f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            // We have an array
441f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_len = ClangASTContext::GetArraySize (clang_type);
442f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_address = GetAddressOf (cstr_address_type, true);
443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        }
444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        else
445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        {
446f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            // We have a pointer
447f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            cstr_address = GetPointerValue (cstr_address_type, true);
448f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        }
44903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        if (cstr_address != LLDB_INVALID_ADDRESS)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
45103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            DataExtractor data;
45203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            size_t bytes_read = 0;
45303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            std::vector<char> data_buffer;
45403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            std::vector<char> cstr_buffer;
45503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            size_t cstr_length;
45603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            Error error;
457f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            if (cstr_len > 0)
45803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
459f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                data_buffer.resize(cstr_len);
46003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // Resize the formatted buffer in case every character
46103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // uses the "\xXX" format and one extra byte for a NULL
46203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                cstr_buffer.resize(data_buffer.size() * 4 + 1);
46303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost);
464f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error);
46503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                if (bytes_read > 0)
46603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
46703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    sstr << '"';
46803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    cstr_length = data.Dump (&sstr,
46903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0,                 // Start offset in "data"
47003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             eFormatChar,       // Print as characters
47103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             1,                 // Size of item (1 byte for a char!)
47203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             bytes_read,        // How many bytes to print?
47303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             UINT32_MAX,        // num per line
47403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             LLDB_INVALID_ADDRESS,// base address
47503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0,                 // bitfield bit size
47603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0);                // bitfield bit offset
47703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    sstr << '"';
47803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
47903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
48003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            else
48103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            {
48203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                const size_t k_max_buf_size = 256;
48303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data_buffer.resize (k_max_buf_size + 1);
48403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // NULL terminate in case we don't get the entire C string
48503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data_buffer.back() = '\0';
48603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // Make a formatted buffer that can contain take 4
48703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // bytes per character in case each byte uses the
48803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                // "\xXX" format and one extra byte for a NULL
48903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                cstr_buffer.resize (k_max_buf_size * 4 + 1);
49003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
49103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                data.SetData (&data_buffer.front(), data_buffer.size(), eByteOrderHost);
49203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                size_t total_cstr_len = 0;
49303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0)
49403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
49503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    size_t len = strlen(&data_buffer.front());
49603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len == 0)
49703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        break;
49803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len > bytes_read)
49903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        len = bytes_read;
50003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (sstr.GetSize() == 0)
50103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        sstr << '"';
50203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
50303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    cstr_length = data.Dump (&sstr,
50403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0,                 // Start offset in "data"
50503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             eFormatChar,       // Print as characters
50603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             1,                 // Size of item (1 byte for a char!)
50703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             len,               // How many bytes to print?
50803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             UINT32_MAX,        // num per line
50903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             LLDB_INVALID_ADDRESS,// base address
51003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0,                 // bitfield bit size
51103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                             0);                // bitfield bit offset
51203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
51303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    if (len < k_max_buf_size)
51403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        break;
51503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    cstr_address += total_cstr_len;
51603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
51703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                if (sstr.GetSize() > 0)
51803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    sstr << '"';
51903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            }
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
52203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
52303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (sstr.GetSize() > 0)
52403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.assign (sstr.GetData(), sstr.GetSize());
52503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                }
52603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                else if (ClangASTContext::IsFunctionPointerType (clang_type))
52703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                {
52803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    lldb::AddressType func_ptr_address_type = eAddressTypeInvalid;
52903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    lldb::addr_t func_ptr_address = GetPointerValue (func_ptr_address_type, true);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
53303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        switch (func_ptr_address_type)
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
53503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeInvalid:
53603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeFile:
53703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
53803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
53903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeLoad:
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            {
54103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                Address so_addr;
542eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                Target *target = exe_scope->CalculateTarget();
543eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                if (target && target->GetSectionLoadList().IsEmpty() == false)
54403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                {
545eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton                                    if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
54603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    {
54703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                        so_addr.Dump (&sstr,
54803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      exe_scope,
54903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      Address::DumpStyleResolvedDescription,
55003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                                      Address::DumpStyleSectionNameOffset);
55103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                    }
55203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                                }
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            }
55403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        case eAddressTypeHost:
55703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                            break;
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
55903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    }
56003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    if (sstr.GetSize() > 0)
56103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                    {
56203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.assign (1, '(');
56303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.append (sstr.GetData(), sstr.GetSize());
56403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                        m_summary_str.append (1, ')');
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_summary_str.empty())
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_summary_str.c_str();
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5754ae519666628cca07c194bf677163009cc2e5a8bJim Inghamconst char *
5764ae519666628cca07c194bf677163009cc2e5a8bJim InghamValueObject::GetObjectDescription (ExecutionContextScope *exe_scope)
5774ae519666628cca07c194bf677163009cc2e5a8bJim Ingham{
5784ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (!m_object_desc_str.empty())
5794ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return m_object_desc_str.c_str();
5804ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5814ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    if (!GetValueIsValid())
5824ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
5834ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5844ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    Process *process = exe_scope->CalculateProcess();
585b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (process == NULL)
5864ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        return NULL;
587b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
588b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    StreamString s;
5894ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
590b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    lldb::LanguageType language = GetObjectRuntimeLanguage();
591b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
5924ae519666628cca07c194bf677163009cc2e5a8bJim Ingham
5930e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    if (runtime == NULL)
5940e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    {
5950e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        // Aw, hell, if the things a pointer, let's try ObjC anyway...
5960e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        clang_type_t opaque_qual_type = GetClangType();
5970e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        if (opaque_qual_type != NULL)
5980e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        {
5990e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham            clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
6000e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham            if (qual_type->isAnyPointerType())
6010e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham                runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
6020e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham        }
6030e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham    }
6040e660f59b93339fed530f1a5fd556e6944cc3d82Jim Ingham
605b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (runtime && runtime->GetObjectDescription(s, *this, exe_scope))
6064ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    {
6074ae519666628cca07c194bf677163009cc2e5a8bJim Ingham        m_object_desc_str.append (s.GetData());
6084ae519666628cca07c194bf677163009cc2e5a8bJim Ingham    }
609e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan
610e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    if (m_object_desc_str.empty())
611e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return NULL;
612e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan    else
613e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan        return m_object_desc_str.c_str();
6144ae519666628cca07c194bf677163009cc2e5a8bJim Ingham}
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetValueAsCString (ExecutionContextScope *exe_scope)
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If our byte size is zero this is an aggregate type that has children
620462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (UpdateValueIfNeeded(exe_scope))
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_value_str.empty())
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Value::ContextType context_type = m_value.GetContextType();
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                switch (context_type)
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
6306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeClangType:
6316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeLLDBType:
6326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeVariable:
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
634f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        clang_type_t clang_type = GetClangType ();
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (clang_type)
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString sstr;
63811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                            if (m_format == eFormatDefault)
63911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                m_format = ClangASTType::GetFormat(clang_type);
64011730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton
64111730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                            if (ClangASTType::DumpTypeValue (GetClangAST(),            // The clang AST
64211730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             clang_type,               // The clang type to display
64311730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             &sstr,
64411730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             m_format,                 // Format to display this type with
64511730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             m_data,                   // Data to extract from
64611730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             0,                        // Byte offset into "m_data"
64711730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetByteSize(),            // Byte size of item in "m_data"
64811730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitSize(),     // Bitfield bit size
64911730f38ab136f60497beb2ef15feb98a6c33a50Greg Clayton                                                             GetBitfieldBitOffset()))  // Bitfield bit offset
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.swap(sstr.GetString());
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            else
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                m_value_str.clear();
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                case Value::eContextTypeRegisterInfo:
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (reg_info)
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        {
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            StreamString reg_sstr;
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_data.Dump(&reg_sstr, 0, reg_info->format, reg_info->byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_value_str.swap(reg_sstr.GetString());
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        }
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    break;
66854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
66954e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                default:
67054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                    break;
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
67317dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton
67417dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            if (!m_value_did_change && m_old_value_valid)
67517dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            {
67617dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // The value was gotten successfully, so we consider the
67717dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                // value as changed if the value string differs
67817dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton                SetValueDidChange (m_old_value_str != m_value_str);
67917dae081d7b88d24a7af6b07c10fc5981f81e2a9Greg Clayton            }
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_value_str.empty())
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_value_str.c_str();
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68703e0f97cfa469792dd69b36f782d33a014225788Greg Claytonaddr_t
688f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg ClaytonValueObject::GetAddressOf (lldb::AddressType &address_type, bool scalar_is_load_address)
689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
690f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
691f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    {
692f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeScalar:
693f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        if (scalar_is_load_address)
694f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
695f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = eAddressTypeLoad;
696f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
697f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
698f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
699f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
700f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeLoadAddress:
701f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeFileAddress:
702f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    case Value::eValueTypeHostAddress:
703f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        {
704f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            address_type = m_value.GetValueAddressType ();
705f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        }
707f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        break;
708f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    }
709f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    address_type = eAddressTypeInvalid;
710f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    return LLDB_INVALID_ADDRESS;
711f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
712f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
713f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Claytonaddr_t
71403e0f97cfa469792dd69b36f782d33a014225788Greg ClaytonValueObject::GetPointerValue (lldb::AddressType &address_type, bool scalar_is_load_address)
71503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton{
71603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    lldb::addr_t address = LLDB_INVALID_ADDRESS;
71703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    address_type = eAddressTypeInvalid;
718f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    switch (m_value.GetValueType())
71903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    {
72003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeScalar:
72103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        if (scalar_is_load_address)
72203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
72303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
72403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = eAddressTypeLoad;
72503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
72603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
72703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
72803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeLoadAddress:
72903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeFileAddress:
73003e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    case Value::eValueTypeHostAddress:
73103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        {
73203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            uint32_t data_offset = 0;
73303e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address = m_data.GetPointer(&data_offset);
73403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            address_type = m_value.GetValueAddressType();
73503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            if (address_type == eAddressTypeInvalid)
73603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton                address_type = eAddressTypeLoad;
73703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
73803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        break;
73903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
741427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (m_pointers_point_to_load_addrs)
742427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        address_type = eAddressTypeLoad;
743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
74403e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    return address;
74503e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
74603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::SetValueFromCString (ExecutionContextScope *exe_scope, const char *value_str)
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure our value is up to date first so that our location and location
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type is valid.
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!UpdateValueIfNeeded(exe_scope))
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t count = 0;
756462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *end = NULL;
759bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton    const size_t byte_size = GetByteSize();
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingInvalid:
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingUint:
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(unsigned long long))
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            unsigned long long ull_val = strtoull(value_str, &end, 0);
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value = ull_val;
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingSint:
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (byte_size > sizeof(long long))
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            long long sll_val = strtoll(value_str, &end, 0);
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end && *end != '\0')
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value = sll_val;
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Limit the bytes in our m_data appropriately.
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_value.GetScalar().GetData (m_data, byte_size);
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingIEEE754:
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const off_t byte_offset = GetByteOffset();
80054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton            uint8_t *dst = const_cast<uint8_t *>(m_data.PeekData(byte_offset, byte_size));
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (dst != NULL)
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We are decoding a float into host byte order below, so make
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // sure m_data knows what it contains.
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_data.SetByteOrder(eByteOrderHost);
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const size_t converted_byte_size = ClangASTContext::ConvertStringToFloatValue (
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        GetClangAST(),
808462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton                                                        GetClangType(),
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        value_str,
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        dst,
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                        byte_size);
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (converted_byte_size == byte_size)
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eEncodingVector:
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    default:
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If we have made it here the value is in m_data and we should write it
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out to the target
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return Write ();
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::Write ()
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the update ID so the next time we try and read the value
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we try and read it again.
83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_update_id = 0;
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // TODO: when Value has a method to write a value back, call it from here.
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
844b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::LanguageType
845b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamValueObject::GetObjectRuntimeLanguage ()
846b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
847f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton    clang_type_t opaque_qual_type = GetClangType();
848b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (opaque_qual_type == NULL)
849b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        return lldb::eLanguageTypeC;
850b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
851b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    // If the type is a reference, then resolve it to what it refers to first:
852b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    clang::QualType qual_type (clang::QualType::getFromOpaquePtr(opaque_qual_type).getNonReferenceType());
853b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (qual_type->isAnyPointerType())
854b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
855b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (qual_type->isObjCObjectPointerType())
856b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
857b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
858b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        clang::QualType pointee_type (qual_type->getPointeeType());
859b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->getCXXRecordDeclForPointerType() != NULL)
860b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
861b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCObjectOrInterfaceType())
862b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
863b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (pointee_type->isObjCClassType())
864b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
865b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
866b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    else
867b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
868b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        if (ClangASTContext::IsObjCClassType (opaque_qual_type))
869b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeObjC;
870974fddb5c78e9a754f0894c99a70ed777a8548c3Johnny Chen        if (ClangASTContext::IsCXXClassType (opaque_qual_type))
871b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham            return lldb::eLanguageTypeC_plus_plus;
872b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
873b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
874b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    return lldb::eLanguageTypeC;
875b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
876b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::AddSyntheticChild (const ConstString &key, ValueObjectSP& valobj_sp)
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_synthetic_children[key] = valobj_sp;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticChild (const ConstString &key) const
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::map<ConstString, ValueObjectSP>::const_iterator pos = m_synthetic_children.find (key);
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_synthetic_children.end())
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = pos->second;
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerType ()
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
896462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerType (GetClangType());
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
899f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
900f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::IsPointerOrReferenceType ()
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
904462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    return ClangASTContext::IsPointerOrReferenceType(GetClangType());
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObjectSP
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValueObjectSP synthetic_child_sp;
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (IsPointerType ())
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char index_str[64];
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        snprintf(index_str, sizeof(index_str), "[%i]", index);
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ConstString index_const_str(index_str);
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Check if we have already created a synthetic array member in this
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // valid object. If we have we will re-use it.
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        synthetic_child_sp = GetSyntheticChild (index_const_str);
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!synthetic_child_sp)
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We haven't made a synthetic array member for INDEX yet, so
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // lets make one and cache it for any future reference.
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            synthetic_child_sp = CreateChildAtIndex(0, true, index);
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Cache the value if we got one back...
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (synthetic_child_sp)
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                AddSyntheticChild(index_const_str, synthetic_child_sp);
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return synthetic_child_sp;
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
932642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
933642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghambool
934642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamValueObject::SetDynamicValue ()
935642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
936642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    if (!IsPointerOrReferenceType())
937642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return false;
938642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
939642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    // Check that the runtime class is correct for determining the most specific class.
940642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    // If it is a C++ class, see if it is dynamic:
941b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
942642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    return true;
943642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
94466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
94566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
94666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Claytonvoid
947bf8e42b9da0e1c6349a727d644ad37610b00d556Greg ClaytonValueObject::GetExpressionPath (Stream &s)
948bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
949bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (m_parent)
950bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
951bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        m_parent->GetExpressionPath (s);
952bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t parent_clang_type = m_parent->GetClangType();
953bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (parent_clang_type)
954bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
955bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (ClangASTContext::IsPointerType(parent_clang_type))
956bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
957bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString("->");
958bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
959bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else if (ClangASTContext::IsAggregateType (parent_clang_type))
960bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
961bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (ClangASTContext::IsArrayType (parent_clang_type) == false &&
962bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    m_parent->IsBaseClass() == false)
963bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutChar('.');
964bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
965bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
966bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
967bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
968bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (IsBaseClass())
969bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
970bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = GetClangType();
971bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        std::string cxx_class_name;
972bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (ClangASTContext::GetCXXClassName (clang_type, cxx_class_name))
973bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
974bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s << cxx_class_name.c_str() << "::";
975bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
976bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
977bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    else
978bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    {
979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const char *name = GetName().GetCString();
980bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (name)
981bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.PutCString(name);
982bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    }
983bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton}
984bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
985bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Claytonvoid
98666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg ClaytonValueObject::DumpValueObject
98766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton(
98866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    Stream &s,
98966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ExecutionContextScope *exe_scope,
99066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    ValueObject *valobj,
99166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    const char *root_valobj_name,
99266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t ptr_depth,
99366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t curr_depth,
99466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint32_t max_depth,
99566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_types,
99666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool show_location,
99766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    bool use_objc,
998bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool scope_already_checked,
999bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    bool flat_output
100066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton)
100166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton{
100266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    if (valobj)
100366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    {
1004bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        clang_type_t clang_type = valobj->GetClangType();
1005bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1006f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
1007bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *err_cstr = NULL;
1008f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
1009f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
1010bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1011bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const bool print_valobj = flat_output == false || has_value;
1012bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1013bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (print_valobj)
101466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1015bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (show_location)
1016bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1017bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf("%s: ", valobj->GetLocationAsCString(exe_scope));
1018bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
101966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1020bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            s.Indent();
102166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1022a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            // Always show the type for the top level items.
1023a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            if (show_types || curr_depth == 0)
1024427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                s.Printf("(%s) ", valobj->GetTypeName().AsCString("<invalid type>"));
102566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
102666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1027bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (flat_output)
1028bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1029bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                valobj->GetExpressionPath(s);
1030bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.PutCString(" =");
1031bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1032bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            else
1033bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1034bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
1035bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                s.Printf ("%s =", name_cstr);
1036bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
1037bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1038bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (!scope_already_checked && !valobj->IsInScope(exe_scope->CalculateStackFrame()))
1039bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1040bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                err_cstr = "error: out of scope";
1041bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            }
104266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
104366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1044bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        const char *val_cstr = NULL;
1045bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1046bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        if (err_cstr == NULL)
1047bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        {
1048bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            val_cstr = valobj->GetValueAsCString(exe_scope);
1049bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            err_cstr = valobj->GetError().AsCString();
1050bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        }
105166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
105266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        if (err_cstr)
105366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1054a564ec6ffca0561d6a68d331985b5e7a4b46e793Greg Clayton            s.Printf (" error: %s\n", err_cstr);
105566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
105666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        else
105766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        {
1058f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
1059bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            if (print_valobj)
1060bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton            {
1061bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                const char *sum_cstr = valobj->GetSummaryAsCString(exe_scope);
106266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1063bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (val_cstr)
1064bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.Printf(" %s", val_cstr);
106566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (sum_cstr)
1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.Printf(" %s", sum_cstr);
1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1069bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (use_objc)
1070bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
1071bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    const char *object_desc = valobj->GetObjectDescription(exe_scope);
1072bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (object_desc)
1073bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        s.Printf(" %s\n", object_desc);
1074bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1075e67bf037a79f9d89d1b06b4990eee9642698d37bSean Callanan                        s.Printf (" [no Objective-C description available]\n");
1076bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    return;
1077bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                }
107866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
107966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
108066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            if (curr_depth < max_depth)
108166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1082f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We will show children for all concrete types. We won't show
1083f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // pointer contents unless a pointer depth has been specified.
1084f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // We won't reference contents unless the reference is the
1085f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // root object (depth of zero).
1086f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                bool print_children = true;
1087f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1088f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // Use a new temporary pointer depth in case we override the
1089f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                // current pointer depth below...
1090f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                uint32_t curr_ptr_depth = ptr_depth;
1091f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1092f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
1093f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (is_ptr || is_ref)
1094f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                {
1095f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // We have a pointer or reference whose value is an address.
1096f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    // Make sure that address is not NULL
1097f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    lldb::AddressType ptr_address_type;
1098f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (valobj->GetPointerValue (ptr_address_type, true) == 0)
1099f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1100f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1101f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    else if (is_ref && curr_depth == 0)
1102f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    {
1103f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // If this is the root object (depth is zero) that we are showing
1104f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // and it is a reference, and no pointer depth has been supplied
1105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // print out what it references. Don't do this at deeper depths
1106f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        // otherwise we can end up with infinite recursion...
1107f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        curr_ptr_depth = 1;
1108f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    }
1109f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
1110f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                    if (curr_ptr_depth == 0)
1111f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                        print_children = false;
1112f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                }
111366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1114f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                if (print_children)
111566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1116bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    const uint32_t num_children = valobj->GetNumChildren();
1117bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    if (num_children)
111866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    {
1119bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (flat_output)
112066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        {
1121bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
1122bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                s.EOL();
1123bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1124bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        else
1125bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1126bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (print_valobj)
11273f5ee7fd6991891f0892bd71537763d9b59acd12Greg Clayton                                s.PutCString(is_ref ? ": {\n" : " {\n");
1128bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentMore();
1129bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1130bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1131bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        for (uint32_t idx=0; idx<num_children; ++idx)
1132bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1133bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            ValueObjectSP child_sp(valobj->GetChildAtIndex(idx, true));
1134bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            if (child_sp.get())
1135bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            {
1136bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                DumpValueObject (s,
1137bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 exe_scope,
1138bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 child_sp.get(),
1139bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 NULL,
1140f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                                                 (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
1141bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 curr_depth + 1,
1142bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 max_depth,
1143bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_types,
1144bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 show_location,
1145bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 false,
1146bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 true,
1147bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                                                 flat_output);
1148bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            }
1149bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        }
1150bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
1151bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (!flat_output)
1152bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        {
1153bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.IndentLess();
1154bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.Indent("}\n");
115566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                        }
115666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    }
1157bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else if (has_children)
1158bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1159bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        // Aggregate, no children...
1160bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1161f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton                            s.PutCString(" {}\n");
1162bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1163bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    else
1164bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    {
1165bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                        if (print_valobj)
1166bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                            s.EOL();
1167bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    }
1168bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
116966ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
1170bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                else
1171bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                {
117266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                    s.EOL();
117366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
117466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
117566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            else
117666ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            {
1177bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                if (has_children && print_valobj)
117866ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                {
1179bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton                    s.PutCString("{...}\n");
118066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton                }
118166ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton            }
118266ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton        }
118366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    }
118466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton}
118566ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton
1186427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1187427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObjectSP
1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonValueObject::CreateConstantValue (ExecutionContextScope *exe_scope, const ConstString &name)
1189427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ValueObjectSP valobj_sp;
1191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1192427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (UpdateValueIfNeeded(exe_scope) && m_error.Success())
1193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ExecutionContext exe_ctx;
1195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        exe_scope->CalculateExecutionContext(exe_ctx);
1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *ast = GetClangAST ();
1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        DataExtractor data;
1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        data.SetByteOrder (m_data.GetByteOrder());
1201427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        data.SetAddressByteSize(m_data.GetAddressByteSize());
1202427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0);
1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        valobj_sp.reset (new ValueObjectConstResult (ast,
1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     GetClangType(),
1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     name,
1208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                     data));
1209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
1211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        valobj_sp.reset (new ValueObjectConstResult (m_error));
1213427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1215427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1217427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonlldb::ValueObjectSP
1218bdcda468276dc9ab6bf648fc8cc07f3faad91526Greg ClaytonValueObject::Dereference (Error &error)
1219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1220427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ValueObjectSP valobj_sp;
1221c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    const bool is_pointer_type = IsPointerType();
1222c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (is_pointer_type)
1223427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool omit_empty_base_classes = true;
1225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        std::string child_name_str;
1227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_byte_size = 0;
1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        int32_t child_byte_offset = 0;
1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_size = 0;
1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        uint32_t child_bitfield_bit_offset = 0;
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        bool child_is_base_class = false;
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        const bool transparent_pointers = false;
1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang::ASTContext *clang_ast = GetClangAST();
1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t clang_type = GetClangType();
1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        clang_type_t child_clang_type;
1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (clang_ast,
1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      GetName().GetCString(),
1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      clang_type,
1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      0,
1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      transparent_pointers,
1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      omit_empty_base_classes,
1242427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_name_str,
1243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_size,
1244427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_byte_offset,
1245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_size,
1246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_bitfield_bit_offset,
1247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      child_is_base_class);
12489db023bd392ede8fc4c92d7dfee64382e08bbd78Greg Clayton        if (child_clang_type && child_byte_offset)
1249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ConstString child_name;
1251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (!child_name_str.empty())
1252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                child_name.SetCString (child_name_str.c_str());
1253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            valobj_sp.reset (new ValueObjectChild (this,
1255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   clang_ast,
1256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_clang_type,
1257427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_name,
1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_byte_size,
1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_byte_offset,
1260427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_bitfield_bit_size,
1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_bitfield_bit_offset,
1262427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                   child_is_base_class));
1263427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1264427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1265c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1266c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    if (valobj_sp)
1267c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    {
1268c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        error.Clear();
1269c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    }
1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    else
1271427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1272c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        StreamString strm;
1273c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        GetExpressionPath(strm);
1274c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1275c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        if (is_pointer_type)
1276c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
1277c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        else
1278c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1281427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1284c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    lldb::ValueObjectSP
1285c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg ClaytonValueObject::AddressOf (Error &error)
1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton{
1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ValueObjectSP valobj_sp;
1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::AddressType address_type = eAddressTypeInvalid;
1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const bool scalar_is_load_address = false;
1290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::addr_t addr = GetAddressOf (address_type, scalar_is_load_address);
1291c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton    error.Clear();
1292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (addr != LLDB_INVALID_ADDRESS)
1293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
1294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        switch (address_type)
1295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        {
1296c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton        default:
1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeInvalid:
1298c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            {
1299c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                StreamString expr_path_strm;
1300c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                GetExpressionPath(expr_path_strm);
1301c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
1302c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton            }
1303427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1304c3b61d239a53271d013b82ffaba6ab4e92b7fcc1Greg Clayton
1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeFile:
1306427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeLoad:
1307427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        case eAddressTypeHost:
1308427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang::ASTContext *ast = GetClangAST();
1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                clang_type_t clang_type = GetClangType();
1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (ast && clang_type)
1312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                {
1313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    std::string name (1, '&');
1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    name.append (m_name.AsCString(""));
1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    valobj_sp.reset (new ValueObjectConstResult (ast,
1316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 ClangASTContext::CreatePointerType (ast, clang_type),
1317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 ConstString (name.c_str()),
1318427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 addr,
1319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 address_type,
1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                 m_data.GetAddressByteSize()));
1321427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                }
1322427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
1323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            break;
1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        }
1325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
1326427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return valobj_sp;
1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton}
1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1329