Added the ability to get synthetic child values from SBValue objects that
represent pointers and arrays by adding an extra parameter to the 

SBValue
SBValue::GetChildAtIndex (uint32_t idx, 
                         DynamicValueType use_dynamic, 
                         bool can_create_synthetic);

The new "can_create_synthetic" will allow you to create child values that
aren't actually a part of the original type. So if you code like:

int *foo_ptr = ...

And you have a SBValue that contains the value for "foo_ptr":

SBValue foo_value = ...

You can now get the "foo_ptr[12]" item by doing this:

v = foo_value.GetChiltAtIndex (12, lldb.eNoDynamicValues, True);

Normall the "foo_value" would only have one child value (an integer), but
we can create "synthetic" child values by treating the pointer as an array.

Likewise if you have code like:

int array[2];

array_value = ....

v = array_value.GetChiltAtIndex (0);     // Success, v will be valid
v = array_value.GetChiltAtIndex (1);     // Success, v will be valid
v = array_value.GetChiltAtIndex (2);     // Fail, v won't be valid, "2" is not a valid zero based index in "array"

But if you use the ability to create synthetic children:

v = array_value.GetChiltAtIndex (0, lldb.eNoDynamicValues, True);     // Success, v will be valid
v = array_value.GetChiltAtIndex (1, lldb.eNoDynamicValues, True);     // Success, v will be valid
v = array_value.GetChiltAtIndex (2, lldb.eNoDynamicValues, True);     // Success, v will be valid






git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@135292 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index aeabb17..5956784 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -361,17 +361,15 @@
 SBValue
 SBValue::GetChildAtIndex (uint32_t idx)
 {
+    const bool can_create_synthetic = false;
+    lldb::DynamicValueType use_dynamic = eNoDynamicValues;
     if (m_opaque_sp)
-    {
-        lldb::DynamicValueType use_dynamic_value = m_opaque_sp->GetUpdatePoint().GetTarget()->GetPreferDynamicValue();
-        return GetChildAtIndex (idx, use_dynamic_value);
-    }
-    else
-        return GetChildAtIndex (idx, eNoDynamicValues);
+        use_dynamic = m_opaque_sp->GetUpdatePoint().GetTarget()->GetPreferDynamicValue();
+    return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
 }
 
 SBValue
-SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic)
+SBValue::GetChildAtIndex (uint32_t idx, lldb::DynamicValueType use_dynamic, bool can_create_synthetic)
 {
     lldb::ValueObjectSP child_sp;
 
@@ -380,13 +378,25 @@
         if (m_opaque_sp->GetUpdatePoint().GetTarget())
         {
             Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTarget()->GetAPIMutex());
-        
-            child_sp = m_opaque_sp->GetChildAtIndex (idx, true);
-            if (use_dynamic != lldb::eNoDynamicValues)
+            const bool can_create = true;
+            child_sp = m_opaque_sp->GetChildAtIndex (idx, can_create);
+            if (can_create_synthetic && !child_sp)
             {
-                if (child_sp)
+                if (m_opaque_sp->IsPointerType())
                 {
-                    lldb::ValueObjectSP dynamic_sp = child_sp->GetDynamicValue (use_dynamic);
+                    child_sp = m_opaque_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
+                }
+                else if (m_opaque_sp->IsArrayType())
+                {
+                    child_sp = m_opaque_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
+                }
+            }
+                
+            if (child_sp)
+            {
+                if (use_dynamic != lldb::eNoDynamicValues)
+                {
+                    lldb::ValueObjectSP dynamic_sp(child_sp->GetDynamicValue (use_dynamic));
                     if (dynamic_sp)
                         child_sp = dynamic_sp;
                 }