Convert all python objects in our API to use overload the __str__ method
instead of the __repr__. __repr__ is a function that should return an
expression that can be used to recreate an python object and we were using
it to just return a human readable string.

Fixed a crasher when using the new implementation of SBValue::Cast(SBType).

Thread hardened lldb::SBValue and lldb::SBWatchpoint and did other general
improvements to the API.

Fixed a crasher in lldb::SBValue::GetChildMemberWithName() where we didn't
correctly handle not having a target.




git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@149743 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 58a718b..2369d6b 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -22,6 +22,7 @@
 #include "lldb/Core/ValueObjectConstResult.h"
 #include "lldb/Symbol/Block.h"
 #include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Symbol/Type.h"
 #include "lldb/Symbol/Variable.h"
 #include "lldb/Symbol/VariableList.h"
 #include "lldb/Target/ExecutionContext.h"
@@ -86,8 +87,9 @@
 {
     SBError sb_error;
     
-    if (m_opaque_sp.get())
-        sb_error.SetError(m_opaque_sp->GetError());
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        sb_error.SetError(value_sp->GetError());
     else
         sb_error.SetErrorString("error: invalid value");
     
@@ -97,8 +99,9 @@
 user_id_t
 SBValue::GetID()
 {
-    if (m_opaque_sp)
-        return m_opaque_sp->GetID();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        return value_sp->GetID();
     return LLDB_INVALID_UID;
 }
 
@@ -107,16 +110,17 @@
 {
 
     const char *name = NULL;
-    if (m_opaque_sp)
-        name = m_opaque_sp->GetName().GetCString();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        name = value_sp->GetName().GetCString();
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (name)
-            log->Printf ("SBValue(%p)::GetName () => \"%s\"", m_opaque_sp.get(), name);
+            log->Printf ("SBValue(%p)::GetName () => \"%s\"", value_sp.get(), name);
         else
-            log->Printf ("SBValue(%p)::GetName () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetName () => NULL", value_sp.get());
     }
 
     return name;
@@ -126,15 +130,16 @@
 SBValue::GetTypeName ()
 {
     const char *name = NULL;
-    if (m_opaque_sp)
-        name = m_opaque_sp->GetTypeName().GetCString();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        name = value_sp->GetTypeName().GetCString();
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (name)
-            log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", m_opaque_sp.get(), name);
+            log->Printf ("SBValue(%p)::GetTypeName () => \"%s\"", value_sp.get(), name);
         else
-            log->Printf ("SBValue(%p)::GetTypeName () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetTypeName () => NULL", value_sp.get());
     }
 
     return name;
@@ -145,12 +150,13 @@
 {
     size_t result = 0;
 
-    if (m_opaque_sp)
-        result = m_opaque_sp->GetByteSize();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        result = value_sp->GetByteSize();
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetByteSize () => %zu", m_opaque_sp.get(), result);
+        log->Printf ("SBValue(%p)::GetByteSize () => %zu", value_sp.get(), result);
 
     return result;
 }
@@ -160,18 +166,20 @@
 {
     bool result = false;
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            result = m_opaque_sp->IsInScope ();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            result = value_sp->IsInScope ();
         }
     }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::IsInScope () => %i", m_opaque_sp.get(), result);
+        log->Printf ("SBValue(%p)::IsInScope () => %i", value_sp.get(), result);
 
     return result;
 }
@@ -180,21 +188,23 @@
 SBValue::GetValue ()
 {
     const char *cstr = NULL;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            cstr = m_opaque_sp->GetValueAsCString ();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            cstr = value_sp->GetValueAsCString ();
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetValue => \"%s\"", m_opaque_sp.get(), cstr);
+            log->Printf ("SBValue(%p)::GetValue => \"%s\"", value_sp.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetValue => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetValue => NULL", value_sp.get());
     }
 
     return cstr;
@@ -204,22 +214,23 @@
 SBValue::GetValueType ()
 {
     ValueType result = eValueTypeInvalid;
-    if (m_opaque_sp)
-        result = m_opaque_sp->GetValueType();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        result = value_sp->GetValueType();
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         switch (result)
         {
-        case eValueTypeInvalid:         log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", m_opaque_sp.get()); break;
-        case eValueTypeVariableGlobal:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", m_opaque_sp.get()); break;
-        case eValueTypeVariableStatic:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", m_opaque_sp.get()); break;
-        case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", m_opaque_sp.get()); break;
-        case eValueTypeVariableLocal:   log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", m_opaque_sp.get()); break;
-        case eValueTypeRegister:        log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", m_opaque_sp.get()); break;
-        case eValueTypeRegisterSet:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", m_opaque_sp.get()); break;
-        case eValueTypeConstResult:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", m_opaque_sp.get()); break;
-        default:     log->Printf ("SBValue(%p)::GetValueType () => %i ???", m_opaque_sp.get(), result); break;
+        case eValueTypeInvalid:         log->Printf ("SBValue(%p)::GetValueType () => eValueTypeInvalid", value_sp.get()); break;
+        case eValueTypeVariableGlobal:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableGlobal", value_sp.get()); break;
+        case eValueTypeVariableStatic:  log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableStatic", value_sp.get()); break;
+        case eValueTypeVariableArgument:log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableArgument", value_sp.get()); break;
+        case eValueTypeVariableLocal:   log->Printf ("SBValue(%p)::GetValueType () => eValueTypeVariableLocal", value_sp.get()); break;
+        case eValueTypeRegister:        log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegister", value_sp.get()); break;
+        case eValueTypeRegisterSet:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeRegisterSet", value_sp.get()); break;
+        case eValueTypeConstResult:     log->Printf ("SBValue(%p)::GetValueType () => eValueTypeConstResult", value_sp.get()); break;
+        default:     log->Printf ("SBValue(%p)::GetValueType () => %i ???", value_sp.get(), result); break;
         }
     }
     return result;
