forked from OSchip/llvm-project
Fix -data-evaluate-expression for array.
Summary: For an array declared like "blk[2][3]", this command was showing: -data-evaluate-expression blk ^done,value="{[0] = [3], [1] = [3]}" After this fix, it shows: -data-evaluate-expression blk ^done,value="{[0] = {[0] = 1, [1] = 2, [2] = 3}, [1] = {[0] = 4, [1] = 5, [2] = 6}}" The code to do the right thing was already available and used by other commands. So I have just used that and removed the half-baked previous implementation. Reviewers: ki.stfu Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D12634 llvm-svn: 246965
This commit is contained in:
parent
058faef6ce
commit
8647f4381f
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue