//++ ------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object of type char[] the c-string value. // Type: Method. // Args: None. // Return: CMIUtilString - The c-string value of the variable. // Throws: None. //-- CMIUtilString CMICmnLLDBUtilSBValue::GetSimpleValueCStringArray() const { const CMIUtilString& summary = GetValueSummary(); if (!summary.empty()) return summary; const MIuint nChildren = m_rValue.GetNumChildren(); lldb::SBValue child = m_rValue.GetChildAtIndex(0); const lldb::BasicType eType = child.GetType().GetBasicType(); switch (eType) { default: assert(0 && "value must be a char[] type"); case lldb::eBasicTypeChar: case lldb::eBasicTypeSignedChar: case lldb::eBasicTypeUnsignedChar: { const CMIUtilString prefix(ReadCStringFromHostMemory<char>(m_rValue, nChildren)); // TODO: to match char* it should be the following // return CMIUtilString::Format("[%u] \"%s\"", nChildren, prefix.c_str()); return CMIUtilString::Format("\"%s\"", prefix.c_str()); } case lldb::eBasicTypeChar16: { const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(m_rValue, nChildren)); return CMIUtilString::Format("u\"%s\"", prefix.c_str()); } case lldb::eBasicTypeChar32: { const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(m_rValue, nChildren)); return CMIUtilString::Format("U\"%s\"", prefix.c_str()); } } }
//++ //------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object the value of the variable // described in // text if it has a simple format (not composite). // Type: Method. // Args: vwrValue - (W) The SBValue in a string format. // Return: MIstatus::success - Function succeeded. // MIstatus::failure - Function failed. // Throws: None. //-- bool CMICmnLLDBUtilSBValue::GetSimpleValue(const bool vbHandleArrayType, CMIUtilString &vwrValue) const { const MIuint nChildren = m_rValue.GetNumChildren(); if (nChildren == 0) { vwrValue = GetValueSummary(!m_bHandleCharType && IsCharType(), m_pUnkwn); return MIstatus::success; } else if (IsPointerType()) { vwrValue = GetValueSummary(!m_bHandleCharType && IsPointeeCharType(), m_pUnkwn); return MIstatus::success; } else if (IsArrayType()) { CMICmnLLDBDebugSessionInfo &rSessionInfo( CMICmnLLDBDebugSessionInfo::Instance()); bool bPrintCharArrayAsString = false; bPrintCharArrayAsString = rSessionInfo.SharedDataRetrieve<bool>( rSessionInfo.m_constStrPrintCharArrayAsString, bPrintCharArrayAsString) && bPrintCharArrayAsString; if (bPrintCharArrayAsString && m_bHandleCharType && IsFirstChildCharType()) { vwrValue = GetValueSummary(false); return MIstatus::success; } else if (vbHandleArrayType) { vwrValue = CMIUtilString::Format("[%u]", nChildren); return MIstatus::success; } } else { // Treat composite value which has registered summary // (for example with AddCXXSummary) as simple value vwrValue = GetValueSummary(false); if (!vwrValue.empty()) return MIstatus::success; } // Composite variable type i.e. struct return MIstatus::failure; }
//++ ------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object of type char* the c-string value. // Type: Method. // Args: None. // Return: CMIUtilString - The c-string value of the variable. // Throws: None. //-- CMIUtilString CMICmnLLDBUtilSBValue::GetSimpleValueCStringPointer() const { const CMIUtilString& summary = GetValueSummary(); if (!summary.empty()) return summary; const char *value = m_rValue.GetValue(); if (value == nullptr) return m_pUnkwn; lldb::SBValue child = m_rValue.GetChildAtIndex(0); const lldb::BasicType eType = child.GetType().GetBasicType(); switch (eType) { default: assert(0 && "child must be a char type"); case lldb::eBasicTypeChar: case lldb::eBasicTypeSignedChar: case lldb::eBasicTypeUnsignedChar: { const CMIUtilString prefix(ReadCStringFromHostMemory<char>(child)); // Note code that has const in will not show the text suffix to the string pointer // i.e. const char * pMyStr = "blah"; ==> "0x00007000"" <-- Eclipse shows this // but char * pMyStr = "blah"; ==> "0x00007000" "blah"" <-- Eclipse shows this return CMIUtilString::Format("%s \"%s\"", value, prefix.c_str()); } case lldb::eBasicTypeChar16: { const CMIUtilString prefix(ReadCStringFromHostMemory<char16_t>(child)); return CMIUtilString::Format("%s u\"%s\"", value, prefix.c_str()); } case lldb::eBasicTypeChar32: { const CMIUtilString prefix(ReadCStringFromHostMemory<char32_t>(child)); return CMIUtilString::Format("%s U\"%s\"", value, prefix.c_str()); } } }
//++ ------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object the char value of the variable. // Type: Method. // Args: None. // Return: CMIUtilString - The char value of the variable. // Throws: None. //-- CMIUtilString CMICmnLLDBUtilSBValue::GetSimpleValueChar() const { const CMIUtilString& summary = GetValueSummary(); if (!summary.empty()) return summary; const uint64_t value = m_rValue.GetValueAsUnsigned(); if (value == 0) { const uint64_t nFailValue = 1; if (nFailValue == m_rValue.GetValueAsUnsigned(nFailValue)) return m_pUnkwn; } const lldb::BasicType eType = m_rValue.GetType().GetBasicType(); switch (eType) { default: assert(0 && "value must be a char type"); case lldb::eBasicTypeChar: case lldb::eBasicTypeSignedChar: case lldb::eBasicTypeUnsignedChar: { const CMIUtilString prefix(CMIUtilString::ConvertToPrintableASCII((char)value)); return CMIUtilString::Format("%" PRIu8 " '%s'", (uint8_t)value, prefix.c_str()); } case lldb::eBasicTypeChar16: { const CMIUtilString prefix(CMIUtilString::ConvertToPrintableASCII((char16_t)value)); return CMIUtilString::Format("U+%04" PRIx16 " u'%s'", (uint16_t)value, prefix.c_str()); } case lldb::eBasicTypeChar32: { const CMIUtilString prefix(CMIUtilString::ConvertToPrintableASCII((char32_t)value)); return CMIUtilString::Format("U+%08" PRIx32 " U'%s'", (uint32_t)value, prefix.c_str()); } } }