diff --git a/lldb/test/tools/lldb-mi/data/TestMiData.py b/lldb/test/tools/lldb-mi/data/TestMiData.py index 4aea485f7589..9d2cf7e01430 100644 --- a/lldb/test/tools/lldb-mi/data/TestMiData.py +++ b/lldb/test/tools/lldb-mi/data/TestMiData.py @@ -312,5 +312,28 @@ class MiDataTestCase(lldbmi_testcase.MiTestCaseBase): self.runCmd("-data-info-line main.cpp:0") self.expect("\^error,msg=\"error: zero is an invalid line number") + @lldbmi_test + @skipIfWindows #llvm.org/pr24452: Get lldb-mi tests working on Windows + @skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races + def test_lldbmi_data_evaluate_expression(self): + """Test that 'lldb-mi --interpreter' works for -data-evaluate-expression.""" + + self.spawnLldbMi(args = None) + + # Load executable + self.runCmd("-file-exec-and-symbols %s" % self.myexe) + self.expect("\^done") + + line = line_number('main.cpp', '// BP_local_2d_array_test') + self.runCmd('-break-insert main.cpp:%d' % line) + self.expect("\^done,bkpt={number=\"1\"") + self.runCmd("-exec-run") + self.expect("\^running") + self.expect("\*stopped,reason=\"breakpoint-hit\"") + + # Check 2d array + self.runCmd("-data-evaluate-expression array2d") + self.expect("\^done,value=\"\{\[0\] = \{\[0\] = 1, \[1\] = 2, \[2\] = 3\}, \[1\] = \{\[0\] = 4, \[1\] = 5, \[2\] = 6\}\}\"") + if __name__ == '__main__': unittest2.main() diff --git a/lldb/test/tools/lldb-mi/data/main.cpp b/lldb/test/tools/lldb-mi/data/main.cpp index 5782b4eea617..8030fe891de2 100644 --- a/lldb/test/tools/lldb-mi/data/main.cpp +++ b/lldb/test/tools/lldb-mi/data/main.cpp @@ -30,6 +30,19 @@ local_array_test() return; } +void +local_2d_array_test() +{ + int array2d[2][3]; + array2d[0][0] = 1; + array2d[0][1] = 2; + array2d[0][2] = 3; + array2d[1][0] = 4; + array2d[1][1] = 5; + array2d[1][2] = 6; + return; // BP_local_2d_array_test +} + void hello_world() { @@ -41,5 +54,6 @@ main(int argc, char const *argv[]) { // FUNC_main local_array_test(); hello_world(); + local_2d_array_test(); return 0; } diff --git a/lldb/tools/lldb-mi/MICmdCmdData.cpp b/lldb/tools/lldb-mi/MICmdCmdData.cpp index 7dd5bfcffd66..00bd1d35a4c1 100644 --- a/lldb/tools/lldb-mi/MICmdCmdData.cpp +++ b/lldb/tools/lldb-mi/MICmdCmdData.cpp @@ -54,7 +54,6 @@ CMICmdCmdDataEvaluateExpression::CMICmdCmdDataEvaluateExpression() : m_bExpressionValid(true) , m_bEvaluatedExpression(true) , m_strValue("??") - , m_bCompositeVarType(false) , m_bFoundInvalidChar(false) , m_cExpressionInvalidChar(0x00) , m_constStrArgThread("thread") @@ -145,41 +144,7 @@ CMICmdCmdDataEvaluateExpression::Execute() m_strValue = rExpression.Trim('\"'); return MIstatus::success; } - - MIuint64 nNumber = 0; - if (CMICmnLLDBProxySBValue::GetValueAsUnsigned(value, nNumber) == MIstatus::success) - { - const lldb::ValueType eValueType = value.GetValueType(); - MIunused(eValueType); - m_strValue = utilValue.GetValue().Escape().AddSlashes(); - return MIstatus::success; - } - - // Composite type i.e. struct - m_bCompositeVarType = true; - const MIuint nChild = value.GetNumChildren(); - for (MIuint i = 0; i < nChild; i++) - { - lldb::SBValue member = value.GetChildAtIndex(i); - const bool bValid = member.IsValid(); - CMIUtilString strType(MIRSRC(IDS_WORD_UNKNOWNTYPE_BRKTS)); - if (bValid) - { - const CMIUtilString strValue( - CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(member, CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural)); - const char *pTypeName = member.GetName(); - if (pTypeName != nullptr) - strType = pTypeName; - - // MI print "{variable = 1, variable2 = 3, variable3 = 5}" - const bool bNoQuotes = true; - const CMICmnMIValueConst miValueConst(strValue, bNoQuotes); - const bool bUseSpaces = true; - const CMICmnMIValueResult miValueResult(strType, miValueConst, bUseSpaces); - m_miValueTuple.Add(miValueResult, bUseSpaces); - } - } - + m_strValue = utilValue.GetValue(true).Escape().AddSlashes(); return MIstatus::success; } @@ -199,15 +164,6 @@ CMICmdCmdDataEvaluateExpression::Acknowledge() { if (m_bEvaluatedExpression) { - if (m_bCompositeVarType) - { - const CMICmnMIValueConst miValueConst(m_miValueTuple.GetString()); - const CMICmnMIValueResult miValueResult("value", miValueConst); - const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult); - m_miResultRecord = miRecordResult; - return MIstatus::success; - } - if (m_bFoundInvalidChar) { const CMICmnMIValueConst miValueConst( diff --git a/lldb/tools/lldb-mi/MICmdCmdData.h b/lldb/tools/lldb-mi/MICmdCmdData.h index fb7b6eb2e406..3e957206921e 100644 --- a/lldb/tools/lldb-mi/MICmdCmdData.h +++ b/lldb/tools/lldb-mi/MICmdCmdData.h @@ -73,7 +73,6 @@ class CMICmdCmdDataEvaluateExpression : public CMICmdBase bool m_bEvaluatedExpression; // True = yes is expression evaluated, false = failed CMIUtilString m_strValue; CMICmnMIValueTuple m_miValueTuple; - bool m_bCompositeVarType; // True = yes composite type, false = internal type bool m_bFoundInvalidChar; // True = yes found unexpected character in the expression, false = all ok char m_cExpressionInvalidChar; const CMIUtilString m_constStrArgThread; // Not specified in MI spec but Eclipse gives this option. Not handled by command.