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