forked from qt-creator/qt-creator
Merge branch 'master' of scm.dev.nokia.troll.no:creator/mainline
This commit is contained in:
@@ -8,6 +8,8 @@ import gdb
|
||||
import base64
|
||||
import __builtin__
|
||||
import os
|
||||
import cProfile
|
||||
|
||||
|
||||
# Fails on Windows.
|
||||
try:
|
||||
@@ -776,228 +778,235 @@ class FrameCommand(gdb.Command):
|
||||
super(FrameCommand, self).__init__("bb", gdb.COMMAND_OBSCURE)
|
||||
|
||||
def invoke(self, args, from_tty):
|
||||
options = []
|
||||
varList = []
|
||||
typeformats = {}
|
||||
formats = {}
|
||||
watchers = ""
|
||||
expandedINames = ""
|
||||
resultVarName = ""
|
||||
for arg in args.split(' '):
|
||||
pos = arg.find(":") + 1
|
||||
if arg.startswith("options:"):
|
||||
options = arg[pos:].split(",")
|
||||
elif arg.startswith("vars:"):
|
||||
if len(arg[pos:]) > 0:
|
||||
varList = arg[pos:].split(",")
|
||||
elif arg.startswith("resultvarname:"):
|
||||
resultVarName = arg[pos:]
|
||||
elif arg.startswith("expanded:"):
|
||||
expandedINames = set(arg[pos:].split(","))
|
||||
elif arg.startswith("typeformats:"):
|
||||
for f in arg[pos:].split(","):
|
||||
pos = f.find("=")
|
||||
if pos != -1:
|
||||
type = base64.b16decode(f[0:pos], True)
|
||||
typeformats[type] = int(f[pos+1:])
|
||||
elif arg.startswith("formats:"):
|
||||
for f in arg[pos:].split(","):
|
||||
pos = f.find("=")
|
||||
if pos != -1:
|
||||
formats[f[0:pos]] = int(f[pos+1:])
|
||||
elif arg.startswith("watchers:"):
|
||||
watchers = base64.b16decode(arg[pos:], True)
|
||||
#if args.startswith('options:pp'):
|
||||
# cProfile.run('bb("%s")' % args, '/tmp/fooprof')
|
||||
#else:
|
||||
bb(args)
|
||||
|
||||
useFancy = "fancy" in options
|
||||
|
||||
#warn("VARIABLES: %s" % varList)
|
||||
#warn("EXPANDED INAMES: %s" % expandedINames)
|
||||
module = sys.modules[__name__]
|
||||
self.dumpers = {}
|
||||
|
||||
if False:
|
||||
dumpers = ""
|
||||
typeformats = ""
|
||||
for key, value in module.__dict__.items():
|
||||
if key.startswith("qdump__"):
|
||||
dumpers += '"' + key[7:] + '",'
|
||||
output = "dumpers=[%s]," % dumpers
|
||||
#output += "qtversion=[%d,%d,%d]"
|
||||
#output += "qtversion=[4,6,0],"
|
||||
output += "namespace=\"%s\"," % qtNamespace()
|
||||
output += "dumperversion=\"2.0\","
|
||||
output += "sizes=[],"
|
||||
output += "expressions=[]"
|
||||
output += "]"
|
||||
print output
|
||||
return
|
||||
FrameCommand()
|
||||
|
||||
|
||||
if useFancy:
|
||||
for key, value in module.__dict__.items():
|
||||
if key.startswith("qdump__"):
|
||||
self.dumpers[key[7:]] = value
|
||||
def bb(args):
|
||||
options = []
|
||||
varList = []
|
||||
typeformats = {}
|
||||
formats = {}
|
||||
watchers = ""
|
||||
expandedINames = ""
|
||||
resultVarName = ""
|
||||
for arg in args.split(' '):
|
||||
pos = arg.find(":") + 1
|
||||
if arg.startswith("options:"):
|
||||
options = arg[pos:].split(",")
|
||||
elif arg.startswith("vars:"):
|
||||
if len(arg[pos:]) > 0:
|
||||
varList = arg[pos:].split(",")
|
||||
elif arg.startswith("resultvarname:"):
|
||||
resultVarName = arg[pos:]
|
||||
elif arg.startswith("expanded:"):
|
||||
expandedINames = set(arg[pos:].split(","))
|
||||
elif arg.startswith("typeformats:"):
|
||||
for f in arg[pos:].split(","):
|
||||
pos = f.find("=")
|
||||
if pos != -1:
|
||||
type = base64.b16decode(f[0:pos], True)
|
||||
typeformats[type] = int(f[pos+1:])
|
||||
elif arg.startswith("formats:"):
|
||||
for f in arg[pos:].split(","):
|
||||
pos = f.find("=")
|
||||
if pos != -1:
|
||||
formats[f[0:pos]] = int(f[pos+1:])
|
||||
elif arg.startswith("watchers:"):
|
||||
watchers = base64.b16decode(arg[pos:], True)
|
||||
|
||||
d = Dumper()
|
||||
d.dumpers = self.dumpers
|
||||
d.typeformats = typeformats
|
||||
d.formats = formats
|
||||
d.useFancy = useFancy
|
||||
d.passExceptions = "pe" in options
|
||||
d.autoDerefPointers = "autoderef" in options
|
||||
d.ns = qtNamespace()
|
||||
d.expandedINames = expandedINames
|
||||
#warn(" NAMESPACE IS: '%s'" % d.ns)
|
||||
useFancy = "fancy" in options
|
||||
|
||||
#
|
||||
# Locals
|
||||
#
|
||||
locals = listOfLocals(varList);
|
||||
#warn("VARIABLES: %s" % varList)
|
||||
#warn("EXPANDED INAMES: %s" % expandedINames)
|
||||
module = sys.modules[__name__]
|
||||
dumpers = {}
|
||||
|
||||
# Take care of the return value of the last function call.
|
||||
if len(resultVarName) > 0:
|
||||
if False:
|
||||
dumpers = ""
|
||||
typeformats = ""
|
||||
for key, value in module.__dict__.items():
|
||||
if key.startswith("qdump__"):
|
||||
dumpers += '"' + key[7:] + '",'
|
||||
output = "dumpers=[%s]," % dumpers
|
||||
#output += "qtversion=[%d,%d,%d]"
|
||||
#output += "qtversion=[4,6,0],"
|
||||
output += "namespace=\"%s\"," % qtNamespace()
|
||||
output += "dumperversion=\"2.0\","
|
||||
output += "sizes=[],"
|
||||
output += "expressions=[]"
|
||||
output += "]"
|
||||
print output
|
||||
return
|
||||
|
||||
|
||||
if useFancy:
|
||||
for key, value in module.__dict__.items():
|
||||
if key.startswith("qdump__"):
|
||||
dumpers[key[7:]] = value
|
||||
|
||||
d = Dumper()
|
||||
d.dumpers = dumpers
|
||||
d.typeformats = typeformats
|
||||
d.formats = formats
|
||||
d.useFancy = useFancy
|
||||
d.passExceptions = "pe" in options
|
||||
d.autoDerefPointers = "autoderef" in options
|
||||
d.ns = qtNamespace()
|
||||
d.expandedINames = expandedINames
|
||||
#warn(" NAMESPACE IS: '%s'" % d.ns)
|
||||
|
||||
#
|
||||
# Locals
|
||||
#
|
||||
locals = listOfLocals(varList);
|
||||
|
||||
# Take care of the return value of the last function call.
|
||||
if len(resultVarName) > 0:
|
||||
try:
|
||||
value = parseAndEvaluate(resultVarName)
|
||||
locals.append(Item(value, "return", resultVarName, "return"))
|
||||
except:
|
||||
# Don't bother. It's only supplementary information anyway.
|
||||
pass
|
||||
|
||||
for item in locals:
|
||||
with OutputSafer(d, "", ""):
|
||||
d.anonNumber = -1
|
||||
#warn("ITEM NAME %s: " % item.name)
|
||||
try:
|
||||
#warn("ITEM VALUE %s: " % item.value)
|
||||
# Throw on funny stuff, catch below.
|
||||
# Unfortunately, this fails also with a "Unicode encoding error"
|
||||
# in testArray().
|
||||
#dummy = str(item.value)
|
||||
pass
|
||||
except:
|
||||
# Locals with failing memory access.
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.put('name="%s",' % item.name)
|
||||
d.put('addr="<not accessible>",')
|
||||
d.put('value="<not accessible>",')
|
||||
d.put('type="%s",' % item.value.type)
|
||||
d.put('numchild="0"');
|
||||
continue
|
||||
|
||||
type = item.value.type
|
||||
if type.code == gdb.TYPE_CODE_PTR \
|
||||
and item.name == "argv" and str(type) == "char **":
|
||||
# Special handling for char** argv.
|
||||
n = 0
|
||||
p = item.value
|
||||
# p is 0 for "optimized out" cases.
|
||||
if not isNull(p):
|
||||
while not isNull(p.dereference()) and n <= 100:
|
||||
p += 1
|
||||
n += 1
|
||||
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.putName(item.name)
|
||||
d.putItemCount(select(n <= 100, n, "> 100"))
|
||||
d.putType(type)
|
||||
d.putNumChild(n)
|
||||
if d.isExpanded(item):
|
||||
p = item.value
|
||||
with Children(d, n):
|
||||
for i in xrange(n):
|
||||
value = p.dereference()
|
||||
d.putItem(Item(value, item.iname, i, None))
|
||||
p += 1
|
||||
if n > 100:
|
||||
d.putEllipsis()
|
||||
|
||||
else:
|
||||
# A "normal" local variable or parameter.
|
||||
try:
|
||||
value = parseAndEvaluate(resultVarName)
|
||||
locals.append(Item(value, "return", resultVarName, "return"))
|
||||
except:
|
||||
# Don't bother. It's only supplementary information anyway.
|
||||
pass
|
||||
|
||||
for item in locals:
|
||||
with OutputSafer(d, "", ""):
|
||||
d.anonNumber = -1
|
||||
#warn("ITEM NAME %s: " % item.name)
|
||||
try:
|
||||
#warn("ITEM VALUE %s: " % item.value)
|
||||
# Throw on funny stuff, catch below.
|
||||
# Unfortunately, this fails also with a "Unicode encoding error"
|
||||
# in testArray().
|
||||
#dummy = str(item.value)
|
||||
pass
|
||||
except:
|
||||
# Locals with failing memory access.
|
||||
addr = cleanAddress(item.value.address)
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.put('addr="%s",' % addr)
|
||||
d.putItemHelper(item)
|
||||
except AttributeError:
|
||||
# Thrown by cleanAddress with message "'NoneType' object
|
||||
# has no attribute 'cast'" for optimized-out values.
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.put('name="%s",' % item.name)
|
||||
d.put('addr="<not accessible>",')
|
||||
d.put('value="<not accessible>",')
|
||||
d.put('type="%s",' % item.value.type)
|
||||
d.put('numchild="0"');
|
||||
continue
|
||||
d.put('addr="<optimized out>",')
|
||||
d.put('value="<optimized out>",')
|
||||
d.put('type="%s"' % item.value.type)
|
||||
|
||||
type = item.value.type
|
||||
if type.code == gdb.TYPE_CODE_PTR \
|
||||
and item.name == "argv" and str(type) == "char **":
|
||||
# Special handling for char** argv.
|
||||
n = 0
|
||||
p = item.value
|
||||
# p is 0 for "optimized out" cases.
|
||||
if not isNull(p):
|
||||
while not isNull(p.dereference()) and n <= 100:
|
||||
p += 1
|
||||
n += 1
|
||||
#
|
||||
# Watchers
|
||||
#
|
||||
with OutputSafer(d, ",", ""):
|
||||
if len(watchers) > 0:
|
||||
for watcher in watchers.split("##"):
|
||||
(exp, iname) = watcher.split("#")
|
||||
handleWatch(d, exp, iname)
|
||||
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.putName(item.name)
|
||||
d.putItemCount(select(n <= 100, n, "> 100"))
|
||||
d.putType(type)
|
||||
d.putNumChild(n)
|
||||
if d.isExpanded(item):
|
||||
p = item.value
|
||||
with Children(d, n):
|
||||
for i in xrange(n):
|
||||
value = p.dereference()
|
||||
d.putItem(Item(value, item.iname, i, None))
|
||||
p += 1
|
||||
if n > 100:
|
||||
d.putEllipsis()
|
||||
#
|
||||
# Breakpoints
|
||||
#
|
||||
#listOfBreakpoints(d)
|
||||
|
||||
else:
|
||||
# A "normal" local variable or parameter.
|
||||
try:
|
||||
addr = cleanAddress(item.value.address)
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.put('addr="%s",' % addr)
|
||||
d.putItemHelper(item)
|
||||
except AttributeError:
|
||||
# Thrown by cleanAddress with message "'NoneType' object
|
||||
# has no attribute 'cast'" for optimized-out values.
|
||||
with SubItem(d):
|
||||
d.put('iname="%s",' % item.iname)
|
||||
d.put('name="%s",' % item.name)
|
||||
d.put('addr="<optimized out>",')
|
||||
d.put('value="<optimized out>",')
|
||||
d.put('type="%s"' % item.value.type)
|
||||
|
||||
#
|
||||
# Watchers
|
||||
#
|
||||
with OutputSafer(d, ",", ""):
|
||||
if len(watchers) > 0:
|
||||
for watcher in watchers.split("##"):
|
||||
(exp, iname) = watcher.split("#")
|
||||
self.handleWatch(d, exp, iname)
|
||||
|
||||
#
|
||||
# Breakpoints
|
||||
#
|
||||
#listOfBreakpoints(d)
|
||||
|
||||
#print('data=[' + locals + sep + watchers + '],bkpts=[' + breakpoints + ']\n')
|
||||
print('data=[' + d.output + ']')
|
||||
#print('data=[' + locals + sep + watchers + '],bkpts=[' + breakpoints + ']\n')
|
||||
print('data=[' + d.output + ']')
|
||||
|
||||
|
||||
def handleWatch(self, d, exp, iname):
|
||||
exp = str(exp)
|
||||
escapedExp = exp.replace('"', '\\"');
|
||||
#warn("HANDLING WATCH %s, INAME: '%s'" % (exp, iname))
|
||||
if exp.startswith("[") and exp.endswith("]"):
|
||||
#warn("EVAL: EXP: %s" % exp)
|
||||
with SubItem(d):
|
||||
d.putField("iname", iname)
|
||||
d.putField("name", escapedExp)
|
||||
d.putField("exp", escapedExp)
|
||||
try:
|
||||
list = eval(exp)
|
||||
d.putValue("")
|
||||
d.putType(" ")
|
||||
d.putNumChild(len(list))
|
||||
# This is a list of expressions to evaluate
|
||||
with Children(d, len(list)):
|
||||
itemNumber = 0
|
||||
for item in list:
|
||||
self.handleWatch(d, item, "%s.%d" % (iname, itemNumber))
|
||||
itemNumber += 1
|
||||
except RuntimeError, error:
|
||||
warn("EVAL: ERROR CAUGHT %s" % error)
|
||||
d.putValue("<syntax error>")
|
||||
d.putType(" ")
|
||||
d.putNumChild(0)
|
||||
with Children(d, 0):
|
||||
pass
|
||||
return
|
||||
|
||||
def handleWatch(d, exp, iname):
|
||||
exp = str(exp)
|
||||
escapedExp = exp.replace('"', '\\"');
|
||||
#warn("HANDLING WATCH %s, INAME: '%s'" % (exp, iname))
|
||||
if exp.startswith("[") and exp.endswith("]"):
|
||||
#warn("EVAL: EXP: %s" % exp)
|
||||
with SubItem(d):
|
||||
d.putField("iname", iname)
|
||||
d.putField("name", escapedExp)
|
||||
d.putField("exp", escapedExp)
|
||||
handled = False
|
||||
if exp == "<Edit>" or len(exp) == 0:
|
||||
d.put('value=" ",type=" ",numchild="0",')
|
||||
else:
|
||||
try:
|
||||
value = parseAndEvaluate(exp)
|
||||
item = Item(value, iname, None, None)
|
||||
if not value is None:
|
||||
d.putAddress(value.address)
|
||||
d.putItemHelper(item)
|
||||
except RuntimeError:
|
||||
d.put('value="<invalid>",type="<unknown>",numchild="0",')
|
||||
try:
|
||||
list = eval(exp)
|
||||
d.putValue("")
|
||||
d.putType(" ")
|
||||
d.putNumChild(len(list))
|
||||
# This is a list of expressions to evaluate
|
||||
with Children(d, len(list)):
|
||||
itemNumber = 0
|
||||
for item in list:
|
||||
handleWatch(d, item, "%s.%d" % (iname, itemNumber))
|
||||
itemNumber += 1
|
||||
except RuntimeError, error:
|
||||
warn("EVAL: ERROR CAUGHT %s" % error)
|
||||
d.putValue("<syntax error>")
|
||||
d.putType(" ")
|
||||
d.putNumChild(0)
|
||||
with Children(d, 0):
|
||||
pass
|
||||
return
|
||||
|
||||
with SubItem(d):
|
||||
d.putField("iname", iname)
|
||||
d.putField("name", escapedExp)
|
||||
d.putField("exp", escapedExp)
|
||||
handled = False
|
||||
if exp == "<Edit>" or len(exp) == 0:
|
||||
d.put('value=" ",type=" ",numchild="0",')
|
||||
else:
|
||||
try:
|
||||
value = parseAndEvaluate(exp)
|
||||
item = Item(value, iname, None, None)
|
||||
if not value is None:
|
||||
d.putAddress(value.address)
|
||||
d.putItemHelper(item)
|
||||
except RuntimeError:
|
||||
d.put('value="<invalid>",type="<unknown>",numchild="0",')
|
||||
|
||||
FrameCommand()
|
||||
|
||||
|
||||
#######################################################################
|
||||
|
@@ -195,13 +195,13 @@ QT_END_NAMESPACE
|
||||
#ifdef MACROSDEBUG
|
||||
Q_DECL_EXPORT char xDumpInBuffer[10000];
|
||||
Q_DECL_EXPORT char xDumpOutBuffer[1000000];
|
||||
#define inBuffer xDumpInBuffer
|
||||
#define outBuffer xDumpOutBuffer
|
||||
# define inBuffer xDumpInBuffer
|
||||
# define outBuffer xDumpOutBuffer
|
||||
#else
|
||||
Q_DECL_EXPORT char qDumpInBuffer[10000];
|
||||
Q_DECL_EXPORT char qDumpOutBuffer[1000000];
|
||||
#define inBuffer qDumpInBuffer
|
||||
#define outBuffer qDumpOutBuffer
|
||||
# define inBuffer qDumpInBuffer
|
||||
# define outBuffer qDumpOutBuffer
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
@@ -994,7 +994,7 @@ void qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr,
|
||||
}
|
||||
break;
|
||||
case 'O':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QObject *")) {
|
||||
if (addr) {
|
||||
const QObject *ob = reinterpret_cast<const QObject *>(addr);
|
||||
@@ -1010,7 +1010,7 @@ void qDumpInnerValueHelper(QDumper &d, const char *type, const void *addr,
|
||||
d.putItem("numchild", 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'S':
|
||||
if (isEqual(type, "QString")) {
|
||||
@@ -1246,13 +1246,13 @@ static void qDumpQDateTime(QDumper &d)
|
||||
d.putHash("isNull", date.isNull());
|
||||
d.putHash("toTime_t", (long)date.toTime_t());
|
||||
d.putHash("toString", date.toString());
|
||||
#if QT_VERSION >= 0x040500
|
||||
# if QT_VERSION >= 0x040500
|
||||
d.putHash("toString_(ISO)", date.toString(Qt::ISODate));
|
||||
d.putHash("toString_(SystemLocale)", date.toString(Qt::SystemLocaleDate));
|
||||
d.putHash("toString_(Locale)", date.toString(Qt::LocaleDate));
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#if 0
|
||||
# if 0
|
||||
d.beginHash();
|
||||
d.putItem("name", "toUTC");
|
||||
d.putItem("exp", "(("NSX"QDateTime"NSY"*)").put(d.data).put(")"
|
||||
@@ -1260,9 +1260,9 @@ static void qDumpQDateTime(QDumper &d)
|
||||
d.putItem("type", NS"QDateTime");
|
||||
d.putItem("numchild", "1");
|
||||
d.endHash();
|
||||
#endif
|
||||
# endif
|
||||
|
||||
#if 0
|
||||
# if 0
|
||||
d.beginHash();
|
||||
d.putItem("name", "toLocalTime");
|
||||
d.putItem("exp", "(("NSX"QDateTime"NSY"*)").put(d.data).put(")"
|
||||
@@ -1270,7 +1270,7 @@ static void qDumpQDateTime(QDumper &d)
|
||||
d.putItem("type", NS"QDateTime");
|
||||
d.putItem("numchild", "1");
|
||||
d.endHash();
|
||||
#endif
|
||||
# endif
|
||||
|
||||
d.endChildren();
|
||||
}
|
||||
@@ -2079,13 +2079,13 @@ static void qDumpQVariantHelper(const QVariant *v, QString *value,
|
||||
*value = QLatin1Char('"') + v->toString() + QLatin1Char('"');
|
||||
*numchild = 0;
|
||||
break;
|
||||
#if QT_VERSION >= 0x040500
|
||||
# if QT_VERSION >= 0x040500
|
||||
case QVariant::StringList:
|
||||
*exp = QString(QLatin1String("(*('"NS"QStringList'*)%1)"))
|
||||
.arg((quintptr)v);
|
||||
*numchild = v->toStringList().size();
|
||||
break;
|
||||
#endif
|
||||
# endif
|
||||
case QVariant::Int:
|
||||
*value = QString::number(v->toInt());
|
||||
*numchild= 0;
|
||||
@@ -2094,7 +2094,7 @@ static void qDumpQVariantHelper(const QVariant *v, QString *value,
|
||||
*value = QString::number(v->toDouble());
|
||||
*numchild = 0;
|
||||
break;
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
case QVariant::Point: {
|
||||
const QPoint p = v->toPoint();
|
||||
*value = QString::fromLatin1("%1, %2").arg(p.x()).arg(p.y());
|
||||
@@ -2138,8 +2138,8 @@ static void qDumpQVariantHelper(const QVariant *v, QString *value,
|
||||
}
|
||||
*numchild = 0;
|
||||
break;
|
||||
#endif // QT_BOOTSTRAPPED
|
||||
#if USE_QT_GUI
|
||||
# endif // QT_BOOTSTRAPPED
|
||||
# if USE_QT_GUI
|
||||
case QVariant::Font:
|
||||
*value = qvariant_cast<QFont>(*v).toString();
|
||||
break;
|
||||
@@ -2147,16 +2147,16 @@ static void qDumpQVariantHelper(const QVariant *v, QString *value,
|
||||
*value = qvariant_cast<QColor>(*v).name();
|
||||
break;
|
||||
case QVariant::KeySequence:
|
||||
#ifndef QT_NO_SHORTCUT
|
||||
# ifndef QT_NO_SHORTCUT
|
||||
*value = qvariant_cast<QKeySequence>(*v).toString();
|
||||
#else
|
||||
# else
|
||||
*value = QString::fromLatin1("Disabled by QT_NO_SHORTCUT");
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case QVariant::SizePolicy:
|
||||
*value = sizePolicyValue(qvariant_cast<QSizePolicy>(*v));
|
||||
break;
|
||||
#endif
|
||||
# endif
|
||||
default: {
|
||||
static const char *qTypeFormat = sizeof(void *) == sizeof(long)
|
||||
? "'"NS"%s "NS"qVariantValue<"NS"%s >'(*('"NS"QVariant'*)0x%lx)"
|
||||
@@ -3476,12 +3476,12 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpStdMap(d);
|
||||
break;
|
||||
case 'A':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QAbstractItemModel"))
|
||||
qDumpQAbstractItemModel(d);
|
||||
else if (isEqual(type, "QAbstractItem"))
|
||||
qDumpQAbstractItem(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'B':
|
||||
if (isEqual(type, "QByteArray"))
|
||||
@@ -3504,12 +3504,12 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpStdSet(d);
|
||||
break;
|
||||
case 'F':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QFile"))
|
||||
qDumpQFile(d);
|
||||
else if (isEqual(type, "QFileInfo"))
|
||||
qDumpQFileInfo(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'H':
|
||||
if (isEqual(type, "QHash"))
|
||||
@@ -3522,25 +3522,25 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpStdList(d);
|
||||
break;
|
||||
case 'I':
|
||||
#if USE_QT_GUI
|
||||
# if USE_QT_GUI
|
||||
if (isEqual(type, "QImage"))
|
||||
qDumpQImage(d);
|
||||
else if (isEqual(type, "QImageData"))
|
||||
qDumpQImageData(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'L':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QList"))
|
||||
qDumpQList(d);
|
||||
else if (isEqual(type, "QLinkedList"))
|
||||
qDumpQLinkedList(d);
|
||||
else if (isEqual(type, "QLocale"))
|
||||
qDumpQLocale(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'M':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QMap"))
|
||||
qDumpQMap(d);
|
||||
else if (isEqual(type, "QMapNode"))
|
||||
@@ -3549,10 +3549,10 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpQModelIndex(d);
|
||||
else if (isEqual(type, "QMultiMap"))
|
||||
qDumpQMultiMap(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'O':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QObject"))
|
||||
qDumpQObject(d);
|
||||
else if (isEqual(type, "QObjectPropertyList"))
|
||||
@@ -3571,43 +3571,43 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpQObjectSlotList(d);
|
||||
else if (isEqual(type, "QObjectChildList"))
|
||||
qDumpQObjectChildList(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'P':
|
||||
#if USE_QT_GUI
|
||||
# if USE_QT_GUI
|
||||
if (isEqual(type, "QPixmap"))
|
||||
qDumpQPixmap(d);
|
||||
#endif
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# endif
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QPoint"))
|
||||
qDumpQPoint(d);
|
||||
else if (isEqual(type, "QPointF"))
|
||||
qDumpQPointF(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'R':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QRect"))
|
||||
qDumpQRect(d);
|
||||
else if (isEqual(type, "QRectF"))
|
||||
qDumpQRectF(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'S':
|
||||
if (isEqual(type, "QString"))
|
||||
qDumpQString(d);
|
||||
else if (isEqual(type, "QStringList"))
|
||||
qDumpQStringList(d);
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
else if (isEqual(type, "QSet"))
|
||||
qDumpQSet(d);
|
||||
else if (isEqual(type, "QStack"))
|
||||
qDumpQVector(d);
|
||||
#if QT_VERSION >= 0x040500
|
||||
# if QT_VERSION >= 0x040500
|
||||
else if (isEqual(type, "QSharedPointer"))
|
||||
qDumpQSharedPointer(d);
|
||||
#endif
|
||||
#endif // QT_BOOTSTRAPPED
|
||||
# endif
|
||||
# endif // QT_BOOTSTRAPPED
|
||||
else if (isEqual(type, "QSize"))
|
||||
qDumpQSize(d);
|
||||
else if (isEqual(type, "QSizeF"))
|
||||
@@ -3634,13 +3634,13 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
qDumpStdWString(d);
|
||||
break;
|
||||
case 'T':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QTextCodec"))
|
||||
qDumpQTextCodec(d);
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'V':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
if (isEqual(type, "QVariantList")) { // resolve typedef
|
||||
d.outerType = "QList";
|
||||
d.innerType = "QVariant";
|
||||
@@ -3651,15 +3651,15 @@ static void handleProtocolVersion2and3(QDumper &d)
|
||||
} else if (isEqual(type, "QVector")) {
|
||||
qDumpQVector(d);
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
break;
|
||||
case 'W':
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
#if QT_VERSION >= 0x040500
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
# if QT_VERSION >= 0x040500
|
||||
if (isEqual(type, "QWeakPointer"))
|
||||
qDumpQWeakPointer(d);
|
||||
#endif
|
||||
#endif
|
||||
# endif
|
||||
# endif
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -3954,9 +3954,9 @@ void *qDumpObjectData440(
|
||||
}
|
||||
|
||||
else {
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
# ifndef QT_BOOTSTRAPPED
|
||||
qDebug() << "Unsupported protocol version" << protocolVersion;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
return outBuffer;
|
||||
}
|
||||
|
@@ -109,6 +109,7 @@ include(cdb/cdb.pri)
|
||||
include(gdb/gdb.pri)
|
||||
include(script/script.pri)
|
||||
include(pdb/pdb.pri)
|
||||
include(qml/qml.pri)
|
||||
include(tcf/tcf.pri)
|
||||
include(shared/shared.pri)
|
||||
|
||||
|
@@ -160,6 +160,7 @@ IDebuggerEngine *createGdbEngine(DebuggerManager *parent);
|
||||
IDebuggerEngine *createScriptEngine(DebuggerManager *parent);
|
||||
IDebuggerEngine *createPdbEngine(DebuggerManager *parent);
|
||||
IDebuggerEngine *createTcfEngine(DebuggerManager *parent);
|
||||
IDebuggerEngine *createQmlEngine(DebuggerManager *parent);
|
||||
|
||||
// The createCdbEngine function takes a list of options pages it can add to.
|
||||
// This allows for having a "enabled" toggle on the page independently
|
||||
@@ -198,7 +199,7 @@ using namespace TextEditor;
|
||||
|
||||
const char *DebuggerManager::stateName(int s)
|
||||
{
|
||||
#define SN(x) case x: return #x;
|
||||
# define SN(x) case x: return #x;
|
||||
switch (s) {
|
||||
SN(DebuggerNotReady)
|
||||
SN(EngineStarting)
|
||||
@@ -221,7 +222,7 @@ const char *DebuggerManager::stateName(int s)
|
||||
SN(EngineShuttingDown)
|
||||
}
|
||||
return "<unknown>";
|
||||
#undef SN
|
||||
# undef SN
|
||||
}
|
||||
|
||||
|
||||
@@ -254,6 +255,7 @@ static Debugger::Internal::IDebuggerEngine *gdbEngine = 0;
|
||||
static Debugger::Internal::IDebuggerEngine *scriptEngine = 0;
|
||||
static Debugger::Internal::IDebuggerEngine *cdbEngine = 0;
|
||||
static Debugger::Internal::IDebuggerEngine *pdbEngine = 0;
|
||||
static Debugger::Internal::IDebuggerEngine *qmlEngine = 0;
|
||||
static Debugger::Internal::IDebuggerEngine *tcfEngine = 0;
|
||||
|
||||
struct DebuggerManagerPrivate
|
||||
@@ -345,12 +347,13 @@ DebuggerManager::DebuggerManager(DebuggerPlugin *plugin)
|
||||
|
||||
DebuggerManager::~DebuggerManager()
|
||||
{
|
||||
#define doDelete(ptr) delete ptr; ptr = 0
|
||||
# define doDelete(ptr) delete ptr; ptr = 0
|
||||
doDelete(scriptEngine);
|
||||
doDelete(pdbEngine);
|
||||
doDelete(gdbEngine);
|
||||
doDelete(cdbEngine);
|
||||
doDelete(tcfEngine);
|
||||
doDelete(qmlEngine);
|
||||
|
||||
doDelete(d->m_breakHandler);
|
||||
doDelete(d->m_threadsHandler);
|
||||
@@ -359,12 +362,7 @@ DebuggerManager::~DebuggerManager()
|
||||
doDelete(d->m_snapshotHandler);
|
||||
doDelete(d->m_stackHandler);
|
||||
doDelete(d->m_watchHandler);
|
||||
|
||||
doDelete(gdbEngine);
|
||||
doDelete(scriptEngine);
|
||||
doDelete(cdbEngine);
|
||||
doDelete(tcfEngine);
|
||||
#undef doDelete
|
||||
# undef doDelete
|
||||
DebuggerManagerPrivate::instance = 0;
|
||||
delete d;
|
||||
}
|
||||
@@ -692,6 +690,11 @@ QList<Core::IOptionsPage*> DebuggerManager::initializeEngines(unsigned enabledTy
|
||||
tcfEngine->addOptionPages(&rc);
|
||||
}
|
||||
|
||||
if (enabledTypeFlags & QmlEngineType) {
|
||||
qmlEngine = createQmlEngine(this);
|
||||
//qmlEngine->addOptionPages(&rc);
|
||||
}
|
||||
|
||||
d->m_engine = 0;
|
||||
STATE_DEBUG(gdbEngine << cdbEngine << scriptEngine
|
||||
<< pdbEngine << rc.size());
|
||||
@@ -976,6 +979,15 @@ static IDebuggerEngine *debuggerEngineForExecutable(const QString &executable,
|
||||
QString *errorMessage,
|
||||
QString *settingsIdHint)
|
||||
{
|
||||
if (executable.endsWith(_("qmlviewer"))) {
|
||||
qDebug() << "HERE";
|
||||
if (!qmlEngine) {
|
||||
*errorMessage = msgEngineNotAvailable("Qml Engine");
|
||||
return 0;
|
||||
}
|
||||
return qmlEngine;
|
||||
}
|
||||
|
||||
if (executable.endsWith(_(".js"))) {
|
||||
if (!scriptEngine) {
|
||||
*errorMessage = msgEngineNotAvailable("Script Engine");
|
||||
@@ -1016,7 +1028,8 @@ static IDebuggerEngine *debuggerEngineForExecutable(const QString &executable,
|
||||
|
||||
// We need the CDB debugger in order to be able to debug VS
|
||||
// executables
|
||||
if (!DebuggerManager::instance()->checkDebugConfiguration(ProjectExplorer::ToolChain::MSVC, errorMessage, 0 , settingsIdHint))
|
||||
if (!DebuggerManager::instance()->checkDebugConfiguration(
|
||||
ProjectExplorer::ToolChain::MSVC, errorMessage, 0, settingsIdHint))
|
||||
return 0;
|
||||
return cdbEngine;
|
||||
#endif
|
||||
@@ -1049,6 +1062,7 @@ static IDebuggerEngine *debuggerEngineForMode(DebuggerStartMode startMode, QStri
|
||||
|
||||
void DebuggerManager::startNewDebugger(const DebuggerStartParametersPtr &sp)
|
||||
{
|
||||
qDebug() << "TARGET: " << sp->executable;
|
||||
if (d->m_state != DebuggerNotReady)
|
||||
return;
|
||||
d->m_startParameters = sp;
|
||||
@@ -1067,7 +1081,9 @@ void DebuggerManager::startNewDebugger(const DebuggerStartParametersPtr &sp)
|
||||
// Figure out engine: toolchain, executable, attach or default
|
||||
const DebuggerStartMode startMode = sp->startMode;
|
||||
|
||||
if (sp->executable.endsWith(_(".js")))
|
||||
if (sp->executable.endsWith(_("qmlviewer")))
|
||||
d->m_engine = qmlEngine;
|
||||
else if (sp->executable.endsWith(_(".js")))
|
||||
d->m_engine = scriptEngine;
|
||||
else if (sp->executable.endsWith(_(".py")))
|
||||
d->m_engine = pdbEngine;
|
||||
|
@@ -95,6 +95,7 @@ class CdbDumperInitThread;
|
||||
class CdbExceptionLoggerEventCallback;
|
||||
class GdbEngine;
|
||||
class TcfEngine;
|
||||
class QmlEngine;
|
||||
class CdbDebugEngine;
|
||||
class CdbDebugEnginePrivate;
|
||||
class TrkGdbAdapter;
|
||||
@@ -145,11 +146,13 @@ enum DebuggerEngineTypeFlags
|
||||
CdbEngineType = 0x04,
|
||||
PdbEngineType = 0x08,
|
||||
TcfEngineType = 0x10,
|
||||
QmlEngineType = 0x20,
|
||||
AllEngineTypes = GdbEngineType
|
||||
| ScriptEngineType
|
||||
| CdbEngineType
|
||||
| PdbEngineType
|
||||
| TcfEngineType
|
||||
| QmlEngineType
|
||||
};
|
||||
|
||||
QDebug operator<<(QDebug d, DebuggerState state);
|
||||
@@ -178,6 +181,7 @@ public:
|
||||
friend class Internal::ScriptEngine;
|
||||
friend class Internal::PdbEngine;
|
||||
friend class Internal::TcfEngine;
|
||||
friend class Internal::QmlEngine;
|
||||
friend class Internal::CdbDebugEngine;
|
||||
friend class Internal::CdbDebugEnginePrivate;
|
||||
friend class Internal::TrkGdbAdapter;
|
||||
|
@@ -637,11 +637,15 @@ static bool parseArgument(QStringList::const_iterator &it,
|
||||
*enabledEngines &= ~Debugger::GdbEngineType;
|
||||
return true;
|
||||
}
|
||||
if (option == _("-disable-qmldb")) {
|
||||
*enabledEngines &= ~Debugger::QmlEngineType;
|
||||
return true;
|
||||
}
|
||||
if (option == _("-disable-sdb")) {
|
||||
*enabledEngines &= ~Debugger::ScriptEngineType;
|
||||
return true;
|
||||
}
|
||||
if (option == QLatin1String("-disable-tcf")) {
|
||||
if (option == _("-disable-tcf")) {
|
||||
*enabledEngines &= ~TcfEngineType;
|
||||
return true;
|
||||
}
|
||||
@@ -1358,7 +1362,6 @@ void DebuggerPlugin::languageChanged(const QString &language)
|
||||
m_attachCoreAction->setVisible(debuggerIsCPP);
|
||||
m_startRemoteAction->setVisible(debuggerIsCPP);
|
||||
m_detachAction->setVisible(debuggerIsCPP);
|
||||
|
||||
}
|
||||
|
||||
void DebuggerPlugin::writeSettings() const
|
||||
@@ -1398,12 +1401,9 @@ void DebuggerPlugin::onModeChanged(IMode *mode)
|
||||
|
||||
if (isCurrentProjectCppBased())
|
||||
m_uiSwitcher->setActiveLanguage(LANG_CPP);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DebuggerPlugin::showSettingsDialog()
|
||||
{
|
||||
Core::ICore::instance()->showOptionsDialog(
|
||||
|
@@ -48,6 +48,7 @@
|
||||
namespace Debugger {
|
||||
namespace Internal {
|
||||
|
||||
using ProjectExplorer::BuildConfiguration;
|
||||
using ProjectExplorer::RunConfiguration;
|
||||
using ProjectExplorer::RunControl;
|
||||
using ProjectExplorer::LocalApplicationRunConfiguration;
|
||||
@@ -65,6 +66,7 @@ DebuggerRunControlFactory::DebuggerRunControlFactory(DebuggerManager *manager)
|
||||
|
||||
bool DebuggerRunControlFactory::canRun(RunConfiguration *runConfiguration, const QString &mode) const
|
||||
{
|
||||
// return mode == ProjectExplorer::Constants::DEBUGMODE;
|
||||
return mode == ProjectExplorer::Constants::DEBUGMODE
|
||||
&& qobject_cast<LocalApplicationRunConfiguration *>(runConfiguration);
|
||||
}
|
||||
@@ -130,8 +132,9 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager,
|
||||
break;
|
||||
}
|
||||
if (runConfiguration->target()->project()) {
|
||||
m_startParameters->buildDirectory =
|
||||
runConfiguration->target()->activeBuildConfiguration()->buildDirectory();
|
||||
BuildConfiguration *bc = runConfiguration->target()->activeBuildConfiguration();
|
||||
if (bc)
|
||||
m_startParameters->buildDirectory = bc->buildDirectory();
|
||||
}
|
||||
m_startParameters->useTerminal =
|
||||
runConfiguration->runMode() == LocalApplicationRunConfiguration::Console;
|
||||
|
@@ -224,9 +224,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
{
|
||||
PRECONDITION;
|
||||
WatchData data = data0;
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM:" << data.toString();
|
||||
#endif
|
||||
# endif
|
||||
QTC_ASSERT(data.isValid(), return);
|
||||
|
||||
// in any case we need the type first
|
||||
@@ -235,16 +235,16 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
// Let's play safe, though.
|
||||
if (!data.variable.isEmpty()) {
|
||||
// Update: It does so for out-of-scope watchers.
|
||||
#if 1
|
||||
# if 1
|
||||
qDebug() << "FIXME: GdbEngine::updateSubItem:"
|
||||
<< data.toString() << "should not happen";
|
||||
#else
|
||||
# else
|
||||
data.setType(WatchData::msgNotInScope());
|
||||
data.setValue(WatchData::msgNotInScope());
|
||||
data.setHasChildren(false);
|
||||
insertData(data);
|
||||
return;
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
// The WatchVarCreate handler will receive type information
|
||||
// and re-insert a WatchData item with correct type, so
|
||||
@@ -261,9 +261,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
if (data.isChildrenNeeded() && isPointerType(data.type)
|
||||
&& !hasDebuggingHelperForType(data.type)) {
|
||||
// We sometimes know what kind of children pointers have
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "IT'S A POINTER";
|
||||
#endif
|
||||
# endif
|
||||
|
||||
if (theDebuggerBoolSetting(AutoDerefPointers)) {
|
||||
// Try automatic dereferentiation
|
||||
@@ -286,9 +286,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
}
|
||||
|
||||
if (data.isValueNeeded() && hasDebuggingHelperForType(data.type)) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE";
|
||||
#endif
|
||||
# endif
|
||||
runDebuggingHelperClassic(data,
|
||||
manager()->watchHandler()->isExpandedIName(data.iname));
|
||||
return;
|
||||
@@ -296,9 +296,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
|
||||
/*
|
||||
if (data.isValueNeeded() && data.exp.isEmpty()) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: NO EXPRESSION?";
|
||||
#endif
|
||||
# endif
|
||||
data.setError("<no expression given>");
|
||||
insertData(data);
|
||||
return;
|
||||
@@ -306,9 +306,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
*/
|
||||
|
||||
if (data.isValueNeeded() && data.variable.isEmpty()) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: VARIABLE NEEDED FOR VALUE";
|
||||
#endif
|
||||
# endif
|
||||
createGdbVariableClassic(data);
|
||||
// the WatchVarCreate handler will re-insert a WatchData
|
||||
// item, with valueNeeded() set.
|
||||
@@ -317,9 +317,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
|
||||
if (data.isValueNeeded()) {
|
||||
QTC_ASSERT(!data.variable.isEmpty(), return); // tested above
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: VALUE";
|
||||
#endif
|
||||
# endif
|
||||
QByteArray cmd = "-var-evaluate-expression \"" + data.iname + '"';
|
||||
postCommand(cmd, WatchUpdate,
|
||||
CB(handleEvaluateExpressionClassic), QVariant::fromValue(data));
|
||||
@@ -327,17 +327,17 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
}
|
||||
|
||||
if (data.isChildrenNeeded() && hasDebuggingHelperForType(data.type)) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE WITH CHILDREN";
|
||||
#endif
|
||||
# endif
|
||||
runDebuggingHelperClassic(data, true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data.isChildrenNeeded() && data.variable.isEmpty()) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: VARIABLE NEEDED FOR CHILDREN";
|
||||
#endif
|
||||
# endif
|
||||
createGdbVariableClassic(data);
|
||||
// the WatchVarCreate handler will re-insert a WatchData
|
||||
// item, with childrenNeeded() set.
|
||||
@@ -353,9 +353,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
}
|
||||
|
||||
if (data.isHasChildrenNeeded() && hasDebuggingHelperForType(data.type)) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: CUSTOMVALUE WITH CHILDREN";
|
||||
#endif
|
||||
# endif
|
||||
runDebuggingHelperClassic(data,
|
||||
manager()->watchHandler()->isExpandedIName(data.iname));
|
||||
return;
|
||||
@@ -363,9 +363,9 @@ void GdbEngine::updateSubItemClassic(const WatchData &data0)
|
||||
|
||||
//#if !X
|
||||
if (data.isHasChildrenNeeded() && data.variable.isEmpty()) {
|
||||
#if DEBUG_SUBITEM
|
||||
# if DEBUG_SUBITEM
|
||||
qDebug() << "UPDATE SUBITEM: VARIABLE NEEDED FOR CHILDCOUNT";
|
||||
#endif
|
||||
# endif
|
||||
createGdbVariableClassic(data);
|
||||
// the WatchVarCreate handler will re-insert a WatchData
|
||||
// item, with childrenNeeded() set.
|
||||
|
@@ -657,13 +657,13 @@ void GdbEngine::readGdbStandardOutput()
|
||||
scan = newstart;
|
||||
if (end == start)
|
||||
continue;
|
||||
#if defined(Q_OS_WIN)
|
||||
# if defined(Q_OS_WIN)
|
||||
if (m_inbuffer.at(end - 1) == '\r') {
|
||||
--end;
|
||||
if (end == start)
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
m_busy = true;
|
||||
handleResponse(QByteArray::fromRawData(m_inbuffer.constData() + start, end - start));
|
||||
m_busy = false;
|
||||
@@ -1149,7 +1149,7 @@ void GdbEngine::handleAqcuiredInferior()
|
||||
|
||||
tryLoadDebuggingHelpers();
|
||||
|
||||
#ifndef Q_OS_MAC
|
||||
# ifndef Q_OS_MAC
|
||||
// intentionally after tryLoadDebuggingHelpers(),
|
||||
// otherwise we'd interrupt solib loading.
|
||||
if (theDebuggerBoolSetting(AllPluginBreakpoints)) {
|
||||
@@ -1166,7 +1166,7 @@ void GdbEngine::handleAqcuiredInferior()
|
||||
postCommand("set auto-solib-add off");
|
||||
postCommand("set stop-on-solib-events 0");
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
// It's nicer to see a bit of the world we live in.
|
||||
reloadModulesInternal();
|
||||
@@ -2847,7 +2847,7 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response)
|
||||
stackFrames.append(parseStackFrame(stack.childAt(i), i));
|
||||
const StackFrame &frame = stackFrames.back();
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
# if defined(Q_OS_WIN)
|
||||
const bool isBogus =
|
||||
// Assume this is wrong and points to some strange stl_algobase
|
||||
// implementation. Happens on Karsten's XP system with Gdb 5.50
|
||||
@@ -2863,7 +2863,7 @@ void GdbEngine::handleStackListFrames(const GdbResponse &response)
|
||||
showStatusMessage(tr("Jumping out of bogus frame..."), 1000);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
// Initialize top frame to the first valid frame.
|
||||
const bool isValid = frame.isUsable() && !frame.function.isEmpty();
|
||||
@@ -3401,11 +3401,11 @@ void GdbEngine::updateWatchDataHelper(const WatchData &data)
|
||||
{
|
||||
//m_pendingRequests = 0;
|
||||
PENDING_DEBUG("UPDATE WATCH DATA");
|
||||
#if DEBUG_PENDING
|
||||
# if DEBUG_PENDING
|
||||
//qDebug() << "##############################################";
|
||||
qDebug() << "UPDATE MODEL, FOUND INCOMPLETE:";
|
||||
//qDebug() << data.toString();
|
||||
#endif
|
||||
# endif
|
||||
|
||||
updateSubItemClassic(data);
|
||||
//PENDING_DEBUG("INTERNAL TRIGGERING UPDATE WATCH MODEL");
|
||||
|
@@ -1151,26 +1151,26 @@ void TrkGdbAdapter::handleTrkResult(const TrkResult &result)
|
||||
logMessage(QLatin1String("Ignoring stop at 0"));
|
||||
}
|
||||
|
||||
#if 1
|
||||
# if 1
|
||||
// We almost always need register values, so get them
|
||||
// now before informing gdb about the stop.s
|
||||
//qDebug() << "Auto-fetching registers";
|
||||
sendTrkMessage(0x12,
|
||||
TrkCB(handleAndReportReadRegistersAfterStop),
|
||||
trkReadRegistersMessage());
|
||||
#else
|
||||
# else
|
||||
// As a source-line step typically consists of
|
||||
// several instruction steps, better avoid the multiple
|
||||
// roundtrips through TRK in favour of an additional
|
||||
// roundtrip through gdb. But gdb will ask for all registers.
|
||||
#if 1
|
||||
# if 1
|
||||
sendGdbServerMessage("S05", "Target stopped");
|
||||
#else
|
||||
# else
|
||||
QByteArray ba = "T05";
|
||||
appendRegister(&ba, RegisterPSGdb, addr);
|
||||
sendGdbServerMessage(ba, "Registers");
|
||||
#endif
|
||||
#endif
|
||||
# endif
|
||||
# endif
|
||||
break;
|
||||
}
|
||||
case TrkNotifyException: { // 0x91 Notify Exception (obsolete)
|
||||
@@ -1522,14 +1522,14 @@ void TrkGdbAdapter::tryAnswerGdbMemoryRequest(bool buffered)
|
||||
// Happens when chunks are not combined
|
||||
QTC_ASSERT(false, /**/);
|
||||
debugMessage("CHUNKS NOT COMBINED");
|
||||
#ifdef MEMORY_DEBUG
|
||||
# ifdef MEMORY_DEBUG
|
||||
qDebug() << "CHUNKS NOT COMBINED";
|
||||
it = m_snapshot.memory.begin();
|
||||
et = m_snapshot.memory.end();
|
||||
for ( ; it != et; ++it)
|
||||
qDebug() << hexNumber(it.key().from) << hexNumber(it.key().to);
|
||||
qDebug() << "WANTED" << wanted.from << wanted.to;
|
||||
#endif
|
||||
# endif
|
||||
sendGdbServerMessage("E22", "");
|
||||
return;
|
||||
}
|
||||
|
9
src/plugins/debugger/qml/qml.pri
Normal file
9
src/plugins/debugger/qml/qml.pri
Normal file
@@ -0,0 +1,9 @@
|
||||
HEADERS += \
|
||||
$$PWD/qmlengine.h \
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/qmlengine.cpp \
|
||||
|
||||
FORMS +=
|
||||
|
||||
RESOURCES +=
|
544
src/plugins/debugger/qml/qmlengine.cpp
Normal file
544
src/plugins/debugger/qml/qmlengine.cpp
Normal file
@@ -0,0 +1,544 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#include "qmlengine.h"
|
||||
|
||||
#include "debuggerstringutils.h"
|
||||
#include "debuggerdialogs.h"
|
||||
#include "breakhandler.h"
|
||||
#include "debuggerconstants.h"
|
||||
#include "debuggermanager.h"
|
||||
#include "moduleshandler.h"
|
||||
#include "registerhandler.h"
|
||||
#include "stackhandler.h"
|
||||
#include "watchhandler.h"
|
||||
#include "watchutils.h"
|
||||
#include "moduleshandler.h"
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QtCore/QDateTime>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QTimer>
|
||||
|
||||
#include <QtGui/QAction>
|
||||
#include <QtGui/QApplication>
|
||||
#include <QtGui/QMainWindow>
|
||||
#include <QtGui/QMessageBox>
|
||||
#include <QtGui/QToolTip>
|
||||
|
||||
#include <QtNetwork/QTcpSocket>
|
||||
|
||||
#define DEBUG_QML 1
|
||||
#if DEBUG_QML
|
||||
# define SDEBUG(s) qDebug() << s
|
||||
#else
|
||||
# define SDEBUG(s)
|
||||
#endif
|
||||
# define XSDEBUG(s) qDebug() << s
|
||||
|
||||
#define CB(callback) &QmlEngine::callback, STRINGIFY(callback)
|
||||
|
||||
//#define USE_CONGESTION_CONTROL
|
||||
|
||||
|
||||
namespace Debugger {
|
||||
namespace Internal {
|
||||
|
||||
|
||||
class QmlResponse
|
||||
{
|
||||
public:
|
||||
QmlResponse() {}
|
||||
QmlResponse(const QByteArray &data_) : data(data_) {}
|
||||
|
||||
QString toString() const { return data; }
|
||||
|
||||
QByteArray data;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// QmlCommand
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
QString QmlEngine::QmlCommand::toString() const
|
||||
{
|
||||
return quoteUnprintableLatin1(command);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// QmlEngine
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
QmlEngine::QmlEngine(DebuggerManager *manager)
|
||||
: IDebuggerEngine(manager)
|
||||
{
|
||||
m_congestion = 0;
|
||||
m_inAir = 0;
|
||||
|
||||
m_sendTimer.setSingleShot(true);
|
||||
m_sendTimer.setInterval(100); // ms
|
||||
connect(&m_sendTimer, SIGNAL(timeout()), this, SLOT(handleSendTimer()));
|
||||
|
||||
m_socket = new QTcpSocket(this);
|
||||
connect(m_socket, SIGNAL(connected()), this, SLOT(socketConnected()));
|
||||
connect(m_socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
|
||||
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)),
|
||||
this, SLOT(socketError(QAbstractSocket::SocketError)));
|
||||
|
||||
//void aboutToClose ()
|
||||
//void bytesWritten ( qint64 bytes )
|
||||
//void readChannelFinished ()
|
||||
connect(m_socket, SIGNAL(readyRead()), this, SLOT(socketReadyRead()));
|
||||
|
||||
//connect(m_socket, SIGNAL(hostFound())
|
||||
//connect(m_socket, SIGNAL(proxyAuthenticationRequired(QNetworkProxy, QAuthenticator *)))
|
||||
//connect(m_socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),
|
||||
// thism SLOT(socketStateChanged(QAbstractSocket::SocketState)));
|
||||
}
|
||||
|
||||
QmlEngine::~QmlEngine()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::socketReadyRead()
|
||||
{
|
||||
//XSDEBUG("QmlEngine::socketReadyRead()");
|
||||
m_inbuffer.append(m_socket->readAll());
|
||||
int pos = 0;
|
||||
while (1) {
|
||||
// the "\3" is followed by either "\1" or "\2"
|
||||
int next = m_inbuffer.indexOf("\3", pos);
|
||||
//qDebug() << "pos: " << pos << "next: " << next;
|
||||
if (next == -1)
|
||||
break;
|
||||
handleResponse(m_inbuffer.mid(pos, next - pos));
|
||||
pos = next + 2;
|
||||
}
|
||||
m_inbuffer.clear();
|
||||
}
|
||||
|
||||
void QmlEngine::socketConnected()
|
||||
{
|
||||
showStatusMessage("Socket connected.");
|
||||
m_socket->waitForConnected(2000);
|
||||
//sendCommand("Locator", "redirect", "ID");
|
||||
}
|
||||
|
||||
void QmlEngine::socketDisconnected()
|
||||
{
|
||||
XSDEBUG("FIXME: QmlEngine::socketDisconnected()");
|
||||
}
|
||||
|
||||
void QmlEngine::socketError(QAbstractSocket::SocketError)
|
||||
{
|
||||
QString msg = tr("%1.").arg(m_socket->errorString());
|
||||
//QMessageBox::critical(q->mainWindow(), tr("Error"), msg);
|
||||
showStatusMessage(msg);
|
||||
manager()->notifyInferiorExited();
|
||||
}
|
||||
|
||||
void QmlEngine::executeDebuggerCommand(const QString &command)
|
||||
{
|
||||
QByteArray cmd = command.toUtf8();
|
||||
cmd = cmd.mid(cmd.indexOf(' ') + 1);
|
||||
QByteArray null;
|
||||
null.append('\0');
|
||||
// FIXME: works for single-digit escapes only
|
||||
cmd.replace("\\0", null);
|
||||
cmd.replace("\\1", "\1");
|
||||
cmd.replace("\\3", "\3");
|
||||
QmlCommand tcf;
|
||||
tcf.command = cmd;
|
||||
enqueueCommand(tcf);
|
||||
}
|
||||
|
||||
void QmlEngine::shutdown()
|
||||
{
|
||||
m_congestion = 0;
|
||||
m_inAir = 0;
|
||||
m_services.clear();
|
||||
exitDebugger();
|
||||
}
|
||||
|
||||
void QmlEngine::exitDebugger()
|
||||
{
|
||||
SDEBUG("QmlEngine::exitDebugger()");
|
||||
manager()->notifyInferiorExited();
|
||||
}
|
||||
|
||||
void QmlEngine::startDebugger(const DebuggerStartParametersPtr &sp)
|
||||
{
|
||||
qDebug() << "STARTING QML ENGINE";
|
||||
setState(InferiorRunningRequested);
|
||||
showStatusMessage(tr("Running requested..."), 5000);
|
||||
const int pos = sp->remoteChannel.indexOf(QLatin1Char(':'));
|
||||
const QString host = sp->remoteChannel.left(pos);
|
||||
const quint16 port = sp->remoteChannel.mid(pos + 1).toInt();
|
||||
//QTimer::singleShot(0, this, SLOT(runInferior()));
|
||||
m_socket->connectToHost(host, port);
|
||||
emit startSuccessful();
|
||||
}
|
||||
|
||||
void QmlEngine::continueInferior()
|
||||
{
|
||||
SDEBUG("QmlEngine::continueInferior()");
|
||||
}
|
||||
|
||||
void QmlEngine::runInferior()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::interruptInferior()
|
||||
{
|
||||
XSDEBUG("QmlEngine::interruptInferior()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeStep()
|
||||
{
|
||||
//SDEBUG("QmlEngine::executeStep()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeStepI()
|
||||
{
|
||||
//SDEBUG("QmlEngine::executeStepI()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeStepOut()
|
||||
{
|
||||
//SDEBUG("QmlEngine::executeStepOut()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeNext()
|
||||
{
|
||||
//SDEBUG("QmlEngine::nextExec()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeNextI()
|
||||
{
|
||||
//SDEBUG("QmlEngine::executeNextI()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeRunToLine(const QString &fileName, int lineNumber)
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
Q_UNUSED(lineNumber)
|
||||
SDEBUG("FIXME: QmlEngine::executeRunToLine()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeRunToFunction(const QString &functionName)
|
||||
{
|
||||
Q_UNUSED(functionName)
|
||||
XSDEBUG("FIXME: QmlEngine::executeRunToFunction()");
|
||||
}
|
||||
|
||||
void QmlEngine::executeJumpToLine(const QString &fileName, int lineNumber)
|
||||
{
|
||||
Q_UNUSED(fileName)
|
||||
Q_UNUSED(lineNumber)
|
||||
XSDEBUG("FIXME: QmlEngine::executeJumpToLine()");
|
||||
}
|
||||
|
||||
void QmlEngine::activateFrame(int index)
|
||||
{
|
||||
Q_UNUSED(index)
|
||||
}
|
||||
|
||||
void QmlEngine::selectThread(int index)
|
||||
{
|
||||
Q_UNUSED(index)
|
||||
}
|
||||
|
||||
void QmlEngine::attemptBreakpointSynchronization()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::loadSymbols(const QString &moduleName)
|
||||
{
|
||||
Q_UNUSED(moduleName)
|
||||
}
|
||||
|
||||
void QmlEngine::loadAllSymbols()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::reloadModules()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::requestModuleSymbols(const QString &moduleName)
|
||||
{
|
||||
Q_UNUSED(moduleName)
|
||||
}
|
||||
|
||||
|
||||
void QmlEngine::handleResponse(const QByteArray &response)
|
||||
{
|
||||
Q_UNUSED(response);
|
||||
/*
|
||||
static QTime lastTime;
|
||||
|
||||
//debugMessage(_(" "), currentTime());
|
||||
QList<QByteArray> parts = response.split('\0');
|
||||
if (parts.size() < 2 || !parts.last().isEmpty()) {
|
||||
SDEBUG("WRONG RESPONSE PACKET LAYOUT" << parts);
|
||||
//if (response.isEmpty())
|
||||
acknowledgeResult();
|
||||
return;
|
||||
}
|
||||
parts.removeLast(); // always empty
|
||||
QByteArray tag = parts.at(0);
|
||||
int n = parts.size();
|
||||
if (n == 2 && tag == "N") { // unidentified command
|
||||
int token = parts.at(1).toInt();
|
||||
QmlCommand tcf = m_cookieForToken[token];
|
||||
SDEBUG("COMMAND NOT RECOGNIZED FOR TOKEN" << token << tcf.toString());
|
||||
showDebuggerOutput(LogOutput, QString::number(token) + "^"
|
||||
+ "NOT RECOQNIZED: " + quoteUnprintableLatin1(response));
|
||||
acknowledgeResult();
|
||||
} else if (n == 2 && tag == "F") { // flow control
|
||||
m_congestion = parts.at(1).toInt();
|
||||
SDEBUG("CONGESTION: " << m_congestion);
|
||||
} else if (n == 4 && tag == "R") { // result data
|
||||
acknowledgeResult();
|
||||
int token = parts.at(1).toInt();
|
||||
QByteArray message = parts.at(2);
|
||||
QmlResponse data(parts.at(3));
|
||||
showDebuggerOutput(LogOutput, QString("%1^%2%3").arg(token)
|
||||
.arg(quoteUnprintableLatin1(response))
|
||||
.arg(QString::fromUtf8(data.toString())));
|
||||
QmlCommand tcf = m_cookieForToken[token];
|
||||
QmlResponse result(data);
|
||||
SDEBUG("GOOD RESPONSE: " << quoteUnprintableLatin1(response));
|
||||
if (tcf.callback)
|
||||
(this->*(tcf.callback))(result, tcf.cookie);
|
||||
} else if (n == 3 && tag == "P") { // progress data (partial result)
|
||||
//int token = parts.at(1).toInt();
|
||||
QByteArray data = parts.at(2);
|
||||
SDEBUG(_("\nTCF PARTIAL:") << quoteUnprintableLatin1(response));
|
||||
} else if (n == 4 && tag == "E") { // an event
|
||||
QByteArray service = parts.at(1);
|
||||
QByteArray eventName = parts.at(2);
|
||||
QmlResponse data(parts.at(3));
|
||||
if (eventName != "peerHeartBeat")
|
||||
SDEBUG(_("\nTCF EVENT:") << quoteUnprintableLatin1(response)
|
||||
<< data.toString());
|
||||
if (service == "Locator" && eventName == "Hello") {
|
||||
m_services.clear();
|
||||
foreach (const QmlResponse &service, data.children())
|
||||
m_services.append(service.data());
|
||||
QTimer::singleShot(0, this, SLOT(startDebugging()));
|
||||
}
|
||||
} else {
|
||||
SDEBUG("UNKNOWN RESPONSE PACKET:"
|
||||
<< quoteUnprintableLatin1(response) << parts);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void QmlEngine::startDebugging()
|
||||
{
|
||||
qDebug() << "START";
|
||||
}
|
||||
|
||||
void QmlEngine::postCommand(const QByteArray &cmd,
|
||||
QmlCommandCallback callback, const char *callbackName)
|
||||
{
|
||||
/*
|
||||
static int token = 20;
|
||||
++token;
|
||||
|
||||
//const char marker_eom = -1;
|
||||
//const char marker_eos = -2;
|
||||
//const char marker_null = -3;
|
||||
|
||||
QByteArray ba = "C";
|
||||
ba.append('\0');
|
||||
ba.append(QByteArray::number(token));
|
||||
ba.append('\0');
|
||||
ba.append(cmd);
|
||||
ba.append('\0');
|
||||
ba.append('\3');
|
||||
ba.append('\1');
|
||||
|
||||
QmlCommand tcf;
|
||||
tcf.command = ba;
|
||||
tcf.callback = callback;
|
||||
tcf.callbackName = callbackName;
|
||||
tcf.token = token;
|
||||
|
||||
m_cookieForToken[token] = tcf;
|
||||
|
||||
enqueueCommand(tcf);
|
||||
*/
|
||||
}
|
||||
|
||||
// Congestion control does not seem to work that way. Basically it's
|
||||
// already too late when we get a flow control packet
|
||||
void QmlEngine::enqueueCommand(const QmlCommand &cmd)
|
||||
{
|
||||
/*
|
||||
#ifdef USE_CONGESTION_CONTROL
|
||||
// congestion controled
|
||||
if (m_congestion <= 0 && m_sendQueue.isEmpty()) {
|
||||
//SDEBUG("DIRECT SEND" << cmd.toString());
|
||||
sendCommandNow(cmd);
|
||||
} else {
|
||||
SDEBUG("QUEUE " << cmd.toString());
|
||||
m_sendQueue.enqueue(cmd);
|
||||
m_sendTimer.start();
|
||||
}
|
||||
#else
|
||||
// synchrounously
|
||||
if (m_inAir == 0)
|
||||
sendCommandNow(cmd);
|
||||
else
|
||||
m_sendQueue.enqueue(cmd);
|
||||
#endif
|
||||
*/
|
||||
}
|
||||
|
||||
void QmlEngine::handleSendTimer()
|
||||
{
|
||||
/*
|
||||
QTC_ASSERT(!m_sendQueue.isEmpty(), return);
|
||||
|
||||
if (m_congestion > 0) {
|
||||
// not ready...
|
||||
SDEBUG("WAITING FOR CONGESTION TO GO DOWN...");
|
||||
m_sendTimer.start();
|
||||
} else {
|
||||
// go!
|
||||
sendCommandNow(m_sendQueue.dequeue());
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void QmlEngine::sendCommandNow(const QmlCommand &cmd)
|
||||
{
|
||||
++m_inAir;
|
||||
int result = m_socket->write(cmd.command);
|
||||
Q_UNUSED(result)
|
||||
m_socket->flush();
|
||||
showDebuggerInput(LogInput, QString::number(cmd.token) + " " + cmd.toString());
|
||||
SDEBUG("SEND " << cmd.toString()); //<< " " << QString::number(result));
|
||||
}
|
||||
|
||||
void QmlEngine::acknowledgeResult()
|
||||
{
|
||||
#if !defined(USE_CONGESTION_CONTROL)
|
||||
QTC_ASSERT(m_inAir == 1, /**/);
|
||||
m_inAir = 0;
|
||||
if (!m_sendQueue.isEmpty())
|
||||
sendCommandNow(m_sendQueue.dequeue());
|
||||
#endif
|
||||
}
|
||||
|
||||
void QmlEngine::handleRunControlSuspend(const QmlResponse &data, const QVariant &)
|
||||
{
|
||||
SDEBUG("HANDLE RESULT" << data.toString());
|
||||
}
|
||||
|
||||
void QmlEngine::handleRunControlGetChildren(const QmlResponse &data, const QVariant &)
|
||||
{
|
||||
SDEBUG("HANDLE RUN CONTROL GET CHILDREN" << data.toString());
|
||||
}
|
||||
|
||||
void QmlEngine::handleSysMonitorGetChildren(const QmlResponse &data, const QVariant &)
|
||||
{
|
||||
SDEBUG("HANDLE RUN CONTROL GET CHILDREN" << data.toString());
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Tooltip specific stuff
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
static WatchData m_toolTip;
|
||||
static QPoint m_toolTipPos;
|
||||
static QHash<QString, WatchData> m_toolTipCache;
|
||||
|
||||
void QmlEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos)
|
||||
{
|
||||
Q_UNUSED(mousePos)
|
||||
Q_UNUSED(editor)
|
||||
Q_UNUSED(cursorPos)
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Watch specific stuff
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
void QmlEngine::assignValueInDebugger(const QString &expression,
|
||||
const QString &value)
|
||||
{
|
||||
XSDEBUG("ASSIGNING: " << expression + '=' + value);
|
||||
updateLocals();
|
||||
}
|
||||
|
||||
void QmlEngine::updateLocals()
|
||||
{
|
||||
}
|
||||
|
||||
void QmlEngine::updateWatchData(const WatchData &)
|
||||
{
|
||||
//qq->watchHandler()->rebuildModel();
|
||||
showStatusMessage(tr("Stopped."), 5000);
|
||||
}
|
||||
|
||||
void QmlEngine::updateSubItem(const WatchData &data0)
|
||||
{
|
||||
Q_UNUSED(data0)
|
||||
QTC_ASSERT(false, return);
|
||||
}
|
||||
|
||||
void QmlEngine::debugMessage(const QString &msg)
|
||||
{
|
||||
showDebuggerOutput(LogDebug, msg);
|
||||
}
|
||||
|
||||
IDebuggerEngine *createQmlEngine(DebuggerManager *manager)
|
||||
{
|
||||
return new QmlEngine(manager);
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Debugger
|
168
src/plugins/debugger/qml/qmlengine.h
Normal file
168
src/plugins/debugger/qml/qmlengine.h
Normal file
@@ -0,0 +1,168 @@
|
||||
/**************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||
**
|
||||
** Commercial Usage
|
||||
**
|
||||
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||
** accordance with the Qt Commercial License Agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and Nokia.
|
||||
**
|
||||
** GNU Lesser General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||
** General Public License version 2.1 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||
** packaging of this file. Please review the following information to
|
||||
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** If you are unsure which license is appropriate for your use, please
|
||||
** contact the sales department at http://qt.nokia.com/contact.
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef DEBUGGER_QMLENGINE_H
|
||||
#define DEBUGGER_QMLENGINE_H
|
||||
|
||||
#include <QtCore/QByteArray>
|
||||
#include <QtCore/QHash>
|
||||
#include <QtCore/QMap>
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QPoint>
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtCore/QQueue>
|
||||
#include <QtCore/QSet>
|
||||
#include <QtCore/QTimer>
|
||||
#include <QtCore/QVariant>
|
||||
|
||||
#include <QtNetwork/QAbstractSocket>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTcpSocket;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#include "idebuggerengine.h"
|
||||
#include "debuggermanager.h"
|
||||
|
||||
namespace Debugger {
|
||||
namespace Internal {
|
||||
|
||||
class ScriptAgent;
|
||||
class WatchData;
|
||||
class QmlResponse;
|
||||
|
||||
class QmlEngine : public IDebuggerEngine
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QmlEngine(DebuggerManager *parent);
|
||||
~QmlEngine();
|
||||
|
||||
private:
|
||||
// IDebuggerEngine implementation
|
||||
void executeStep();
|
||||
void executeStepOut();
|
||||
void executeNext();
|
||||
void executeStepI();
|
||||
void executeNextI();
|
||||
|
||||
void shutdown();
|
||||
void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos);
|
||||
void startDebugger(const DebuggerStartParametersPtr &sp);
|
||||
void exitDebugger();
|
||||
|
||||
void continueInferior();
|
||||
Q_SLOT void runInferior();
|
||||
void interruptInferior();
|
||||
|
||||
void executeRunToLine(const QString &fileName, int lineNumber);
|
||||
void executeRunToFunction(const QString &functionName);
|
||||
void executeJumpToLine(const QString &fileName, int lineNumber);
|
||||
|
||||
void activateFrame(int index);
|
||||
void selectThread(int index);
|
||||
|
||||
void attemptBreakpointSynchronization();
|
||||
|
||||
void assignValueInDebugger(const QString &expr, const QString &value);
|
||||
void executeDebuggerCommand(const QString & command);
|
||||
|
||||
void loadSymbols(const QString &moduleName);
|
||||
void loadAllSymbols();
|
||||
void requestModuleSymbols(const QString &moduleName);
|
||||
void reloadModules();
|
||||
void reloadRegisters() {}
|
||||
void reloadSourceFiles() {}
|
||||
void reloadFullStack() {}
|
||||
|
||||
bool supportsThreads() const { return true; }
|
||||
void maybeBreakNow(bool byFunction);
|
||||
void updateWatchData(const WatchData &data);
|
||||
void updateLocals();
|
||||
void updateSubItem(const WatchData &data);
|
||||
|
||||
Q_SLOT void socketConnected();
|
||||
Q_SLOT void socketDisconnected();
|
||||
Q_SLOT void socketError(QAbstractSocket::SocketError);
|
||||
Q_SLOT void socketReadyRead();
|
||||
|
||||
void handleResponse(const QByteArray &ba);
|
||||
void handleRunControlSuspend(const QmlResponse &response, const QVariant &);
|
||||
void handleRunControlGetChildren(const QmlResponse &response, const QVariant &);
|
||||
void handleSysMonitorGetChildren(const QmlResponse &response, const QVariant &);
|
||||
|
||||
private:
|
||||
Q_SLOT void startDebugging();
|
||||
|
||||
typedef void (QmlEngine::*QmlCommandCallback)
|
||||
(const QmlResponse &record, const QVariant &cookie);
|
||||
|
||||
struct QmlCommand
|
||||
{
|
||||
QmlCommand() : flags(0), token(-1), callback(0), callbackName(0) {}
|
||||
|
||||
QString toString() const;
|
||||
|
||||
int flags;
|
||||
int token;
|
||||
QmlCommandCallback callback;
|
||||
const char *callbackName;
|
||||
QByteArray command;
|
||||
QVariant cookie;
|
||||
};
|
||||
|
||||
void postCommand(const QByteArray &cmd,
|
||||
QmlCommandCallback callback = 0, const char *callbackName = 0);
|
||||
void sendCommandNow(const QmlCommand &command);
|
||||
void debugMessage(const QString &msg);
|
||||
|
||||
QHash<int, QmlCommand> m_cookieForToken;
|
||||
|
||||
QQueue<QmlCommand> m_sendQueue;
|
||||
|
||||
// timer based congestion control. does not seem to work well.
|
||||
void enqueueCommand(const QmlCommand &command);
|
||||
Q_SLOT void handleSendTimer();
|
||||
int m_congestion;
|
||||
QTimer m_sendTimer;
|
||||
|
||||
// synchrounous communication
|
||||
void acknowledgeResult();
|
||||
int m_inAir;
|
||||
|
||||
QTcpSocket *m_socket;
|
||||
QByteArray m_inbuffer;
|
||||
QList<QByteArray> m_services;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Debugger
|
||||
|
||||
#endif // DEBUGGER_QMLENGINE_H
|
@@ -172,9 +172,9 @@ void StackWindow::copyContentsToClipboard()
|
||||
str += '\n';
|
||||
}
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
#ifdef Q_WS_X11
|
||||
# ifdef Q_WS_X11
|
||||
clipboard->setText(str, QClipboard::Selection);
|
||||
#endif
|
||||
# endif
|
||||
clipboard->setText(str, QClipboard::Clipboard);
|
||||
}
|
||||
|
||||
|
@@ -733,7 +733,7 @@ void FakeVimPluginPrivate::setActionChecked(const QString &code, bool check)
|
||||
|
||||
void FakeVimPluginPrivate::windowCommand(int key)
|
||||
{
|
||||
#define control(n) (256 + n)
|
||||
# define control(n) (256 + n)
|
||||
QString code;
|
||||
switch (key) {
|
||||
case 'c': case 'C': case control('c'):
|
||||
@@ -756,7 +756,7 @@ void FakeVimPluginPrivate::windowCommand(int key)
|
||||
code = Core::Constants::GOTO_OTHER_SPLIT;
|
||||
break;
|
||||
}
|
||||
#undef control
|
||||
# undef control
|
||||
//qDebug() << "RUNNING WINDOW COMMAND: " << key << code;
|
||||
if (code.isEmpty()) {
|
||||
//qDebug() << "UNKNOWN WINDOWS COMMAND: " << key;
|
||||
|
@@ -45,11 +45,11 @@ NavigatorTreeModel::NavigatorTreeModel(QObject *parent)
|
||||
{
|
||||
invisibleRootItem()->setFlags(Qt::ItemIsDropEnabled);
|
||||
|
||||
#ifdef _LOCK_ITEMS_
|
||||
# ifdef _LOCK_ITEMS_
|
||||
setColumnCount(3);
|
||||
#else
|
||||
# else
|
||||
setColumnCount(2);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
setSupportedDragActions(Qt::LinkAction);
|
||||
|
||||
@@ -194,14 +194,14 @@ NavigatorTreeModel::ItemRow NavigatorTreeModel::createItemRow(const ModelNode &n
|
||||
idItem->setEditable(true);
|
||||
idItem->setData(hash, Qt::UserRole);
|
||||
|
||||
#ifdef _LOCK_ITEMS_
|
||||
# ifdef _LOCK_ITEMS_
|
||||
QStandardItem *lockItem = new QStandardItem;
|
||||
lockItem->setDragEnabled(true);
|
||||
lockItem->setDropEnabled(dropEnabled);
|
||||
lockItem->setEditable(false);
|
||||
lockItem->setCheckable(true);
|
||||
lockItem->setData(hash, Qt::UserRole);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
QStandardItem *visibilityItem = new QStandardItem;
|
||||
visibilityItem->setDropEnabled(dropEnabled);
|
||||
@@ -212,11 +212,11 @@ NavigatorTreeModel::ItemRow NavigatorTreeModel::createItemRow(const ModelNode &n
|
||||
visibilityItem->setCheckable(false);
|
||||
}
|
||||
|
||||
#ifdef _LOCK_ITEMS_
|
||||
# ifdef _LOCK_ITEMS_
|
||||
return ItemRow(idItem, lockItem, visibilityItem);
|
||||
#else
|
||||
# else
|
||||
return ItemRow(idItem, visibilityItem);
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void NavigatorTreeModel::updateItemRow(const ModelNode &node, ItemRow items)
|
||||
|
@@ -27,7 +27,7 @@
|
||||
**
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef PROPERTYPARSER_H
|
||||
#ifndef PROPERTYPARSER_H
|
||||
#define PROPERTYPARSER_H
|
||||
|
||||
#include <QtCore/QVariant>
|
||||
|
@@ -32,17 +32,17 @@
|
||||
namespace QmlProjectManager {
|
||||
namespace Constants {
|
||||
|
||||
const char * const QML_RC_ID("QmlProjectManager.QmlRunConfiguration");
|
||||
const char * const QML_RC_DISPLAY_NAME(QT_TRANSLATE_NOOP("QmlProjectManager::Internal::QmlRunConfiguration", "QML Viewer"));
|
||||
const char * const QML_VIEWER_KEY("QmlProjectManager.QmlRunConfiguration.QDeclarativeViewer");
|
||||
const char * const QML_VIEWER_ARGUMENTS_KEY("QmlProjectManager.QmlRunConfiguration.QDeclarativeViewerArguments");
|
||||
const char * const QML_VIEWER_TARGET_ID("QmlProjectManager.QmlTarget");
|
||||
const char * const QML_VIEWER_TARGET_DISPLAY_NAME("QML Viewer");
|
||||
const char * const QML_MAINSCRIPT_KEY("QmlProjectManager.QmlRunConfiguration.MainScript");
|
||||
const char * const QML_DEBUG_SERVER_ADDRESS_KEY("QmlProjectManager.QmlRunConfiguration.DebugServerAddress");
|
||||
const char * const QML_DEBUG_SERVER_PORT_KEY("QmlProjectManager.QmlRunConfiguration.DebugServerPort");
|
||||
const char * const QML_RC_ID = "QmlProjectManager.QmlRunConfiguration";
|
||||
const char * const QML_RC_DISPLAY_NAME = QT_TRANSLATE_NOOP("QmlProjectManager::Internal::QmlRunConfiguration", "QML Viewer");
|
||||
const char * const QML_VIEWER_KEY = "QmlProjectManager.QmlRunConfiguration.QDeclarativeViewer";
|
||||
const char * const QML_VIEWER_ARGUMENTS_KEY = "QmlProjectManager.QmlRunConfiguration.QDeclarativeViewerArguments";
|
||||
const char * const QML_VIEWER_TARGET_ID = "QmlProjectManager.QmlTarget";
|
||||
const char * const QML_VIEWER_TARGET_DISPLAY_NAME = "QML Viewer";
|
||||
const char * const QML_MAINSCRIPT_KEY = "QmlProjectManager.QmlRunConfiguration.MainScript";
|
||||
const char * const QML_DEBUG_SERVER_ADDRESS_KEY = "QmlProjectManager.QmlRunConfiguration.DebugServerAddress";
|
||||
const char * const QML_DEBUG_SERVER_PORT_KEY = "QmlProjectManager.QmlRunConfiguration.DebugServerPort";
|
||||
|
||||
const int QML_DEFAULT_DEBUG_SERVER_PORT(3768);
|
||||
const int QML_DEFAULT_DEBUG_SERVER_PORT = 3768;
|
||||
|
||||
} // namespace Constants
|
||||
} // namespace QmlProjectManager
|
||||
|
@@ -72,13 +72,13 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::create(Pro
|
||||
{
|
||||
if (!canCreate(parent, id))
|
||||
return 0;
|
||||
QmlProjectTarget *qmlparent(static_cast<QmlProjectTarget *>(parent));
|
||||
QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent);
|
||||
return new QmlProjectRunConfiguration(qmlparent);
|
||||
}
|
||||
|
||||
bool QmlProjectRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
|
||||
{
|
||||
QString id(ProjectExplorer::idFromMap(map));
|
||||
QString id = ProjectExplorer::idFromMap(map);
|
||||
return canCreate(parent, id);
|
||||
}
|
||||
|
||||
@@ -86,8 +86,8 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::restore(Pr
|
||||
{
|
||||
if (!canRestore(parent, map))
|
||||
return 0;
|
||||
QmlProjectTarget *qmlparent(static_cast<QmlProjectTarget *>(parent));
|
||||
QmlProjectRunConfiguration *rc(new QmlProjectRunConfiguration(qmlparent));
|
||||
QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent);
|
||||
QmlProjectRunConfiguration *rc = new QmlProjectRunConfiguration(qmlparent);
|
||||
if (rc->fromMap(map))
|
||||
return rc;
|
||||
delete rc;
|
||||
@@ -104,7 +104,7 @@ ProjectExplorer::RunConfiguration *QmlProjectRunConfigurationFactory::clone(Proj
|
||||
{
|
||||
if (!canClone(parent, source))
|
||||
return 0;
|
||||
QmlProjectTarget *qmlparent(static_cast<QmlProjectTarget *>(parent));
|
||||
QmlProjectTarget *qmlparent = static_cast<QmlProjectTarget *>(parent);
|
||||
return new QmlProjectRunConfiguration(qmlparent, qobject_cast<QmlProjectRunConfiguration *>(source));
|
||||
}
|
||||
|
||||
|
@@ -791,7 +791,10 @@ QMessageBox *S60DeviceRunControlBase::createTrkWaitingMessageBox(const QString &
|
||||
const QString title = QCoreApplication::translate("Qt4ProjectManager::Internal::S60DeviceRunControlBase",
|
||||
"Waiting for App TRK");
|
||||
const QString text = QCoreApplication::translate("Qt4ProjectManager::Internal::S60DeviceRunControlBase",
|
||||
"Please start App TRK on %1.").arg(port);
|
||||
"Qt creator waiting for the TRK application.<br>"
|
||||
"Please make sure the application is running on "
|
||||
"your mobile phone and the right port is "
|
||||
"configured in the project settings.").arg(port);
|
||||
QMessageBox *rc = new QMessageBox(QMessageBox::Information, title, text,
|
||||
QMessageBox::Cancel, parent);
|
||||
return rc;
|
||||
|
@@ -58,9 +58,9 @@
|
||||
/* Required headers for select() according to POSIX.1-2001 */
|
||||
# include <sys/select.h>
|
||||
/* Required headers for select() according to earlier standards:
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
# include <sys/time.h>
|
||||
# include <sys/types.h>
|
||||
# include <unistd.h>
|
||||
*/
|
||||
#endif
|
||||
|
||||
|
@@ -101,15 +101,15 @@ bool patchBinariesWithQtPathes(const char *baseQtPath)
|
||||
bool result = true;
|
||||
|
||||
static const char *filesToPatch[] = {
|
||||
#ifdef Q_OS_WIN
|
||||
# ifdef Q_OS_WIN
|
||||
"/bin/qmake.exe",
|
||||
"/bin/QtCore4.dll",
|
||||
"/bin/QtCored4.dll",
|
||||
"/lib/QtCored4.dll"
|
||||
#else
|
||||
# else
|
||||
"/bin/qmake",
|
||||
"/lib/libQtCore.so",
|
||||
#endif
|
||||
# endif
|
||||
};
|
||||
|
||||
for (int i = 0; i < (int)(sizeof(filesToPatch) / sizeof(filesToPatch[0])); i++) {
|
||||
|
@@ -1323,7 +1323,7 @@ void tst_Debugger::dumpQLinkedList()
|
||||
dumpQLinkedListHelper(l3);
|
||||
}
|
||||
|
||||
#if 0
|
||||
# if 0
|
||||
void tst_Debugger::dumpQLinkedList()
|
||||
{
|
||||
// Case 1: Simple element type.
|
||||
@@ -1402,7 +1402,7 @@ void tst_Debugger::dumpQLinkedList()
|
||||
//dumpQLinkedListHelper(l3);
|
||||
testDumper("", &l, NS"QLinkedList", true, NS"QString");
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
|
||||
void tst_Debugger::dumpQList_int()
|
||||
{
|
||||
|
@@ -768,11 +768,11 @@ void dump_misc()
|
||||
vec.push_back("Hallo2");
|
||||
std::set<std::string> stdSet;
|
||||
stdSet.insert("s1");
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
QWidget *ww = 0; //this;
|
||||
QWidget &wwr = *ww;
|
||||
Q_UNUSED(wwr);
|
||||
#endif
|
||||
# endif
|
||||
|
||||
QSharedPointer<QString> sps(new QString("hallo"));
|
||||
QList<QSharedPointer<QString> > spsl;
|
||||
@@ -790,10 +790,10 @@ void dump_misc()
|
||||
|
||||
QLinkedList<QString> lls;
|
||||
lls << "link1" << "link2";
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
QStandardItemModel *model = new QStandardItemModel;
|
||||
model->appendRow(new QStandardItem("i1"));
|
||||
#endif
|
||||
# endif
|
||||
|
||||
QList <QList<int> > nestedIntList;
|
||||
nestedIntList << QList<int>();
|
||||
@@ -1055,7 +1055,7 @@ QByteArray dump_QAbstractItemModelHelper(QAbstractItemModel &m)
|
||||
|
||||
void dump_QAbstractItemModel()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
/* A */ QStringList strList;
|
||||
strList << "String 1";
|
||||
QStringListModel model1(strList);
|
||||
@@ -1066,12 +1066,12 @@ void dump_QAbstractItemModel()
|
||||
/* E */ model2.appendRow(QList<QStandardItem *>() << (new QStandardItem("Item (0,0)")) << (new QStandardItem("Item (0,1)")));
|
||||
/* F */ model2.appendRow(QList<QStandardItem *>() << (new QStandardItem("Item (1,0)")) << (new QStandardItem("Item (1,1)")));
|
||||
/* G */ (void) (model1.rowCount() + model2.rowCount() + strList.size());
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void tst_Gdb::dump_QAbstractItemModel()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
/* A */ QStringList strList;
|
||||
QString template_ =
|
||||
"{iname='local.strList',name='strList',type='"NS"QStringList',"
|
||||
@@ -1086,7 +1086,7 @@ void tst_Gdb::dump_QAbstractItemModel()
|
||||
check("A", template_.arg("1").toAscii());
|
||||
next(4);
|
||||
check("B", template_.arg("1").toAscii());
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1184,16 +1184,16 @@ void tst_Gdb::dump_QChar()
|
||||
|
||||
void dump_QDateTime()
|
||||
{
|
||||
#ifndef QT_NO_DATESTRING
|
||||
# ifndef QT_NO_DATESTRING
|
||||
/* A */ QDateTime d;
|
||||
/* B */ d = QDateTime::fromString("M5d21y7110:31:02", "'M'M'd'd'y'yyhh:mm:ss");
|
||||
/* C */ (void) d.isNull();
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void tst_Gdb::dump_QDateTime()
|
||||
{
|
||||
#ifndef QT_NO_DATESTRING
|
||||
# ifndef QT_NO_DATESTRING
|
||||
prepare("dump_QDateTime");
|
||||
if (checkUninitialized)
|
||||
check("A","{iname='local.d',name='d',"
|
||||
@@ -1238,7 +1238,7 @@ void tst_Gdb::dump_QDateTime()
|
||||
"value='-',numchild='3'}"
|
||||
"]}",
|
||||
"local.d");
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1387,18 +1387,18 @@ void tst_Gdb::dump_QImageDataHelper(QImage &img)
|
||||
|
||||
void dump_QImage()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
/* A */ QImage image; // Null image.
|
||||
/* B */ image = QImage(30, 700, QImage::Format_RGB555); // Normal image.
|
||||
/* C */ image = QImage(100, 0, QImage::Format_Invalid); // Invalid image.
|
||||
/* D */ (void) image.size();
|
||||
/* E */ (void) image.size();
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void tst_Gdb::dump_QImage()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
prepare("dump_QImage");
|
||||
next();
|
||||
check("B", "{iname='local.image',name='image',type='"NS"QImage',"
|
||||
@@ -1410,7 +1410,7 @@ void tst_Gdb::dump_QImage()
|
||||
// FIXME:
|
||||
//check("E", "{iname='local.image',name='image',type='"NS"QImage',"
|
||||
// "value='(100x0)',numchild='0'}");
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -2411,17 +2411,17 @@ const char * const pixmap[] = {
|
||||
|
||||
void dump_QPixmap()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
/* A */ QPixmap p; // Case 1: Null Pixmap.
|
||||
/* B */ p = QPixmap(20, 100); // Case 2: Uninitialized non-null pixmap.
|
||||
/* C */ p = QPixmap(pixmap); // Case 3: Initialized non-null pixmap.
|
||||
/* D */ (void) p.size();
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void tst_Gdb::dump_QPixmap()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
prepare("dump_QPixmap");
|
||||
next();
|
||||
check("B", "{iname='local.p',name='p',type='"NS"QPixmap',"
|
||||
@@ -2432,7 +2432,7 @@ void tst_Gdb::dump_QPixmap()
|
||||
next();
|
||||
check("D", "{iname='local.p',name='p',type='"NS"QPixmap',"
|
||||
"value='(2x24)',numchild='0'}");
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -2915,7 +2915,7 @@ void dump_QVariant()
|
||||
|
||||
void tst_Gdb::dump_QVariant()
|
||||
{
|
||||
#define PRE "iname='local.v',name='v',type='"NS"QVariant',"
|
||||
# define PRE "iname='local.v',name='v',type='"NS"QVariant',"
|
||||
prepare("dump_QVariant");
|
||||
if (checkUninitialized) /*<invalid>*/
|
||||
check("A","{"PRE"'value=<invalid>',numchild='0'}");
|
||||
@@ -3257,15 +3257,15 @@ void tst_Gdb::dump_QWeakPointer_2() {}
|
||||
|
||||
void dump_QWidget()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
/* A */ QWidget w;
|
||||
/* B */ (void) w.size();
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
void tst_Gdb::dump_QWidget()
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
prepare("dump_QWidget");
|
||||
if (checkUninitialized)
|
||||
check("A","{iname='local.w',name='w',"
|
||||
@@ -3290,7 +3290,7 @@ void tst_Gdb::dump_QWidget()
|
||||
"{name='data',type='"NS"QWidgetData *',"
|
||||
"value='-',numchild='1'}]}",
|
||||
"local.w,local.w."NS"QObject");
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
|
||||
|
||||
@@ -3620,11 +3620,11 @@ void breaker() {}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
#ifdef QT_GUI_LIB
|
||||
# ifdef QT_GUI_LIB
|
||||
QApplication app(argc, argv);
|
||||
#else
|
||||
# else
|
||||
QCoreApplication app(argc, argv);
|
||||
#endif
|
||||
# endif
|
||||
breaker();
|
||||
|
||||
if (argc == 2 && QByteArray(argv[1]) == "run") {
|
||||
|
@@ -1797,9 +1797,9 @@ int main(int argc, char *argv[])
|
||||
testQMultiMap();
|
||||
testQString();
|
||||
testQSet();
|
||||
#if QT_VERSION >= 0x040500
|
||||
# if QT_VERSION >= 0x040500
|
||||
testQSharedPointer();
|
||||
#endif
|
||||
# endif
|
||||
testQStringList();
|
||||
testStruct();
|
||||
testQThread();
|
||||
|
Reference in New Issue
Block a user