Merge branch 'master' of scm.dev.nokia.troll.no:creator/mainline

This commit is contained in:
con
2010-06-10 15:00:28 +02:00
25 changed files with 1135 additions and 378 deletions

View File

@@ -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()
#######################################################################

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;

View File

@@ -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(

View File

@@ -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;

View File

@@ -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.

View File

@@ -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");

View File

@@ -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;
}

View File

@@ -0,0 +1,9 @@
HEADERS += \
$$PWD/qmlengine.h \
SOURCES += \
$$PWD/qmlengine.cpp \
FORMS +=
RESOURCES +=

View 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

View 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

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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)

View File

@@ -27,7 +27,7 @@
**
**************************************************************************/
#ifndef PROPERTYPARSER_H
#ifndef PROPERTYPARSER_H
#define PROPERTYPARSER_H
#include <QtCore/QVariant>

View File

@@ -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

View File

@@ -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));
}

View File

@@ -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;

View File

@@ -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

View File

@@ -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++) {

View File

@@ -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()
{

View File

@@ -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") {

View File

@@ -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();