@@ -229,21 +240,23 @@
 SBValue::GetObjectDescription ()
 {
     const char *cstr = NULL;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            cstr = m_opaque_sp->GetObjectDescription ();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            cstr = value_sp->GetObjectDescription ();
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", m_opaque_sp.get(), cstr);
+            log->Printf ("SBValue(%p)::GetObjectDescription => \"%s\"", value_sp.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetObjectDescription => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetObjectDescription => NULL", value_sp.get());
     }
     return cstr;
 }
@@ -251,41 +264,42 @@
 SBType
 SBValue::GetType()
 {
-    SBType result;
-    if (m_opaque_sp)
+    SBType sb_type;
+    lldb::ValueObjectSP value_sp(GetSP());
+    TypeImplSP type_sp;
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
-        {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            result = SBType(ClangASTType (m_opaque_sp->GetClangAST(), m_opaque_sp->GetClangType()));
-        }
+        type_sp.reset (new TypeImpl(ClangASTType (value_sp->GetClangAST(), value_sp->GetClangType())));
+        sb_type.SetSP(type_sp);
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
-        if (result.IsValid())
-            log->Printf ("SBValue(%p)::GetType => %p", m_opaque_sp.get(), &result);
+        if (type_sp)
+            log->Printf ("SBValue(%p)::GetType => SBType(%p)", value_sp.get(), type_sp.get());
         else
-            log->Printf ("SBValue(%p)::GetType => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetType => NULL", value_sp.get());
     }
-    return result;
+    return sb_type;
 }
 
 bool
 SBValue::GetValueDidChange ()
 {
     bool result = false;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            result = m_opaque_sp->GetValueDidChange ();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            result = value_sp->GetValueDidChange ();
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetValueDidChange => %i", m_opaque_sp.get(), result);
+        log->Printf ("SBValue(%p)::GetValueDidChange => %i", value_sp.get(), result);
 
     return result;
 }
@@ -294,21 +308,23 @@
 SBValue::GetSummary ()
 {
     const char *cstr = NULL;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            cstr = m_opaque_sp->GetSummaryAsCString();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            cstr = value_sp->GetSummaryAsCString();
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", m_opaque_sp.get(), cstr);
+            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetSummary => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
     }
     return cstr;
 }
@@ -317,21 +333,23 @@
 SBValue::GetLocation ()
 {
     const char *cstr = NULL;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            cstr = m_opaque_sp->GetLocationAsCString();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            cstr = value_sp->GetLocationAsCString();
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (cstr)
-            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", m_opaque_sp.get(), cstr);
+            log->Printf ("SBValue(%p)::GetSummary => \"%s\"", value_sp.get(), cstr);
         else
-            log->Printf ("SBValue(%p)::GetSummary => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetSummary => NULL", value_sp.get());
     }
     return cstr;
 }
@@ -340,12 +358,14 @@
 SBValue::SetValueFromCString (const char *value_str)
 {
     bool success = false;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            success = m_opaque_sp->SetValueFromCString (value_str);
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            success = value_sp->SetValueFromCString (value_str);
         }
     }
     return success;
