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             uint32_t bit_field_size = to - from + 1;
2150             uint32_t bit_field_offset = from;
2151             if (GetDataExtractor().GetByteOrder() == eByteOrderBig)
2152                 bit_field_offset = GetByteSize() * 8 - bit_field_size - bit_field_offset;
2153             // We haven't made a synthetic array member for INDEX yet, so
2154             // lets make one and cache it for any future reference.
2155             ValueObjectChild *synthetic_child = new ValueObjectChild (*this,
2156                                                                       GetCompilerType(),
2157                                                                       index_const_str,
2158                                                                       GetByteSize(),
2159                                                                       0,
2160                                                                       bit_field_size,
2161                                                                       bit_field_offset,
2162                                                                       false,
2163                                                                       false,
2164                                                                       eAddressTypeInvalid,
2165                                                                       0);
2166 
2167             // Cache the value if we got one back...
2168             if (synthetic_child)
2169             {
2170                 AddSyntheticChild(index_const_str, synthetic_child);
2171                 synthetic_child_sp = synthetic_child->GetSP();
2172                 synthetic_child_sp->SetName(ConstString(index_str));
2173                 synthetic_child_sp->m_is_bitfield_for_scalar = true;
2174             }
2175         }
2176     }
2177     return synthetic_child_sp;
2178 }
2179 
2180 ValueObjectSP
2181 ValueObject::GetSyntheticChildAtOffset(uint32_t offset,
2182                                        const CompilerType& type,
2183                                        bool can_create,
2184                                        ConstString name_const_str)
2185 {
2186 
2187     ValueObjectSP synthetic_child_sp;
2188 
2189     if (name_const_str.IsEmpty())
2190     {
2191         char name_str[64];
2192         snprintf(name_str, sizeof(name_str), "@%i", offset);
2193         name_const_str.SetCString(name_str);
2194     }
2195 
2196     // Check if we have already created a synthetic array member in this
2197     // valid object. If we have we will re-use it.
2198     synthetic_child_sp = GetSyntheticChild (name_const_str);
2199 
2200     if (synthetic_child_sp.get())
2201         return synthetic_child_sp;
2202 
2203     if (!can_create)
2204         return ValueObjectSP();
2205 
2206     ExecutionContext exe_ctx (GetExecutionContextRef());
2207 
2208     ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
2209                                                              type,
2210                                                              name_const_str,
2211                                                              type.GetByteSize(exe_ctx.GetBestExecutionContextScope()),
2212                                                              offset,
2213                                                              0,
2214                                                              0,
2215                                                              false,
2216                                                              false,
2217                                                              eAddressTypeInvalid,
2218                                                              0);
2219     if (synthetic_child)
2220     {
2221         AddSyntheticChild(name_const_str, synthetic_child);
2222         synthetic_child_sp = synthetic_child->GetSP();
2223         synthetic_child_sp->SetName(name_const_str);
2224         synthetic_child_sp->m_is_child_at_offset = true;
2225     }
2226     return synthetic_child_sp;
2227 }
2228 
2229 ValueObjectSP
2230 ValueObject::GetSyntheticBase (uint32_t offset,
2231                                const CompilerType& type,
2232                                bool can_create,
2233                                ConstString name_const_str)
2234 {
2235     ValueObjectSP synthetic_child_sp;
2236 
2237     if (name_const_str.IsEmpty())
2238     {
2239         char name_str[128];
2240         snprintf(name_str, sizeof(name_str), "base%s@%i", type.GetTypeName().AsCString("<unknown>"), offset);
2241         name_const_str.SetCString(name_str);
2242     }
2243 
2244     // Check if we have already created a synthetic array member in this
2245     // valid object. If we have we will re-use it.
2246     synthetic_child_sp = GetSyntheticChild (name_const_str);
2247 
2248     if (synthetic_child_sp.get())
2249         return synthetic_child_sp;
2250 
2251     if (!can_create)
2252         return ValueObjectSP();
2253 
2254     const bool is_base_class = true;
2255 
2256     ExecutionContext exe_ctx (GetExecutionContextRef());
2257 
2258     ValueObjectChild *synthetic_child = new ValueObjectChild(*this,
2259                                                              type,
2260                                                              name_const_str,
2261                                                              type.GetByteSize(exe_ctx.GetBestExecutionContextScope()),
2262                                                              offset,
2263                                                              0,
2264                                                              0,
2265                                                              is_base_class,
2266                                                              false,
2267                                                              eAddressTypeInvalid,
2268                                                              0);
2269     if (synthetic_child)
2270     {
2271         AddSyntheticChild(name_const_str, synthetic_child);
2272         synthetic_child_sp = synthetic_child->GetSP();
2273         synthetic_child_sp->SetName(name_const_str);
2274     }
2275     return synthetic_child_sp;
2276 }
2277 
2278 
2279 // your expression path needs to have a leading . or ->
2280 // (unless it somehow "looks like" an array, in which case it has
2281 // a leading [ symbol). while the [ is meaningful and should be shown
2282 // to the user, . and -> are just parser design, but by no means
2283 // added information for the user.. strip them off
2284 static const char*
2285 SkipLeadingExpressionPathSeparators(const char* expression)
2286 {
2287     if (!expression || !expression[0])
2288         return expression;
2289     if (expression[0] == '.')
2290         return expression+1;
2291     if (expression[0] == '-' && expression[1] == '>')
2292         return expression+2;
2293     return expression;
2294 }
2295 
2296 ValueObjectSP
2297 ValueObject::GetSyntheticExpressionPathChild(const char* expression, bool can_create)
2298 {
2299     ValueObjectSP synthetic_child_sp;
2300     ConstString name_const_string(expression);
2301     // Check if we have already created a synthetic array member in this
2302     // valid object. If we have we will re-use it.
2303     synthetic_child_sp = GetSyntheticChild (name_const_string);
2304     if (!synthetic_child_sp)
2305     {
2306         // We haven't made a synthetic array member for expression yet, so
2307         // lets make one and cache it for any future reference.
2308         synthetic_child_sp = GetValueForExpressionPath(expression,
2309                                                        NULL, NULL, NULL,
2310                                                        GetValueForExpressionPathOptions().SetSyntheticChildrenTraversal(GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None));
2311 
2312         // Cache the value if we got one back...
2313         if (synthetic_child_sp.get())
2314         {
2315             // FIXME: this causes a "real" child to end up with its name changed to the contents of expression
2316             AddSyntheticChild(name_const_string, synthetic_child_sp.get());
2317             synthetic_child_sp->SetName(ConstString(SkipLeadingExpressionPathSeparators(expression)));
2318         }
2319     }
2320     return synthetic_child_sp;
2321 }
2322 
2323 void
2324 ValueObject::CalculateSyntheticValue (bool use_synthetic)
2325 {
2326     if (use_synthetic == false)
2327         return;
2328 
2329     TargetSP target_sp(GetTargetSP());
2330     if (target_sp && target_sp->GetEnableSyntheticValue() == false)
2331     {
2332         m_synthetic_value = NULL;
2333         return;
2334     }
2335 
2336     lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp);
2337 
2338     if (!UpdateFormatsIfNeeded() && m_synthetic_value)
2339         return;
2340 
2341     if (m_synthetic_children_sp.get() == NULL)
2342         return;
2343 
2344     if (current_synth_sp == m_synthetic_children_sp && m_synthetic_value)
2345         return;
2346 
2347     m_synthetic_value = new ValueObjectSynthetic(*this, m_synthetic_children_sp);
2348 }
2349 
2350 void
2351 ValueObject::CalculateDynamicValue (DynamicValueType use_dynamic)
2352 {
2353     if (use_dynamic == eNoDynamicValues)
2354         return;
2355 
2356     if (!m_dynamic_value && !IsDynamic())
2357     {
2358         ExecutionContext exe_ctx (GetExecutionContextRef());
2359         Process *process = exe_ctx.GetProcessPtr();
2360         if (process && process->IsPossibleDynamicValue(*this))
2361         {
2362             ClearDynamicTypeInformation ();
2363             m_dynamic_value = new ValueObjectDynamicValue (*this, use_dynamic);
2364         }
2365     }
2366 }
2367 
2368 ValueObjectSP
2369 ValueObject::GetDynamicValue (DynamicValueType use_dynamic)
2370 {
2371     if (use_dynamic == eNoDynamicValues)
2372         return ValueObjectSP();
2373 
2374     if (!IsDynamic() && m_dynamic_value == NULL)
2375     {
2376         CalculateDynamicValue(use_dynamic);
2377     }
2378     if (m_dynamic_value)
2379         return m_dynamic_value->GetSP();
2380     else
2381         return ValueObjectSP();
2382 }
2383 
2384 ValueObjectSP
2385 ValueObject::GetStaticValue()
2386 {
2387     return GetSP();
2388 }
2389 
2390 lldb::ValueObjectSP
2391 ValueObject::GetNonSyntheticValue ()
2392 {
2393     return GetSP();
2394 }
2395 
2396 ValueObjectSP
2397 ValueObject::GetSyntheticValue (bool use_synthetic)
2398 {
2399     if (use_synthetic == false)
2400         return ValueObjectSP();
2401 
2402     CalculateSyntheticValue(use_synthetic);
2403 
2404     if (m_synthetic_value)
2405         return m_synthetic_value->GetSP();
2406     else
2407         return ValueObjectSP();
2408 }
2409 
2410 bool
2411 ValueObject::HasSyntheticValue()
2412 {
2413     UpdateFormatsIfNeeded();
2414 
2415     if (m_synthetic_children_sp.get() == NULL)
2416         return false;
2417 
2418     CalculateSyntheticValue(true);
2419 
2420     if (m_synthetic_value)
2421         return true;
2422     else
2423         return false;
2424 }
2425 
2426 bool
2427 ValueObject::GetBaseClassPath (Stream &s)
2428 {
2429     if (IsBaseClass())
2430     {
2431         bool parent_had_base_class = GetParent() && GetParent()->GetBaseClassPath (s);
2432         CompilerType compiler_type = GetCompilerType();
2433         std::string cxx_class_name;
2434         bool this_had_base_class = ClangASTContext::GetCXXClassName (compiler_type, cxx_class_name);
2435         if (this_had_base_class)
2436         {
2437             if (parent_had_base_class)
2438                 s.PutCString("::");
2439             s.PutCString(cxx_class_name.c_str());
2440         }
2441         return parent_had_base_class || this_had_base_class;
2442     }
2443     return false;
2444 }
2445 
2446 
2447 ValueObject *
2448 ValueObject::GetNonBaseClassParent()
2449 {
2450     if (GetParent())
2451     {
2452         if (GetParent()->IsBaseClass())
2453             return GetParent()->GetNonBaseClassParent();
2454         else
2455             return GetParent();
2456     }
2457     return NULL;
2458 }
2459 
2460 
2461 bool
2462 ValueObject::IsBaseClass (uint32_t& depth)
2463 {
2464     if (!IsBaseClass())
2465     {
2466         depth = 0;
2467         return false;
2468     }
2469     if (GetParent())
2470     {
2471         GetParent()->IsBaseClass(depth);
2472         depth = depth + 1;
2473         return true;
2474     }
2475     // TODO: a base of no parent? weird..
2476     depth = 1;
2477     return true;
2478 }
2479 
2480 void
2481 ValueObject::GetExpressionPath (Stream &s, bool qualify_cxx_base_classes, GetExpressionPathFormat epformat)
2482 {
2483     // synthetic children do not actually "exist" as part of the hierarchy, and sometimes they are consed up in ways
2484     // that don't make sense from an underlying language/API standpoint. So, use a special code path here to return
2485     // something that can hopefully be used in expression
2486     if (m_is_synthetic_children_generated)
2487     {
2488         UpdateValueIfNeeded();
2489 
2490         if (m_value.GetValueType() == Value::eValueTypeLoadAddress)
2491         {
2492             if (IsPointerOrReferenceType())
2493             {
2494                 s.Printf("((%s)0x%" PRIx64 ")",
2495                          GetTypeName().AsCString("void"),
2496                          GetValueAsUnsigned(0));
2497                 return;
2498             }
2499             else
2500             {
2501                 uint64_t load_addr = m_value.GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
2502                 if (load_addr != LLDB_INVALID_ADDRESS)
2503                 {
2504                     s.Printf("(*( (%s *)0x%" PRIx64 "))",
2505                              GetTypeName().AsCString("void"),
2506                              load_addr);
2507                     return;
2508                 }
2509             }
2510         }
2511 
2512         if (CanProvideValue())
2513         {
2514             s.Printf("((%s)%s)",
2515                      GetTypeName().AsCString("void"),
2516                      GetValueAsCString());
2517             return;
2518         }
2519 
2520         return;
2521     }
2522 
2523     const bool is_deref_of_parent = IsDereferenceOfParent ();
2524 
2525     if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2526     {
2527         // this is the original format of GetExpressionPath() producing code like *(a_ptr).memberName, which is entirely
2528         // fine, until you put this into StackFrame::GetValueForVariableExpressionPath() which prefers to see a_ptr->memberName.
2529         // the eHonorPointers mode is meant to produce strings in this latter format
2530         s.PutCString("*(");
2531     }
2532 
2533     ValueObject* parent = GetParent();
2534 
2535     if (parent)
2536         parent->GetExpressionPath (s, qualify_cxx_base_classes, epformat);
2537 
2538     // if we are a deref_of_parent just because we are synthetic array
2539     // members made up to allow ptr[%d] syntax to work in variable
2540     // printing, then add our name ([%d]) to the expression path
2541     if (m_is_array_item_for_pointer && epformat == eGetExpressionPathFormatHonorPointers)
2542         s.PutCString(m_name.AsCString());
2543 
2544     if (!IsBaseClass())
2545     {
2546         if (!is_deref_of_parent)
2547         {
2548             ValueObject *non_base_class_parent = GetNonBaseClassParent();
2549             if (non_base_class_parent && !non_base_class_parent->GetName().IsEmpty())
2550             {
2551                 CompilerType non_base_class_parent_compiler_type = non_base_class_parent->GetCompilerType();
2552                 if (non_base_class_parent_compiler_type)
2553                 {
2554                     if (parent && parent->IsDereferenceOfParent() && epformat == eGetExpressionPathFormatHonorPointers)
2555                     {
2556                         s.PutCString("->");
2557                     }
2558                     else
2559                     {
2560                         const uint32_t non_base_class_parent_type_info = non_base_class_parent_compiler_type.GetTypeInfo();
2561 
2562                         if (non_base_class_parent_type_info & eTypeIsPointer)
2563                         {
2564                             s.PutCString("->");
2565                         }
2566                         else if ((non_base_class_parent_type_info & eTypeHasChildren) &&
2567                                  !(non_base_class_parent_type_info & eTypeIsArray))
2568                         {
2569                             s.PutChar('.');
2570                         }
2571                     }
2572                 }
2573             }
2574 
2575             const char *name = GetName().GetCString();
2576             if (name)
2577             {
2578                 if (qualify_cxx_base_classes)
2579                 {
2580                     if (GetBaseClassPath (s))
2581                         s.PutCString("::");
2582                 }
2583                 s.PutCString(name);
2584             }
2585         }
2586     }
2587 
2588     if (is_deref_of_parent && epformat == eGetExpressionPathFormatDereferencePointers)
2589     {
2590         s.PutChar(')');
2591     }
2592 }
2593 
2594 ValueObjectSP
2595 ValueObject::GetValueForExpressionPath(const char* expression,
2596                                        const char** first_unparsed,
2597                                        ExpressionPathScanEndReason* reason_to_stop,
2598                                        ExpressionPathEndResultType* final_value_type,
2599                                        const GetValueForExpressionPathOptions& options,
2600                                        ExpressionPathAftermath* final_task_on_target)
2601 {
2602 
2603     const char* dummy_first_unparsed;
2604     ExpressionPathScanEndReason dummy_reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnknown;
2605     ExpressionPathEndResultType dummy_final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2606     ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2607 
2608     ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2609                                                            first_unparsed ? first_unparsed : &dummy_first_unparsed,
2610                                                            reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2611                                                            final_value_type ? final_value_type : &dummy_final_value_type,
2612                                                            options,
2613                                                            final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2614 
2615     if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2616         return ret_val;
2617 
2618     if (ret_val.get() && ((final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain)) // I can only deref and takeaddress of plain objects
2619     {
2620         if ( (final_task_on_target ? *final_task_on_target : dummy_final_task_on_target) == ValueObject::eExpressionPathAftermathDereference)
2621         {
2622             Error error;
2623             ValueObjectSP final_value = ret_val->Dereference(error);
2624             if (error.Fail() || !final_value.get())
2625             {
2626                 if (reason_to_stop)
2627                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2628                 if (final_value_type)
2629                     *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2630                 return ValueObjectSP();
2631             }
2632             else
2633             {
2634                 if (final_task_on_target)
2635                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2636                 return final_value;
2637             }
2638         }
2639         if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2640         {
2641             Error error;
2642             ValueObjectSP final_value = ret_val->AddressOf(error);
2643             if (error.Fail() || !final_value.get())
2644             {
2645                 if (reason_to_stop)
2646                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2647                 if (final_value_type)
2648                     *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2649                 return ValueObjectSP();
2650             }
2651             else
2652             {
2653                 if (final_task_on_target)
2654                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2655                 return final_value;
2656             }
2657         }
2658     }
2659     return ret_val; // final_task_on_target will still have its original value, so you know I did not do it
2660 }
2661 
2662 int
2663 ValueObject::GetValuesForExpressionPath(const char* expression,
2664                                         ValueObjectListSP& list,
2665                                         const char** first_unparsed,
2666                                         ExpressionPathScanEndReason* reason_to_stop,
2667                                         ExpressionPathEndResultType* final_value_type,
2668                                         const GetValueForExpressionPathOptions& options,
2669                                         ExpressionPathAftermath* final_task_on_target)
2670 {
2671     const char* dummy_first_unparsed;
2672     ExpressionPathScanEndReason dummy_reason_to_stop;
2673     ExpressionPathEndResultType dummy_final_value_type;
2674     ExpressionPathAftermath dummy_final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2675 
2676     ValueObjectSP ret_val = GetValueForExpressionPath_Impl(expression,
2677                                                            first_unparsed ? first_unparsed : &dummy_first_unparsed,
2678                                                            reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2679                                                            final_value_type ? final_value_type : &dummy_final_value_type,
2680                                                            options,
2681                                                            final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2682 
2683     if (!ret_val.get()) // if there are errors, I add nothing to the list
2684         return 0;
2685 
2686     if ( (reason_to_stop ? *reason_to_stop : dummy_reason_to_stop) != eExpressionPathScanEndReasonArrayRangeOperatorMet)
2687     {
2688         // I need not expand a range, just post-process the final value and return
2689         if (!final_task_on_target || *final_task_on_target == ValueObject::eExpressionPathAftermathNothing)
2690         {
2691             list->Append(ret_val);
2692             return 1;
2693         }
2694         if (ret_val.get() && (final_value_type ? *final_value_type : dummy_final_value_type) == eExpressionPathEndResultTypePlain) // I can only deref and takeaddress of plain objects
2695         {
2696             if (*final_task_on_target == ValueObject::eExpressionPathAftermathDereference)
2697             {
2698                 Error error;
2699                 ValueObjectSP final_value = ret_val->Dereference(error);
2700                 if (error.Fail() || !final_value.get())
2701                 {
2702                     if (reason_to_stop)
2703                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
2704                     if (final_value_type)
2705                         *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2706                     return 0;
2707                 }
2708                 else
2709                 {
2710                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2711                     list->Append(final_value);
2712                     return 1;
2713                 }
2714             }
2715             if (*final_task_on_target == ValueObject::eExpressionPathAftermathTakeAddress)
2716             {
2717                 Error error;
2718                 ValueObjectSP final_value = ret_val->AddressOf(error);
2719                 if (error.Fail() || !final_value.get())
2720                 {
2721                     if (reason_to_stop)
2722                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonTakingAddressFailed;
2723                     if (final_value_type)
2724                         *final_value_type = ValueObject::eExpressionPathEndResultTypeInvalid;
2725                     return 0;
2726                 }
2727                 else
2728                 {
2729                     *final_task_on_target = ValueObject::eExpressionPathAftermathNothing;
2730                     list->Append(final_value);
2731                     return 1;
2732                 }
2733             }
2734         }
2735     }
2736     else
2737     {
2738         return ExpandArraySliceExpression(first_unparsed ? *first_unparsed : dummy_first_unparsed,
2739                                           first_unparsed ? first_unparsed : &dummy_first_unparsed,
2740                                           ret_val,
2741                                           list,
2742                                           reason_to_stop ? reason_to_stop : &dummy_reason_to_stop,
2743                                           final_value_type ? final_value_type : &dummy_final_value_type,
2744                                           options,
2745                                           final_task_on_target ? final_task_on_target : &dummy_final_task_on_target);
2746     }
2747     // in any non-covered case, just do the obviously right thing
2748     list->Append(ret_val);
2749     return 1;
2750 }
2751 
2752 ValueObjectSP
2753 ValueObject::GetValueForExpressionPath_Impl(const char* expression_cstr,
2754                                             const char** first_unparsed,
2755                                             ExpressionPathScanEndReason* reason_to_stop,
2756                                             ExpressionPathEndResultType* final_result,
2757                                             const GetValueForExpressionPathOptions& options,
2758                                             ExpressionPathAftermath* what_next)
2759 {
2760     ValueObjectSP root = GetSP();
2761 
2762     if (!root.get())
2763         return ValueObjectSP();
2764 
2765     *first_unparsed = expression_cstr;
2766 
2767     while (true)
2768     {
2769 
2770         const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
2771 
2772         CompilerType root_compiler_type = root->GetCompilerType();
2773         CompilerType pointee_compiler_type;
2774         Flags pointee_compiler_type_info;
2775 
2776         Flags root_compiler_type_info(root_compiler_type.GetTypeInfo(&pointee_compiler_type));
2777         if (pointee_compiler_type)
2778             pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
2779 
2780         if (!expression_cstr || *expression_cstr == '\0')
2781         {
2782             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2783             return root;
2784         }
2785 
2786         switch (*expression_cstr)
2787         {
2788             case '-':
2789             {
2790                 if (options.m_check_dot_vs_arrow_syntax &&
2791                     root_compiler_type_info.Test(eTypeIsPointer) ) // if you are trying to use -> on a non-pointer and I must catch the error
2792                 {
2793                     *first_unparsed = expression_cstr;
2794                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrowInsteadOfDot;
2795                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2796                     return ValueObjectSP();
2797                 }
2798                 if (root_compiler_type_info.Test(eTypeIsObjC) &&  // if yo are trying to extract an ObjC IVar when this is forbidden
2799                     root_compiler_type_info.Test(eTypeIsPointer) &&
2800                     options.m_no_fragile_ivar)
2801                 {
2802                     *first_unparsed = expression_cstr;
2803                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonFragileIVarNotAllowed;
2804                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2805                     return ValueObjectSP();
2806                 }
2807                 if (expression_cstr[1] != '>')
2808                 {
2809                     *first_unparsed = expression_cstr;
2810                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
2811                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2812                     return ValueObjectSP();
2813                 }
2814                 expression_cstr++; // skip the -
2815             }
2816             LLVM_FALLTHROUGH;
2817             case '.': // or fallthrough from ->
2818             {
2819                 if (options.m_check_dot_vs_arrow_syntax && *expression_cstr == '.' &&
2820                     root_compiler_type_info.Test(eTypeIsPointer)) // if you are trying to use . on a pointer and I must catch the error
2821                 {
2822                     *first_unparsed = expression_cstr;
2823                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDotInsteadOfArrow;
2824                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2825                     return ValueObjectSP();
2826                 }
2827                 expression_cstr++; // skip .
2828                 const char *next_separator = strpbrk(expression_cstr+1,"-.[");
2829                 ConstString child_name;
2830                 if (!next_separator) // if no other separator just expand this last layer
2831                 {
2832                     child_name.SetCString (expression_cstr);
2833                     ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2834 
2835                     if (child_valobj_sp.get()) // we know we are done, so just return
2836                     {
2837                         *first_unparsed = "";
2838                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2839                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2840                         return child_valobj_sp;
2841                     }
2842                     else
2843                     {
2844                         switch (options.m_synthetic_children_traversal)
2845                         {
2846                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None:
2847                                 break;
2848                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::FromSynthetic:
2849                                 if (root->IsSynthetic())
2850                                 {
2851                                     child_valobj_sp = root->GetNonSyntheticValue();
2852                                     if (child_valobj_sp.get())
2853                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2854                                 }
2855                                 break;
2856                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic:
2857                                 if (!root->IsSynthetic())
2858                                 {
2859                                     child_valobj_sp = root->GetSyntheticValue();
2860                                     if (child_valobj_sp.get())
2861                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2862                                 }
2863                                 break;
2864                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both:
2865                                 if (root->IsSynthetic())
2866                                 {
2867                                     child_valobj_sp = root->GetNonSyntheticValue();
2868                                     if (child_valobj_sp.get())
2869                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2870                                 }
2871                                 else
2872                                 {
2873                                     child_valobj_sp = root->GetSyntheticValue();
2874                                     if (child_valobj_sp.get())
2875                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2876                                 }
2877                                 break;
2878                         }
2879                     }
2880 
2881                     // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2882                     // so we hit the "else" branch, and return an error
2883                     if(child_valobj_sp.get()) // if it worked, just return
2884                     {
2885                         *first_unparsed = "";
2886                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
2887                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2888                         return child_valobj_sp;
2889                     }
2890                     else
2891                     {
2892                         *first_unparsed = expression_cstr;
2893                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2894                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2895                         return ValueObjectSP();
2896                     }
2897                 }
2898                 else // other layers do expand
2899                 {
2900                     child_name.SetCStringWithLength(expression_cstr, next_separator - expression_cstr);
2901                     ValueObjectSP child_valobj_sp = root->GetChildMemberWithName(child_name, true);
2902                     if (child_valobj_sp.get()) // store the new root and move on
2903                     {
2904                         root = child_valobj_sp;
2905                         *first_unparsed = next_separator;
2906                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2907                         continue;
2908                     }
2909                     else
2910                     {
2911                         switch (options.m_synthetic_children_traversal)
2912                         {
2913                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None:
2914                                 break;
2915                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::FromSynthetic:
2916                                 if (root->IsSynthetic())
2917                                 {
2918                                     child_valobj_sp = root->GetNonSyntheticValue();
2919                                     if (child_valobj_sp.get())
2920                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2921                                 }
2922                                 break;
2923                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic:
2924                                 if (!root->IsSynthetic())
2925                                 {
2926                                     child_valobj_sp = root->GetSyntheticValue();
2927                                     if (child_valobj_sp.get())
2928                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2929                                 }
2930                                 break;
2931                             case GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both:
2932                                 if (root->IsSynthetic())
2933                                 {
2934                                     child_valobj_sp = root->GetNonSyntheticValue();
2935                                     if (child_valobj_sp.get())
2936                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2937                                 }
2938                                 else
2939                                 {
2940                                     child_valobj_sp = root->GetSyntheticValue();
2941                                     if (child_valobj_sp.get())
2942                                         child_valobj_sp = child_valobj_sp->GetChildMemberWithName(child_name, true);
2943                                 }
2944                                 break;
2945                         }
2946                     }
2947 
2948                     // if we are here and options.m_no_synthetic_children is true, child_valobj_sp is going to be a NULL SP,
2949                     // so we hit the "else" branch, and return an error
2950                     if(child_valobj_sp.get()) // if it worked, move on
2951                     {
2952                         root = child_valobj_sp;
2953                         *first_unparsed = next_separator;
2954                         *final_result = ValueObject::eExpressionPathEndResultTypePlain;
2955                         continue;
2956                     }
2957                     else
2958                     {
2959                         *first_unparsed = expression_cstr;
2960                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
2961                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2962                         return ValueObjectSP();
2963                     }
2964                 }
2965                 break;
2966             }
2967             case '[':
2968             {
2969                 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*
2970                 {
2971                     if (!root_compiler_type_info.Test(eTypeIsScalar)) // if this is not even a scalar...
2972                     {
2973                         if (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None) // ...only chance left is synthetic
2974                         {
2975                             *first_unparsed = expression_cstr;
2976                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
2977                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2978                             return ValueObjectSP();
2979                         }
2980                     }
2981                     else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
2982                     {
2983                         *first_unparsed = expression_cstr;
2984                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
2985                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2986                         return ValueObjectSP();
2987                     }
2988                 }
2989                 if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
2990                 {
2991                     if (!root_compiler_type_info.Test(eTypeIsArray))
2992                     {
2993                         *first_unparsed = expression_cstr;
2994                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
2995                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
2996                         return ValueObjectSP();
2997                     }
2998                     else // even if something follows, we cannot expand unbounded ranges, just let the caller do it
2999                     {
3000                         *first_unparsed = expression_cstr+2;
3001                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
3002                         *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
3003                         return root;
3004                     }
3005                 }
3006                 const char *separator_position = ::strchr(expression_cstr+1,'-');
3007                 const char *close_bracket_position = ::strchr(expression_cstr+1,']');
3008                 if (!close_bracket_position) // if there is no ], this is a syntax error
3009                 {
3010                     *first_unparsed = expression_cstr;
3011                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3012                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3013                     return ValueObjectSP();
3014                 }
3015                 if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
3016                 {
3017                     char *end = NULL;
3018                     unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
3019                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3020                     {
3021                         *first_unparsed = expression_cstr;
3022                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3023                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3024                         return ValueObjectSP();
3025                     }
3026                     if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
3027                     {
3028                         if (root_compiler_type_info.Test(eTypeIsArray))
3029                         {
3030                             *first_unparsed = expression_cstr+2;
3031                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
3032                             *final_result = ValueObject::eExpressionPathEndResultTypeUnboundedRange;
3033                             return root;
3034                         }
3035                         else
3036                         {
3037                             *first_unparsed = expression_cstr;
3038                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3039                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3040                             return ValueObjectSP();
3041                         }
3042                     }
3043                     // from here on we do have a valid index
3044                     if (root_compiler_type_info.Test(eTypeIsArray))
3045                     {
3046                         ValueObjectSP child_valobj_sp = root->GetChildAtIndex(index, true);
3047                         if (!child_valobj_sp)
3048                             child_valobj_sp = root->GetSyntheticArrayMember(index, true);
3049                         if (!child_valobj_sp)
3050                             if (root->HasSyntheticValue() && root->GetSyntheticValue()->GetNumChildren() > index)
3051                                 child_valobj_sp = root->GetSyntheticValue()->GetChildAtIndex(index, true);
3052                         if (child_valobj_sp)
3053                         {
3054                             root = child_valobj_sp;
3055                             *first_unparsed = end+1; // skip ]
3056                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3057                             continue;
3058                         }
3059                         else
3060                         {
3061                             *first_unparsed = expression_cstr;
3062                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3063                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3064                             return ValueObjectSP();
3065                         }
3066                     }
3067                     else if (root_compiler_type_info.Test(eTypeIsPointer))
3068                     {
3069                         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
3070                             pointee_compiler_type_info.Test(eTypeIsScalar))
3071                         {
3072                             Error error;
3073                             root = root->Dereference(error);
3074                             if (error.Fail() || !root.get())
3075                             {
3076                                 *first_unparsed = expression_cstr;
3077                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3078                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3079                                 return ValueObjectSP();
3080                             }
3081                             else
3082                             {
3083                                 *what_next = eExpressionPathAftermathNothing;
3084                                 continue;
3085                             }
3086                         }
3087                         else
3088                         {
3089                             if (root->GetCompilerType().GetMinimumLanguage() == eLanguageTypeObjC
3090                                 && pointee_compiler_type_info.AllClear(eTypeIsPointer)
3091                                 && root->HasSyntheticValue()
3092                                 && (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic ||
3093                                     options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both))
3094                             {
3095                                 root = root->GetSyntheticValue()->GetChildAtIndex(index, true);
3096                             }
3097                             else
3098                                 root = root->GetSyntheticArrayMember(index, true);
3099                             if (!root.get())
3100                             {
3101                                 *first_unparsed = expression_cstr;
3102                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3103                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3104                                 return ValueObjectSP();
3105                             }
3106                             else
3107                             {
3108                                 *first_unparsed = end+1; // skip ]
3109                                 *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3110                                 continue;
3111                             }
3112                         }
3113                     }
3114                     else if (root_compiler_type_info.Test(eTypeIsScalar))
3115                     {
3116                         root = root->GetSyntheticBitFieldChild(index, index, true);
3117                         if (!root.get())
3118                         {
3119                             *first_unparsed = expression_cstr;
3120                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3121                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3122                             return ValueObjectSP();
3123                         }
3124                         else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
3125                         {
3126                             *first_unparsed = end+1; // skip ]
3127                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
3128                             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
3129                             return root;
3130                         }
3131                     }
3132                     else if (root_compiler_type_info.Test(eTypeIsVector))
3133                     {
3134                         root = root->GetChildAtIndex(index, true);
3135                         if (!root.get())
3136                         {
3137                             *first_unparsed = expression_cstr;
3138                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3139                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3140                             return ValueObjectSP();
3141                         }
3142                         else
3143                         {
3144                             *first_unparsed = end+1; // skip ]
3145                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3146                             continue;
3147                         }
3148                     }
3149                     else if (options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::ToSynthetic ||
3150                              options.m_synthetic_children_traversal == GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both)
3151                     {
3152                         if (root->HasSyntheticValue())
3153                             root = root->GetSyntheticValue();
3154                         else if (!root->IsSynthetic())
3155                         {
3156                             *first_unparsed = expression_cstr;
3157                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
3158                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3159                             return ValueObjectSP();
3160                         }
3161                         // if we are here, then root itself is a synthetic VO.. should be good to go
3162 
3163                         if (!root.get())
3164                         {
3165                             *first_unparsed = expression_cstr;
3166                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonSyntheticValueMissing;
3167                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3168                             return ValueObjectSP();
3169                         }
3170                         root = root->GetChildAtIndex(index, true);
3171                         if (!root.get())
3172                         {
3173                             *first_unparsed = expression_cstr;
3174                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3175                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3176                             return ValueObjectSP();
3177                         }
3178                         else
3179                         {
3180                             *first_unparsed = end+1; // skip ]
3181                             *final_result = ValueObject::eExpressionPathEndResultTypePlain;
3182                             continue;
3183                         }
3184                     }
3185                     else
3186                     {
3187                         *first_unparsed = expression_cstr;
3188                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3189                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3190                         return ValueObjectSP();
3191                     }
3192                 }
3193                 else // we have a low and a high index
3194                 {
3195                     char *end = NULL;
3196                     unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
3197                     if (!end || end != separator_position) // if something weird is in our way return an error
3198                     {
3199                         *first_unparsed = expression_cstr;
3200                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3201                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3202                         return ValueObjectSP();
3203                     }
3204                     unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
3205                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3206                     {
3207                         *first_unparsed = expression_cstr;
3208                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3209                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3210                         return ValueObjectSP();
3211                     }
3212                     if (index_lower > index_higher) // swap indices if required
3213                     {
3214                         unsigned long temp = index_lower;
3215                         index_lower = index_higher;
3216                         index_higher = temp;
3217                     }
3218                     if (root_compiler_type_info.Test(eTypeIsScalar)) // expansion only works for scalars
3219                     {
3220                         root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
3221                         if (!root.get())
3222                         {
3223                             *first_unparsed = expression_cstr;
3224                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3225                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3226                             return ValueObjectSP();
3227                         }
3228                         else
3229                         {
3230                             *first_unparsed = end+1; // skip ]
3231                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonBitfieldRangeOperatorMet;
3232                             *final_result = ValueObject::eExpressionPathEndResultTypeBitfield;
3233                             return root;
3234                         }
3235                     }
3236                     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
3237                              *what_next == ValueObject::eExpressionPathAftermathDereference &&
3238                              pointee_compiler_type_info.Test(eTypeIsScalar))
3239                     {
3240                         Error error;
3241                         root = root->Dereference(error);
3242                         if (error.Fail() || !root.get())
3243                         {
3244                             *first_unparsed = expression_cstr;
3245                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3246                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3247                             return ValueObjectSP();
3248                         }
3249                         else
3250                         {
3251                             *what_next = ValueObject::eExpressionPathAftermathNothing;
3252                             continue;
3253                         }
3254                     }
3255                     else
3256                     {
3257                         *first_unparsed = expression_cstr;
3258                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonArrayRangeOperatorMet;
3259                         *final_result = ValueObject::eExpressionPathEndResultTypeBoundedRange;
3260                         return root;
3261                     }
3262                 }
3263                 break;
3264             }
3265             default: // some non-separator is in the way
3266             {
3267                 *first_unparsed = expression_cstr;
3268                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3269                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3270                 return ValueObjectSP();
3271                 break;
3272             }
3273         }
3274     }
3275 }
3276 
3277 int
3278 ValueObject::ExpandArraySliceExpression(const char* expression_cstr,
3279                                         const char** first_unparsed,
3280                                         ValueObjectSP root,
3281                                         ValueObjectListSP& list,
3282                                         ExpressionPathScanEndReason* reason_to_stop,
3283                                         ExpressionPathEndResultType* final_result,
3284                                         const GetValueForExpressionPathOptions& options,
3285                                         ExpressionPathAftermath* what_next)
3286 {
3287     if (!root.get())
3288         return 0;
3289 
3290     *first_unparsed = expression_cstr;
3291 
3292     while (true)
3293     {
3294 
3295         const char* expression_cstr = *first_unparsed; // hide the top level expression_cstr
3296 
3297         CompilerType root_compiler_type = root->GetCompilerType();
3298         CompilerType pointee_compiler_type;
3299         Flags pointee_compiler_type_info;
3300         Flags root_compiler_type_info(root_compiler_type.GetTypeInfo(&pointee_compiler_type));
3301         if (pointee_compiler_type)
3302             pointee_compiler_type_info.Reset(pointee_compiler_type.GetTypeInfo());
3303 
3304         if (!expression_cstr || *expression_cstr == '\0')
3305         {
3306             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEndOfString;
3307             list->Append(root);
3308             return 1;
3309         }
3310 
3311         switch (*expression_cstr)
3312         {
3313             case '[':
3314             {
3315                 if (!root_compiler_type_info.Test(eTypeIsArray) && !root_compiler_type_info.Test(eTypeIsPointer)) // if this is not a T[] nor a T*
3316                 {
3317                     if (!root_compiler_type_info.Test(eTypeIsScalar)) // if this is not even a scalar, this syntax is just plain wrong!
3318                     {
3319                         *first_unparsed = expression_cstr;
3320                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorInvalid;
3321                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3322                         return 0;
3323                     }
3324                     else if (!options.m_allow_bitfields_syntax) // if this is a scalar, check that we can expand bitfields
3325                     {
3326                         *first_unparsed = expression_cstr;
3327                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorNotAllowed;
3328                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3329                         return 0;
3330                     }
3331                 }
3332                 if (*(expression_cstr+1) == ']') // if this is an unbounded range it only works for arrays
3333                 {
3334                     if (!root_compiler_type_info.Test(eTypeIsArray))
3335                     {
3336                         *first_unparsed = expression_cstr;
3337                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3338                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3339                         return 0;
3340                     }
3341                     else // expand this into list
3342                     {
3343                         const size_t max_index = root->GetNumChildren() - 1;
3344                         for (size_t index = 0; index < max_index; index++)
3345                         {
3346                             ValueObjectSP child =
3347                                 root->GetChildAtIndex(index, true);
3348                             list->Append(child);
3349                         }
3350                         *first_unparsed = expression_cstr+2;
3351                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3352                         *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3353                         return max_index; // tell me number of items I added to the VOList
3354                     }
3355                 }
3356                 const char *separator_position = ::strchr(expression_cstr+1,'-');
3357                 const char *close_bracket_position = ::strchr(expression_cstr+1,']');
3358                 if (!close_bracket_position) // if there is no ], this is a syntax error
3359                 {
3360                     *first_unparsed = expression_cstr;
3361                     *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3362                     *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3363                     return 0;
3364                 }
3365                 if (!separator_position || separator_position > close_bracket_position) // if no separator, this is either [] or [N]
3366                 {
3367                     char *end = NULL;
3368                     unsigned long index = ::strtoul (expression_cstr+1, &end, 0);
3369                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3370                     {
3371                         *first_unparsed = expression_cstr;
3372                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3373                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3374                         return 0;
3375                     }
3376                     if (end - expression_cstr == 1) // if this is [], only return a valid value for arrays
3377                     {
3378                         if (root_compiler_type_info.Test(eTypeIsArray))
3379                         {
3380                             const size_t max_index = root->GetNumChildren() - 1;
3381                             for (size_t index = 0; index < max_index; index++)
3382                             {
3383                                 ValueObjectSP child =
3384                                 root->GetChildAtIndex(index, true);
3385                                 list->Append(child);
3386                             }
3387                             *first_unparsed = expression_cstr+2;
3388                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3389                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3390                             return max_index; // tell me number of items I added to the VOList
3391                         }
3392                         else
3393                         {
3394                             *first_unparsed = expression_cstr;
3395                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonEmptyRangeNotAllowed;
3396                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3397                             return 0;
3398                         }
3399                     }
3400                     // from here on we do have a valid index
3401                     if (root_compiler_type_info.Test(eTypeIsArray))
3402                     {
3403                         root = root->GetChildAtIndex(index, true);
3404                         if (!root.get())
3405                         {
3406                             *first_unparsed = expression_cstr;
3407                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3408                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3409                             return 0;
3410                         }
3411                         else
3412                         {
3413                             list->Append(root);
3414                             *first_unparsed = end+1; // skip ]
3415                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3416                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3417                             return 1;
3418                         }
3419                     }
3420                     else if (root_compiler_type_info.Test(eTypeIsPointer))
3421                     {
3422                         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
3423                             pointee_compiler_type_info.Test(eTypeIsScalar))
3424                         {
3425                             Error error;
3426                             root = root->Dereference(error);
3427                             if (error.Fail() || !root.get())
3428                             {
3429                                 *first_unparsed = expression_cstr;
3430                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3431                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3432                                 return 0;
3433                             }
3434                             else
3435                             {
3436                                 *what_next = eExpressionPathAftermathNothing;
3437                                 continue;
3438                             }
3439                         }
3440                         else
3441                         {
3442                             root = root->GetSyntheticArrayMember(index, true);
3443                             if (!root.get())
3444                             {
3445                                 *first_unparsed = expression_cstr;
3446                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3447                                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3448                                 return 0;
3449                             }
3450                             else
3451                             {
3452                                 list->Append(root);
3453                                 *first_unparsed = end+1; // skip ]
3454                                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3455                                 *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3456                                 return 1;
3457                             }
3458                         }
3459                     }
3460                     else /*if (ClangASTContext::IsScalarType(root_compiler_type))*/
3461                     {
3462                         root = root->GetSyntheticBitFieldChild(index, index, true);
3463                         if (!root.get())
3464                         {
3465                             *first_unparsed = expression_cstr;
3466                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3467                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3468                             return 0;
3469                         }
3470                         else // we do not know how to expand members of bitfields, so we just return and let the caller do any further processing
3471                         {
3472                             list->Append(root);
3473                             *first_unparsed = end+1; // skip ]
3474                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3475                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3476                             return 1;
3477                         }
3478                     }
3479                 }
3480                 else // we have a low and a high index
3481                 {
3482                     char *end = NULL;
3483                     unsigned long index_lower = ::strtoul (expression_cstr+1, &end, 0);
3484                     if (!end || end != separator_position) // if something weird is in our way return an error
3485                     {
3486                         *first_unparsed = expression_cstr;
3487                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3488                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3489                         return 0;
3490                     }
3491                     unsigned long index_higher = ::strtoul (separator_position+1, &end, 0);
3492                     if (!end || end != close_bracket_position) // if something weird is in our way return an error
3493                     {
3494                         *first_unparsed = expression_cstr;
3495                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3496                         *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3497                         return 0;
3498                     }
3499                     if (index_lower > index_higher) // swap indices if required
3500                     {
3501                         unsigned long temp = index_lower;
3502                         index_lower = index_higher;
3503                         index_higher = temp;
3504                     }
3505                     if (root_compiler_type_info.Test(eTypeIsScalar)) // expansion only works for scalars
3506                     {
3507                         root = root->GetSyntheticBitFieldChild(index_lower, index_higher, true);
3508                         if (!root.get())
3509                         {
3510                             *first_unparsed = expression_cstr;
3511                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonNoSuchChild;
3512                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3513                             return 0;
3514                         }
3515                         else
3516                         {
3517                             list->Append(root);
3518                             *first_unparsed = end+1; // skip ]
3519                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3520                             *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3521                             return 1;
3522                         }
3523                     }
3524                     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
3525                              *what_next == ValueObject::eExpressionPathAftermathDereference &&
3526                              pointee_compiler_type_info.Test(eTypeIsScalar))
3527                     {
3528                         Error error;
3529                         root = root->Dereference(error);
3530                         if (error.Fail() || !root.get())
3531                         {
3532                             *first_unparsed = expression_cstr;
3533                             *reason_to_stop = ValueObject::eExpressionPathScanEndReasonDereferencingFailed;
3534                             *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3535                             return 0;
3536                         }
3537                         else
3538                         {
3539                             *what_next = ValueObject::eExpressionPathAftermathNothing;
3540                             continue;
3541                         }
3542                     }
3543                     else
3544                     {
3545                         for (unsigned long index = index_lower;
3546                              index <= index_higher; index++)
3547                         {
3548                             ValueObjectSP child =
3549                                 root->GetChildAtIndex(index, true);
3550                             list->Append(child);
3551                         }
3552                         *first_unparsed = end+1;
3553                         *reason_to_stop = ValueObject::eExpressionPathScanEndReasonRangeOperatorExpanded;
3554                         *final_result = ValueObject::eExpressionPathEndResultTypeValueObjectList;
3555                         return index_higher-index_lower+1; // tell me number of items I added to the VOList
3556                     }
3557                 }
3558                 break;
3559             }
3560             default: // some non-[ separator, or something entirely wrong, is in the way
3561             {
3562                 *first_unparsed = expression_cstr;
3563                 *reason_to_stop = ValueObject::eExpressionPathScanEndReasonUnexpectedSymbol;
3564                 *final_result = ValueObject::eExpressionPathEndResultTypeInvalid;
3565                 return 0;
3566                 break;
3567             }
3568         }
3569     }
3570 }
3571 
3572 void
3573 ValueObject::LogValueObject (Log *log)
3574 {
3575     if (log)
3576         return LogValueObject (log, DumpValueObjectOptions(*this));
3577 }
3578 
3579 void
3580 ValueObject::LogValueObject (Log *log, const DumpValueObjectOptions& options)
3581 {
3582     if (log)
3583     {
3584         StreamString s;
3585         Dump (s, options);
3586         if (s.GetSize())
3587             log->PutCString(s.GetData());
3588     }
3589 }
3590 
3591 void
3592 ValueObject::Dump (Stream &s)
3593 {
3594     Dump (s, DumpValueObjectOptions(*this));
3595 }
3596 
3597 void
3598 ValueObject::Dump (Stream &s,
3599                    const DumpValueObjectOptions& options)
3600 {
3601     ValueObjectPrinter printer(this,&s,options);
3602     printer.PrintValueObject();
3603 }
3604 
3605 ValueObjectSP
3606 ValueObject::CreateConstantValue (const ConstString &name)
3607 {
3608     ValueObjectSP valobj_sp;
3609 
3610     if (UpdateValueIfNeeded(false) && m_error.Success())
3611     {
3612         ExecutionContext exe_ctx (GetExecutionContextRef());
3613 
3614         DataExtractor data;
3615         data.SetByteOrder (m_data.GetByteOrder());
3616         data.SetAddressByteSize(m_data.GetAddressByteSize());
3617 
3618         if (IsBitfield())
3619         {
3620             Value v(Scalar(GetValueAsUnsigned(UINT64_MAX)));
3621             m_error = v.GetValueAsData (&exe_ctx, data, 0, GetModule().get());
3622         }
3623         else
3624             m_error = m_value.GetValueAsData (&exe_ctx, data, 0, GetModule().get());
3625 
3626         valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3627                                                     GetCompilerType(),
3628                                                     name,
3629                                                     data,
3630                                                     GetAddressOf());
3631     }
3632 
3633     if (!valobj_sp)
3634     {
3635         ExecutionContext exe_ctx (GetExecutionContextRef());
3636         valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), m_error);
3637     }
3638     return valobj_sp;
3639 }
3640 
3641 ValueObjectSP
3642 ValueObject::GetQualifiedRepresentationIfAvailable (lldb::DynamicValueType dynValue,
3643                                                     bool synthValue)
3644 {
3645     ValueObjectSP result_sp(GetSP());
3646 
3647     switch (dynValue)
3648     {
3649         case lldb::eDynamicCanRunTarget:
3650         case lldb::eDynamicDontRunTarget:
3651         {
3652             if (!result_sp->IsDynamic())
3653             {
3654                 if (result_sp->GetDynamicValue(dynValue))
3655                     result_sp = result_sp->GetDynamicValue(dynValue);
3656             }
3657         }
3658             break;
3659         case lldb::eNoDynamicValues:
3660         {
3661             if (result_sp->IsDynamic())
3662             {
3663                 if (result_sp->GetStaticValue())
3664                     result_sp = result_sp->GetStaticValue();
3665             }
3666         }
3667             break;
3668     }
3669 
3670     if (synthValue)
3671     {
3672         if (!result_sp->IsSynthetic())
3673         {
3674             if (result_sp->GetSyntheticValue())
3675                 result_sp = result_sp->GetSyntheticValue();
3676         }
3677     }
3678     else
3679     {
3680         if (result_sp->IsSynthetic())
3681         {
3682             if (result_sp->GetNonSyntheticValue())
3683                 result_sp = result_sp->GetNonSyntheticValue();
3684         }
3685     }
3686 
3687     return result_sp;
3688 }
3689 
3690 lldb::addr_t
3691 ValueObject::GetCPPVTableAddress (AddressType &address_type)
3692 {
3693     CompilerType pointee_type;
3694     CompilerType this_type(GetCompilerType());
3695     uint32_t type_info = this_type.GetTypeInfo(&pointee_type);
3696     if (type_info)
3697     {
3698         bool ptr_or_ref = false;
3699         if (type_info & (eTypeIsPointer | eTypeIsReference))
3700         {
3701             ptr_or_ref = true;
3702             type_info = pointee_type.GetTypeInfo();
3703         }
3704 
3705         const uint32_t cpp_class = eTypeIsClass | eTypeIsCPlusPlus;
3706         if ((type_info & cpp_class) == cpp_class)
3707         {
3708             if (ptr_or_ref)
3709             {
3710                 address_type = GetAddressTypeOfChildren();
3711                 return GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
3712             }
3713             else
3714                 return GetAddressOf (false, &address_type);
3715         }
3716     }
3717 
3718     address_type = eAddressTypeInvalid;
3719     return LLDB_INVALID_ADDRESS;
3720 }
3721 
3722 ValueObjectSP
3723 ValueObject::Dereference (Error &error)
3724 {
3725     if (m_deref_valobj)
3726         return m_deref_valobj->GetSP();
3727 
3728     const bool is_pointer_or_reference_type = IsPointerOrReferenceType();
3729     if (is_pointer_or_reference_type)
3730     {
3731         bool omit_empty_base_classes = true;
3732         bool ignore_array_bounds = false;
3733 
3734         std::string child_name_str;
3735         uint32_t child_byte_size = 0;
3736         int32_t child_byte_offset = 0;
3737         uint32_t child_bitfield_bit_size = 0;
3738         uint32_t child_bitfield_bit_offset = 0;
3739         bool child_is_base_class = false;
3740         bool child_is_deref_of_parent = false;
3741         const bool transparent_pointers = false;
3742         CompilerType compiler_type = GetCompilerType();
3743         CompilerType child_compiler_type;
3744         uint64_t language_flags;
3745 
3746         ExecutionContext exe_ctx (GetExecutionContextRef());
3747 
3748         child_compiler_type = compiler_type.GetChildCompilerTypeAtIndex (&exe_ctx,
3749                                                                          0,
3750                                                                          transparent_pointers,
3751                                                                          omit_empty_base_classes,
3752                                                                          ignore_array_bounds,
3753                                                                          child_name_str,
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                                                                          this,
3761                                                                          language_flags);
3762         if (child_compiler_type && child_byte_size)
3763         {
3764             ConstString child_name;
3765             if (!child_name_str.empty())
3766                 child_name.SetCString (child_name_str.c_str());
3767 
3768             m_deref_valobj = new ValueObjectChild (*this,
3769                                                    child_compiler_type,
3770                                                    child_name,
3771                                                    child_byte_size,
3772                                                    child_byte_offset,
3773                                                    child_bitfield_bit_size,
3774                                                    child_bitfield_bit_offset,
3775                                                    child_is_base_class,
3776                                                    child_is_deref_of_parent,
3777                                                    eAddressTypeInvalid,
3778                                                    language_flags);
3779         }
3780     }
3781 
3782     if (m_deref_valobj)
3783     {
3784         error.Clear();
3785         return m_deref_valobj->GetSP();
3786     }
3787     else
3788     {
3789         StreamString strm;
3790         GetExpressionPath(strm, true);
3791 
3792         if (is_pointer_or_reference_type)
3793             error.SetErrorStringWithFormat("dereference failed: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3794         else
3795             error.SetErrorStringWithFormat("not a pointer or reference type: (%s) %s", GetTypeName().AsCString("<invalid type>"), strm.GetString().c_str());
3796         return ValueObjectSP();
3797     }
3798 }
3799 
3800 ValueObjectSP
3801 ValueObject::AddressOf (Error &error)
3802 {
3803     if (m_addr_of_valobj_sp)
3804         return m_addr_of_valobj_sp;
3805 
3806     AddressType address_type = eAddressTypeInvalid;
3807     const bool scalar_is_load_address = false;
3808     addr_t addr = GetAddressOf (scalar_is_load_address, &address_type);
3809     error.Clear();
3810     if (addr != LLDB_INVALID_ADDRESS && address_type != eAddressTypeHost)
3811     {
3812         switch (address_type)
3813         {
3814         case eAddressTypeInvalid:
3815             {
3816                 StreamString expr_path_strm;
3817                 GetExpressionPath(expr_path_strm, true);
3818                 error.SetErrorStringWithFormat("'%s' is not in memory", expr_path_strm.GetString().c_str());
3819             }
3820             break;
3821 
3822         case eAddressTypeFile:
3823         case eAddressTypeLoad:
3824             {
3825                 CompilerType compiler_type = GetCompilerType();
3826                 if (compiler_type)
3827                 {
3828                     std::string name (1, '&');
3829                     name.append (m_name.AsCString(""));
3830                     ExecutionContext exe_ctx (GetExecutionContextRef());
3831                     m_addr_of_valobj_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
3832                                                                           compiler_type.GetPointerType(),
3833                                                                           ConstString (name.c_str()),
3834                                                                           addr,
3835                                                                           eAddressTypeInvalid,
3836                                                                           m_data.GetAddressByteSize());
3837                 }
3838             }
3839             break;
3840         default:
3841             break;
3842         }
3843     }
3844     else
3845     {
3846         StreamString expr_path_strm;
3847         GetExpressionPath(expr_path_strm, true);
3848         error.SetErrorStringWithFormat("'%s' doesn't have a valid address", expr_path_strm.GetString().c_str());
3849     }
3850 
3851     return m_addr_of_valobj_sp;
3852 }
3853 
3854 ValueObjectSP
3855 ValueObject::Cast (const CompilerType &compiler_type)
3856 {
3857     return ValueObjectCast::Create (*this, GetName(), compiler_type);
3858 }
3859 
3860 ValueObjectSP
3861 ValueObject::CastPointerType (const char *name, CompilerType &compiler_type)
3862 {
3863     ValueObjectSP valobj_sp;
3864     AddressType address_type;
3865     addr_t ptr_value = GetPointerValue (&address_type);
3866 
3867     if (ptr_value != LLDB_INVALID_ADDRESS)
3868     {
3869         Address ptr_addr (ptr_value);
3870         ExecutionContext exe_ctx (GetExecutionContextRef());
3871         valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3872                                                name,
3873                                                ptr_addr,
3874                                                compiler_type);
3875     }
3876     return valobj_sp;
3877 }
3878 
3879 ValueObjectSP
3880 ValueObject::CastPointerType (const char *name, TypeSP &type_sp)
3881 {
3882     ValueObjectSP valobj_sp;
3883     AddressType address_type;
3884     addr_t ptr_value = GetPointerValue (&address_type);
3885 
3886     if (ptr_value != LLDB_INVALID_ADDRESS)
3887     {
3888         Address ptr_addr (ptr_value);
3889         ExecutionContext exe_ctx (GetExecutionContextRef());
3890         valobj_sp = ValueObjectMemory::Create (exe_ctx.GetBestExecutionContextScope(),
3891                                                name,
3892                                                ptr_addr,
3893                                                type_sp);
3894     }
3895     return valobj_sp;
3896 }
3897 
3898 ValueObject::EvaluationPoint::EvaluationPoint () :
3899     m_mod_id(),
3900     m_exe_ctx_ref(),
3901     m_needs_update (true)
3902 {
3903 }
3904 
3905 ValueObject::EvaluationPoint::EvaluationPoint (ExecutionContextScope *exe_scope, bool use_selected):
3906     m_mod_id(),
3907     m_exe_ctx_ref(),
3908     m_needs_update (true)
3909 {
3910     ExecutionContext exe_ctx(exe_scope);
3911     TargetSP target_sp (exe_ctx.GetTargetSP());
3912     if (target_sp)
3913     {
3914         m_exe_ctx_ref.SetTargetSP (target_sp);
3915         ProcessSP process_sp (exe_ctx.GetProcessSP());
3916         if (!process_sp)
3917             process_sp = target_sp->GetProcessSP();
3918 
3919         if (process_sp)
3920         {
3921             m_mod_id = process_sp->GetModID();
3922             m_exe_ctx_ref.SetProcessSP (process_sp);
3923 
3924             ThreadSP thread_sp (exe_ctx.GetThreadSP());
3925 
3926             if (!thread_sp)
3927             {
3928                 if (use_selected)
3929                     thread_sp = process_sp->GetThreadList().GetSelectedThread();
3930             }
3931 
3932             if (thread_sp)
3933             {
3934                 m_exe_ctx_ref.SetThreadSP(thread_sp);
3935 
3936                 StackFrameSP frame_sp (exe_ctx.GetFrameSP());
3937                 if (!frame_sp)
3938                 {
3939                     if (use_selected)
3940                         frame_sp = thread_sp->GetSelectedFrame();
3941                 }
3942                 if (frame_sp)
3943                     m_exe_ctx_ref.SetFrameSP(frame_sp);
3944             }
3945         }
3946     }
3947 }
3948 
3949 ValueObject::EvaluationPoint::EvaluationPoint (const ValueObject::EvaluationPoint &rhs) :
3950     m_mod_id(),
3951     m_exe_ctx_ref(rhs.m_exe_ctx_ref),
3952     m_needs_update (true)
3953 {
3954 }
3955 
3956 ValueObject::EvaluationPoint::~EvaluationPoint ()
3957 {
3958 }
3959 
3960 // This function checks the EvaluationPoint against the current process state.  If the current
3961 // state matches the evaluation point, or the evaluation point is already invalid, then we return
3962 // false, meaning "no change".  If the current state is different, we update our state, and return
3963 // true meaning "yes, change".  If we did see a change, we also set m_needs_update to true, so
3964 // future calls to NeedsUpdate will return true.
3965 // exe_scope will be set to the current execution context scope.
3966 
3967 bool
3968 ValueObject::EvaluationPoint::SyncWithProcessState(bool accept_invalid_exe_ctx)
3969 {
3970     // Start with the target, if it is NULL, then we're obviously not going to get any further:
3971     const bool thread_and_frame_only_if_stopped = true;
3972     ExecutionContext exe_ctx(m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped));
3973 
3974     if (exe_ctx.GetTargetPtr() == NULL)
3975         return false;
3976 
3977     // If we don't have a process nothing can change.
3978     Process *process = exe_ctx.GetProcessPtr();
3979     if (process == NULL)
3980         return false;
3981 
3982     // If our stop id is the current stop ID, nothing has changed:
3983     ProcessModID current_mod_id = process->GetModID();
3984 
3985     // If the current stop id is 0, either we haven't run yet, or the process state has been cleared.
3986     // In either case, we aren't going to be able to sync with the process state.
3987     if (current_mod_id.GetStopID() == 0)
3988         return false;
3989 
3990     bool changed = false;
3991     const bool was_valid = m_mod_id.IsValid();
3992     if (was_valid)
3993     {
3994         if (m_mod_id == current_mod_id)
3995         {
3996             // Everything is already up to date in this object, no need to
3997             // update the execution context scope.
3998             changed = false;
3999         }
4000         else
4001         {
4002             m_mod_id = current_mod_id;
4003             m_needs_update = true;
4004             changed = true;
4005         }
4006     }
4007 
4008     // Now re-look up the thread and frame in case the underlying objects have gone away & been recreated.
4009     // That way we'll be sure to return a valid exe_scope.
4010     // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid.
4011 
4012     if (!accept_invalid_exe_ctx)
4013     {
4014         if (m_exe_ctx_ref.HasThreadRef())
4015         {
4016             ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP());
4017             if (thread_sp)
4018             {
4019                 if (m_exe_ctx_ref.HasFrameRef())
4020                 {
4021                     StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP());
4022                     if (!frame_sp)
4023                     {
4024                         // We used to have a frame, but now it is gone
4025                         SetInvalid();
4026                         changed = was_valid;
4027                     }
4028                 }
4029             }
4030             else
4031             {
4032                 // We used to have a thread, but now it is gone
4033                 SetInvalid();
4034                 changed = was_valid;
4035             }
4036         }
4037     }
4038 
4039     return changed;
4040 }
4041 
4042 void
4043 ValueObject::EvaluationPoint::SetUpdated ()
4044 {
4045     ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP());
4046     if (process_sp)
4047         m_mod_id = process_sp->GetModID();
4048     m_needs_update = false;
4049 }
4050 
4051 
4052 
4053 void
4054 ValueObject::ClearUserVisibleData(uint32_t clear_mask)
4055 {
4056     if ((clear_mask & eClearUserVisibleDataItemsValue) == eClearUserVisibleDataItemsValue)
4057         m_value_str.clear();
4058 
4059     if ((clear_mask & eClearUserVisibleDataItemsLocation) == eClearUserVisibleDataItemsLocation)
4060         m_location_str.clear();
4061 
4062     if ((clear_mask & eClearUserVisibleDataItemsSummary) == eClearUserVisibleDataItemsSummary)
4063         m_summary_str.clear();
4064 
4065     if ((clear_mask & eClearUserVisibleDataItemsDescription) == eClearUserVisibleDataItemsDescription)
4066         m_object_desc_str.clear();
4067 
4068     if ((clear_mask & eClearUserVisibleDataItemsSyntheticChildren) == eClearUserVisibleDataItemsSyntheticChildren)
4069     {
4070             if (m_synthetic_value)
4071                 m_synthetic_value = NULL;
4072     }
4073 
4074     if ((clear_mask & eClearUserVisibleDataItemsValidator) == eClearUserVisibleDataItemsValidator)
4075         m_validation_result.reset();
4076 }
4077 
4078 SymbolContextScope *
4079 ValueObject::GetSymbolContextScope()
4080 {
4081     if (m_parent)
4082     {
4083         if (!m_parent->IsPointerOrReferenceType())
4084             return m_parent->GetSymbolContextScope();
4085     }
4086     return NULL;
4087 }
4088 
4089 lldb::ValueObjectSP
4090 ValueObject::CreateValueObjectFromExpression (const char* name,
4091                                               const char* expression,
4092                                               const ExecutionContext& exe_ctx)
4093 {
4094     return CreateValueObjectFromExpression(name, expression, exe_ctx, EvaluateExpressionOptions());
4095 }
4096 
4097 
4098 lldb::ValueObjectSP
4099 ValueObject::CreateValueObjectFromExpression (const char* name,
4100                                               const char* expression,
4101                                               const ExecutionContext& exe_ctx,
4102                                               const EvaluateExpressionOptions& options)
4103 {
4104     lldb::ValueObjectSP retval_sp;
4105     lldb::TargetSP target_sp(exe_ctx.GetTargetSP());
4106     if (!target_sp)
4107         return retval_sp;
4108     if (!expression || !*expression)
4109         return retval_sp;
4110     target_sp->EvaluateExpression (expression,
4111                                    exe_ctx.GetFrameSP().get(),
4112                                    retval_sp,
4113                                    options);
4114     if (retval_sp && name && *name)
4115         retval_sp->SetName(ConstString(name));
4116     return retval_sp;
4117 }
4118 
4119 lldb::ValueObjectSP
4120 ValueObject::CreateValueObjectFromAddress (const char* name,
4121                                            uint64_t address,
4122                                            const ExecutionContext& exe_ctx,
4123                                            CompilerType type)
4124 {
4125     if (type)
4126     {
4127         CompilerType pointer_type(type.GetPointerType());
4128         if (pointer_type)
4129         {
4130             lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
4131             lldb::ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
4132                                                                                      pointer_type,
4133                                                                                      ConstString(name),
4134                                                                                      buffer,
4135                                                                                      exe_ctx.GetByteOrder(),
4136                                                                                      exe_ctx.GetAddressByteSize()));
4137             if (ptr_result_valobj_sp)
4138             {
4139                 ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
4140                 Error err;
4141                 ptr_result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
4142                 if (ptr_result_valobj_sp && name && *name)
4143                     ptr_result_valobj_sp->SetName(ConstString(name));
4144             }
4145             return ptr_result_valobj_sp;
4146         }
4147     }
4148     return lldb::ValueObjectSP();
4149 }
4150 
4151 lldb::ValueObjectSP
4152 ValueObject::CreateValueObjectFromData (const char* name,
4153                                         const DataExtractor& data,
4154                                         const ExecutionContext& exe_ctx,
4155                                         CompilerType type)
4156 {
4157     lldb::ValueObjectSP new_value_sp;
4158     new_value_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
4159                                                    type,
4160                                                    ConstString(name),
4161                                                    data,
4162                                                    LLDB_INVALID_ADDRESS);
4163     new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
4164     if (new_value_sp && name && *name)
4165         new_value_sp->SetName(ConstString(name));
4166     return new_value_sp;
4167 }
4168 
4169 ModuleSP
4170 ValueObject::GetModule ()
4171 {
4172     ValueObject* root(GetRoot());
4173     if (root != this)
4174         return root->GetModule();
4175     return lldb::ModuleSP();
4176 }
4177 
4178 ValueObject*
4179 ValueObject::GetRoot ()
4180 {
4181     if (m_root)
4182         return m_root;
4183     return (m_root = FollowParentChain( [] (ValueObject* vo) -> bool {
4184         return (vo->m_parent != nullptr);
4185     }));
4186 }
4187 
4188 ValueObject*
4189 ValueObject::FollowParentChain (std::function<bool(ValueObject*)> f)
4190 {
4191     ValueObject* vo = this;
4192     while (vo)
4193     {
4194         if (f(vo) == false)
4195             break;
4196         vo = vo->m_parent;
4197     }
4198     return vo;
4199 }
4200 
4201 AddressType
4202 ValueObject::GetAddressTypeOfChildren()
4203 {
4204     if (m_address_type_of_ptr_or_ref_children == eAddressTypeInvalid)
4205     {
4206         ValueObject* root(GetRoot());
4207         if (root != this)
4208             return root->GetAddressTypeOfChildren();
4209     }
4210     return m_address_type_of_ptr_or_ref_children;
4211 }
4212 
4213 lldb::DynamicValueType
4214 ValueObject::GetDynamicValueType ()
4215 {
4216     ValueObject* with_dv_info = this;
4217     while (with_dv_info)
4218     {
4219         if (with_dv_info->HasDynamicValueTypeInfo())
4220             return with_dv_info->GetDynamicValueTypeImpl();
4221         with_dv_info = with_dv_info->m_parent;
4222     }
4223     return lldb::eNoDynamicValues;
4224 }
4225 
4226 lldb::Format
4227 ValueObject::GetFormat () const
4228 {
4229     const ValueObject* with_fmt_info = this;
4230     while (with_fmt_info)
4231     {
4232         if (with_fmt_info->m_format != lldb::eFormatDefault)
4233             return with_fmt_info->m_format;
4234         with_fmt_info = with_fmt_info->m_parent;
4235     }
4236     return m_format;
4237 }
4238 
4239 lldb::LanguageType
4240 ValueObject::GetPreferredDisplayLanguage ()
4241 {
4242     lldb::LanguageType type = m_preferred_display_language;
4243     if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
4244     {
4245         if (GetRoot())
4246         {
4247             if (GetRoot() == this)
4248             {
4249                 if (StackFrameSP frame_sp = GetFrameSP())
4250                 {
4251                     const SymbolContext& sc(frame_sp->GetSymbolContext(eSymbolContextCompUnit));
4252                     if (CompileUnit* cu = sc.comp_unit)
4253                         type = cu->GetLanguage();
4254                 }
4255             }
4256             else
4257             {
4258                 type = GetRoot()->GetPreferredDisplayLanguage();
4259             }
4260         }
4261     }
4262     return (m_preferred_display_language = type); // only compute it once
4263 }
4264 
4265 void
4266 ValueObject::SetPreferredDisplayLanguage (lldb::LanguageType lt)
4267 {
4268     m_preferred_display_language = lt;
4269 }
4270 
4271 void
4272 ValueObject::SetPreferredDisplayLanguageIfNeeded (lldb::LanguageType lt)
4273 {
4274     if (m_preferred_display_language == lldb::eLanguageTypeUnknown)
4275         SetPreferredDisplayLanguage(lt);
4276 }
4277 
4278 bool
4279 ValueObject::CanProvideValue ()
4280 {
4281     // we need to support invalid types as providers of values because some bare-board
4282     // debugging scenarios have no notion of types, but still manage to have raw numeric
4283     // values for things like registers. sigh.
4284     const CompilerType &type(GetCompilerType());
4285     return (false == type.IsValid()) || (0 != (type.GetTypeInfo() & eTypeHasValue));
4286 }
4287 
4288 bool
4289 ValueObject::IsChecksumEmpty ()
4290 {
4291     return m_value_checksum.empty();
4292 }
4293 
4294 ValueObjectSP
4295 ValueObject::Persist ()
4296 {
4297     if (!UpdateValueIfNeeded())
4298         return nullptr;
4299 
4300     TargetSP target_sp(GetTargetSP());
4301     if (!target_sp)
4302         return nullptr;
4303 
4304     PersistentExpressionState *persistent_state = target_sp->GetPersistentExpressionStateForLanguage(GetPreferredDisplayLanguage());
4305 
4306     if (!persistent_state)
4307         return nullptr;
4308 
4309     ConstString name(persistent_state->GetNextPersistentVariableName());
4310 
4311     ValueObjectSP const_result_sp = ValueObjectConstResult::Create (target_sp.get(), GetValue(), name);
4312 
4313     ExpressionVariableSP clang_var_sp = persistent_state->CreatePersistentVariable(const_result_sp);
4314     clang_var_sp->m_live_sp = clang_var_sp->m_frozen_sp;
4315     clang_var_sp->m_flags |= ExpressionVariable::EVIsProgramReference;
4316 
4317     return clang_var_sp->GetValueObject();
4318 }
4319 
4320 bool
4321 ValueObject::IsSyntheticChildrenGenerated ()
4322 {
4323     return m_is_synthetic_children_generated;
4324 }
4325 
4326 void
4327 ValueObject::SetSyntheticChildrenGenerated (bool b)
4328 {
4329     m_is_synthetic_children_generated = b;
4330 }
4331 
4332 uint64_t
4333 ValueObject::GetLanguageFlags ()
4334 {
4335     return m_language_flags;
4336 }
4337 
4338 void
4339 ValueObject::SetLanguageFlags (uint64_t flags)
4340 {
4341     m_language_flags = flags;
4342 }
4343