SBValue.cpp revision dfc91c368886f961b5cac95efc9adfe9be05cf73
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o//===-- SBValue.cpp ---------------------------------------------*- C++ -*-===// 23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// 33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// The LLVM Compiler Infrastructure 43839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// 53839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// This file is distributed under the University of Illinois Open Source 63839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// License. See LICENSE.TXT for details. 73839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o// 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o//===----------------------------------------------------------------------===// 9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o 10543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o#include "lldb/API/SBValue.h" 11543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o 123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/DataExtractor.h" 133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Module.h" 143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Stream.h" 153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/StreamFile.h" 163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/Value.h" 173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Core/ValueObject.h" 183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Symbol/Block.h" 1966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Symbol/ObjectFile.h" 2066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Symbol/Variable.h" 2166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o#include "lldb/Target/ExecutionContext.h" 2250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/Target/Process.h" 233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/Target/StackFrame.h" 2450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/Target/Thread.h" 2550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#include "lldb/API/SBProcess.h" 2750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/API/SBTarget.h" 28023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include "lldb/API/SBThread.h" 2950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#include "lldb/API/SBFrame.h" 30023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o#include "lldb/API/SBDebugger.h" 3150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ousing namespace lldb; 3350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'ousing namespace lldb_private; 343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oSBValue::SBValue () : 363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o m_opaque_sp () 3766d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{ 3866d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o} 3966d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o 4066d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'oSBValue::SBValue (const lldb::ValueObjectSP &value_sp) : 4166d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o m_opaque_sp (value_sp) 4266d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{ 433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 45cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'oSBValue::~SBValue() 463c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o{ 4750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o} 48cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o 49cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'obool 5050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::IsValid () const 51cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o{ 5250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return (m_opaque_sp.get() != NULL); 53cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o} 54cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o 5550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char * 5650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::GetName() 57cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o{ 58cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o if (IsValid()) 5950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o return m_opaque_sp->GetName().AsCString(); 6050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o else 61cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o return NULL; 62cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o} 6350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o 6450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char * 65cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'oSBValue::GetTypeName () 66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 6750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o if (IsValid()) 68a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o return m_opaque_sp->GetTypeName().AsCString(); 693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o else 701a4ce9df5884405a7152855b868c3a7bfbeec385Theodore Ts'o return NULL; 71023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o} 72023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o 73023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'osize_t 743c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'oSBValue::GetByteSize () 7566d8c3f33f976e83ea0efd361bb5ac182315a421Theodore Ts'o{ 763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o size_t result = 0; 773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o 78cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o if (IsValid()) 79a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o result = m_opaque_sp->GetByteSize(); 80a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o 81cce382b12c2e0764b91d143ec6f9549c735f8f9eTheodore Ts'o return result; 823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o} 83a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'o 84a8a813ee3321f3d8986a88c83903b933f1b35e8eTheodore Ts'obool 853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oSBValue::IsInScope (const SBFrame &frame) 86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{ 873c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o bool result = false; 883c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o 893c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o if (IsValid()) 903c203cb6831fdfe096bae7ce60c594725f70f47dTheodore Ts'o result = m_opaque_sp->IsInScope (frame.get()); 91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall return result; 93023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o} 94023d111e92195624463e870146d0f386ba5c2d87Theodore Ts'o 9550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oconst char * 9650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oSBValue::GetValue (const SBFrame &frame) 973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{ 98 const char *value_string = NULL; 99 if ( m_opaque_sp) 100 value_string = m_opaque_sp->GetValueAsCString (frame.get()); 101 return value_string; 102} 103 104const char * 105SBValue::GetObjectDescription (const SBFrame &frame) 106{ 107 const char *value_string = NULL; 108 if ( m_opaque_sp) 109 value_string = m_opaque_sp->GetObjectDescription (frame.get()); 110 return value_string; 111} 112 113bool 114SBValue::GetValueDidChange (const SBFrame &frame) 115{ 116 if (IsValid()) 117 return m_opaque_sp->GetValueDidChange (frame.get()); 118 return false; 119} 120 121const char * 122SBValue::GetSummary (const SBFrame &frame) 123{ 124 const char *value_string = NULL; 125 if ( m_opaque_sp) 126 value_string = m_opaque_sp->GetSummaryAsCString(frame.get()); 127 return value_string; 128} 129 130const char * 131SBValue::GetLocation (const SBFrame &frame) 132{ 133 const char *value_string = NULL; 134 if (IsValid()) 135 value_string = m_opaque_sp->GetLocationAsCString(frame.get()); 136 return value_string; 137} 138 139bool 140SBValue::SetValueFromCString (const SBFrame &frame, const char *value_str) 141{ 142 bool success = false; 143 if (IsValid()) 144 success = m_opaque_sp->SetValueFromCString (frame.get(), value_str); 145 return success; 146} 147 148SBValue 149SBValue::GetChildAtIndex (uint32_t idx) 150{ 151 lldb::ValueObjectSP child_sp; 152 153 if (IsValid()) 154 { 155 child_sp = m_opaque_sp->GetChildAtIndex (idx, true); 156 } 157 158 SBValue sb_value (child_sp); 159 return sb_value; 160} 161 162uint32_t 163SBValue::GetIndexOfChildWithName (const char *name) 164{ 165 if (IsValid()) 166 return m_opaque_sp->GetIndexOfChildWithName (ConstString(name)); 167 return UINT32_MAX; 168} 169 170SBValue 171SBValue::GetChildMemberWithName (const char *name) 172{ 173 lldb::ValueObjectSP child_sp; 174 const ConstString str_name (name); 175 176 if (IsValid()) 177 { 178 child_sp = m_opaque_sp->GetChildMemberWithName (str_name, true); 179 } 180 181 SBValue sb_value (child_sp); 182 return sb_value; 183} 184 185 186uint32_t 187SBValue::GetNumChildren () 188{ 189 uint32_t num_children = 0; 190 191 if (IsValid()) 192 { 193 num_children = m_opaque_sp->GetNumChildren(); 194 } 195 196 return num_children; 197} 198 199bool 200SBValue::ValueIsStale () 201{ 202 bool result = true; 203 204 if (IsValid()) 205 { 206 result = m_opaque_sp->GetValueIsValid(); 207 } 208 209 return result; 210} 211 212 213SBValue 214SBValue::Dereference () 215{ 216 if (IsValid()) 217 { 218 if (m_opaque_sp->IsPointerType()) 219 { 220 return GetChildAtIndex(0); 221 } 222 } 223 return *this; 224} 225 226bool 227SBValue::TypeIsPtrType () 228{ 229 bool is_ptr_type = false; 230 231 if (IsValid()) 232 { 233 is_ptr_type = m_opaque_sp->IsPointerType(); 234 } 235 236 return is_ptr_type; 237} 238 239void * 240SBValue::GetOpaqueType() 241{ 242 if (m_opaque_sp) 243 return m_opaque_sp->GetOpaqueClangQualType(); 244 return NULL; 245} 246 247// Mimic shared pointer... 248lldb_private::ValueObject * 249SBValue::get() const 250{ 251 return m_opaque_sp.get(); 252} 253 254lldb_private::ValueObject * 255SBValue::operator->() const 256{ 257 return m_opaque_sp.get(); 258} 259 260lldb::ValueObjectSP & 261SBValue::operator*() 262{ 263 return m_opaque_sp; 264} 265 266const lldb::ValueObjectSP & 267SBValue::operator*() const 268{ 269 return m_opaque_sp; 270} 271