@@ -354,136 +374,147 @@
 lldb::SBValue
 SBValue::CreateChildAtOffset (const char *name, uint32_t offset, SBType type)
 {
-    lldb::SBValue result;
-    if (m_opaque_sp)
+    lldb::SBValue sb_value;
+    lldb::ValueObjectSP value_sp(GetSP());
+    lldb::ValueObjectSP new_value_sp;
+    if (value_sp)
     {
+        TypeImplSP type_sp (type.GetSP());
         if (type.IsValid())
         {
-            result = SBValue(m_opaque_sp->GetSyntheticChildAtOffset(offset, type.m_opaque_sp->GetClangASTType(), true));
-            result.m_opaque_sp->SetName(ConstString(name));
+            sb_value = SBValue(value_sp->GetSyntheticChildAtOffset(offset, type_sp->GetClangASTType(), true));
+            new_value_sp = sb_value.GetSP();
+            if (new_value_sp)
+                new_value_sp->SetName(ConstString(name));
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
-        if (result.IsValid())
-            log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
+        if (new_value_sp)
+            log->Printf ("SBValue(%p)::GetChildAtOffset => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
         else
-            log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetChildAtOffset => NULL", value_sp.get());
     }
-    return result;
+    return sb_value;
 }
 
 lldb::SBValue
 SBValue::Cast (SBType type)
 {
     lldb::SBValue sb_value;
-    if (m_opaque_sp && type.IsValid())
-        *sb_value = m_opaque_sp->Cast(type.ref().GetClangASTType());
+    lldb::ValueObjectSP value_sp(GetSP());
+    TypeImplSP type_sp (type.GetSP());
+    if (value_sp && type_sp)
+        sb_value.SetSP(value_sp->Cast(type_sp->GetClangASTType()));
     return sb_value;
 }
 
 lldb::SBValue
 SBValue::CreateValueFromExpression (const char *name, const char* expression)
 {
-    lldb::SBValue result;
-    if (m_opaque_sp)
+    lldb::SBValue sb_value;
+    lldb::ValueObjectSP value_sp(GetSP());
+    lldb::ValueObjectSP new_value_sp;
+    if (value_sp)
     {
-        ValueObjectSP result_valobj_sp;
-        m_opaque_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
-                                                                         m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame(),
-                                                                         eExecutionPolicyOnlyWhenNeeded,
-                                                                         false, // coerce to id
-                                                                         true, // unwind on error
-                                                                         true, // keep in memory
-                                                                         eNoDynamicValues,
-                                                                         result_valobj_sp);
-        if (result_valobj_sp)
+        value_sp->GetUpdatePoint().GetTargetSP()->EvaluateExpression (expression,
+                                                                      value_sp->GetExecutionContextScope()->CalculateStackFrame(),
+                                                                      eExecutionPolicyOnlyWhenNeeded,
+                                                                      false, // coerce to id
+                                                                      true, // unwind on error
+                                                                      true, // keep in memory
+                                                                      eNoDynamicValues,
+                                                                      new_value_sp);
+        if (new_value_sp)
         {
-            result_valobj_sp->SetName(ConstString(name));
-            result = SBValue(result_valobj_sp);
+            new_value_sp->SetName(ConstString(name));
+            sb_value.SetSP(new_value_sp);
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
-        if (result.IsValid())
-            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
+        if (new_value_sp)
+            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
         else
-            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
     }
-    return result;
+    return sb_value;
 }
 
 lldb::SBValue
-SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType type)
+SBValue::CreateValueFromAddress(const char* name, lldb::addr_t address, SBType sb_type)
 {
-    lldb::SBValue result;
-    if (m_opaque_sp && type.IsValid() && type.GetPointerType().IsValid())
+    lldb::SBValue sb_value;
+    lldb::ValueObjectSP value_sp(GetSP());
+    lldb::ValueObjectSP new_value_sp;
+    lldb::TypeImplSP type_impl_sp (sb_type.GetSP());
+    if (value_sp && type_impl_sp)
     {
-        SBType real_type(type.GetPointerType());
-        
-        lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
-        
-        ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (m_opaque_sp->GetExecutionContextScope(),
-                                                                           real_type.m_opaque_sp->GetASTContext(),
-                                                                           real_type.m_opaque_sp->GetOpaqueQualType(),
-                                                                           ConstString(name),
-                                                                           buffer,
-                                                                           lldb::endian::InlHostByteOrder(), 
-                                                                           GetTarget().GetProcess().GetAddressByteSize()));
-        
-        ValueObjectSP result_valobj_sp;
-        
-        ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
-        if (ptr_result_valobj_sp)
+        ClangASTType pointee_ast_type(type_impl_sp->GetASTContext(), type_impl_sp->GetClangASTType().GetPointerType ());
+        lldb::TypeImplSP pointee_type_impl_sp (new TypeImpl(pointee_ast_type));
+        if (pointee_type_impl_sp)
         {
-            Error err;
-            result_valobj_sp = ptr_result_valobj_sp->Dereference(err);
-            if (result_valobj_sp)
-                result_valobj_sp->SetName(ConstString(name));
+        
+            lldb::DataBufferSP buffer(new lldb_private::DataBufferHeap(&address,sizeof(lldb::addr_t)));
+        
+            ValueObjectSP ptr_result_valobj_sp(ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(),
+                                                                               pointee_type_impl_sp->GetASTContext(),
+                                                                               pointee_type_impl_sp->GetOpaqueQualType(),
+                                                                               ConstString(name),
+                                                                               buffer,
+                                                                               lldb::endian::InlHostByteOrder(), 
+                                                                               GetTarget().GetProcess().GetAddressByteSize()));
+        
+            if (ptr_result_valobj_sp)
+            {
+                ptr_result_valobj_sp->GetValue().SetValueType(Value::eValueTypeLoadAddress);
+                Error err;
+                new_value_sp = ptr_result_valobj_sp->Dereference(err);
+                if (new_value_sp)
+                    new_value_sp->SetName(ConstString(name));
+            }
+            sb_value.SetSP(new_value_sp);
         }
-        result = SBValue(result_valobj_sp);
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
-        if (result.IsValid())
-            log->Printf ("SBValue(%p)::GetChildFromAddress => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
+        if (new_value_sp)
+            log->Printf ("SBValue(%p)::CreateValueFromAddress => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
         else
-            log->Printf ("SBValue(%p)::GetChildFromAddress => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::CreateValueFromAddress => NULL", value_sp.get());
     }
-    return result;
+    return sb_value;
 }
 
 lldb::SBValue
 SBValue::CreateValueFromData (const char* name, SBData data, SBType type)
 {
-    SBValue result;
-    
-    AddressType addr_of_children_priv = eAddressTypeLoad;
-    
-    if (m_opaque_sp)
+    lldb::SBValue sb_value;
+    lldb::ValueObjectSP new_value_sp;
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        ValueObjectSP valobj_sp;
-        valobj_sp = ValueObjectConstResult::Create (m_opaque_sp->GetExecutionContextScope(), 
-                                                    type.m_opaque_sp->GetASTContext() ,
-                                                    type.m_opaque_sp->GetOpaqueQualType(),
-                                                    ConstString(name),
-                                                    *data.m_opaque_sp,
-                                                    LLDB_INVALID_ADDRESS);
-        valobj_sp->SetAddressTypeOfChildren(addr_of_children_priv);
-        result = SBValue(valobj_sp);
+        new_value_sp = ValueObjectConstResult::Create (value_sp->GetExecutionContextScope(), 
+                                                       type.m_opaque_sp->GetASTContext() ,
+                                                       type.m_opaque_sp->GetOpaqueQualType(),
+                                                       ConstString(name),
+                                                       *data.m_opaque_sp,
+                                                       LLDB_INVALID_ADDRESS);
+        new_value_sp->SetAddressTypeOfChildren(eAddressTypeLoad);
+        sb_value.SetSP(new_value_sp);
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
-        if (result.IsValid())
-            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", m_opaque_sp.get(), result.m_opaque_sp->GetName().AsCString());
+        if (new_value_sp)
+            log->Printf ("SBValue(%p)::GetChildFromExpression => \"%s\"", value_sp.get(), new_value_sp->GetName().AsCString());
         else
-            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetChildFromExpression => NULL", value_sp.get());
     }
-    return result;
+    return sb_value;
 }
 
 SBValue
