ValueObject.cpp revision 940dd18789f83f28a618a9b588376c8bae557347
1//===-- ValueObject.cpp -----------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/ValueObject.h"
11
12// C Includes
13#include <stdlib.h>
14
15// C++ Includes
16// Other libraries and framework includes
17#include "llvm/Support/raw_ostream.h"
18#include "clang/AST/Type.h"
19
20// Project includes
21#include "lldb/Core/DataBufferHeap.h"
22#include "lldb/Core/DataVisualization.h"
23#include "lldb/Core/Debugger.h"
24#include "lldb/Core/Log.h"
25#include "lldb/Core/StreamString.h"
26#include "lldb/Core/ValueObjectChild.h"
27#include "lldb/Core/ValueObjectConstResult.h"
28#include "lldb/Core/ValueObjectDynamicValue.h"
29#include "lldb/Core/ValueObjectList.h"
30#include "lldb/Core/ValueObjectMemory.h"
31#include "lldb/Core/ValueObjectSyntheticFilter.h"
32
33#include "lldb/Host/Endian.h"
34
35#include "lldb/Interpreter/CommandInterpreter.h"
36#include "lldb/Interpreter/ScriptInterpreterPython.h"
37
38#include "lldb/Symbol/ClangASTType.h"
39#include "lldb/Symbol/ClangASTContext.h"
40#include "lldb/Symbol/Type.h"
41
42#include "lldb/Target/ExecutionContext.h"
43#include "lldb/Target/LanguageRuntime.h"
44#include "lldb/Target/ObjCLanguageRuntime.h"
45#include "lldb/Target/Process.h"
46#include "lldb/Target/RegisterContext.h"
47#include "lldb/Target/Target.h"
48#include "lldb/Target/Thread.h"
49
50#include "lldb/Utility/RefCounter.h"
51
52using namespace lldb;
53using namespace lldb_private;
54using namespace lldb_utility;
55
56static user_id_t g_value_obj_uid = 0;
57
58//----------------------------------------------------------------------
59// ValueObject constructor
60//----------------------------------------------------------------------
61ValueObject::ValueObject (ValueObject &parent) :
62    UserID (++g_value_obj_uid), // Unique identifier for every value object
63    m_parent (&parent),
64    m_update_point (parent.GetUpdatePoint ()),
65    m_name (),
66    m_data (),
67    m_value (),
68    m_error (),
69    m_value_str (),
70    m_old_value_str (),
71    m_location_str (),
72    m_summary_str (),
73    m_object_desc_str (),
74    m_manager(parent.GetManager()),
75    m_children (),
76    m_synthetic_children (),
77    m_dynamic_value (NULL),
78    m_synthetic_value(NULL),
79    m_deref_valobj(NULL),
80    m_format (eFormatDefault),
81    m_last_format_mgr_revision(0),
82    m_last_format_mgr_dynamic(parent.m_last_format_mgr_dynamic),
83    m_type_summary_sp(),
84    m_type_format_sp(),
85    m_synthetic_children_sp(),
86    m_user_id_of_forced_summary(),
87    m_address_type_of_ptr_or_ref_children(eAddressTypeInvalid),
88    m_value_is_valid (false),
89    m_value_did_change (false),
90    m_children_count_valid (false),
91    m_old_value_valid (false),
92    m_is_deref_of_parent (false),
93    m_is_array_item_for_pointer(false),
94    m_is_bitfield_for_scalar(false),
95    m_is_expression_path_child(false),
96    m_is_child_at_offset(false),
97    m_is_getting_summary(false),
98    m_did_calculate_complete_objc_class_type(false)
99{
100    m_manager->ManageObject(this);
101}
102
103//----------------------------------------------------------------------
104// ValueObject constructor
105//----------------------------------------------------------------------
106ValueObject::ValueObject (ExecutionContextScope *exe_scope,
107                          AddressType child_ptr_or_ref_addr_type) :
108    UserID (++g_value_obj_uid), // Unique identifier for every value object
109    m_parent (NULL),
110    m_update_point (exe_scope),
111    m_name (),
112    m_data (),
113    m_value (),
114    m_error (),
115    m_value_str (),
116    m_old_value_str (),
117    m_location_str (),
118    m_summary_str (),
119    m_object_desc_str (),
120    m_manager(),
121    m_children (),
122    m_synthetic_children (),
123    m_dynamic_value (NULL),
124    m_synthetic_value(NULL),
125    m_deref_valobj(NULL),
126    m_format (eFormatDefault),
127    m_last_format_mgr_revision(0),
128    m_last_format_mgr_dynamic(eNoDynamicValues),
129    m_type_summary_sp(),
130    m_type_format_sp(),
131    m_synthetic_children_sp(),
132    m_user_id_of_forced_summary(),
133    m_address_type_of_ptr_or_ref_children(child_ptr_or_ref_addr_type),
134    m_value_is_valid (false),
135    m_value_did_change (false),
136    m_children_count_valid (false),
137    m_old_value_valid (false),
138    m_is_deref_of_parent (false),
139    m_is_array_item_for_pointer(false),
140    m_is_bitfield_for_scalar(false),
141    m_is_expression_path_child(false),
142    m_is_child_at_offset(false),
143    m_is_getting_summary(false),
144    m_did_calculate_complete_objc_class_type(false)
145{
146    m_manager = new ValueObjectManager();
147    m_manager->ManageObject (this);
148}
149
150//----------------------------------------------------------------------
151// Destructor
152//----------------------------------------------------------------------
153ValueObject::~ValueObject ()
154{
155}
156
157bool
158ValueObject::UpdateValueIfNeeded (bool update_format)
159{
160    return UpdateValueIfNeeded(m_last_format_mgr_dynamic, update_format);
161}
162
163bool
164ValueObject::UpdateValueIfNeeded (DynamicValueType use_dynamic, bool update_format)
165{
166
167    bool did_change_formats = false;
168
169    if (update_format)
170        did_change_formats = UpdateFormatsIfNeeded(use_dynamic);
171
172    // If this is a constant value, then our success is predicated on whether
173    // we have an error or not
174    if (GetIsConstant())
175    {
176        // if you were asked to update your formatters, but did not get a chance to do it
177        // clear your own values (this serves the purpose of faking a stop-id for frozen
178        // objects (which are regarded as constant, but could have changes behind their backs
179        // because of the frozen-pointer depth limit)
180		// TODO: decouple summary from value and then remove this code and only force-clear the summary
181        if (update_format && !did_change_formats)
182            ClearUserVisibleData(eClearUserVisibleDataItemsSummary);
183        return m_error.Success();
184    }
185
186    bool first_update = m_update_point.IsFirstEvaluation();
187
188    if (m_update_point.NeedsUpdating())
189    {
190        m_update_point.SetUpdated();
191
192        // Save the old value using swap to avoid a string copy which
193        // also will clear our m_value_str
194        if (m_value_str.empty())
195        {
196            m_old_value_valid = false;
197        }
198        else
199        {
200            m_old_value_valid = true;
201            m_old_value_str.swap (m_value_str);
202            ClearUserVisibleData(eClearUserVisibleDataItemsValue);
203        }
204
205        ClearUserVisibleData();
206
207        if (IsInScope())
208        {
209            const bool value_was_valid = GetValueIsValid();
210            SetValueDidChange (false);
211
212            m_error.Clear();
213
214            // Call the pure virtual function to update the value
215            bool success = UpdateValue ();
216
217            SetValueIsValid (success);
218
219            if (first_update)
220                SetValueDidChange (false);
221            else if (!m_value_did_change && success == false)
222            {
223                // The value wasn't gotten successfully, so we mark this
224                // as changed if the value used to be valid and now isn't
225                SetValueDidChange (value_was_valid);
226            }
227        }
228        else
229        {
230            m_error.SetErrorString("out of scope");
231        }
232    }
233    return m_error.Success();
234}
235
236bool
237ValueObject::UpdateFormatsIfNeeded(DynamicValueType use_dynamic)
238{
239    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
240    if (log)
241        log->Printf("checking for FormatManager revisions. VO named %s is at revision %d, while the format manager is at revision %d",
242           GetName().GetCString(),
243           m_last_format_mgr_revision,
244           DataVisualization::GetCurrentRevision());
245
246    bool any_change = false;
247
248    if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision()) ||
249          m_last_format_mgr_dynamic != use_dynamic)
250    {
251        SetValueFormat(DataVisualization::ValueFormats::GetFormat (*this, eNoDynamicValues));
252        SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, use_dynamic));
253        SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, use_dynamic));
254
255        m_last_format_mgr_revision = DataVisualization::GetCurrentRevision();
256        m_last_format_mgr_dynamic = use_dynamic;
257
258        any_change = true;
259    }
260
261    return any_change;
262
263}
264
265void
266ValueObject::SetNeedsUpdate ()
267{
268    m_update_point.SetNeedsUpdate();
269    // We have to clear the value string here so ConstResult children will notice if their values are
270    // changed by hand (i.e. with SetValueAsCString).
271    ClearUserVisibleData(eClearUserVisibleDataItemsValue);
272}
273
274ClangASTType
275ValueObject::MaybeCalculateCompleteType ()
276{
277    ClangASTType ret(GetClangASTImpl(), GetClangTypeImpl());
278
279    if (m_did_calculate_complete_objc_class_type)
280    {
281        if (m_override_type.IsValid())
282            return m_override_type;
283        else
284            return ret;
285    }
286
287    clang_type_t ast_type(GetClangTypeImpl());
288    clang_type_t class_type;
289    bool is_pointer_type;
290
291    if (ClangASTContext::IsObjCObjectPointerType(ast_type, &class_type))
292    {
293        is_pointer_type = true;
294    }
295    else if (ClangASTContext::IsObjCClassType(ast_type))
296    {
297        is_pointer_type = false;
298        class_type = ast_type;
299    }
300    else
301    {
302        return ret;
303    }
304
305    m_did_calculate_complete_objc_class_type = true;
306
307    if (!class_type)
308        return ret;
309
310    std::string class_name;
311
312    if (!ClangASTContext::GetObjCClassName(class_type, class_name))
313        return ret;
314
315    ProcessSP process_sp(GetUpdatePoint().GetExecutionContextRef().GetProcessSP());
316
317    if (!process_sp)
318        return ret;
319
320    ObjCLanguageRuntime *objc_language_runtime(process_sp->GetObjCLanguageRuntime());
321
322    if (!objc_language_runtime)
323        return ret;
324
325    ConstString class_name_cs(class_name.c_str());
326
327    TypeSP complete_objc_class_type_sp = objc_language_runtime->LookupInCompleteClassCache(class_name_cs);
328
329    if (!complete_objc_class_type_sp)
330        return ret;
331
332    ClangASTType complete_class(complete_objc_class_type_sp->GetClangAST(),
333                                complete_objc_class_type_sp->GetClangFullType());
334
335    if (!ClangASTContext::GetCompleteType(complete_class.GetASTContext(),
336                                          complete_class.GetOpaqueQualType()))
337        return ret;
338
339    if (is_pointer_type)
340    {
341        clang_type_t pointer_type = ClangASTContext::CreatePointerType(complete_class.GetASTContext(),
342                                                                       complete_class.GetOpaqueQualType());
343
344        m_override_type = ClangASTType(complete_class.GetASTContext(),
345                                       pointer_type);
346    }
347    else
348    {
349        m_override_type = complete_class;
350    }
351
352    if (m_override_type.IsValid())
353        return m_override_type;
354    else
355        return ret;
356}
357
358clang::ASTContext *
359ValueObject::GetClangAST ()
360{
361    ClangASTType type = MaybeCalculateCompleteType();
362
363    return type.GetASTContext();
364}
365
366lldb::clang_type_t
367ValueObject::GetClangType ()
368{
369    ClangASTType type = MaybeCalculateCompleteType();
370
371    return type.GetOpaqueQualType();
372}
373
374DataExtractor &
375ValueObject::GetDataExtractor ()
376{
377    UpdateValueIfNeeded(false);
378    return m_data;
379}
380
381const Error &
382ValueObject::GetError()
383{
384    UpdateValueIfNeeded(false);
385    return m_error;
386}
387
388const ConstString &
389ValueObject::GetName() const
390{
391    return m_name;
392}
393
394const char *
395ValueObject::GetLocationAsCString ()
396{
397    if (UpdateValueIfNeeded(false))
398    {
399        if (m_location_str.empty())
400        {
401            StreamString sstr;
402
403            switch (m_value.GetValueType())
404            {
405            default:
406                break;
407
408            case Value::eValueTypeScalar:
409                if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
410                {
411                    RegisterInfo *reg_info = m_value.GetRegisterInfo();
412                    if (reg_info)
413                    {
414                        if (reg_info->name)
415                            m_location_str = reg_info->name;
416                        else if (reg_info->alt_name)
417                            m_location_str = reg_info->alt_name;
418                        break;
419                    }
420                }
421                m_location_str = "scalar";
422                break;
423
424            case Value::eValueTypeLoadAddress:
425            case Value::eValueTypeFileAddress:
426            case Value::eValueTypeHostAddress:
427                {
428                    uint32_t addr_nibble_size = m_data.GetAddressByteSize() * 2;
429                    sstr.Printf("0x%*.*llx", addr_nibble_size, addr_nibble_size, m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS));
430                    m_location_str.swap(sstr.GetString());
431                }
432                break;
433            }
434        }
435    }
436    return m_location_str.c_str();
437}
438
439Value &
440ValueObject::GetValue()
441{
442    return m_value;
443}
444
445const Value &
446ValueObject::GetValue() const
447{
448    return m_value;
449}
450
451bool
452ValueObject::ResolveValue (Scalar &scalar)
453{
454    if (UpdateValueIfNeeded(false)) // make sure that you are up to date before returning anything
455    {
456        ExecutionContext exe_ctx (GetExecutionContextRef());
457        Value tmp_value(m_value);
458        scalar = tmp_value.ResolveValue(&exe_ctx, GetClangAST ());
459        if (scalar.IsValid())
460        {
461            const uint32_t bitfield_bit_size = GetBitfieldBitSize();
462            if (bitfield_bit_size)
463                return scalar.ExtractBitfield (bitfield_bit_size, GetBitfieldBitOffset());
464            return true;
465        }
466    }
467    return false;
468}
469
470bool
471ValueObject::GetValueIsValid () const
472{
473    return m_value_is_valid;
474}
475
476
477void
478ValueObject::SetValueIsValid (bool b)
479{
480    m_value_is_valid = b;
481}
482
483bool
484ValueObject::GetValueDidChange ()
485{
486    GetValueAsCString ();
487    return m_value_did_change;
488}
489
490void
491ValueObject::SetValueDidChange (bool value_changed)
492{
493    m_value_did_change = value_changed;
494}
495
496ValueObjectSP
497ValueObject::GetChildAtIndex (uint32_t idx, bool can_create)
498{
499    ValueObjectSP child_sp;
500    // We may need to update our value if we are dynamic
501    if (IsPossibleDynamicType ())
502        UpdateValueIfNeeded(false);
503    if (idx < GetNumChildren())
504    {
505        // Check if we have already made the child value object?
506        if (can_create && !m_children.HasChildAtIndex(idx))
507        {
508            // No we haven't created the child at this index, so lets have our
509            // subclass do it and cache the result for quick future access.
510            m_children.SetChildAtIndex(idx,CreateChildAtIndex (idx, false, 0));
511        }
512
513        ValueObject* child = m_children.GetChildAtIndex(idx);
514        if (child != NULL)
515            return child->GetSP();
516    }
517    return child_sp;
518}
519
520uint32_t
521ValueObject::GetIndexOfChildWithName (const ConstString &name)
522{
523    bool omit_empty_base_classes = true;
524    return ClangASTContext::GetIndexOfChildWithName (GetClangAST(),
525                                                     GetClangType(),
526                                                     name.GetCString(),
527                                                     omit_empty_base_classes);
528}
529
530ValueObjectSP
531ValueObject::GetChildMemberWithName (const ConstString &name, bool can_create)
532{
533    // when getting a child by name, it could be buried inside some base
534    // classes (which really aren't part of the expression path), so we
535    // need a vector of indexes that can get us down to the correct child
536    ValueObjectSP child_sp;
537
538    // We may need to update our value if we are dynamic
539    if (IsPossibleDynamicType ())
540        UpdateValueIfNeeded(false);
541
542    std::vector<uint32_t> child_indexes;
543    clang::ASTContext *clang_ast = GetClangAST();
544    void *clang_type = GetClangType();
545    bool omit_empty_base_classes = true;
546    const size_t num_child_indexes =  ClangASTContext::GetIndexOfChildMemberWithName (clang_ast,
547                                                                                      clang_type,
548                                                                                      name.GetCString(),
549                                                                                      omit_empty_base_classes,
550                                                                                      child_indexes);
551    if (num_child_indexes > 0)
552    {
553        std::vector<uint32_t>::const_iterator pos = child_indexes.begin ();
554        std::vector<uint32_t>::const_iterator end = child_indexes.end ();
555
556        child_sp = GetChildAtIndex(*pos, can_create);
557        for (++pos; pos != end; ++pos)
558        {
559            if (child_sp)
560            {
561                ValueObjectSP new_child_sp(child_sp->GetChildAtIndex (*pos, can_create));
562                child_sp = new_child_sp;
563            }
564            else
565            {
566                child_sp.reset();
567            }
568
569        }
570    }
571    return child_sp;
572}
573
574
575uint32_t
576ValueObject::GetNumChildren ()
577{
578    UpdateValueIfNeeded();
579    if (!m_children_count_valid)
580    {
581        SetNumChildren (CalculateNumChildren());
582    }
583    return m_children.GetChildrenCount();
584}
585void
586ValueObject::SetNumChildren (uint32_t num_children)
587{
588    m_children_count_valid = true;
589    m_children.SetChildrenCount(num_children);
590}
591
592void
593ValueObject::SetName (const ConstString &name)
594{
595    m_name = name;
596}
597
598ValueObject *
599ValueObject::CreateChildAtIndex (uint32_t idx, bool synthetic_array_member, int32_t synthetic_index)
600{
601    ValueObject *valobj = NULL;
602
603    bool omit_empty_base_classes = true;
604    bool ignore_array_bounds = synthetic_array_member;
605    std::string child_name_str;
606    uint32_t child_byte_size = 0;
607    int32_t child_byte_offset = 0;
608    uint32_t child_bitfield_bit_size = 0;
609    uint32_t child_bitfield_bit_offset = 0;
610    bool child_is_base_class = false;
611    bool child_is_deref_of_parent = false;
612
613    const bool transparent_pointers = synthetic_array_member == false;
614    clang::ASTContext *clang_ast = GetClangAST();
615    clang_type_t clang_type = GetClangType();
616    clang_type_t child_clang_type;
617
618    ExecutionContext exe_ctx (GetExecutionContextRef());
619
620    child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
621                                                                  clang_ast,
622                                                                  GetName().GetCString(),
623                                                                  clang_type,
624                                                                  idx,
625                                                                  transparent_pointers,
626                                                                  omit_empty_base_classes,
627                                                                  ignore_array_bounds,
628                                                                  child_name_str,
629                                                                  child_byte_size,
630                                                                  child_byte_offset,
631                                                                  child_bitfield_bit_size,
632                                                                  child_bitfield_bit_offset,
633                                                                  child_is_base_class,
634                                                                  child_is_deref_of_parent);
635    if (child_clang_type && child_byte_size)
636    {
637        if (synthetic_index)
638            child_byte_offset += child_byte_size * synthetic_index;
639
640        ConstString child_name;
641        if (!child_name_str.empty())
642            child_name.SetCString (child_name_str.c_str());
643
644        valobj = new ValueObjectChild (*this,
645                                       clang_ast,
646                                       child_clang_type,
647                                       child_name,
648                                       child_byte_size,
649                                       child_byte_offset,
650                                       child_bitfield_bit_size,
651                                       child_bitfield_bit_offset,
652                                       child_is_base_class,
653                                       child_is_deref_of_parent,
654                                       eAddressTypeInvalid);
655        //if (valobj)
656        //    valobj->SetAddressTypeOfChildren(eAddressTypeInvalid);
657   }
658
659    return valobj;
660}
661
662bool
663ValueObject::GetSummaryAsCString (TypeSummaryImpl* summary_ptr,
664                                  std::string& destination)
665{
666    destination.clear();
667
668    // ideally we would like to bail out if passing NULL, but if we do so
669    // we end up not providing the summary for function pointers anymore
670    if (/*summary_ptr == NULL ||*/ m_is_getting_summary)
671        return false;
672
673    m_is_getting_summary = true;
674    if (UpdateValueIfNeeded (false))
675    {
676        if (summary_ptr)
677        {
678            if (HasSyntheticValue())
679                m_synthetic_value->UpdateValueIfNeeded(); // the summary might depend on the synthetic children being up-to-date (e.g. ${svar%#})
680            summary_ptr->FormatObject(this, destination);
681        }
682        else
683        {
684            clang_type_t clang_type = GetClangType();
685
686            // Do some default printout for function pointers
687            if (clang_type)
688            {
689                StreamString sstr;
690                clang_type_t elem_or_pointee_clang_type;
691                const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
692                                                                      GetClangAST(),
693                                                                      &elem_or_pointee_clang_type));
694
695                if (ClangASTContext::IsFunctionPointerType (clang_type))
696                {
697                    AddressType func_ptr_address_type = eAddressTypeInvalid;
698                    addr_t func_ptr_address = GetPointerValue (&func_ptr_address_type);
699                    if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS)
700                    {
701                        switch (func_ptr_address_type)
702                        {
703                            case eAddressTypeInvalid:
704                            case eAddressTypeFile:
705                                break;
706
707                            case eAddressTypeLoad:
708                            {
709                                ExecutionContext exe_ctx (GetExecutionContextRef());
710
711                                Address so_addr;
712                                Target *target = exe_ctx.GetTargetPtr();
713                                if (target && target->GetSectionLoadList().IsEmpty() == false)
714                                {
715                                    if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr))
716                                    {
717                                        so_addr.Dump (&sstr,
718                                                      exe_ctx.GetBestExecutionContextScope(),
719                                                      Address::DumpStyleResolvedDescription,
720                                                      Address::DumpStyleSectionNameOffset);
721                                    }
722                                }
723                            }
724                                break;
725
726                            case eAddressTypeHost:
727                                break;
728                        }
729                    }
730                    if (sstr.GetSize() > 0)
731                    {
732                        destination.assign (1, '(');
733                        destination.append (sstr.GetData(), sstr.GetSize());
734                        destination.append (1, ')');
735                    }
736                }
737            }
738        }
739    }
740    m_is_getting_summary = false;
741    return !destination.empty();
742}
743
744const char *
745ValueObject::GetSummaryAsCString ()
746{
747    if (UpdateValueIfNeeded(true) && m_summary_str.empty())
748    {
749        GetSummaryAsCString(GetSummaryFormat().get(),
750                            m_summary_str);
751    }
752    if (m_summary_str.empty())
753        return NULL;
754    return m_summary_str.c_str();
755}
756
757bool
758ValueObject::IsCStringContainer(bool check_pointer)
759{
760    clang_type_t elem_or_pointee_clang_type;
761    const Flags type_flags (ClangASTContext::GetTypeInfo (GetClangType(),
762                                                          GetClangAST(),
763                                                          &elem_or_pointee_clang_type));
764    bool is_char_arr_ptr (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
765            ClangASTContext::IsCharType (elem_or_pointee_clang_type));
766    if (!is_char_arr_ptr)
767        return false;
768    if (!check_pointer)
769        return true;
770    if (type_flags.Test(ClangASTContext::eTypeIsArray))
771        return true;
772    addr_t cstr_address = LLDB_INVALID_ADDRESS;
773    AddressType cstr_address_type = eAddressTypeInvalid;
774    cstr_address = GetAddressOf (true, &cstr_address_type);
775    return (cstr_address != LLDB_INVALID_ADDRESS);
776}
777
778size_t
779ValueObject::GetPointeeData (DataExtractor& data,
780                             uint32_t item_idx,
781                             uint32_t item_count)
782{
783    if (!IsPointerType() && !IsArrayType())
784        return 0;
785
786    if (item_count == 0)
787        return 0;
788
789    uint32_t stride = 0;
790
791    ClangASTType type(GetClangAST(),
792                      GetClangType());
793
794    const uint64_t item_type_size = (IsPointerType() ? ClangASTType::GetTypeByteSize(GetClangAST(), type.GetPointeeType()) :
795                                     ClangASTType::GetTypeByteSize(GetClangAST(), type.GetArrayElementType(stride)));
796
797    const uint64_t bytes = item_count * item_type_size;
798
799    const uint64_t offset = item_idx * item_type_size;
800
801    if (item_idx == 0 && item_count == 1) // simply a deref
802    {
803        if (IsPointerType())
804        {
805            Error error;
806            ValueObjectSP pointee_sp = Dereference(error);
807            if (error.Fail() || pointee_sp.get() == NULL)
808                return 0;
809            return pointee_sp->GetDataExtractor().Copy(data);
810        }
811        else
812        {
813            ValueObjectSP child_sp = GetChildAtIndex(0, true);
814            if (child_sp.get() == NULL)
815                return 0;
816            return child_sp->GetDataExtractor().Copy(data);
817        }
818        return true;
819    }
820    else /* (items > 1) */
821    {
822        Error error;
823        lldb_private::DataBufferHeap* heap_buf_ptr = NULL;
824        lldb::DataBufferSP data_sp(heap_buf_ptr = new lldb_private::DataBufferHeap());
825
826        AddressType addr_type;
827        lldb::addr_t addr = IsPointerType() ? GetPointerValue(&addr_type) : GetAddressOf(true, &addr_type);
828
829        switch (addr_type)
830        {
831            case eAddressTypeFile:
832                {
833                    ModuleSP module_sp (GetModule());
834                    if (module_sp)
835                    {
836                        Address so_addr;
837                        module_sp->ResolveFileAddress(addr, so_addr);
838                        ExecutionContext exe_ctx (GetExecutionContextRef());
839                        Target* target = exe_ctx.GetTargetPtr();
840                        if (target)
841                        {
842                            heap_buf_ptr->SetByteSize(bytes);
843                            size_t bytes_read = target->ReadMemory(so_addr, false, heap_buf_ptr->GetBytes(), bytes, error);
844                            if (error.Success())
845                            {
846                                data.SetData(data_sp);
847                                return bytes_read;
848                            }
849                        }
850                    }
851                }
852                break;
853            case eAddressTypeLoad:
854                {
855                    ExecutionContext exe_ctx (GetExecutionContextRef());
856                    Process *process = exe_ctx.GetProcessPtr();
857                    if (process)
858                    {
859                        heap_buf_ptr->SetByteSize(bytes);
860                        size_t bytes_read = process->ReadMemory(addr + offset, heap_buf_ptr->GetBytes(), bytes, error);
861                        if (error.Success())
862                        {
863                            data.SetData(data_sp);
864                            return bytes_read;
865                        }
866                    }
867                }
868                break;
869            case eAddressTypeHost:
870                {
871                    heap_buf_ptr->CopyData((uint8_t*)(addr + offset), bytes);
872                    data.SetData(data_sp);
873                    return bytes;
874                }
875                break;
876            case eAddressTypeInvalid:
877            default:
878                break;
879        }
880    }
881    return 0;
882}
883
884size_t
885ValueObject::GetData (DataExtractor& data)
886{
887    UpdateValueIfNeeded(false);
888    ExecutionContext exe_ctx (GetExecutionContextRef());
889    Error error = m_value.GetValueAsData(&exe_ctx, GetClangAST(), data, 0, GetModule().get());
890    if (error.Fail())
891        return 0;
892    data.SetAddressByteSize(m_data.GetAddressByteSize());
893    data.SetByteOrder(m_data.GetByteOrder());
894    return data.GetByteSize();
895}
896
897// will compute strlen(str), but without consuming more than
898// maxlen bytes out of str (this serves the purpose of reading
899// chunks of a string without having to worry about
900// missing NULL terminators in the chunk)
901// of course, if strlen(str) > maxlen, the function will return
902// maxlen_value (which should be != maxlen, because that allows you
903// to know whether strlen(str) == maxlen or strlen(str) > maxlen)
904static uint32_t
905strlen_or_inf (const char* str,
906               uint32_t maxlen,
907               uint32_t maxlen_value)
908{
909    uint32_t len = 0;
910    if (str)
911    {
912        while(*str)
913        {
914            len++;str++;
915            if (len > maxlen)
916                return maxlen_value;
917        }
918    }
919    return len;
920}
921
922void
923ValueObject::ReadPointedString (Stream& s,
924                                Error& error,
925                                uint32_t max_length,
926                                bool honor_array,
927                                Format item_format)
928{
929    ExecutionContext exe_ctx (GetExecutionContextRef());
930    Target* target = exe_ctx.GetTargetPtr();
931
932    if (target && max_length == 0)
933        max_length = target->GetMaximumSizeOfStringSummary();
934
935    clang_type_t clang_type = GetClangType();
936    clang_type_t elem_or_pointee_clang_type;
937    const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type,
938                                                          GetClangAST(),
939                                                          &elem_or_pointee_clang_type));
940    if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
941        ClangASTContext::IsCharType (elem_or_pointee_clang_type))
942    {
943        if (target == NULL)
944        {
945            s << "<no target to read from>";
946        }
947        else
948        {
949            addr_t cstr_address = LLDB_INVALID_ADDRESS;
950            AddressType cstr_address_type = eAddressTypeInvalid;
951
952            size_t cstr_len = 0;
953            bool capped_data = false;
954            if (type_flags.Test (ClangASTContext::eTypeIsArray))
955            {
956                // We have an array
957                cstr_len = ClangASTContext::GetArraySize (clang_type);
958                if (cstr_len > max_length)
959                {
960                    capped_data = true;
961                    cstr_len = max_length;
962                }
963                cstr_address = GetAddressOf (true, &cstr_address_type);
964            }
965            else
966            {
967                // We have a pointer
968                cstr_address = GetPointerValue (&cstr_address_type);
969            }
970            if (cstr_address != 0 && cstr_address != LLDB_INVALID_ADDRESS)
971            {
972                Address cstr_so_addr (cstr_address);
973                DataExtractor data;
974                size_t bytes_read = 0;
975                if (cstr_len > 0 && honor_array)
976                {
977                    // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host
978                    // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this
979                    GetPointeeData(data, 0, cstr_len);
980
981                    if ((bytes_read = data.GetByteSize()) > 0)
982                    {
983                        s << '"';
984                        data.Dump (&s,
985                                   0,                 // Start offset in "data"
986                                   item_format,
987                                   1,                 // Size of item (1 byte for a char!)
988                                   bytes_read,        // How many bytes to print?
989                                   UINT32_MAX,        // num per line
990                                   LLDB_INVALID_ADDRESS,// base address
991                                   0,                 // bitfield bit size
992                                   0);                // bitfield bit offset
993                        if (capped_data)
994                            s << "...";
995                        s << '"';
996                    }
997                }
998                else
999                {
1000                    cstr_len = max_length;
1001                    const size_t k_max_buf_size = 64;
1002
1003                    size_t offset = 0;
1004
1005                    int cstr_len_displayed = -1;
1006                    bool capped_cstr = false;
1007                    // I am using GetPointeeData() here to abstract the fact that some ValueObjects are actually frozen pointers in the host
1008                    // but the pointed-to data lives in the debuggee, and GetPointeeData() automatically takes care of this
1009                    while ((bytes_read = GetPointeeData(data, offset, k_max_buf_size)) > 0)
1010                    {
1011                        const char *cstr = data.PeekCStr(0);
1012                        size_t len = strlen_or_inf (cstr, k_max_buf_size, k_max_buf_size+1);
1013                        if (len > k_max_buf_size)
1014                            len = k_max_buf_size;
1015                        if (cstr && cstr_len_displayed < 0)
1016                            s << '"';
1017
1018                        if (cstr_len_displayed < 0)
1019                            cstr_len_displayed = len;
1020
1021                        if (len == 0)
1022                            break;
1023                        cstr_len_displayed += len;
1024                        if (len > bytes_read)
1025                            len = bytes_read;
1026                        if (len > cstr_len)
1027                            len = cstr_len;
1028
1029                        data.Dump (&s,
1030                                   0,                 // Start offset in "data"
1031                                   item_format,
1032                                   1,                 // Size of item (1 byte for a char!)
1033                                   len,               // How many bytes to print?
1034                                   UINT32_MAX,        // num per line
1035                                   LLDB_INVALID_ADDRESS,// base address
1036                                   0,                 // bitfield bit size
1037                                   0);                // bitfield bit offset
1038
1039                        if (len < k_max_buf_size)
1040                            break;
1041
1042                        if (len >= cstr_len)
1043                        {
1044                            capped_cstr = true;
1045                            break;
1046                        }
1047
1048                        cstr_len -= len;
1049                        offset += len;
1050                    }
1051
1052                    if (cstr_len_displayed >= 0)
1053                    {
1054                        s << '"';
1055                        if (capped_cstr)
1056                            s << "...";
1057                    }
1058                }
1059            }
1060        }
1061    }
1062    else
1063    {
1064        error.SetErrorString("impossible to read a string from this object");
1065        s << "<not a string object>";
1066    }
1067}
1068
1069const char *
1070ValueObject::GetObjectDescription ()
1071{
1072
1073    if (!UpdateValueIfNeeded (true))
1074        return NULL;
1075
1076    if (!m_object_desc_str.empty())
1077        return m_object_desc_str.c_str();
1078
1079    ExecutionContext exe_ctx (GetExecutionContextRef());
1080    Process *process = exe_ctx.GetProcessPtr();
1081    if (process == NULL)
1082        return NULL;
1083
1084    StreamString s;
1085
1086    LanguageType language = GetObjectRuntimeLanguage();
1087    LanguageRuntime *runtime = process->GetLanguageRuntime(language);
1088
1089    if (runtime == NULL)
1090    {
1091        // Aw, hell, if the things a pointer, or even just an integer, let's try ObjC anyway...
1092        clang_type_t opaque_qual_type = GetClangType();
1093        if (opaque_qual_type != NULL)
1094        {
1095            bool is_signed;
1096            if (ClangASTContext::IsIntegerType (opaque_qual_type, is_signed)
1097                || ClangASTContext::IsPointerType (opaque_qual_type))
1098            {
1099                runtime = process->GetLanguageRuntime(eLanguageTypeObjC);
1100            }
1101        }
1102    }
1103
1104    if (runtime && runtime->GetObjectDescription(s, *this))
1105    {
1106        m_object_desc_str.append (s.GetData());
1107    }
1108
1109    if (m_object_desc_str.empty())
1110        return NULL;
1111    else
1112        return m_object_desc_str.c_str();
1113}
1114
1115bool
1116ValueObject::GetValueAsCString (lldb::Format format,
1117                                std::string& destination)
1118{
1119    if (ClangASTContext::IsAggregateType (GetClangType()) == false &&
1120        UpdateValueIfNeeded(false))
1121    {
1122        const Value::ContextType context_type = m_value.GetContextType();
1123
1124        switch (context_type)
1125        {
1126            case Value::eContextTypeClangType:
1127            case Value::eContextTypeLLDBType:
1128            case Value::eContextTypeVariable:
1129            {
1130                clang_type_t clang_type = GetClangType ();
1131                if (clang_type)
1132                {
1133                    StreamString sstr;
1134                    ExecutionContext exe_ctx (GetExecutionContextRef());
1135                    ClangASTType::DumpTypeValue (GetClangAST(),             // The clang AST
1136                                                 clang_type,                // The clang type to display
1137                                                 &sstr,
1138                                                 format,                    // Format to display this type with
1139                                                 m_data,                    // Data to extract from
1140                                                 0,                         // Byte offset into "m_data"
1141                                                 GetByteSize(),             // Byte size of item in "m_data"
1142                                                 GetBitfieldBitSize(),      // Bitfield bit size
1143                                                 GetBitfieldBitOffset(),    // Bitfield bit offset
1144                                                 exe_ctx.GetBestExecutionContextScope());
1145                    // Don't set the m_error to anything here otherwise
1146                    // we won't be able to re-format as anything else. The
1147                    // code for ClangASTType::DumpTypeValue() should always
1148                    // return something, even if that something contains
1149                    // an error messsage. "m_error" is used to detect errors
1150                    // when reading the valid object, not for formatting errors.
1151                    if (sstr.GetString().empty())
1152                        destination.clear();
1153                    else
1154                        destination.swap(sstr.GetString());
1155                }
1156            }
1157                break;
1158
1159            case Value::eContextTypeRegisterInfo:
1160            {
1161                const RegisterInfo *reg_info = m_value.GetRegisterInfo();
1162                if (reg_info)
1163                {
1164                    ExecutionContext exe_ctx (GetExecutionContextRef());
1165
1166                    StreamString reg_sstr;
1167                    m_data.Dump (&reg_sstr,
1168                                 0,
1169                                 format,
1170                                 reg_info->byte_size,
1171                                 1,
1172                                 UINT32_MAX,
1173                                 LLDB_INVALID_ADDRESS,
1174                                 0,
1175                                 0,
1176                                 exe_ctx.GetBestExecutionContextScope());
1177                    destination.swap(reg_sstr.GetString());
1178                }
1179            }
1180                break;
1181
1182            default:
1183                break;
1184        }
1185        return !destination.empty();
1186    }
1187    else
1188        return false;
1189}
1190
1191const char *
1192ValueObject::GetValueAsCString ()
1193{
1194    if (UpdateValueIfNeeded(true) && m_value_str.empty())
1195    {
1196        lldb::Format my_format = GetFormat();
1197        if (m_format == lldb::eFormatDefault)
1198        {
1199            if (m_type_format_sp)
1200                my_format = m_type_format_sp->GetFormat();
1201            else
1202            {
1203                if (m_is_bitfield_for_scalar)
1204                    my_format = eFormatUnsigned;
1205                else
1206                {
1207                    if (m_value.GetContextType() == Value::eContextTypeRegisterInfo)
1208                    {
1209                        const RegisterInfo *reg_info = m_value.GetRegisterInfo();
1210                        if (reg_info)
1211                            my_format = reg_info->format;
1212                    }
1213                    else
1214                    {
1215                        clang_type_t clang_type = GetClangType ();
1216                        my_format = ClangASTType::GetFormat(clang_type);
1217                    }
1218                }
1219            }
1220        }
1221        if (GetValueAsCString(my_format, m_value_str))
1222        {
1223            if (!m_value_did_change && m_old_value_valid)
1224            {
1225                // The value was gotten successfully, so we consider the
1226                // value as changed if the value string differs
1227                SetValueDidChange (m_old_value_str != m_value_str);
1228            }
1229        }
1230    }
1231    if (m_value_str.empty())
1232        return NULL;
1233    return m_value_str.c_str();
1234}
1235
1236// if > 8bytes, 0 is returned. this method should mostly be used
1237// to read address values out of pointers
1238uint64_t
1239ValueObject::GetValueAsUnsigned (uint64_t fail_value)
1240{
1241    // If our byte size is zero this is an aggregate type that has children
1242    if (ClangASTContext::IsAggregateType (GetClangType()) == false)
1243    {
1244        Scalar scalar;
1245        if (ResolveValue (scalar))
1246            return scalar.GetRawBits64(fail_value);
1247    }
1248    return fail_value;
1249}
1250
1251// if any more "special cases" are added to ValueObject::DumpPrintableRepresentation() please keep
1252// this call up to date by returning true for your new special cases. We will eventually move
1253// to checking this call result before trying to display special cases
1254bool
1255ValueObject::HasSpecialPrintableRepresentation(ValueObjectRepresentationStyle val_obj_display,
1256                                               Format custom_format)
1257{
1258    clang_type_t elem_or_pointee_type;
1259    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
1260
1261    if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
1262        && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue)
1263    {
1264        if (IsCStringContainer(true) &&
1265            (custom_format == eFormatCString ||
1266             custom_format == eFormatCharArray ||
1267             custom_format == eFormatChar ||
1268             custom_format == eFormatVectorOfChar))
1269            return true;
1270
1271        if (flags.Test(ClangASTContext::eTypeIsArray))
1272        {
1273            if ((custom_format == eFormatBytes) ||
1274                (custom_format == eFormatBytesWithASCII))
1275                return true;
1276
1277            if ((custom_format == eFormatVectorOfChar) ||
1278                (custom_format == eFormatVectorOfFloat32) ||
1279                (custom_format == eFormatVectorOfFloat64) ||
1280                (custom_format == eFormatVectorOfSInt16) ||
1281                (custom_format == eFormatVectorOfSInt32) ||
1282                (custom_format == eFormatVectorOfSInt64) ||
1283                (custom_format == eFormatVectorOfSInt8) ||
1284                (custom_format == eFormatVectorOfUInt128) ||
1285                (custom_format == eFormatVectorOfUInt16) ||
1286                (custom_format == eFormatVectorOfUInt32) ||
1287                (custom_format == eFormatVectorOfUInt64) ||
1288                (custom_format == eFormatVectorOfUInt8))
1289                return true;
1290        }
1291    }
1292    return false;
1293}
1294
1295bool
1296ValueObject::DumpPrintableRepresentation(Stream& s,
1297                                         ValueObjectRepresentationStyle val_obj_display,
1298                                         Format custom_format,
1299                                         PrintableRepresentationSpecialCases special)
1300{
1301
1302    clang_type_t elem_or_pointee_type;
1303    Flags flags(ClangASTContext::GetTypeInfo(GetClangType(), GetClangAST(), &elem_or_pointee_type));
1304
1305    bool allow_special = ((special & ePrintableRepresentationSpecialCasesAllow) == ePrintableRepresentationSpecialCasesAllow);
1306    bool only_special = ((special & ePrintableRepresentationSpecialCasesOnly) == ePrintableRepresentationSpecialCasesOnly);
1307
1308    if (allow_special)
1309    {
1310        if (flags.AnySet(ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer)
1311             && val_obj_display == ValueObject::eValueObjectRepresentationStyleValue)
1312        {
1313            // when being asked to get a printable display an array or pointer type directly,
1314            // try to "do the right thing"
1315
1316            if (IsCStringContainer(true) &&
1317                (custom_format == eFormatCString ||
1318                 custom_format == eFormatCharArray ||
1319                 custom_format == eFormatChar ||
1320                 custom_format == eFormatVectorOfChar)) // print char[] & char* directly
1321            {
1322                Error error;
1323                ReadPointedString(s,
1324                                  error,
1325                                  0,
1326                                  (custom_format == eFormatVectorOfChar) ||
1327                                  (custom_format == eFormatCharArray));
1328                return !error.Fail();
1329            }
1330
1331            if (custom_format == eFormatEnum)
1332                return false;
1333
1334            // this only works for arrays, because I have no way to know when
1335            // the pointed memory ends, and no special \0 end of data marker
1336            if (flags.Test(ClangASTContext::eTypeIsArray))
1337            {
1338                if ((custom_format == eFormatBytes) ||
1339                    (custom_format == eFormatBytesWithASCII))
1340                {
1341                    uint32_t count = GetNumChildren();
1342
1343                    s << '[';
1344                    for (uint32_t low = 0; low < count; low++)
1345                    {
1346
1347                        if (low)
1348                            s << ',';
1349
1350                        ValueObjectSP child = GetChildAtIndex(low,true);
1351                        if (!child.get())
1352                        {
1353                            s << "<invalid child>";
1354                            continue;
1355                        }
1356                        child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, custom_format);
1357                    }
1358
1359                    s << ']';
1360
1361                    return true;
1362                }
1363
1364                if ((custom_format == eFormatVectorOfChar) ||
1365                    (custom_format == eFormatVectorOfFloat32) ||
1366                    (custom_format == eFormatVectorOfFloat64) ||
1367                    (custom_format == eFormatVectorOfSInt16) ||
1368                    (custom_format == eFormatVectorOfSInt32) ||
1369                    (custom_format == eFormatVectorOfSInt64) ||
1370                    (custom_format == eFormatVectorOfSInt8) ||
1371                    (custom_format == eFormatVectorOfUInt128) ||
1372                    (custom_format == eFormatVectorOfUInt16) ||
1373                    (custom_format == eFormatVectorOfUInt32) ||
1374                    (custom_format == eFormatVectorOfUInt64) ||
1375                    (custom_format == eFormatVectorOfUInt8)) // arrays of bytes, bytes with ASCII or any vector format should be printed directly
1376                {
1377                    uint32_t count = GetNumChildren();
1378
1379                    Format format = FormatManager::GetSingleItemFormat(custom_format);
1380
1381                    s << '[';
1382                    for (uint32_t low = 0; low < count; low++)
1383                    {
1384
1385                        if (low)
1386                            s << ',';
1387
1388                        ValueObjectSP child = GetChildAtIndex(low,true);
1389                        if (!child.get())
1390                        {
1391                            s << "<invalid child>";
1392                            continue;
1393                        }
1394                        child->DumpPrintableRepresentation(s, ValueObject::eValueObjectRepresentationStyleValue, format);
1395                    }
1396
1397                    s << ']';
1398
1399                    return true;
1400                }
1401            }
1402
1403            if ((custom_format == eFormatBoolean) ||
1404                (custom_format == eFormatBinary) ||
1405                (custom_format == eFormatChar) ||
1406                (custom_format == eFormatCharPrintable) ||
1407                (custom_format == eFormatComplexFloat) ||
1408                (custom_format == eFormatDecimal) ||
1409                (custom_format == eFormatHex) ||
1410                (custom_format == eFormatFloat) ||
1411                (custom_format == eFormatOctal) ||
1412                (custom_format == eFormatOSType) ||
1413                (custom_format == eFormatUnicode16) ||
1414                (custom_format == eFormatUnicode32) ||
1415                (custom_format == eFormatUnsigned) ||
1416                (custom_format == eFormatPointer) ||
1417                (custom_format == eFormatComplexInteger) ||
1418                (custom_format == eFormatComplex) ||
1419                (custom_format == eFormatDefault)) // use the [] operator
1420                return false;
1421        }
1422    }
1423
1424    if (only_special)
1425        return false;
1426
1427    bool var_success = false;
1428
1429    {
1430        const char * return_value;
1431        std::string alloc_mem;
1432
1433        if (custom_format != eFormatInvalid)
1434            SetFormat(custom_format);
1435
1436        switch(val_obj_display)
1437        {
1438            case eValueObjectRepresentationStyleValue:
1439                return_value = GetValueAsCString();
1440                break;
1441
1442            case eValueObjectRepresentationStyleSummary:
1443                return_value = GetSummaryAsCString();
1444                break;
1445
1446            case eValueObjectRepresentationStyleLanguageSpecific:
1447                return_value = GetObjectDescription();
1448                break;
1449
1450            case eValueObjectRepresentationStyleLocation:
1451                return_value = GetLocationAsCString();
1452                break;
1453
1454            case eValueObjectRepresentationStyleChildrenCount:
1455            {
1456                alloc_mem.resize(512);
1457                return_value = &alloc_mem[0];
1458                int count = GetNumChildren();
1459                snprintf((char*)return_value, 512, "%d", count);
1460            }
1461                break;
1462
1463            case eValueObjectRepresentationStyleType:
1464                return_value = GetTypeName().AsCString();
1465                break;
1466
1467            default:
1468                break;
1469        }
1470
1471        if (!return_value)
1472        {
1473            if (val_obj_display == eValueObjectRepresentationStyleValue)
1474                return_value = GetSummaryAsCString();
1475            else if (val_obj_display == eValueObjectRepresentationStyleSummary)
1476            {
1477                if (ClangASTContext::IsAggregateType (GetClangType()) == true)
1478                {
1479                    // this thing has no value, and it seems to have no summary
1480                    // some combination of unitialized data and other factors can also
1481                    // raise this condition, so let's print a nice generic description
1482                    {
1483                        alloc_mem.resize(684);
1484                        return_value = &alloc_mem[0];
1485                        snprintf((char*)return_value, 684, "%s @ %s", GetTypeName().AsCString(), GetLocationAsCString());
1486                    }
1487                }
1488                else
1489                    return_value = GetValueAsCString();
1490            }
1491        }
1492
1493        if (return_value)
1494            s.PutCString(return_value);
1495        else
1496        {
1497            if (m_error.Fail())
1498                s.Printf("<%s>", m_error.AsCString());
1499            else if (val_obj_display == eValueObjectRepresentationStyleSummary)
1500                s.PutCString("<no summary available>");
1501            else if (val_obj_display == eValueObjectRepresentationStyleValue)
1502                s.PutCString("<no value available>");
1503            else if (val_obj_display == eValueObjectRepresentationStyleLanguageSpecific)
1504                s.PutCString("<not a valid Objective-C object>"); // edit this if we have other runtimes that support a description
1505            else
1506                s.PutCString("<no printable representation>");
1507        }
1508
1509        // we should only return false here if we could not do *anything*
1510        // even if we have an error message as output, that's a success
1511        // from our callers' perspective, so return true
1512        var_success = true;
1513
1514        if (custom_format != eFormatInvalid)
1515            SetFormat(eFormatDefault);
1516    }
1517
1518    return var_success;
1519}
1520
1521addr_t
1522ValueObject::GetAddressOf (bool scalar_is_load_address, AddressType *address_type)
1523{
1524    if (!UpdateValueIfNeeded(false))
1525        return LLDB_INVALID_ADDRESS;
1526
1527    switch (m_value.GetValueType())
1528    {
1529    case Value::eValueTypeScalar:
1530        if (scalar_is_load_address)
1531        {
1532            if(address_type)
1533                *address_type = eAddressTypeLoad;
1534            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1535        }
1536        break;
1537
1538    case Value::eValueTypeLoadAddress:
1539    case Value::eValueTypeFileAddress:
1540    case Value::eValueTypeHostAddress:
1541        {
1542            if(address_type)
1543                *address_type = m_value.GetValueAddressType ();
1544            return m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1545        }
1546        break;
1547    }
1548    if (address_type)
1549        *address_type = eAddressTypeInvalid;
1550    return LLDB_INVALID_ADDRESS;
1551}
1552
1553addr_t
1554ValueObject::GetPointerValue (AddressType *address_type)
1555{
1556    addr_t address = LLDB_INVALID_ADDRESS;
1557    if(address_type)
1558        *address_type = eAddressTypeInvalid;
1559
1560    if (!UpdateValueIfNeeded(false))
1561        return address;
1562
1563    switch (m_value.GetValueType())
1564    {
1565    case Value::eValueTypeScalar:
1566        address = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
1567        break;
1568
1569    case Value::eValueTypeHostAddress:
1570    case Value::eValueTypeLoadAddress:
1571    case Value::eValueTypeFileAddress:
1572        {
1573            uint32_t data_offset = 0;
1574            address = m_data.GetPointer(&data_offset);
1575        }
1576        break;
1577    }
1578
1579    if (address_type)
1580        *address_type = GetAddressTypeOfChildren();
1581
1582    return address;
1583}
1584
1585bool
1586ValueObject::SetValueFromCString (const char *value_str)
1587{
1588    // Make sure our value is up to date first so that our location and location
1589    // type is valid.
1590    if (!UpdateValueIfNeeded(false))
1591        return false;
1592
1593    uint32_t count = 0;
1594    Encoding encoding = ClangASTType::GetEncoding (GetClangType(), count);
1595
1596    const size_t byte_size = GetByteSize();
1597
1598    Value::ValueType value_type = m_value.GetValueType();
1599
1600    if (value_type == Value::eValueTypeScalar)
1601    {
1602        // If the value is already a scalar, then let the scalar change itself:
1603        m_value.GetScalar().SetValueFromCString (value_str, encoding, byte_size);
1604    }
1605    else if (byte_size <= Scalar::GetMaxByteSize())
1606    {
1607        // If the value fits in a scalar, then make a new scalar and again let the
1608        // scalar code do the conversion, then figure out where to put the new value.
1609        Scalar new_scalar;
1610        Error error;
1611        error = new_scalar.SetValueFromCString (value_str, encoding, byte_size);
1612        if (error.Success())
1613        {
1614            switch (value_type)
1615            {
1616            case Value::eValueTypeLoadAddress:
1617                {
1618                    // If it is a load address, then the scalar value is the storage location
1619                    // of the data, and we have to shove this value down to that load location.
1620                    ExecutionContext exe_ctx (GetExecutionContextRef());
1621                    Process *process = exe_ctx.GetProcessPtr();
1622                    if (process)
1623                    {
1624                        addr_t target_addr = m_value.GetScalar().GetRawBits64(LLDB_INVALID_ADDRESS);
1625                        size_t bytes_written = process->WriteScalarToMemory (target_addr,
1626                                                                             new_scalar,
1627                                                                             byte_size,
1628                                                                             error);
1629                        if (!error.Success() || bytes_written != byte_size)
1630                            return false;
1631                    }
1632                }
1633                break;
1634            case Value::eValueTypeHostAddress:
1635                {
1636                    // If it is a host address, then we stuff the scalar as a DataBuffer into the Value's data.
1637                    DataExtractor new_data;
1638                    new_data.SetByteOrder (m_data.GetByteOrder());
1639
1640                    DataBufferSP buffer_sp (new DataBufferHeap(byte_size, 0));
1641                    m_data.SetData(buffer_sp, 0);
1642                    bool success = new_scalar.GetData(new_data);
1643                    if (success)
1644                    {
1645                        new_data.CopyByteOrderedData (0,
1646                                                      byte_size,
1647                                                      const_cast<uint8_t *>(m_data.GetDataStart()),
1648                                                      byte_size,
1649                                                      m_data.GetByteOrder());
1650                    }
1651                    m_value.GetScalar() = (uintptr_t)m_data.GetDataStart();
1652
1653                }
1654                break;
1655            case Value::eValueTypeFileAddress:
1656            case Value::eValueTypeScalar:
1657                break;
1658            }
1659        }
1660        else
1661        {
1662            return false;
1663        }
1664    }
1665    else
1666    {
1667        // We don't support setting things bigger than a scalar at present.
1668        return false;
1669    }
1670
1671    // If we have reached this point, then we have successfully changed the value.
1672    SetNeedsUpdate();
1673    return true;
1674}
1675
1676bool
1677ValueObject::GetDeclaration (Declaration &decl)
1678{
1679    decl.Clear();
1680    return false;
1681}
1682
1683ConstString
1684ValueObject::GetTypeName()
1685{
1686    return ClangASTType::GetConstTypeName (GetClangAST(), GetClangType());
1687}
1688
1689ConstString
1690ValueObject::GetQualifiedTypeName()
1691{
1692    return ClangASTType::GetConstQualifiedTypeName (GetClangAST(), GetClangType());
1693}
1694
1695
1696LanguageType
1697ValueObject::GetObjectRuntimeLanguage ()
1698{
1699    return ClangASTType::GetMinimumLanguage (GetClangAST(),
1700                                             GetClangType());
1701}
1702
1703void
1704ValueObject::AddSyntheticChild (const ConstString &key, ValueObject *valobj)
1705{
1706    m_synthetic_children[key] = valobj;
1707}
1708
1709ValueObjectSP
1710ValueObject::GetSyntheticChild (const ConstString &key) const
1711{
1712    ValueObjectSP synthetic_child_sp;
1713    std::map<ConstString, ValueObject *>::const_iterator pos = m_synthetic_children.find (key);
1714    if (pos != m_synthetic_children.end())
1715        synthetic_child_sp = pos->second->GetSP();
1716    return synthetic_child_sp;
1717}
1718
1719bool
1720ValueObject::IsPointerType ()
1721{
1722    return ClangASTContext::IsPointerType (GetClangType());
1723}
1724
1725bool
1726ValueObject::IsArrayType ()
1727{
1728    return ClangASTContext::IsArrayType (GetClangType());
1729}
1730
1731bool
1732ValueObject::IsScalarType ()
1733{
1734    return ClangASTContext::IsScalarType (GetClangType());
1735}
1736
1737bool
1738ValueObject::IsIntegerType (bool &is_signed)
1739{
1740    return ClangASTContext::IsIntegerType (GetClangType(), is_signed);
1741}
1742
1743bool
1744ValueObject::IsPointerOrReferenceType ()
1745{
1746    return ClangASTContext::IsPointerOrReferenceType (GetClangType());
1747}
1748
1749bool
1750ValueObject::IsPossibleCPlusPlusDynamicType ()
1751{
1752    return ClangASTContext::IsPossibleCPlusPlusDynamicType (GetClangAST (), GetClangType());
1753}
1754
1755bool
1756ValueObject::IsPossibleDynamicType ()
1757{
1758    return ClangASTContext::IsPossibleDynamicType (GetClangAST (), GetClangType());
1759}
1760
1761ValueObjectSP
1762ValueObject::GetSyntheticArrayMember (int32_t index, bool can_create)
1763{
1764    if (IsArrayType())
1765        return GetSyntheticArrayMemberFromArray(index, can_create);
1766
1767    if (IsPointerType())
1768        return GetSyntheticArrayMemberFromPointer(index, can_create);
1769
1770    return ValueObjectSP();
1771
1772}
1773
1774ValueObjectSP
1775ValueObject::GetSyntheticArrayMemberFromPointer (int32_t index, bool can_create)
1776{
1777    ValueObjectSP synthetic_child_sp;
1778    if (IsPointerType ())
1779    {
1780        char index_str[64];
1781        snprintf(index_str, sizeof(index_str), "[%i]", index);
1782        ConstString index_const_str(index_str);
1783        // Check if we have already created a synthetic array member in this
1784        // valid object. If we have we will re-use it.
1785        synthetic_child_sp = GetSyntheticChild (index_const_str);
1786        if (!synthetic_child_sp)
1787        {
1788            ValueObject *synthetic_child;
1789            // We haven't made a synthetic array member for INDEX yet, so
1790            // lets make one and cache it for any future reference.
1791            synthetic_child = CreateChildAtIndex(0, true, index);
1792
1793            // Cache the value if we got one back...
1794            if (synthetic_child)
1795            {
1796                AddSyntheticChild(index_const_str, synthetic_child);
1797                synthetic_child_sp = synthetic_child->GetSP();
1798                synthetic_child_sp->SetName(ConstString(index_str));
1799                synthetic_child_sp->m_is_array_item_for_pointer = true;
1800            }
1801        }
1802    }
1803    return synthetic_child_sp;
1804}
1805
1806// This allows you to create an array member using and index
1807// that doesn't not fall in the normal bounds of the array.
1808// Many times structure can be defined as:
1809// struct Collection
1810// {
1811//     uint32_t item_count;
1812//     Item item_array[0];
1813// };
1814// The size of the "item_array" is 1, but many times in practice
1815// there are more items in "item_array".
1816
1817ValueObjectSP
1818ValueObject::GetSyntheticArrayMemberFromArray (int32_t index, bool can_create)
1819{
1820    ValueObjectSP synthetic_child_sp;
1821    if (IsArrayType ())
1822    {
1823        char index_str[64];
1824        snprintf(index_str, sizeof(index_str), "[%i]", index);
1825        ConstString index_const_str(index_str);
1826        // Check if we have already created a synthetic array member in this
1827        // valid object. If we have we will re-use it.
1828        synthetic_child_sp = GetSyntheticChild (index_const_str);
1829        if (!synthetic_child_sp)
1830        {
1831            ValueObject *synthetic_child;
1832            // We haven't made a synthetic array member for INDEX yet, so
1833            // lets make one and cache it for any future reference.
1834            synthetic_child = CreateChildAtIndex(0, true, index);
1835
1836            // Cache the value if we got one back...
1837            if (synthetic_child)
1838            {
1839                AddSyntheticChild(index_const_str, synthetic_child);
1840                synthetic_child_sp = synthetic_child->GetSP();
1841                synthetic_child_sp->SetName(ConstString(index_str));
1842                synthetic_child_sp->m_is_array_item_for_pointer = true;
1843            }
1844        }
1845    }
1846    return synthetic_child_sp;
1847}
1848
1849ValueObjectSP
1850ValueObject::GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create)
1851{
1852    ValueObjectSP synthetic_child_sp;
1853    if (IsScalarType ())
1854    {
1855        char index_str[64];
1856        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
1857        ConstString index_const_str(index_str);
1858        // Check if we have already created a synthetic array member in this
1859        // valid object. If we have we will re-use it.
1860        synthetic_child_sp = GetSyntheticChild (index_const_str);
1861        if (!synthetic_child_sp)
1862        {
1863            ValueObjectChild *synthetic_child;
1864            // We haven't made a synthetic array member for INDEX yet, so
1865            // lets make one and cache it for any future reference.
1866            synthetic_child = new ValueObjectChild(*this,
1867                                                      GetClangAST(),
1868                                                      GetClangType(),
1869                                                      index_const_str,
1870                                                      GetByteSize(),
1871                                                      0,
1872                                                      to-from+1,
1873                                                      from,
1874                                                      false,
1875                                                      false,
1876                                                      eAddressTypeInvalid);
1877
1878            // Cache the value if we got one back...
1879            if (synthetic_child)
1880            {
1881                AddSyntheticChild(index_const_str, synthetic_child);
1882                synthetic_child_sp = synthetic_child->GetSP();
1883                synthetic_child_sp->SetName(ConstString(index_str));
1884                synthetic_child_sp->m_is_bitfield_for_scalar = true;
1885            }
1886        }
1887    }
1888    return synthetic_child_sp;
1889}
1890
1891ValueObjectSP
1892ValueObject::GetSyntheticArrayRangeChild (uint32_t from, uint32_t to, bool can_create)
1893{
1894    ValueObjectSP synthetic_child_sp;
1895    if (IsArrayType () || IsPointerType ())
1896    {
1897        char index_str[64];
1898        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
1899        ConstString index_const_str(index_str);
1900        // Check if we have already created a synthetic array member in this
1901        // valid object. If we have we will re-use it.
1902        synthetic_child_sp = GetSyntheticChild (index_const_str);
1903        if (!synthetic_child_sp)
1904        {
1905            ValueObjectSynthetic *synthetic_child;
1906
1907            // We haven't made a synthetic array member for INDEX yet, so
1908            // lets make one and cache it for any future reference.
1909            SyntheticArrayView *view = new SyntheticArrayView(SyntheticChildren::Flags());
1910            view->AddRange(from,to);
1911            SyntheticChildrenSP view_sp(view);
1912            synthetic_child = new ValueObjectSynthetic(*this, view_sp);
1913
1914            // Cache the value if we got one back...
1915            if (synthetic_child)
1916            {
1917                AddSyntheticChild(index_const_str, synthetic_child);
1918                synthetic_child_sp = synthetic_child->GetSP();
1919                synthetic_child_sp->SetName(ConstString(index_str));
1920                synthetic_child_sp->m_is_bitfield_for_scalar = true;
1921            }
1922        }
1923    }
1924    return synthetic_child_sp;
1925}
1926
1927ValueObjectSP
1928ValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
1929{
1930
1931    ValueObjectSP synthetic_child_sp;
1932
1933    char name_str[64];
1934    snprintf(name_str, sizeof(name_str), "@%i", offset);
1935    ConstString name_const_str(name_str);
1936
1937    // Check if we have already created a synthetic array member in this
1938    // valid object. If we have we will re-use it.
1939    synthetic_child_sp = GetSyntheticChild (name_const_str);
1940
1941    if (synthetic_child_sp.get())
1942        return synthetic_child_sp;
1943
1944    if (!can_create)
1945        return ValueObjectSP();
1946
1947    ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
1948                                                             type.GetASTContext(),
1949                                                             type.GetOpaqueQualType(),
1950                                                             name_const_str,
1951                                                             type.GetTypeByteSize(),
1952                                                             offset,
1953                                                             0,
1954                                                             0,
1955                                                             false,
1956                                                             false,
1957                                                             eAddressTypeInvalid);
1958    if (synthetic_child)
1959    {
1960        AddSyntheticChild(name_const_str, synthetic_child);
1961        synthetic_child_sp = synthetic_child->GetSP();
1962        synthetic_child_sp->SetName(name_const_str);
1963        synthetic_child_sp->m_is_child_at_offset = true;
1964    }
1965    return synthetic_child_sp;
1966}
1967
1968// your expression path needs to have a leading . or ->
1969// (unless it somehow "looks like" an array, in which case it has
1970// a leading [ symbol). while the [ is meaningful and should be shown
1971// to the user, . and -> are just parser design, but by no means
1972// added information for the user.. strip them off
1973static const char*
1974SkipLeadingExpressionPathSeparators(const char* expression)
1975{
1976    if (!expression || !expression[0])
1977        return expression;
1978    if (expression[0] == '.')
1979        return expression+1;
1980    if (expression[0] == '-' && expression[1] == '>')
1981        return expression+2;
1982    return expression;
1983}
1984
1985ValueObjectSP
1986ValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
1987{
1988    ValueObjectSP synthetic_child_sp;
1989    ConstString name_const_string(expression);
1990    // Check if we have already created a synthetic array member in this
1991    // valid object. If we have we will re-use it.
1992    synthetic_child_sp = GetSyntheticChild (name_const_string);
1993    if (!synthetic_child_sp)
1994    {
1995        // We haven't made a synthetic array member for expression yet, so
1996        // lets make one and cache it for any future reference.
1997        synthetic_child_sp = GetValueForExpressionPath(expression);
1998
1999        // Cache the value if we got one back...
2000        if (synthetic_child_sp.get())
2001        {
2002            AddSyntheticChild(name_const_string, synthetic_child_sp.get());
2003            synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
2004            synthetic_child_sp->m_is_expression_path_child = true;
2005        }
2006    }
2007    return synthetic_child_sp;
2008}
2009
2010void
2011ValueObject::CalculateSyntheticValue (bool use_synthetic)
2012{
2013    if (use_synthetic == false)
2014        return;
2015
2016    TargetSP target_sp(GetTargetSP());
2017    if (target_sp && (target_sp->GetEnableSyntheticValue() == false || target_sp->GetSuppressSyntheticValue() == true))
2018    {
2019        m_synthetic_value = NULL;
2020        return;
2021    }
2022
2023    if (!UpdateFormatsIfNeeded(m_last_format_mgr_dynamic) && m_synthetic_value)
2024        return;
2025
2026    if (m_synthetic_children_sp.get() == NULL)
2027        return;
2028
2029    m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp);
2030}
2031
2032void
2033ValueObject::CalculateDynamicValue (DynamicValueType use_dynamic)
2034{
2035    if (use_dynamic == eNoDynamicValues)
2036        return;
2037
2038    if (!m_dynamic_value && !IsDynamic())
2039    {
2040        ExecutionContext exe_ctx (GetExecutionContextRef());
2041        Process *process = exe_ctx.GetProcessPtr();
2042        if (process)
2043        {
2044            bool worth_having_dynamic_value = false;
2045
2046
2047            // FIXME: Process should have some kind of "map over Runtimes" so we don't have to
2048            // hard code this everywhere.
2049            LanguageType known_type = GetObjectRuntimeLanguage();
2050            if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC)
2051            {
2052                LanguageRuntime *runtime = process->GetLanguageRuntime (known_type);
2053                if (runtime)
2054                    worth_having_dynamic_value = runtime->CouldHaveDynamicValue(*this);
2055            }
2056            else
2057            {
2058                LanguageRuntime *cpp_runtime = process->GetLanguageRuntime (eLanguageTypeC_plus_plus);
2059                if (cpp_runtime)
2060                    worth_having_dynamic_value = cpp_runtime->CouldHaveDynamicValue(*this);
2061
2062                if (!worth_having_dynamic_value)
2063                {
2064                    LanguageRuntime *objc_runtime = process->GetLanguageRuntime (eLanguageTypeObjC);
2065                    if (objc_runtime)
2066                        worth_having_dynamic_value = objc_runtime->CouldHaveDynamicValue(*this);
2067                }
2068            }
2069
2070            if (worth_having_dynamic_value)
2071                m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
2072        }
2073    }
2074}
2075
2076ValueObjectSP
2077ValueObject::GetDynamicValue (DynamicValueType use_dynamic)
2078{
2079    if (use_dynamic == eNoDynamicValues)
2080        return ValueObjectSP();
2081
2082    if (!IsDynamic() && m_dynamic_value == NULL)
2083    {
2084        CalculateDynamicValue(use_dynamic);
2085    }
2086    if (m_dynamic_value)
2087        return m_dynamic_value->GetSP();
2088    else
2089        return ValueObjectSP();
2090}
2091
2092ValueObjectSP
2093ValueObject::GetStaticValue()
2094{
2095    return GetSP();
2096}
2097
2098ValueObjectSP
2099ValueObject::GetSyntheticValue (bool use_synthetic)
2100{
2101    if (use_synthetic == false)
2102        return ValueObjectSP();
2103
2104    CalculateSyntheticValue(use_synthetic);
2105
2106    if (m_synthetic_value)
2107        return m_synthetic_value->GetSP();
2108    else
2109        return ValueObjectSP();
2110}
2111
2112bool
2113ValueObject::HasSyntheticValue()
2114{
2115    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
2116
2117    if (m_synthetic_children_sp.get() == NULL)
2118        return false;
2119
2120    CalculateSyntheticValue(true);
2121
2122    if (m_synthetic_value)
2123        return true;
2124    else
2125        return false;
2126}
2127
2128bool
2129ValueObject::GetBaseClassPath (Stream &s)
2130{
2131    if (IsBaseClass())
2132    {
2133        bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
2134        clang_type_t clang_type = GetClangType();
2135        std::string cxx_class_name;
2136        bool this_had_base_class = ClangASTContext::GetCXXClassName (clang_type, cxx_class_name);
2137        if (this_had_base_class)
2138        {
2139            if (parent_had_base_class)
2140                s.PutCString("::");
2141            s.PutCString(cxx_class_name.c_str());
2142        }
2143        return parent_had_base_class || this_had_base_class;
2144    }
2145    return false;
2146}
2147
2148
2149ValueObject *
2150ValueObject::GetNonBaseClassParent()
2151{
2152    if (GetParent())
2153    {
2154        if (GetParent()->IsBaseClass())
2155            return GetParent()->GetNonBaseClassParent();
2156        else
2157            return GetParent();
2158    }
2159    return NULL;
2160}
2161
2162void
2163ValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
2164{
2165    const bool is_deref_of_parent = IsDereferenceOfParent ();
2166
2167    if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2168    {
2169        // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
2170        // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
2171        // the eHonorPointers mode is meant to produce strings in this latter format
2172        s.PutCString("*(");
2173    }
2174
2175    ValueObject* parent = GetParent();
2176
2177    if (parent)
2178        parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
2179
2180    // if we are a deref_of_parent just because we are synthetic array
2181    // members made up to allow ptr[%d] syntax to work in variable
2182    // printing, then add our name ([%d]) to the expression path
2183    if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers)
2184        s.PutCString(m_name.AsCString());
2185
2186    if (!IsBaseClass())
2187    {
2188        if (!is_deref_of_parent)
2189        {
2190            ValueObject *non_base_class_parent = GetNonBaseClassParent();
2191            if (non_base_class_parent)
2192            {
2193                clang_type_t non_base_class_parent_clang_type = non_base_class_parent->GetClangType();
2194                if (non_base_class_parent_clang_type)
2195                {
2196                    const uint32_t non_base_class_parent_type_info = ClangASTContext::GetTypeInfo (non_base_class_parent_clang_type, NULL, NULL);
2197
2198                    if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers)
2199                    {
2200                        s.PutCString("->");
2201                    }
2202                    else
2203                    {
2204                        if (non_base_class_parent_type_info & ClangASTContext::eTypeIsPointer)
2205                        {
2206                            s.PutCString("->");
2207                        }
2208                        else if ((non_base_class_parent_type_info & ClangASTContext::eTypeHasChildren) &&
2209                                 !(non_base_class_parent_type_info & ClangASTContext::eTypeIsArray))
2210                        {
2211                            s.PutChar('.');
2212                        }
2213                    }
2214                }
2215            }
2216
2217            const char *name = GetName().GetCString();
2218            if (name)
2219            {
2220                if (qualify_cxx_base_classes)
2221                {
2222                    if (GetBaseClassPath (s))
2223                        s.PutCString("::");
2224                }
2225                s.PutCString(name);
2226            }
2227        }
2228    }
2229
2230    if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2231    {
2232        s.PutChar(')');
2233    }
2234}
2235
2236ValueObjectSP
2237ValueObject::GetValueForExpressionPath(const char* expression,
2238                                       const char** first_unparsed,
2239                                       ExpressionPathScanEndReason* reason_to_stop,
2240                                       ExpressionPathEndResultType* final_value_type,
2241                                       const GetValueForExpressionPathOptions& options,
2242                                       ExpressionPathAftermath* final_task_on_target)
2243{
2244
2245    const char* dummy_first_unparsed;
2246    ExpressionPathScanEndReason dummy_reason_to_stop;
2247    ExpressionPathEndResultType dummy_final_value_type;
2248    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2249
2250    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2251                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
2252                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2253                                                           final_value_type ? final_value_type : &dummy_final_value_type,
2254                                                           options,
2255                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2256
2257    if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2258        return ret_val;
2259
2260    if (ret_val.get() && ((final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress of plain objects
2261    {
2262        if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference)
2263        {
2264            Error error;
2265            ValueObjectSP final_value = ret_val->Dereference(error);
2266            if (error.Fail() || !final_value.get())
2267            {
2268                if (reason_to_stop)
2269                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2270                if (final_value_type)
2271                    *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2272                return ValueObjectSP();
2273            }
2274            else
2275            {
2276                if (final_task_on_target)
2277                    *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2278                return final_value;
2279            }
2280        }
2281        if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2282        {
2283            Error error;
2284            ValueObjectSP final_value = ret_val->AddressOf(error);
2285            if (error.Fail() || !final_value.get())
2286            {
2287                if (reason_to_stop)
2288                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2289                if (final_value_type)
2290                    *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2291                return ValueObjectSP();
2292            }
2293            else
2294            {
2295                if (final_task_on_target)
2296                    *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2297                return final_value;
2298            }
2299        }
2300    }
2301    return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
2302}
2303
2304int
2305ValueObject::GetValuesForExpressionPath(const char* expression,
2306                                        ValueObjectListSP& list,
2307                                        const char** first_unparsed,
2308                                        ExpressionPathScanEndReason* reason_to_stop,
2309                                        ExpressionPathEndResultType* final_value_type,
2310                                        const GetValueForExpressionPathOptions& options,
2311                                        ExpressionPathAftermath* final_task_on_target)
2312{
2313    const char* dummy_first_unparsed;
2314    ExpressionPathScanEndReason dummy_reason_to_stop;
2315    ExpressionPathEndResultType dummy_final_value_type;
2316    ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2317
2318    ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2319                                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
2320                                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2321                                                           final_value_type ? final_value_type : &dummy_final_value_type,
2322                                                           options,
2323                                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2324
2325    if (!ret_val.get()) // if there are errors, I add nothing to the list
2326        return 0;
2327
2328    if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet)
2329    {
2330        // I need not expand a range, just post-process the final value and return
2331        if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2332        {
2333            list->Append(ret_val);
2334            return 1;
2335        }
2336        if (ret_val.get() && (final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain) // I can only deref and takeaddress of plain objects
2337        {
2338            if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference)
2339            {
2340                Error error;
2341                ValueObjectSP final_value = ret_val->Dereference(error);
2342                if (error.Fail() || !final_value.get())
2343                {
2344                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2345                    *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2346                    return 0;
2347                }
2348                else
2349                {
2350                    *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2351                    list->Append(final_value);
2352                    return 1;
2353                }
2354            }
2355            if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2356            {
2357                Error error;
2358                ValueObjectSP final_value = ret_val->AddressOf(error);
2359                if (error.Fail() || !final_value.get())
2360                {
2361                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2362                    *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2363                    return 0;
2364                }
2365                else
2366                {
2367                    *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2368                    list->Append(final_value);
2369                    return 1;
2370                }
2371            }
2372        }
2373    }
2374    else
2375    {
2376        return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
2377                                          first_unparsed ? first_unparsed : &dummy_first_unparsed,
2378                                          ret_val,
2379                                          list,
2380                                          reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2381                                          final_value_type ? final_value_type : &dummy_final_value_type,
2382                                          options,
2383                                          final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2384    }
2385    // in any non-covered case, just do the obviously right thing
2386    list->Append(ret_val);
2387    return 1;
2388}
2389
2390ValueObjectSP
2391ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
2392                                            const char** first_unparsed,
2393                                            ExpressionPathScanEndReason* reason_to_stop,
2394                                            ExpressionPathEndResultType* final_result,
2395                                            const GetValueForExpressionPathOptions& options,
2396                                            ExpressionPathAftermath* what_next)
2397{
2398    ValueObjectSP root = GetSP();
2399
2400    if (!root.get())
2401        return ValueObjectSP();
2402
2403    *first_unparsed = expression_cstr;
2404
2405    while (true)
2406    {
2407
2408        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
2409
2410        clang_type_t root_clang_type = root->GetClangType();
2411        clang_type_t pointee_clang_type;
2412        Flags root_clang_type_info,pointee_clang_type_info;
2413
2414        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
2415        if (pointee_clang_type)
2416            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
2417
2418        if (!expression_cstr || *expression_cstr == '\0')
2419        {
2420            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2421            return root;
2422        }
2423
2424        switch (*expression_cstr)
2425        {
2426            case '-':
2427            {
2428                if (options.m_check_dot_vs_arrow_syntax &&
2429                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
2430                {
2431                    *first_unparsed = expression_cstr;
2432                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
2433                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2434                    return ValueObjectSP();
2435                }
2436                if (root_clang_type_info.Test(ClangASTContext::eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
2437                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) &&
2438                    options.m_no_fragile_ivar)
2439                {
2440                    *first_unparsed = expression_cstr;
2441                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
2442                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2443                    return ValueObjectSP();
2444                }
2445                if (expression_cstr[1] != '>')
2446                {
2447                    *first_unparsed = expression_cstr;
2448                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2449                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2450                    return ValueObjectSP();
2451                }
2452                expression_cstr++; // skip the -
2453            }
2454            case '.': // or fallthrough from ->
2455            {
2456                if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
2457                    root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
2458                {
2459                    *first_unparsed = expression_cstr;
2460                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
2461                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2462                    return ValueObjectSP();
2463                }
2464                expression_cstr++; // skip .
2465                const char *next_separator = strpbrk(expression_cstr+1,"-.[");
2466                ConstString child_name;
2467                if (!next_separator) // if no other separator just expand this last layer
2468                {
2469                    child_name.SetCString (expression_cstr);
2470                    ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2471
2472                    if (child_valobj_sp.get()) // we know we are done, so just return
2473                    {
2474                        *first_unparsed = '\0';
2475                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2476                        *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2477                        return child_valobj_sp;
2478                    }
2479                    else if (options.m_no_synthetic_children == false) // let's try with synthetic children
2480                    {
2481                        if (root->IsSynthetic())
2482                            child_valobj_sp = root;
2483                        else
2484                            child_valobj_sp = root->GetSyntheticValue();
2485
2486                        if (child_valobj_sp.get())
2487                            child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2488                    }
2489
2490                    // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2491                    // so we hit the "else" branch, and return an error
2492                    if(child_valobj_sp.get()) // if it worked, just return
2493                    {
2494                        *first_unparsed = '\0';
2495                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2496                        *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2497                        return child_valobj_sp;
2498                    }
2499                    else
2500                    {
2501                        *first_unparsed = expression_cstr;
2502                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2503                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2504                        return ValueObjectSP();
2505                    }
2506                }
2507                else // other layers do expand
2508                {
2509                    child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2510                    ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2511                    if (child_valobj_sp.get()) // store the new root and move on
2512                    {
2513                        root = child_valobj_sp;
2514                        *first_unparsed = next_separator;
2515                        *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2516                        continue;
2517                    }
2518                    else if (options.m_no_synthetic_children == false) // let's try with synthetic children
2519                    {
2520                        child_valobj_sp = root->GetSyntheticValue(true);
2521                        if (child_valobj_sp)
2522                            child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2523                    }
2524
2525                    // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2526                    // so we hit the "else" branch, and return an error
2527                    if(child_valobj_sp.get()) // if it worked, move on
2528                    {
2529                        root = child_valobj_sp;
2530                        *first_unparsed = next_separator;
2531                        *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2532                        continue;
2533                    }
2534                    else
2535                    {
2536                        *first_unparsed = expression_cstr;
2537                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2538                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2539                        return ValueObjectSP();
2540                    }
2541                }
2542                break;
2543            }
2544            case '[':
2545            {
2546                if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T*
2547                {
2548                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar...
2549                    {
2550                        if (options.m_no_synthetic_children) // ...only chance left is synthetic
2551                        {
2552                            *first_unparsed = expression_cstr;
2553                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2554                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2555                            return ValueObjectSP();
2556                        }
2557                    }
2558                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2559                    {
2560                        *first_unparsed = expression_cstr;
2561                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2562                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2563                        return ValueObjectSP();
2564                    }
2565                }
2566                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2567                {
2568                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2569                    {
2570                        *first_unparsed = expression_cstr;
2571                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2572                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2573                        return ValueObjectSP();
2574                    }
2575                    else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2576                    {
2577                        *first_unparsed = expression_cstr+2;
2578                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2579                        *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
2580                        return root;
2581                    }
2582                }
2583                const char *separator_position = ::strchr(expression_cstr+1,'-');
2584                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
2585                if (!close_bracket_position) // if there is no ], this is a syntax error
2586                {
2587                    *first_unparsed = expression_cstr;
2588                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2589                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2590                    return ValueObjectSP();
2591                }
2592                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2593                {
2594                    char *end = NULL;
2595                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2596                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2597                    {
2598                        *first_unparsed = expression_cstr;
2599                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2600                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2601                        return ValueObjectSP();
2602                    }
2603                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2604                    {
2605                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2606                        {
2607                            *first_unparsed = expression_cstr+2;
2608                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2609                            *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
2610                            return root;
2611                        }
2612                        else
2613                        {
2614                            *first_unparsed = expression_cstr;
2615                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2616                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2617                            return ValueObjectSP();
2618                        }
2619                    }
2620                    // from here on we do have a valid index
2621                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2622                    {
2623                        ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
2624                        if (!child_valobj_sp)
2625                            child_valobj_sp = root->GetSyntheticArrayMemberFromArray(index, true);
2626                        if (!child_valobj_sp)
2627                            if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index)
2628                                child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true);
2629                        if (child_valobj_sp)
2630                        {
2631                            root = child_valobj_sp;
2632                            *first_unparsed = end+1; // skip ]
2633                            *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2634                            continue;
2635                        }
2636                        else
2637                        {
2638                            *first_unparsed = expression_cstr;
2639                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2640                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2641                            return ValueObjectSP();
2642                        }
2643                    }
2644                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2645                    {
2646                        if (*what_next == ValueObject::eExpressionPathAftermathDereference &&  // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
2647                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2648                        {
2649                            Error error;
2650                            root = root->Dereference(error);
2651                            if (error.Fail() || !root.get())
2652                            {
2653                                *first_unparsed = expression_cstr;
2654                                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2655                                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2656                                return ValueObjectSP();
2657                            }
2658                            else
2659                            {
2660                                *what_next = eExpressionPathAftermathNothing;
2661                                continue;
2662                            }
2663                        }
2664                        else
2665                        {
2666                            if (ClangASTType::GetMinimumLanguage(root->GetClangAST(),
2667                                                                 root->GetClangType()) == eLanguageTypeObjC
2668                                && ClangASTContext::IsPointerType(ClangASTType::GetPointeeType(root->GetClangType())) == false
2669                                && root->HasSyntheticValue()
2670                                && options.m_no_synthetic_children == false)
2671                            {
2672                                root = root->GetSyntheticValue()->GetChildAtIndex(index, true);
2673                            }
2674                            else
2675                                root = root->GetSyntheticArrayMemberFromPointer(index, true);
2676                            if (!root.get())
2677                            {
2678                                *first_unparsed = expression_cstr;
2679                                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2680                                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2681                                return ValueObjectSP();
2682                            }
2683                            else
2684                            {
2685                                *first_unparsed = end+1; // skip ]
2686                                *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2687                                continue;
2688                            }
2689                        }
2690                    }
2691                    else if (ClangASTContext::IsScalarType(root_clang_type))
2692                    {
2693                        root = root->GetSyntheticBitFieldChild(index, index, true);
2694                        if (!root.get())
2695                        {
2696                            *first_unparsed = expression_cstr;
2697                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2698                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2699                            return ValueObjectSP();
2700                        }
2701                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
2702                        {
2703                            *first_unparsed = end+1; // skip ]
2704                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2705                            *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2706                            return root;
2707                        }
2708                    }
2709                    else if (options.m_no_synthetic_children == false)
2710                    {
2711                        if (root->HasSyntheticValue())
2712                            root = root->GetSyntheticValue();
2713                        else if (!root->IsSynthetic())
2714                        {
2715                            *first_unparsed = expression_cstr;
2716                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2717                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2718                            return ValueObjectSP();
2719                        }
2720                        // if we are here, then root itself is a synthetic VO.. should be good to go
2721
2722                        if (!root.get())
2723                        {
2724                            *first_unparsed = expression_cstr;
2725                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
2726                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2727                            return ValueObjectSP();
2728                        }
2729                        root = root->GetChildAtIndex(index, true);
2730                        if (!root.get())
2731                        {
2732                            *first_unparsed = expression_cstr;
2733                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2734                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2735                            return ValueObjectSP();
2736                        }
2737                        else
2738                        {
2739                            *first_unparsed = end+1; // skip ]
2740                            *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2741                            continue;
2742                        }
2743                    }
2744                    else
2745                    {
2746                        *first_unparsed = expression_cstr;
2747                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2748                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2749                        return ValueObjectSP();
2750                    }
2751                }
2752                else // we have a low and a high index
2753                {
2754                    char *end = NULL;
2755                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
2756                    if (!end || end != separator_position) // if something weird is in our way return an error
2757                    {
2758                        *first_unparsed = expression_cstr;
2759                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2760                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2761                        return ValueObjectSP();
2762                    }
2763                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
2764                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2765                    {
2766                        *first_unparsed = expression_cstr;
2767                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2768                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2769                        return ValueObjectSP();
2770                    }
2771                    if (index_lower > index_higher) // swap indices if required
2772                    {
2773                        unsigned long temp = index_lower;
2774                        index_lower = index_higher;
2775                        index_higher = temp;
2776                    }
2777                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
2778                    {
2779                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
2780                        if (!root.get())
2781                        {
2782                            *first_unparsed = expression_cstr;
2783                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2784                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2785                            return ValueObjectSP();
2786                        }
2787                        else
2788                        {
2789                            *first_unparsed = end+1; // skip ]
2790                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
2791                            *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
2792                            return root;
2793                        }
2794                    }
2795                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
2796                             *what_next == ValueObject::eExpressionPathAftermathDereference &&
2797                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2798                    {
2799                        Error error;
2800                        root = root->Dereference(error);
2801                        if (error.Fail() || !root.get())
2802                        {
2803                            *first_unparsed = expression_cstr;
2804                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2805                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2806                            return ValueObjectSP();
2807                        }
2808                        else
2809                        {
2810                            *what_next = ValueObject::eExpressionPathAftermathNothing;
2811                            continue;
2812                        }
2813                    }
2814                    else
2815                    {
2816                        *first_unparsed = expression_cstr;
2817                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
2818                        *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
2819                        return root;
2820                    }
2821                }
2822                break;
2823            }
2824            default: // some non-separator is in the way
2825            {
2826                *first_unparsed = expression_cstr;
2827                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2828                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2829                return ValueObjectSP();
2830                break;
2831            }
2832        }
2833    }
2834}
2835
2836int
2837ValueObject::ExpandArraySliceExpression(const char* expression_cstr,
2838                                        const char** first_unparsed,
2839                                        ValueObjectSP root,
2840                                        ValueObjectListSP& list,
2841                                        ExpressionPathScanEndReason* reason_to_stop,
2842                                        ExpressionPathEndResultType* final_result,
2843                                        const GetValueForExpressionPathOptions& options,
2844                                        ExpressionPathAftermath* what_next)
2845{
2846    if (!root.get())
2847        return 0;
2848
2849    *first_unparsed = expression_cstr;
2850
2851    while (true)
2852    {
2853
2854        const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
2855
2856        clang_type_t root_clang_type = root->GetClangType();
2857        clang_type_t pointee_clang_type;
2858        Flags root_clang_type_info,pointee_clang_type_info;
2859
2860        root_clang_type_info = Flags(ClangASTContext::GetTypeInfo(root_clang_type, GetClangAST(), &pointee_clang_type));
2861        if (pointee_clang_type)
2862            pointee_clang_type_info = Flags(ClangASTContext::GetTypeInfo(pointee_clang_type, GetClangAST(), NULL));
2863
2864        if (!expression_cstr || *expression_cstr == '\0')
2865        {
2866            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2867            list->Append(root);
2868            return 1;
2869        }
2870
2871        switch (*expression_cstr)
2872        {
2873            case '[':
2874            {
2875                if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray) && !root_clang_type_info.Test(ClangASTContext::eTypeIsPointer)) // if this is not a T[] nor a T*
2876                {
2877                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
2878                    {
2879                        *first_unparsed = expression_cstr;
2880                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2881                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2882                        return 0;
2883                    }
2884                    else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2885                    {
2886                        *first_unparsed = expression_cstr;
2887                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2888                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2889                        return 0;
2890                    }
2891                }
2892                if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2893                {
2894                    if (!root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2895                    {
2896                        *first_unparsed = expression_cstr;
2897                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2898                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2899                        return 0;
2900                    }
2901                    else // expand this into list
2902                    {
2903                        int max_index = root->GetNumChildren() - 1;
2904                        for (int index = 0; index < max_index; index++)
2905                        {
2906                            ValueObjectSP child =
2907                                root->GetChildAtIndex(index, true);
2908                            list->Append(child);
2909                        }
2910                        *first_unparsed = expression_cstr+2;
2911                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
2912                        *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
2913                        return max_index; // tell me number of items I added to the VOList
2914                    }
2915                }
2916                const char *separator_position = ::strchr(expression_cstr+1,'-');
2917                const char *close_bracket_position = ::strchr(expression_cstr+1,']');
2918                if (!close_bracket_position) // if there is no ], this is a syntax error
2919                {
2920                    *first_unparsed = expression_cstr;
2921                    *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2922                    *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2923                    return 0;
2924                }
2925                if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
2926                {
2927                    char *end = NULL;
2928                    unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
2929                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
2930                    {
2931                        *first_unparsed = expression_cstr;
2932                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2933                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2934                        return 0;
2935                    }
2936                    if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
2937                    {
2938                        if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2939                        {
2940                            int max_index = root->GetNumChildren() - 1;
2941                            for (int index = 0; index < max_index; index++)
2942                            {
2943                                ValueObjectSP child =
2944                                root->GetChildAtIndex(index, true);
2945                                list->Append(child);
2946                            }
2947                            *first_unparsed = expression_cstr+2;
2948                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
2949                            *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
2950                            return max_index; // tell me number of items I added to the VOList
2951                        }
2952                        else
2953                        {
2954                            *first_unparsed = expression_cstr;
2955                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2956                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2957                            return 0;
2958                        }
2959                    }
2960                    // from here on we do have a valid index
2961                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsArray))
2962                    {
2963                        root = root->GetChildAtIndex(index, true);
2964                        if (!root.get())
2965                        {
2966                            *first_unparsed = expression_cstr;
2967                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2968                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2969                            return 0;
2970                        }
2971                        else
2972                        {
2973                            list->Append(root);
2974                            *first_unparsed = end+1; // skip ]
2975                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
2976                            *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
2977                            return 1;
2978                        }
2979                    }
2980                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer))
2981                    {
2982                        if (*what_next == ValueObject::eExpressionPathAftermathDereference &&  // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
2983                            pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
2984                        {
2985                            Error error;
2986                            root = root->Dereference(error);
2987                            if (error.Fail() || !root.get())
2988                            {
2989                                *first_unparsed = expression_cstr;
2990                                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2991                                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2992                                return 0;
2993                            }
2994                            else
2995                            {
2996                                *what_next = eExpressionPathAftermathNothing;
2997                                continue;
2998                            }
2999                        }
3000                        else
3001                        {
3002                            root = root->GetSyntheticArrayMemberFromPointer(index, true);
3003                            if (!root.get())
3004                            {
3005                                *first_unparsed = expression_cstr;
3006                                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3007                                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3008                                return 0;
3009                            }
3010                            else
3011                            {
3012                                list->Append(root);
3013                                *first_unparsed = end+1; // skip ]
3014                                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3015                                *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3016                                return 1;
3017                            }
3018                        }
3019                    }
3020                    else /*if (ClangASTContext::IsScalarType(root_clang_type))*/
3021                    {
3022                        root = root->GetSyntheticBitFieldChild(index, index, true);
3023                        if (!root.get())
3024                        {
3025                            *first_unparsed = expression_cstr;
3026                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3027                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3028                            return 0;
3029                        }
3030                        else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
3031                        {
3032                            list->Append(root);
3033                            *first_unparsed = end+1; // skip ]
3034                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3035                            *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3036                            return 1;
3037                        }
3038                    }
3039                }
3040                else // we have a low and a high index
3041                {
3042                    char *end = NULL;
3043                    unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
3044                    if (!end || end != separator_position) // if something weird is in our way return an error
3045                    {
3046                        *first_unparsed = expression_cstr;
3047                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3048                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3049                        return 0;
3050                    }
3051                    unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
3052                    if (!end || end != close_bracket_position) // if something weird is in our way return an error
3053                    {
3054                        *first_unparsed = expression_cstr;
3055                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3056                        *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3057                        return 0;
3058                    }
3059                    if (index_lower > index_higher) // swap indices if required
3060                    {
3061                        unsigned long temp = index_lower;
3062                        index_lower = index_higher;
3063                        index_higher = temp;
3064                    }
3065                    if (root_clang_type_info.Test(ClangASTContext::eTypeIsScalar)) // expansion only works for scalars
3066                    {
3067                        root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
3068                        if (!root.get())
3069                        {
3070                            *first_unparsed = expression_cstr;
3071                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3072                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3073                            return 0;
3074                        }
3075                        else
3076                        {
3077                            list->Append(root);
3078                            *first_unparsed = end+1; // skip ]
3079                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3080                            *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3081                            return 1;
3082                        }
3083                    }
3084                    else if (root_clang_type_info.Test(ClangASTContext::eTypeIsPointer) && // if this is a ptr-to-scalar, I am accessing it by index and I would have deref'ed anyway, then do it now and use this as a bitfield
3085                             *what_next == ValueObject::eExpressionPathAftermathDereference &&
3086                             pointee_clang_type_info.Test(ClangASTContext::eTypeIsScalar))
3087                    {
3088                        Error error;
3089                        root = root->Dereference(error);
3090                        if (error.Fail() || !root.get())
3091                        {
3092                            *first_unparsed = expression_cstr;
3093                            *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3094                            *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3095                            return 0;
3096                        }
3097                        else
3098                        {
3099                            *what_next = ValueObject::eExpressionPathAftermathNothing;
3100                            continue;
3101                        }
3102                    }
3103                    else
3104                    {
3105                        for (unsigned long index = index_lower;
3106                             index <= index_higher; index++)
3107                        {
3108                            ValueObjectSP child =
3109                                root->GetChildAtIndex(index, true);
3110                            list->Append(child);
3111                        }
3112                        *first_unparsed = end+1;
3113                        *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3114                        *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3115                        return index_higher-index_lower+1; // tell me number of items I added to the VOList
3116                    }
3117                }
3118                break;
3119            }
3120            default: // some non-[ separator, or something entirely wrong, is in the way
3121            {
3122                *first_unparsed = expression_cstr;
3123                *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3124                *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3125                return 0;
3126                break;
3127            }
3128        }
3129    }
3130}
3131
3132static void
3133DumpValueObject_Impl (Stream &s,
3134                      ValueObject *valobj,
3135                      const ValueObject::DumpValueObjectOptions& options,
3136                      uint32_t ptr_depth,
3137                      uint32_t curr_depth)
3138{
3139    if (valobj)
3140    {
3141        bool update_success = valobj->UpdateValueIfNeeded (options.m_use_dynamic, true);
3142
3143        const char *root_valobj_name =
3144            options.m_root_valobj_name.empty() ?
3145                valobj->GetName().AsCString() :
3146                options.m_root_valobj_name.c_str();
3147
3148        if (update_success && options.m_use_dynamic != eNoDynamicValues)
3149        {
3150            ValueObject *dynamic_value = valobj->GetDynamicValue(options.m_use_dynamic).get();
3151            if (dynamic_value)
3152                valobj = dynamic_value;
3153        }
3154
3155        clang_type_t clang_type = valobj->GetClangType();
3156
3157        const Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, NULL));
3158        const char *err_cstr = NULL;
3159        const bool has_children = type_flags.Test (ClangASTContext::eTypeHasChildren);
3160        const bool has_value = type_flags.Test (ClangASTContext::eTypeHasValue);
3161
3162        const bool print_valobj = options.m_flat_output == false || has_value;
3163
3164        if (print_valobj)
3165        {
3166            if (options.m_show_location)
3167            {
3168                s.Printf("%s: ", valobj->GetLocationAsCString());
3169            }
3170
3171            s.Indent();
3172
3173            // Always show the type for the top level items.
3174            if (options.m_show_types || (curr_depth == 0 && !options.m_flat_output))
3175            {
3176                const char* typeName = valobj->GetQualifiedTypeName().AsCString("<invalid type>");
3177                //const char* typeName = valobj->GetTypeName().AsCString("<invalid type>");
3178                s.Printf("(%s", typeName);
3179                // only show dynamic types if the user really wants to see types
3180                if (options.m_show_types && options.m_use_dynamic != eNoDynamicValues &&
3181                    (/*strstr(typeName, "id") == typeName ||*/
3182                     ClangASTType::GetMinimumLanguage(valobj->GetClangAST(), valobj->GetClangType()) == eLanguageTypeObjC))
3183                {
3184                    ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
3185                    Process *process = exe_ctx.GetProcessPtr();
3186                    if (process == NULL)
3187                        s.Printf(", dynamic type: unknown) ");
3188                    else
3189                    {
3190                        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
3191                        if (runtime == NULL)
3192                            s.Printf(", dynamic type: unknown) ");
3193                        else
3194                        {
3195                            ObjCLanguageRuntime::ObjCISA isa = runtime->GetISA(*valobj);
3196                            if (!runtime->IsValidISA(isa))
3197                                s.Printf(", dynamic type: unknown) ");
3198                            else
3199                                s.Printf(", dynamic type: %s) ",
3200                                         runtime->GetActualTypeName(isa).GetCString());
3201                        }
3202                    }
3203                }
3204                else
3205                    s.Printf(") ");
3206            }
3207
3208
3209            if (options.m_flat_output)
3210            {
3211                // If we are showing types, also qualify the C++ base classes
3212                const bool qualify_cxx_base_classes = options.m_show_types;
3213                valobj->GetExpressionPath(s, qualify_cxx_base_classes);
3214                s.PutCString(" =");
3215            }
3216            else
3217            {
3218                const char *name_cstr = root_valobj_name ? root_valobj_name : valobj->GetName().AsCString("");
3219                s.Printf ("%s =", name_cstr);
3220            }
3221
3222            if (!options.m_scope_already_checked && !valobj->IsInScope())
3223            {
3224                err_cstr = "out of scope";
3225            }
3226        }
3227
3228        std::string summary_str;
3229        std::string value_str;
3230        const char *val_cstr = NULL;
3231        const char *sum_cstr = NULL;
3232        TypeSummaryImpl* entry = options.m_summary_sp ? options.m_summary_sp.get() : valobj->GetSummaryFormat().get();
3233
3234        if (options.m_omit_summary_depth > 0)
3235            entry = NULL;
3236
3237        if (err_cstr == NULL)
3238        {
3239            if (options.m_format != eFormatDefault && options.m_format != valobj->GetFormat())
3240            {
3241                valobj->GetValueAsCString(options.m_format,
3242                                          value_str);
3243            }
3244            else
3245            {
3246                val_cstr = valobj->GetValueAsCString();
3247                if (val_cstr)
3248                    value_str = val_cstr;
3249            }
3250            err_cstr = valobj->GetError().AsCString();
3251        }
3252
3253        if (err_cstr)
3254        {
3255            s.Printf (" <%s>\n", err_cstr);
3256        }
3257        else
3258        {
3259            const bool is_ref = type_flags.Test (ClangASTContext::eTypeIsReference);
3260            if (print_valobj)
3261            {
3262                if (options.m_omit_summary_depth == 0)
3263                {
3264                    if (options.m_summary_sp)
3265                    {
3266                        valobj->GetSummaryAsCString(entry, summary_str);
3267                        sum_cstr = summary_str.c_str();
3268                    }
3269                    else
3270                        sum_cstr = valobj->GetSummaryAsCString();
3271                }
3272
3273                // Make sure we have a value and make sure the summary didn't
3274                // specify that the value should not be printed
3275                if (!value_str.empty() && (entry == NULL || entry->DoesPrintValue() || sum_cstr == NULL))
3276                    s.Printf(" %s", value_str.c_str());
3277
3278                if (sum_cstr)
3279                    s.Printf(" %s", sum_cstr);
3280
3281                if (options.m_use_objc)
3282                {
3283                    const char *object_desc = valobj->GetObjectDescription();
3284                    if (object_desc)
3285                        s.Printf(" %s\n", object_desc);
3286                    else
3287                        s.Printf (" [no Objective-C description available]\n");
3288                    return;
3289                }
3290            }
3291
3292            if (curr_depth < options.m_max_depth)
3293            {
3294                // We will show children for all concrete types. We won't show
3295                // pointer contents unless a pointer depth has been specified.
3296                // We won't reference contents unless the reference is the
3297                // root object (depth of zero).
3298                bool print_children = true;
3299
3300                // Use a new temporary pointer depth in case we override the
3301                // current pointer depth below...
3302                uint32_t curr_ptr_depth = ptr_depth;
3303
3304                const bool is_ptr = type_flags.Test (ClangASTContext::eTypeIsPointer);
3305                if (is_ptr || is_ref)
3306                {
3307                    // We have a pointer or reference whose value is an address.
3308                    // Make sure that address is not NULL
3309                    AddressType ptr_address_type;
3310                    if (valobj->GetPointerValue (&ptr_address_type) == 0)
3311                        print_children = false;
3312
3313                    else if (is_ref && curr_depth == 0)
3314                    {
3315                        // If this is the root object (depth is zero) that we are showing
3316                        // and it is a reference, and no pointer depth has been supplied
3317                        // print out what it references. Don't do this at deeper depths
3318                        // otherwise we can end up with infinite recursion...
3319                        curr_ptr_depth = 1;
3320                    }
3321
3322                    if (curr_ptr_depth == 0)
3323                        print_children = false;
3324                }
3325
3326                if (print_children && (!entry || entry->DoesPrintChildren() || !sum_cstr))
3327                {
3328                    ValueObject* synth_valobj;
3329                    ValueObjectSP synth_valobj_sp = valobj->GetSyntheticValue (options.m_use_synthetic);
3330                    synth_valobj = (synth_valobj_sp ? synth_valobj_sp.get() : valobj);
3331
3332                    uint32_t num_children = synth_valobj->GetNumChildren();
3333                    bool print_dotdotdot = false;
3334                    if (num_children)
3335                    {
3336                        if (options.m_flat_output)
3337                        {
3338                            if (print_valobj)
3339                                s.EOL();
3340                        }
3341                        else
3342                        {
3343                            if (print_valobj)
3344                                s.PutCString(is_ref ? ": {\n" : " {\n");
3345                            s.IndentMore();
3346                        }
3347
3348                        uint32_t max_num_children = valobj->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay();
3349
3350                        if (num_children > max_num_children && !options.m_ignore_cap)
3351                        {
3352                            num_children = max_num_children;
3353                            print_dotdotdot = true;
3354                        }
3355
3356                        ValueObject::DumpValueObjectOptions child_options(options);
3357                        child_options.SetFormat().SetSummary().SetRootValueObjectName();
3358                        child_options.SetScopeChecked(true)
3359                        .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0);
3360                        for (uint32_t idx=0; idx<num_children; ++idx)
3361                        {
3362                            ValueObjectSP child_sp(synth_valobj->GetChildAtIndex(idx, true));
3363                            if (child_sp.get())
3364                            {
3365                                DumpValueObject_Impl (s,
3366                                                      child_sp.get(),
3367                                                      child_options,
3368                                                      (is_ptr || is_ref) ? curr_ptr_depth - 1 : curr_ptr_depth,
3369                                                      curr_depth + 1);
3370                            }
3371                        }
3372
3373                        if (!options.m_flat_output)
3374                        {
3375                            if (print_dotdotdot)
3376                            {
3377                                ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
3378                                Target *target = exe_ctx.GetTargetPtr();
3379                                if (target)
3380                                    target->GetDebugger().GetCommandInterpreter().ChildrenTruncated();
3381                                s.Indent("...\n");
3382                            }
3383                            s.IndentLess();
3384                            s.Indent("}\n");
3385                        }
3386                    }
3387                    else if (has_children)
3388                    {
3389                        // Aggregate, no children...
3390                        if (print_valobj)
3391                            s.PutCString(" {}\n");
3392                    }
3393                    else
3394                    {
3395                        if (print_valobj)
3396                            s.EOL();
3397                    }
3398
3399                }
3400                else
3401                {
3402                    s.EOL();
3403                }
3404            }
3405            else
3406            {
3407                if (has_children && print_valobj)
3408                {
3409                    s.PutCString("{...}\n");
3410                }
3411            }
3412        }
3413    }
3414}
3415
3416void
3417ValueObject::LogValueObject (Log *log,
3418                             ValueObject *valobj)
3419{
3420    if (log && valobj)
3421        return LogValueObject (log, valobj, DumpValueObjectOptions::DefaultOptions());
3422}
3423
3424void
3425ValueObject::LogValueObject (Log *log,
3426                             ValueObject *valobj,
3427                             const DumpValueObjectOptions& options)
3428{
3429    if (log && valobj)
3430    {
3431        StreamString s;
3432        ValueObject::DumpValueObject (s, valobj, options);
3433        if (s.GetSize())
3434            log->PutCString(s.GetData());
3435    }
3436}
3437
3438void
3439ValueObject::DumpValueObject (Stream &s,
3440                              ValueObject *valobj)
3441{
3442
3443    if (!valobj)
3444        return;
3445
3446    DumpValueObject_Impl(s,
3447                         valobj,
3448                         DumpValueObjectOptions::DefaultOptions(),
3449                         0,
3450                         0);
3451}
3452
3453void
3454ValueObject::DumpValueObject (Stream &s,
3455                              ValueObject *valobj,
3456                              const DumpValueObjectOptions& options)
3457{
3458    DumpValueObject_Impl(s,
3459                         valobj,
3460                         options,
3461                         options.m_max_ptr_depth, // max pointer depth allowed, we will go down from here
3462                         0 // current object depth is 0 since we are just starting
3463                         );
3464}
3465
3466ValueObjectSP
3467ValueObject::CreateConstantValue (const ConstString &name)
3468{
3469    ValueObjectSP valobj_sp;
3470
3471    if (UpdateValueIfNeeded(false) && m_error.Success())
3472    {
3473        ExecutionContext exe_ctx (GetExecutionContextRef());
3474        clang::ASTContext *ast = GetClangAST ();
3475
3476        DataExtractor data;
3477        data.SetByteOrder (m_data.GetByteOrder());
3478        data.SetAddressByteSize(m_data.GetAddressByteSize());
3479
3480        m_error = m_value.GetValueAsData (&exe_ctx, ast, data, 0, GetModule().get());
3481
3482        valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3483                                                    ast,
3484                                                    GetClangType(),
3485                                                    name,
3486                                                    data,
3487                                                    GetAddressOf());
3488    }
3489
3490    if (!valobj_sp)
3491    {
3492        valobj_sp = ValueObjectConstResult::Create (NULL, m_error);
3493    }
3494    return valobj_sp;
3495}
3496
3497ValueObjectSP
3498ValueObject::Dereference (Error &error)
3499{
3500    if (m_deref_valobj)
3501        return m_deref_valobj->GetSP();
3502
3503    const bool is_pointer_type = IsPointerType();
3504    if (is_pointer_type)
3505    {
3506        bool omit_empty_base_classes = true;
3507        bool ignore_array_bounds = false;
3508
3509        std::string child_name_str;
3510        uint32_t child_byte_size = 0;
3511        int32_t child_byte_offset = 0;
3512        uint32_t child_bitfield_bit_size = 0;
3513        uint32_t child_bitfield_bit_offset = 0;
3514        bool child_is_base_class = false;
3515        bool child_is_deref_of_parent = false;
3516        const bool transparent_pointers = false;
3517        clang::ASTContext *clang_ast = GetClangAST();
3518        clang_type_t clang_type = GetClangType();
3519        clang_type_t child_clang_type;
3520
3521        ExecutionContext exe_ctx (GetExecutionContextRef());
3522
3523        child_clang_type = ClangASTContext::GetChildClangTypeAtIndex (&exe_ctx,
3524                                                                      clang_ast,
3525                                                                      GetName().GetCString(),
3526                                                                      clang_type,
3527                                                                      0,
3528                                                                      transparent_pointers,
3529                                                                      omit_empty_base_classes,
3530                                                                      ignore_array_bounds,
3531                                                                      child_name_str,
3532                                                                      child_byte_size,
3533                                                                      child_byte_offset,
3534                                                                      child_bitfield_bit_size,
3535                                                                      child_bitfield_bit_offset,
3536                                                                      child_is_base_class,
3537                                                                      child_is_deref_of_parent);
3538        if (child_clang_type && child_byte_size)
3539        {
3540            ConstString child_name;
3541            if (!child_name_str.empty())
3542                child_name.SetCString (child_name_str.c_str());
3543
3544            m_deref_valobj = new ValueObjectChild (*this,
3545                                                   clang_ast,
3546                                                   child_clang_type,
3547                                                   child_name,
3548                                                   child_byte_size,
3549                                                   child_byte_offset,
3550                                                   child_bitfield_bit_size,
3551                                                   child_bitfield_bit_offset,
3552                                                   child_is_base_class,
3553                                                   child_is_deref_of_parent,
3554                                                   eAddressTypeInvalid);
3555        }
3556    }
3557
3558    if (m_deref_valobj)
3559    {
3560        error.Clear();
3561        return m_deref_valobj->GetSP();
3562    }
3563    else
3564    {
3565        StreamString strm;
3566        GetExpressionPath(strm, true);
3567
3568        if (is_pointer_type)
3569            error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3570        else
3571            error.SetErrorStringWithFormat("not a pointer type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3572        return ValueObjectSP();
3573    }
3574}
3575
3576ValueObjectSP
3577ValueObject::AddressOf (Error &error)
3578{
3579    if (m_addr_of_valobj_sp)
3580        return m_addr_of_valobj_sp;
3581
3582    AddressType address_type = eAddressTypeInvalid;
3583    const bool scalar_is_load_address = false;
3584    addr_t addr = GetAddressOf (scalar_is_load_address, &address_type);
3585    error.Clear();
3586    if (addr != LLDB_INVALID_ADDRESS)
3587    {
3588        switch (address_type)
3589        {
3590        default:
3591        case eAddressTypeInvalid:
3592            {
3593                StreamString expr_path_strm;
3594                GetExpressionPath(expr_path_strm, true);
3595                error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
3596            }
3597            break;
3598
3599        case eAddressTypeFile:
3600        case eAddressTypeLoad:
3601        case eAddressTypeHost:
3602            {
3603                clang::ASTContext *ast = GetClangAST();
3604                clang_type_t clang_type = GetClangType();
3605                if (ast && clang_type)
3606                {
3607                    std::string name (1, '&');
3608                    name.append (m_name.AsCString(""));
3609                    ExecutionContext exe_ctx (GetExecutionContextRef());
3610                    m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3611                                                                          ast,
3612                                                                          ClangASTContext::CreatePointerType (ast, clang_type),
3613                                                                          ConstString (name.c_str()),
3614                                                                          addr,
3615                                                                          eAddressTypeInvalid,
3616                                                                          m_data.GetAddressByteSize());
3617                }
3618            }
3619            break;
3620        }
3621    }
3622    return m_addr_of_valobj_sp;
3623}
3624
3625ValueObjectSP
3626ValueObject::Cast (const ClangASTType &clang_ast_type)
3627{
3628    return ValueObjectCast::Create (*this, GetName(), clang_ast_type);
3629}
3630
3631ValueObjectSP
3632ValueObject::CastPointerType (const char *name, ClangASTType &clang_ast_type)
3633{
3634    ValueObjectSP valobj_sp;
3635    AddressType address_type;
3636    addr_t ptr_value = GetPointerValue (&address_type);
3637
3638    if (ptr_value != LLDB_INVALID_ADDRESS)
3639    {
3640        Address ptr_addr (ptr_value);
3641        ExecutionContext exe_ctx (GetExecutionContextRef());
3642        valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3643                                               name,
3644                                               ptr_addr,
3645                                               clang_ast_type);
3646    }
3647    return valobj_sp;
3648}
3649
3650ValueObjectSP
3651ValueObject::CastPointerType (const char *name, TypeSP &type_sp)
3652{
3653    ValueObjectSP valobj_sp;
3654    AddressType address_type;
3655    addr_t ptr_value = GetPointerValue (&address_type);
3656
3657    if (ptr_value != LLDB_INVALID_ADDRESS)
3658    {
3659        Address ptr_addr (ptr_value);
3660        ExecutionContext exe_ctx (GetExecutionContextRef());
3661        valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3662                                               name,
3663                                               ptr_addr,
3664                                               type_sp);
3665    }
3666    return valobj_sp;
3667}
3668
3669ValueObject::EvaluationPoint::EvaluationPoint () :
3670    m_mod_id(),
3671    m_exe_ctx_ref(),
3672    m_needs_update (true),
3673    m_first_update (true)
3674{
3675}
3676
3677ValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3678    m_mod_id(),
3679    m_exe_ctx_ref(),
3680    m_needs_update (true),
3681    m_first_update (true)
3682{
3683    ExecutionContext exe_ctx(exe_scope);
3684    TargetSP target_sp (exe_ctx.GetTargetSP());
3685    if (target_sp)
3686    {
3687        m_exe_ctx_ref.SetTargetSP (target_sp);
3688        ProcessSP process_sp (exe_ctx.GetProcessSP());
3689        if (!process_sp)
3690            process_sp = target_sp->GetProcessSP();
3691
3692        if (process_sp)
3693        {
3694            m_mod_id = process_sp->GetModID();
3695            m_exe_ctx_ref.SetProcessSP (process_sp);
3696
3697            ThreadSP thread_sp (exe_ctx.GetThreadSP());
3698
3699            if (!thread_sp)
3700            {
3701                if (use_selected)
3702                    thread_sp = process_sp->GetThreadList().GetSelectedThread();
3703            }
3704
3705            if (thread_sp)
3706            {
3707                m_exe_ctx_ref.SetThreadSP(thread_sp);
3708
3709                StackFrameSP frame_sp (exe_ctx.GetFrameSP());
3710                if (!frame_sp)
3711                {
3712                    if (use_selected)
3713                        frame_sp = thread_sp->GetSelectedFrame();
3714                }
3715                if (frame_sp)
3716                    m_exe_ctx_ref.SetFrameSP(frame_sp);
3717            }
3718        }
3719    }
3720}
3721
3722ValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3723    m_mod_id(),
3724    m_exe_ctx_ref(rhs.m_exe_ctx_ref),
3725    m_needs_update (true),
3726    m_first_update (true)
3727{
3728}
3729
3730ValueObject::EvaluationPoint::~EvaluationPoint ()
3731{
3732}
3733
3734// This function checks the EvaluationPoint against the current process state.  If the current
3735// state matches the evaluation point, or the evaluation point is already invalid, then we return
3736// false, meaning "no change".  If the current state is different, we update our state, and return
3737// true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3738// future calls to NeedsUpdate will return true.
3739// exe_scope will be set to the current execution context scope.
3740
3741bool
3742ValueObject::EvaluationPoint::SyncWithProcessState()
3743{
3744
3745    // Start with the target, if it is NULL, then we're obviously not going to get any further:
3746    ExecutionContext exe_ctx(m_exe_ctx_ref.Lock());
3747
3748    if (exe_ctx.GetTargetPtr() == NULL)
3749        return false;
3750
3751    // If we don't have a process nothing can change.
3752    Process *process = exe_ctx.GetProcessPtr();
3753    if (process == NULL)
3754        return false;
3755
3756    // If our stop id is the current stop ID, nothing has changed:
3757    ProcessModID current_mod_id = process->GetModID();
3758
3759    // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3760    // In either case, we aren't going to be able to sync with the process state.
3761    if (current_mod_id.GetStopID() == 0)
3762        return false;
3763
3764    bool changed;
3765
3766    if (m_mod_id.IsValid())
3767    {
3768        if (m_mod_id == current_mod_id)
3769        {
3770            // Everything is already up to date in this object, no need to
3771            // update the execution context scope.
3772            changed = false;
3773        }
3774        else
3775        {
3776            m_mod_id = current_mod_id;
3777            m_needs_update = true;
3778            changed = true;
3779        }
3780    }
3781
3782    // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated.
3783    // That way we'll be sure to return a valid exe_scope.
3784    // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid.
3785
3786    if (m_exe_ctx_ref.HasThreadRef())
3787    {
3788        ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP());
3789        if (thread_sp)
3790        {
3791            if (m_exe_ctx_ref.HasFrameRef())
3792            {
3793                StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP());
3794                if (!frame_sp)
3795                {
3796                    // We used to have a frame, but now it is gone
3797                    SetInvalid();
3798                }
3799            }
3800        }
3801        else
3802        {
3803            // We used to have a thread, but now it is gone
3804            SetInvalid();
3805        }
3806
3807    }
3808    return changed;
3809}
3810
3811void
3812ValueObject::EvaluationPoint::SetUpdated ()
3813{
3814    ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
3815    if (process_sp)
3816        m_mod_id = process_sp->GetModID();
3817    m_first_update = false;
3818    m_needs_update = false;
3819}
3820
3821
3822//bool
3823//ValueObject::EvaluationPoint::SetContext (ExecutionContextScope *exe_scope)
3824//{
3825//    if (!IsValid())
3826//        return false;
3827//
3828//    bool needs_update = false;
3829//
3830//    // The target has to be non-null, and the
3831//    Target *target = exe_scope->CalculateTarget();
3832//    if (target != NULL)
3833//    {
3834//        Target *old_target = m_target_sp.get();
3835//        assert (target == old_target);
3836//        Process *process = exe_scope->CalculateProcess();
3837//        if (process != NULL)
3838//        {
3839//            // FOR NOW - assume you can't update variable objects across process boundaries.
3840//            Process *old_process = m_process_sp.get();
3841//            assert (process == old_process);
3842//            ProcessModID current_mod_id = process->GetModID();
3843//            if (m_mod_id != current_mod_id)
3844//            {
3845//                needs_update = true;
3846//                m_mod_id = current_mod_id;
3847//            }
3848//            // See if we're switching the thread or stack context.  If no thread is given, this is
3849//            // being evaluated in a global context.
3850//            Thread *thread = exe_scope->CalculateThread();
3851//            if (thread != NULL)
3852//            {
3853//                user_id_t new_thread_index = thread->GetIndexID();
3854//                if (new_thread_index != m_thread_id)
3855//                {
3856//                    needs_update = true;
3857//                    m_thread_id = new_thread_index;
3858//                    m_stack_id.Clear();
3859//                }
3860//
3861//                StackFrame *new_frame = exe_scope->CalculateStackFrame();
3862//                if (new_frame != NULL)
3863//                {
3864//                    if (new_frame->GetStackID() != m_stack_id)
3865//                    {
3866//                        needs_update = true;
3867//                        m_stack_id = new_frame->GetStackID();
3868//                    }
3869//                }
3870//                else
3871//                {
3872//                    m_stack_id.Clear();
3873//                    needs_update = true;
3874//                }
3875//            }
3876//            else
3877//            {
3878//                // If this had been given a thread, and now there is none, we should update.
3879//                // Otherwise we don't have to do anything.
3880//                if (m_thread_id != LLDB_INVALID_UID)
3881//                {
3882//                    m_thread_id = LLDB_INVALID_UID;
3883//                    m_stack_id.Clear();
3884//                    needs_update = true;
3885//                }
3886//            }
3887//        }
3888//        else
3889//        {
3890//            // If there is no process, then we don't need to update anything.
3891//            // But if we're switching from having a process to not, we should try to update.
3892//            if (m_process_sp.get() != NULL)
3893//            {
3894//                needs_update = true;
3895//                m_process_sp.reset();
3896//                m_thread_id = LLDB_INVALID_UID;
3897//                m_stack_id.Clear();
3898//            }
3899//        }
3900//    }
3901//    else
3902//    {
3903//        // If there's no target, nothing can change so we don't need to update anything.
3904//        // But if we're switching from having a target to not, we should try to update.
3905//        if (m_target_sp.get() != NULL)
3906//        {
3907//            needs_update = true;
3908//            m_target_sp.reset();
3909//            m_process_sp.reset();
3910//            m_thread_id = LLDB_INVALID_UID;
3911//            m_stack_id.Clear();
3912//        }
3913//    }
3914//    if (!m_needs_update)
3915//        m_needs_update = needs_update;
3916//
3917//    return needs_update;
3918//}
3919
3920void
3921ValueObject::ClearUserVisibleData(uint32_t clear_mask)
3922{
3923    if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue)
3924        m_value_str.clear();
3925
3926    if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation)
3927        m_location_str.clear();
3928
3929    if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary)
3930    {
3931        m_is_getting_summary = false;
3932        m_summary_str.clear();
3933    }
3934
3935    if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription)
3936        m_object_desc_str.clear();
3937
3938    if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren)
3939    {
3940            if (m_synthetic_value)
3941                m_synthetic_value = NULL;
3942    }
3943}
3944
3945SymbolContextScope *
3946ValueObject::GetSymbolContextScope()
3947{
3948    if (m_parent)
3949    {
3950        if (!m_parent->IsPointerOrReferenceType())
3951            return m_parent->GetSymbolContextScope();
3952    }
3953    return NULL;
3954}
3955