//++ ------------------------------------------------------------------------------------ // Details: Retrieve from the LLDB SB Value object the value of the variable described in // text. If the value is invalid (or the SBValue object invalid) then "??" is // returned. // Type: Method. // Args: None. // Return: CMIUtilString - Text description of the variable's value or "??". // Throws: None. //-- CMIUtilString CMICmnLLDBUtilSBValue::GetValue(const bool vbExpandAggregates /* = false */) const { if (!m_bValidSBValue) return m_pUnkwn; CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance()); bool bPrintExpandAggregates = false; bPrintExpandAggregates = rSessionInfo.SharedDataRetrieve<bool>(rSessionInfo.m_constStrPrintExpandAggregates, bPrintExpandAggregates) && bPrintExpandAggregates; const bool bHandleArrayTypeAsSimple = m_bHandleArrayType && !vbExpandAggregates && !bPrintExpandAggregates; CMIUtilString value; const bool bIsSimpleValue = GetSimpleValue(bHandleArrayTypeAsSimple, value); if (bIsSimpleValue) return value; if (!vbExpandAggregates && !bPrintExpandAggregates) return m_pComposite; bool bPrintAggregateFieldNames = false; bPrintAggregateFieldNames = !rSessionInfo.SharedDataRetrieve<bool>(rSessionInfo.m_constStrPrintAggregateFieldNames, bPrintAggregateFieldNames) || bPrintAggregateFieldNames; CMICmnMIValueTuple miValueTuple; const bool bOk = GetCompositeValue(bPrintAggregateFieldNames, miValueTuple); if (!bOk) return m_pUnkwn; value = miValueTuple.GetString(); return value; }
bool CMICmnLLDBUtilSBValue::GetCompositeValue(const bool vbPrintFieldNames, CMICmnMIValueTuple &vwrMiValueTuple, const MIuint vnDepth /* = 1 */) const { const MIuint nMaxDepth = 10; const MIuint nChildren = m_rValue.GetNumChildren(); for (MIuint i = 0; i < nChildren; ++i) { const lldb::SBValue member = m_rValue.GetChildAtIndex(i); const CMICmnLLDBUtilSBValue utilMember(member, m_bHandleCharType, m_bHandleArrayType); const bool bHandleArrayTypeAsSimple = false; CMIUtilString value; const bool bIsSimpleValue = utilMember.GetSimpleValue(bHandleArrayTypeAsSimple, value); if (bIsSimpleValue) { // OK. Value is simple (not composite) and was successfully got } else if (vnDepth < nMaxDepth) { // Need to get value from composite type CMICmnMIValueTuple miValueTuple; const bool bOk = utilMember.GetCompositeValue(vbPrintFieldNames, miValueTuple, vnDepth + 1); if (!bOk) // Can't obtain composite type value = m_pUnkwn; else // OK. Value is composite and was successfully got value = miValueTuple.GetString(); } else { // Need to get value from composite type, but vnMaxDepth is reached value = m_pComposite; } const bool bNoQuotes = true; const CMICmnMIValueConst miValueConst(value, bNoQuotes); if (vbPrintFieldNames) { const bool bUseSpacing = true; const CMICmnMIValueResult miValueResult(utilMember.GetName(), miValueConst, bUseSpacing); const bool bOk = vwrMiValueTuple.Add(miValueResult, bUseSpacing); if (!bOk) return MIstatus::failure; } else { const bool bUseSpacing = false; const bool bOk = vwrMiValueTuple.Add(miValueConst, bUseSpacing); if (!bOk) return MIstatus::failure; } } return MIstatus::success; }