@@ -491,8 +522,9 @@
 {
     const bool can_create_synthetic = false;
     lldb::DynamicValueType use_dynamic = eNoDynamicValues;
-    if (m_opaque_sp)
-        use_dynamic = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        use_dynamic = value_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
     return GetChildAtIndex (idx, use_dynamic, can_create_synthetic);
 }
 
@@ -501,22 +533,24 @@
 {
     lldb::ValueObjectSP child_sp;
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             const bool can_create = true;
-            child_sp = m_opaque_sp->GetChildAtIndex (idx, can_create);
+            child_sp = value_sp->GetChildAtIndex (idx, can_create);
             if (can_create_synthetic && !child_sp)
             {
-                if (m_opaque_sp->IsPointerType())
+                if (value_sp->IsPointerType())
                 {
-                    child_sp = m_opaque_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
+                    child_sp = value_sp->GetSyntheticArrayMemberFromPointer(idx, can_create);
                 }
-                else if (m_opaque_sp->IsArrayType())
+                else if (value_sp->IsArrayType())
                 {
-                    child_sp = m_opaque_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
+                    child_sp = value_sp->GetSyntheticArrayMemberFromArray(idx, can_create);
                 }
             }
                 
@@ -535,7 +569,7 @@
     SBValue sb_value (child_sp);
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", m_opaque_sp.get(), idx, sb_value.get());
+        log->Printf ("SBValue(%p)::GetChildAtIndex (%u) => SBValue(%p)", value_sp.get(), idx, value_sp.get());
 
     return sb_value;
 }
@@ -544,22 +578,24 @@
 SBValue::GetIndexOfChildWithName (const char *name)
 {
     uint32_t idx = UINT32_MAX;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
         
-            idx = m_opaque_sp->GetIndexOfChildWithName (ConstString(name));
+            idx = value_sp->GetIndexOfChildWithName (ConstString(name));
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (idx == UINT32_MAX)
-            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", m_opaque_sp.get(), name);
+            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => NOT FOUND", value_sp.get(), name);
         else
-            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", m_opaque_sp.get(), name, idx);
+            log->Printf ("SBValue(%p)::GetIndexOfChildWithName (name=\"%s\") => %u", value_sp.get(), name, idx);
     }
     return idx;
 }
@@ -567,13 +603,19 @@
 SBValue
 SBValue::GetChildMemberWithName (const char *name)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        lldb::DynamicValueType use_dynamic_value = m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetPreferDynamicValue();
+        lldb::DynamicValueType use_dynamic_value = eNoDynamicValues;
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
+        {
+            Mutex::Locker api_locker (target_sp->GetAPIMutex());
+            use_dynamic_value = target_sp->GetPreferDynamicValue();
+        }
         return GetChildMemberWithName (name, use_dynamic_value);
     }
-    else
-        return GetChildMemberWithName (name, eNoDynamicValues);
+    return SBValue();
 }
 
 SBValue
@@ -583,12 +625,14 @@
     const ConstString str_name (name);
 
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true);
+            Mutex::Locker api_locker (target_sp->GetAPIMutex());
+            child_sp = value_sp->GetChildMemberWithName (str_name, true);
             if (use_dynamic_value != lldb::eNoDynamicValues)
             {
                 if (child_sp)
@@ -605,7 +649,7 @@
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", m_opaque_sp.get(), name, sb_value.get());
+        log->Printf ("SBValue(%p)::GetChildMemberWithName (name=\"%s\") => SBValue(%p)", value_sp.get(), name, value_sp.get());
 
     return sb_value;
 }
