Commit 4fb507c0 authored by hjk's avatar hjk

debugger: show at least basic QWidget properties

parent 8bd8d256
......@@ -579,16 +579,26 @@ def extractCString(table, offset):
return result
def qdump__QWidget(d, item):
qdump__QObject(d, item)
def qdump__QObject(d, item):
#warn("OBJECT: %s " % item.value)
staticMetaObject = item.value["staticMetaObject"]
#warn("SMO: %s " % staticMetaObject)
#warn("SMO DATA: %s " % staticMetaObject["d"]["stringdata"])
superData = staticMetaObject["d"]["superdata"]
#warn("SUPERDATA: %s" % superData)
#while not isNull(superData):
# superData = superData.dereference()["d"]["superdata"]
# warn("SUPERDATA: %s" % superData)
privateType = gdb.lookup_type(d.ns + "QObjectPrivate").pointer()
d_ptr = item.value["d_ptr"]["d"].cast(privateType).dereference()
#warn("D_PTR: %s " % d_ptr)
objectName = d_ptr["objectName"]
#warn("OBJECTNAME: %s " % objectName)
#warn("D_PTR: %s " % d_ptr.dereference())
#warn("D_PTR: %s " % d_ptr)
mo = d_ptr["metaObject"]
type = d.stripNamespaceFromType(item.value.type)
if isNull(mo):
......@@ -608,13 +618,16 @@ def qdump__QObject(d, item):
if d.isExpanded(item):
d.beginChildren()
# parent and children
# Parent and children.
d.putItem(Item(d_ptr["parent"], item.iname, "parent", "parent"))
d.putItem(Item(d_ptr["children"], item.iname, "children", "children"))
# properties
# Properties.
d.beginHash()
propertyCount = metaData[6]
#propertyCount = metaData[6]
# FIXME: Replace with plain memory accesses.
propertyCount = int(call(mo, "propertyCount()"))
warn("PROPERTY COUNT: %s" % propertyCount)
propertyData = metaData[7]
d.putName("properties")
d.putItemCount(propertyCount)
......@@ -630,28 +643,48 @@ def qdump__QObject(d, item):
d.putName(propertyName)
#flags = metaData[offset + 2]
#warn("FLAGS: %s " % flags)
warn("PROPERTY TYPE: %s " % propertyType)
#warn("PROPERTY: %s %s " % (propertyType, propertyName))
# #exp = '((\'%sQObject\'*)%s)->property("%s")' \
# % (d.ns, item.value.address, propertyName)
#exp = '"((\'%sQObject\'*)%s)"' % (d.ns, item.value.address,)
#warn("EXPRESSION: %s" % exp)
value = call(item.value, 'property("%s")' % propertyName)
warn("VALUE: %s" % value)
warn("TYPE: %s" % value.type)
if True and propertyType == "QString":
# FIXME: re-use parts of QVariant dumper
#d.putType(d.ns + "QString")
data = value["d"]["data"]["ptr"]
innerType = gdb.lookup_type(d.ns + "QString")
d.putItemHelper(
Item(data.cast(innerType), item.iname, property))
#d.putNumChild(0)
#warn("VALUE: %s" % value)
inner, innert = qdumpHelper__QVariant(d, value["d"])
if len(inner):
# Build-in types.
if len(innert) == 0:
innert = inner
d.putType(inner)
innerType = gdb.lookup_type(inner)
val = value["d"]["data"]["ptr"].cast(innerType)
d.putItemHelper(Item(val, item.iname + ".properties",
propertyName, propertyName))
else:
iname = "%s.properties.%s" % (item.iname, propertyName)
d.putItemHelper(Item(value, iname, propertyName))
# User types.
# func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, variantType)
# type = str(call(item.value, func))
# type = type[type.find('"') + 1 : type.rfind('"')]
# type = type.replace("Q", d.ns + "Q") # HACK!
# data = call(item.value, "constData()")
# tdata = data.cast(gdb.lookup_type(type).pointer()).dereference()
# d.putValue("(%s)" % tdata.type)
# d.putType(tdata.type)
# d.putNumChild(1)
# if d.isExpanded(item):
# d.beginChildren()
# d.putItem(Item(tdata, item.iname, "data", "data"))
# d.endChildren()
warn("FIXME: CUSTOM QOBJECT PROPERTIES NOT IMPLEMENTED: %s %s"
% (propertyType, innert))
d.putType(propertyType)
d.putValue("...")
d.putNumChild(0)
d.endHash()
d.endChildren()
d.endHash()
# connections
d.beginHash()
......@@ -679,7 +712,7 @@ def qdump__QObject(d, item):
d.endChildren()
d.endHash()
# signals
# Signals
signalCount = metaData[13]
d.beginHash()
d.putName("signals")
......@@ -703,7 +736,7 @@ def qdump__QObject(d, item):
d.endChildren()
d.endHash()
# slots
# Slots
d.beginHash()
slotCount = metaData[4] - signalCount
d.putName("slots")
......@@ -991,55 +1024,6 @@ def qdump__QObject(d, item):
# d.disarm()
# }
#
# static void dumpQObjectPropertyList(QDumper &d)
# {
# const QObject *ob = (const QObject *)d.data
# const QMetaObject *mo = ob->metaObject()
# const int propertyCount = mo->propertyCount()
# d.putField("addr", "<synthetic>")
# d.putField("type", ns + "QObjectPropertyList")
# d.putField("numchild", propertyCount)
# d.putItemCount(propertyCount)
# if d.isExpanded(item):
# d.beginChildren()
# for (int i = propertyCount; --i >= 0; ) {
# const QMetaProperty & prop = mo->property(i)
# d.beginHash()
# d.putName(prop.name())
# switch (prop.type()) {
# case QVariant::String:
# d.putField("type", prop.typeName())
# d.putValue(prop.read(ob).toString(), 2)
# d.putField("numchild", "0")
# break
# case QVariant::Bool:
# d.putField("type", prop.typeName())
# d.putValue((prop.read(ob).toBool() ? "true" : "false"))
# d.putField("numchild", "0")
# break
# case QVariant::Int:
# if prop.isEnumType()) {
# dumpMetaEnumValue(d, prop, prop.read(ob).toInt())
# } elif prop.isFlagType()) {
# dumpMetaFlagValue(d, prop, prop.read(ob).toInt())
# } else {
# d.putValue(prop.read(ob).toInt())
# d.putField("numchild", "0")
# }
# break
# default:
# d.putField("addr", d.data)
# d.putField("type", ns + "QObjectProperty")
# d.putField("numchild", "1")
# break
# }
# d.endHash()
# }
# d.endChildren()
# }
# d.disarm()
# }
#
# static void dumpQObjectMethodList(QDumper &d)
# {
# const QObject *ob = (const QObject *)d.data
......@@ -1512,12 +1496,10 @@ def qdump__QTextCodec(d, item):
d.putCallItem("mibEnum", item, "mibEnum()")
d.endChildren()
def qdump__QVariant(d, item):
union = item.value["d"]
data = union["data"]
variantType = int(union["type"])
def qdumpHelper__QVariant(d, d_member):
#warn("VARIANT TYPE: %s : " % variantType)
data = d_member["data"]
variantType = int(d_member["type"])
inner = ""
innert = ""
if variantType == 0: # QVariant::Invalid
......@@ -1526,22 +1508,28 @@ def qdump__QVariant(d, item):
elif variantType == 1: # QVariant::Bool
d.putValue(select(data["b"], "true", "false"))
d.putNumChild(0)
inner = "bool"
elif variantType == 2: # QVariant::Int
d.putValue(data["i"])
d.putNumChild(0)
inner = "int"
elif variantType == 3: # uint
d.putValue(data["u"])
d.putNumChild(0)
inner = "uint"
elif variantType == 4: # qlonglong
d.putValue(data["ll"])
d.putNumChild(0)
inner = "qlonglong"
elif variantType == 5: # qulonglong
d.putValue(data["ull"])
d.putNumChild(0)
inner = "qulonglong"
elif variantType == 6: # QVariant::Double
value = data["d"]
d.putValue(data["d"])
d.putNumChild(0)
inner = "double"
elif variantType == 7: # QVariant::QChar
inner = d.ns + "QChar"
elif variantType == 8: # QVariant::VariantMap
......@@ -1633,6 +1621,10 @@ def qdump__QVariant(d, item):
inner = d.ns + "QVector4D"
elif variantType == 86: # QVariant::Quadernion
inner = d.ns + "QQuadernion"
return inner, innert
def qdump__QVariant(d, item):
inner, innert = qdumpHelper__QVariant(d, item.value["d"])
if len(inner):
# Build-in types.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment