ultimatepp/uppsrc/ide/Debuggers/VarItem.cpp
cxl 5d1b108eb3 Core: HttpRequest::ShortTrace, ide: Debuggers: MI2 fixed to compile in Win32
git-svn-id: svn://ultimatepp.org/upp/trunk@6914 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2014-02-13 09:42:08 +00:00

128 lines
2.9 KiB
C++

#include "Debuggers.h"
#include <ide/ide.h>
// check if value contains an error
bool Gdb_MI2::VarItem::IsError(void) const
{
return error;
}
// constructor
Gdb_MI2::VarItem::VarItem()
{
error = true;
dynamic = false;
numChildren = 0;
kind = SIMPLE;
}
// evaluate an expression usign gdb variables
Gdb_MI2::VarItem Gdb_MI2::EvalGdb(String const &expr)
{
VarItem v;
MIValue val = MICmd("var-create - @ " + expr);
if(val.IsError())
return v;
v.error = false;
v.varName = val["name"];
v.evaluableExpression = expr;
v.shortExpression = expr;
v.value = val["value"];
v.numChildren = atoi(val.Get("numchild", "0"));
v.type = val["type"];
String dispHint = val.Get("displayhint", "");
if(ToUpper(dispHint) == "ARRAY")
v.kind = VarItem::ARRAY;
else if(ToUpper(dispHint) == "MAP")
v.kind = VarItem::MAP;
else
v.kind = VarItem::SIMPLE;
v.dynamic = (val.Get("dynamic", "") != "");
return v;
}
// remove GDB variable for item
void Gdb_MI2::KillVariable(Gdb_MI2::VarItem &v)
{
MICmd("var-delete " + v.varName);
}
// fetch variable children
Vector<Gdb_MI2::VarItem> Gdb_MI2::GetChildren(MIValue const &val, String const &prePath)
{
Vector<VarItem> res;
if(val.IsError() || !val.IsTuple())
return res;
MIValue const &children = val["children"];
if(!children.IsArray())
return res;
for(int i = 0; i < children.GetCount(); i++)
{
MIValue const &child = children[i];
// for private, protected, public and inherited fake childs, just go deeper
String exp = child["exp"];
String typ = child.Get("type", "");
String nam = child.Get("name");
if(exp == "private" || exp == "protected" || exp == "public" || exp == typ)
{
MIValue val2 = MICmd("var-list-children 1 " + nam);
res.Append(GetChildren(val2, prePath));
}
else
{
VarItem &v = res.Add();
v.error = false;
v.varName = nam;
v.shortExpression = prePath + "." + exp;
v.type = typ;
v.value = child["value"];
v.dynamic = (child.Get("dynamic", "") != "");
v.numChildren = atoi(child.Get("numchild", "0"));
String dispHint = child.Get("displayhint", "");
if(ToUpper(dispHint) == "ARRAY")
v.kind = VarItem::ARRAY;
else if(ToUpper(dispHint) == "MAP")
v.kind = VarItem::MAP;
else
v.kind = VarItem::SIMPLE;
/*
MIValue vExp = MICmd("var-info-path-expression " + nam);
v.evaluableExpression = vExp.Get("path_expr", "");
*/
}
}
return res;
}
// fetch variable children
Vector<Gdb_MI2::VarItem> Gdb_MI2::GetChildren(Gdb_MI2::VarItem &v, int minChild, int maxChild)
{
// for 'simple' (i.e. not maps or arrays..) get all children
// otherwise get the given range
int first, last;
if(v.kind == VarItem::SIMPLE)
{
first = 0;
last = INT_MAX;
}
else
{
if(minChild < 0)
first = 0;
else
first = minChild;
if(maxChild < 0)
last = v.numChildren;
else
last = maxChild;
}
MIValue val = MICmd(Format("var-list-children 1 %s %d %d", v.varName, first, last));
return GetChildren(val, v.shortExpression);
}