@@ -613,12 +657,14 @@
 lldb::SBValue
 SBValue::GetDynamicValue (lldb::DynamicValueType use_dynamic)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            return SBValue (m_opaque_sp->GetDynamicValue(use_dynamic));
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            return SBValue (value_sp->GetDynamicValue(use_dynamic));
         }
     }
     
@@ -628,12 +674,14 @@
 lldb::SBValue
 SBValue::GetStaticValue ()
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            return SBValue(m_opaque_sp->GetStaticValue());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            return SBValue(value_sp->GetStaticValue());
         }
     }
     
@@ -643,12 +691,14 @@
 bool
 SBValue::IsDynamic()
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
-            return m_opaque_sp->IsDynamic();
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            return value_sp->IsDynamic();
         }
     }
     return false;
@@ -658,13 +708,15 @@
 SBValue::GetValueForExpressionPath(const char* expr_path)
 {
     lldb::ValueObjectSP child_sp;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             // using default values for all the fancy options, just do it if you can
-            child_sp = m_opaque_sp->GetValueForExpressionPath(expr_path);
+            child_sp = value_sp->GetValueForExpressionPath(expr_path);
         }
     }
     
@@ -672,7 +724,7 @@
     
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", m_opaque_sp.get(), expr_path, sb_value.get());
+        log->Printf ("SBValue(%p)::GetValueForExpressionPath (expr_path=\"%s\") => SBValue(%p)", value_sp.get(), expr_path, value_sp.get());
     
     return sb_value;
 }
@@ -681,13 +733,15 @@
 SBValue::GetValueAsSigned(SBError& error, int64_t fail_value)
 {
     error.Clear();
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             Scalar scalar;
-            if (m_opaque_sp->ResolveValue (scalar))
+            if (value_sp->ResolveValue (scalar))
                 return scalar.GetRawBits64(fail_value);
             else
                 error.SetErrorString("could not get value");
@@ -703,13 +757,15 @@
 SBValue::GetValueAsUnsigned(SBError& error, uint64_t fail_value)
 {
     error.Clear();
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             Scalar scalar;
-            if (m_opaque_sp->ResolveValue (scalar))
+            if (value_sp->ResolveValue (scalar))
                 return scalar.GetRawBits64(fail_value);
             else
                 error.SetErrorString("could not get value");
@@ -724,13 +780,15 @@
 int64_t
 SBValue::GetValueAsSigned(int64_t fail_value)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             Scalar scalar;
-            if (m_opaque_sp->ResolveValue (scalar))
+            if (value_sp->ResolveValue (scalar))
                 return scalar.GetRawBits64(fail_value);
         }
     }
@@ -740,13 +798,15 @@
 uint64_t
 SBValue::GetValueAsUnsigned(uint64_t fail_value)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
             Scalar scalar;
-            if (m_opaque_sp->ResolveValue (scalar))
+            if (value_sp->ResolveValue (scalar))
                 return scalar.GetRawBits64(fail_value);
         }
     }
@@ -758,19 +818,21 @@
 {
     uint32_t num_children = 0;
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
 
-            num_children = m_opaque_sp->GetNumChildren();
+            num_children = value_sp->GetNumChildren();
         }
     }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetNumChildren () => %u", m_opaque_sp.get(), num_children);
+        log->Printf ("SBValue(%p)::GetNumChildren () => %u", value_sp.get(), num_children);
 
     return num_children;
 }
@@ -780,19 +842,21 @@
 SBValue::Dereference ()
 {
     SBValue sb_value;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
 
             Error error;
-            sb_value = m_opaque_sp->Dereference (error);
+            sb_value = value_sp->Dereference (error);
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", m_opaque_sp.get(), sb_value.get());
+        log->Printf ("SBValue(%p)::Dereference () => SBValue(%p)", value_sp.get(), value_sp.get());
 
     return sb_value;
 }
@@ -802,19 +866,21 @@
 {
     bool is_ptr_type = false;
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
 
-            is_ptr_type = m_opaque_sp->IsPointerType();
+            is_ptr_type = value_sp->IsPointerType();
         }
     }
 
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", m_opaque_sp.get(), is_ptr_type);
+        log->Printf ("SBValue(%p)::TypeIsPointerType () => %i", value_sp.get(), is_ptr_type);
 
 
     return is_ptr_type;
@@ -823,13 +889,15 @@
 void *
 SBValue::GetOpaqueType()
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetUpdatePoint().GetTargetSP())
+        TargetSP target_sp(value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
-            Mutex::Locker api_locker (m_opaque_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
+            Mutex::Locker api_locker (value_sp->GetUpdatePoint().GetTargetSP()->GetAPIMutex());
 
-            return m_opaque_sp->GetClangType();
+            return value_sp->GetClangType();
         }
     }
     return NULL;
@@ -840,18 +908,19 @@
 {
     SBTarget sb_target;
     TargetSP target_sp;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        target_sp = m_opaque_sp->GetUpdatePoint().GetTargetSP();
+        target_sp = value_sp->GetUpdatePoint().GetTargetSP();
         sb_target.SetSP (target_sp);
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
     {
         if (target_sp.get() == NULL)
-            log->Printf ("SBValue(%p)::GetTarget () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetTarget () => NULL", value_sp.get());
         else
-            log->Printf ("SBValue(%p)::GetTarget () => %p", m_opaque_sp.get(), target_sp.get());
+            log->Printf ("SBValue(%p)::GetTarget () => %p", value_sp.get(), target_sp.get());
     }
     return sb_target;
 }
@@ -861,9 +930,10 @@
 {
     SBProcess sb_process;
     ProcessSP process_sp;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        process_sp = m_opaque_sp->GetUpdatePoint().GetProcessSP();
+        process_sp = value_sp->GetUpdatePoint().GetProcessSP();
         if (process_sp)
             sb_process.SetSP (process_sp);
     }
@@ -871,9 +941,9 @@
     if (log)
     {
         if (process_sp.get() == NULL)
-            log->Printf ("SBValue(%p)::GetProcess () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetProcess () => NULL", value_sp.get());
         else
-            log->Printf ("SBValue(%p)::GetProcess () => %p", m_opaque_sp.get(), process_sp.get());
+            log->Printf ("SBValue(%p)::GetProcess () => %p", value_sp.get(), process_sp.get());
     }
     return sb_process;
 }
@@ -883,11 +953,12 @@
 {
     SBThread sb_thread;
     ThreadSP thread_sp;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetExecutionContextScope())
+        if (value_sp->GetExecutionContextScope())
         {
-            thread_sp = m_opaque_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this();
+            thread_sp = value_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this();
             sb_thread.SetThread(thread_sp);
         }
     }
@@ -895,9 +966,9 @@
     if (log)
     {
         if (thread_sp.get() == NULL)
-            log->Printf ("SBValue(%p)::GetThread () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetThread () => NULL", value_sp.get());
         else
-            log->Printf ("SBValue(%p)::GetThread () => %p", m_opaque_sp.get(), thread_sp.get());
+            log->Printf ("SBValue(%p)::GetThread () => %p", value_sp.get(), thread_sp.get());
     }
     return sb_thread;
 }
@@ -907,11 +978,12 @@
 {
     SBFrame sb_frame;
     StackFrameSP frame_sp;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        if (m_opaque_sp->GetExecutionContextScope())
+        if (value_sp->GetExecutionContextScope())
         {
-            frame_sp = m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this();
+            frame_sp = value_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this();
             sb_frame.SetFrameSP (frame_sp);
         }
     }
@@ -919,45 +991,34 @@
     if (log)
     {
         if (frame_sp.get() == NULL)
-            log->Printf ("SBValue(%p)::GetFrame () => NULL", m_opaque_sp.get());
+            log->Printf ("SBValue(%p)::GetFrame () => NULL", value_sp.get());
         else
-            log->Printf ("SBValue(%p)::GetFrame () => %p", m_opaque_sp.get(), frame_sp.get());
+            log->Printf ("SBValue(%p)::GetFrame () => %p", value_sp.get(), frame_sp.get());
     }
     return sb_frame;
 }
 
 
-// Mimic shared pointer...
-lldb_private::ValueObject *
-SBValue::get() const
-{
-    return m_opaque_sp.get();
-}
-
-lldb_private::ValueObject *
-SBValue::operator->() const
-{
-    return m_opaque_sp.get();
-}
-
-lldb::ValueObjectSP &
-SBValue::operator*()
+lldb::ValueObjectSP
+SBValue::GetSP () const
 {
     return m_opaque_sp;
 }
 
-const lldb::ValueObjectSP &
-SBValue::operator*() const
+void
+SBValue::SetSP (const lldb::ValueObjectSP &sp)
 {
-    return m_opaque_sp;
+    m_opaque_sp = sp;
 }
 
+
 bool
 SBValue::GetExpressionPath (SBStream &description)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        m_opaque_sp->GetExpressionPath (description.ref(), false);
+        value_sp->GetExpressionPath (description.ref(), false);
         return true;
     }
     return false;
@@ -966,9 +1027,10 @@
 bool
 SBValue::GetExpressionPath (SBStream &description, bool qualify_cxx_base_classes)
 {
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        m_opaque_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
+        value_sp->GetExpressionPath (description.ref(), qualify_cxx_base_classes);
         return true;
     }
     return false;
@@ -979,9 +1041,10 @@
 {
     Stream &strm = description.ref();
 
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        ValueObject::DumpValueObject (strm, m_opaque_sp.get());
+        ValueObject::DumpValueObject (strm, value_sp.get());
     }
     else
         strm.PutCString ("No value");
@@ -992,35 +1055,38 @@
 lldb::Format
 SBValue::GetFormat ()
 {
-    if (m_opaque_sp)
-        return m_opaque_sp->GetFormat();
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        return value_sp->GetFormat();
     return eFormatDefault;
 }
 
 void
 SBValue::SetFormat (lldb::Format format)
 {
-    if (m_opaque_sp)
-        m_opaque_sp->SetFormat(format);
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
+        value_sp->SetFormat(format);
 }
 
 lldb::SBValue
 SBValue::AddressOf()
 {
     SBValue sb_value;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
+        Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
         if (target)
         {
             Mutex::Locker api_locker (target->GetAPIMutex());
             Error error;
-            sb_value = m_opaque_sp->AddressOf (error);
+            sb_value = value_sp->AddressOf (error);
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", m_opaque_sp.get(), sb_value.get());
+        log->Printf ("SBValue(%p)::GetPointerToObject () => SBValue(%p)", value_sp.get(), value_sp.get());
     
     return sb_value;
 }
@@ -1029,25 +1095,26 @@
 SBValue::GetLoadAddress()
 {
     lldb::addr_t value = LLDB_INVALID_ADDRESS;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
+        Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
         if (target)
         {
             Mutex::Locker api_locker (target->GetAPIMutex());
             const bool scalar_is_load_address = true;
             AddressType addr_type;
-            value = m_opaque_sp->GetAddressOf(scalar_is_load_address, &addr_type);
+            value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
             if (addr_type == eAddressTypeFile)
             {
-                Module* module = m_opaque_sp->GetModule();
+                Module* module = value_sp->GetModule();
                 if (!module)
                     value = LLDB_INVALID_ADDRESS;
                 else
                 {
                     Address addr;
                     module->ResolveFileAddress(value, addr);
-                    value = addr.GetLoadAddress(m_opaque_sp->GetUpdatePoint().GetTargetSP().get());
+                    value = addr.GetLoadAddress(value_sp->GetUpdatePoint().GetTargetSP().get());
                 }
             }
             else if (addr_type == eAddressTypeHost || addr_type == eAddressTypeInvalid)
@@ -1056,7 +1123,7 @@
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", m_opaque_sp.get(), value);
+        log->Printf ("SBValue(%p)::GetLoadAddress () => (%llu)", value_sp.get(), value);
     
     return value;
 }
@@ -1065,19 +1132,20 @@
 SBValue::GetAddress()
 {
     Address addr;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
+        Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
         if (target)
         {
             lldb::addr_t value = LLDB_INVALID_ADDRESS;
             Mutex::Locker api_locker (target->GetAPIMutex());
             const bool scalar_is_load_address = true;
             AddressType addr_type;
-            value = m_opaque_sp->GetAddressOf(scalar_is_load_address, &addr_type);
+            value = value_sp->GetAddressOf(scalar_is_load_address, &addr_type);
             if (addr_type == eAddressTypeFile)
             {
-                Module* module = m_opaque_sp->GetModule();
+                Module* module = value_sp->GetModule();
                 if (module)
                     module->ResolveFileAddress(value, addr);
             }
@@ -1092,7 +1160,7 @@
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
-        log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", m_opaque_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset());
+        log->Printf ("SBValue(%p)::GetAddress () => (%s,%llu)", value_sp.get(), (addr.GetSection() ? addr.GetSection()->GetName().GetCString() : "NULL"), addr.GetOffset());
     return SBAddress(new Address(addr));
 }
 
@@ -1101,14 +1169,15 @@
                          uint32_t item_count)
 {
     lldb::SBData sb_data;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
+        Target* target = value_sp->GetUpdatePoint().GetTargetSP().get();
         if (target)
         {
 			DataExtractorSP data_sp(new DataExtractor());
             Mutex::Locker api_locker (target->GetAPIMutex());
-            m_opaque_sp->GetPointeeData(*data_sp, item_idx, item_count);
+            value_sp->GetPointeeData(*data_sp, item_idx, item_count);
             if (data_sp->GetByteSize() > 0)
                 *sb_data = data_sp;
         }
@@ -1116,7 +1185,7 @@
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
         log->Printf ("SBValue(%p)::GetPointeeData (%d, %d) => SBData(%p)",
-                     m_opaque_sp.get(),
+                     value_sp.get(),
                      item_idx,
                      item_count,
                      sb_data.get());
@@ -1128,14 +1197,15 @@
 SBValue::GetData ()
 {
     lldb::SBData sb_data;
-    if (m_opaque_sp)
+    lldb::ValueObjectSP value_sp(GetSP());
+    if (value_sp)
     {
-        Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
-        if (target)
+        TargetSP target_sp (value_sp->GetUpdatePoint().GetTargetSP());
+        if (target_sp)
         {
+            Mutex::Locker api_locker (target_sp->GetAPIMutex());
 			DataExtractorSP data_sp(new DataExtractor());
-            Mutex::Locker api_locker (target->GetAPIMutex());
-            m_opaque_sp->GetData(*data_sp);
+            value_sp->GetData(*data_sp);
             if (data_sp->GetByteSize() > 0)
                 *sb_data = data_sp;
         }
@@ -1143,7 +1213,7 @@
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
     if (log)
         log->Printf ("SBValue(%p)::GetData () => SBData(%p)",
-                     m_opaque_sp.get(),
+                     value_sp.get(),
                      sb_data.get());
     
     return sb_data;
@@ -1152,98 +1222,61 @@
 lldb::SBWatchpoint
 SBValue::Watch (bool resolve_location, bool read, bool write)
 {
-    lldb::SBWatchpoint sb_watchpoint;
-    if (!m_opaque_sp)
-        return sb_watchpoint;
-
-    Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
-    if (target)
+    SBWatchpoint sb_watchpoint;
+    
+    // If the SBValue is not valid, there's no point in even trying to watch it.
+    lldb::ValueObjectSP value_sp(GetSP());
+    TargetSP target_sp (GetTarget().GetSP());
+    if (value_sp && target_sp)
     {
-        Mutex::Locker api_locker (target->GetAPIMutex());
-        sb_watchpoint = WatchValue(read, write, false);
+        // Read and Write cannot both be false.
+        if (!read && !write)
+            return sb_watchpoint;
+        
+        // If the value is not in scope, don't try and watch and invalid value
+        if (!IsInScope())
+            return sb_watchpoint;
+        
+        addr_t addr = GetLoadAddress();
+        if (addr == LLDB_INVALID_ADDRESS)
+            return sb_watchpoint;
+        size_t byte_size = GetByteSize();
+        if (byte_size == 0)
+            return sb_watchpoint;
+                
+        uint32_t watch_type = 0;
+        if (read)
+            watch_type |= LLDB_WATCH_TYPE_READ;
+        if (write)
+            watch_type |= LLDB_WATCH_TYPE_WRITE;
+        
+        WatchpointSP watchpoint_sp = target_sp->CreateWatchpoint(addr, byte_size, watch_type);
+                
+        if (watchpoint_sp) 
+        {
+            sb_watchpoint.SetSP (watchpoint_sp);
+            Declaration decl;
+            if (value_sp->GetDeclaration (decl))
+            {
+                if (decl.GetFile()) 
+                {
+                    StreamString ss;
+                    // True to show fullpath for declaration file.
+                    decl.DumpStopContext(&ss, true);
+                    watchpoint_sp->SetDeclInfo(ss.GetString());
+                }
+            }
+        }
     }
-    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-    if (log)
-        log->Printf ("SBValue(%p)::Watch (resolve_location=%i, read=%i, write=%i) => wp(%p)", 
-                     m_opaque_sp.get(), resolve_location, read, write, sb_watchpoint.get());
     return sb_watchpoint;
 }
 
 lldb::SBWatchpoint
 SBValue::WatchPointee (bool resolve_location, bool read, bool write)
 {
-    lldb::SBWatchpoint sb_watchpoint;
-    if (!m_opaque_sp)
-        return sb_watchpoint;
-
-    Target* target = m_opaque_sp->GetUpdatePoint().GetTargetSP().get();
-    if (target)
-    {
-        Mutex::Locker api_locker (target->GetAPIMutex());
-        sb_watchpoint = WatchValue(read, write, true);
-    }
-    LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
-    if (log)
-        log->Printf ("SBValue(%p)::WatchPointee (resolve_location=%i, read=%i, write=%i) => wp(%p)", 
-                     m_opaque_sp.get(), resolve_location, read, write, sb_watchpoint.get());
+    SBWatchpoint sb_watchpoint;
+    if (IsInScope() && GetType().IsPointerType())
+        sb_watchpoint = Dereference().Watch (resolve_location, read, write);
     return sb_watchpoint;
 }
 
-// Helper function for SBValue::Watch() and SBValue::WatchPointee().
-SBWatchpoint
-SBValue::WatchValue(bool read, bool write, bool watch_pointee)
-{
-    SBWatchpoint sb_wp_empty;
-
-    // If the SBValue is not valid, there's no point in even trying to watch it.
-    if (!IsValid())
-        return sb_wp_empty;
-
-    // Read and Write cannot both be false.
-    if (!read && !write)
-        return sb_wp_empty;
-    
-    // If we are watching the pointee, check that the SBValue is a pointer type.
-    if (watch_pointee && !GetType().IsPointerType())
-        return sb_wp_empty;
-
-    TargetSP target_sp (GetTarget().GetSP());
-    if (!target_sp)
-        return sb_wp_empty;
-    
-    StackFrameSP frame_sp (GetFrame().GetFrameSP());
-    if (!frame_sp)
-        return sb_wp_empty;
-    
-    addr_t addr;
-    size_t size;
-    if (watch_pointee) {
-        addr = GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
-        size = GetType().GetPointeeType().GetByteSize();
-    } else {
-        addr = GetLoadAddress();
-        size = GetByteSize();
-    }
-
-    // Sanity check the address and the size before calling Target::CreateWatchpoint().
-    if (addr == LLDB_INVALID_ADDRESS || size == 0)
-        return sb_wp_empty;
-
-    uint32_t watch_type = (read ? LLDB_WATCH_TYPE_READ : 0) |
-        (write ? LLDB_WATCH_TYPE_WRITE : 0);
-    WatchpointSP wp_sp = target_sp->CreateWatchpoint(addr, size, watch_type);
-
-    if (wp_sp) {
-        // StackFrame::GetInScopeVariableList(true) to get file globals as well.
-        VariableListSP var_list_sp(frame_sp->GetInScopeVariableList(true));
-        VariableSP var_sp = var_list_sp->FindVariable(ConstString(GetName()));
-        if (var_sp && var_sp->GetDeclaration().GetFile()) {
-            StreamString ss;
-            // True to show fullpath for declaration file.
-            var_sp->GetDeclaration().DumpStopContext(&ss, true);
-            wp_sp->SetDeclInfo(ss.GetString());
-        }
-    }
-    return wp_sp;
-}
-