forked from qt-creator/qt-creator
debugger: speedup QVariant dumper
Essential for QObject, too. Change-Id: Ie798227f6c8d07eff37e6dbadb7f6f5baa382ca8 Reviewed-on: http://codereview.qt.nokia.com/851 Reviewed-by: hjk <qthjk@ovi.com>
This commit is contained in:
@@ -1385,6 +1385,10 @@ class Dumper:
|
|||||||
self.currentType = type
|
self.currentType = type
|
||||||
self.currentTypePriority = priority
|
self.currentTypePriority = priority
|
||||||
|
|
||||||
|
def putBetterType(self, type, priority = 0):
|
||||||
|
self.currentType = type
|
||||||
|
self.currentTypePriority = self.currentTypePriority + 1
|
||||||
|
|
||||||
def putAddress(self, addr):
|
def putAddress(self, addr):
|
||||||
if self.printsAddress:
|
if self.printsAddress:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -800,7 +800,7 @@ def qdump__QObject(d, item):
|
|||||||
name = "%s.properties.%d" % (item.iname, i)
|
name = "%s.properties.%d" % (item.iname, i)
|
||||||
t = qdump__QVariant(d, Item(qq, name))
|
t = qdump__QVariant(d, Item(qq, name))
|
||||||
# Override the "QVariant (foo)" output
|
# Override the "QVariant (foo)" output
|
||||||
d.putType(t, d.currentTypePriority + 1)
|
d.putBetterType(t)
|
||||||
p += 1
|
p += 1
|
||||||
q += 1
|
q += 1
|
||||||
|
|
||||||
@@ -838,8 +838,12 @@ def qdump__QObject(d, item):
|
|||||||
gdb.execute("set $d.d.is_null = %s"
|
gdb.execute("set $d.d.is_null = %s"
|
||||||
% value1["is_null"])
|
% value1["is_null"])
|
||||||
value = parseAndEvaluate("$d").dereference()
|
value = parseAndEvaluate("$d").dereference()
|
||||||
val, inner, innert = qdumpHelper__QVariant(d, value)
|
val, inner, innert, handled = \
|
||||||
if len(inner):
|
qdumpHelper__QVariant(d, value)
|
||||||
|
|
||||||
|
if handled:
|
||||||
|
pass
|
||||||
|
elif len(inner):
|
||||||
# Build-in types.
|
# Build-in types.
|
||||||
d.putType(inner)
|
d.putType(inner)
|
||||||
name = "%s.properties.%d" \
|
name = "%s.properties.%d" \
|
||||||
@@ -1243,7 +1247,7 @@ def qdump__QRegion(d, item):
|
|||||||
# gdb.parse_and_eval("region")["d"].dereference()["qt_rgn"].dereference()
|
# gdb.parse_and_eval("region")["d"].dereference()["qt_rgn"].dereference()
|
||||||
|
|
||||||
def qdump__QScopedPointer(d, item):
|
def qdump__QScopedPointer(d, item):
|
||||||
d.putType(d.currentType, d.currentTypePriority + 1)
|
d.putBetterType(d.currentType)
|
||||||
d.putItem(Item(item.value["d"], item.iname, None, None))
|
d.putItem(Item(item.value["d"], item.iname, None, None))
|
||||||
|
|
||||||
|
|
||||||
@@ -1327,7 +1331,7 @@ def qdump__QSharedDataPointer(d, item):
|
|||||||
d.putPlainChildren(item)
|
d.putPlainChildren(item)
|
||||||
return
|
return
|
||||||
value = gdb.Value(d_ptr.cast(innerType.pointer()))
|
value = gdb.Value(d_ptr.cast(innerType.pointer()))
|
||||||
d.putType(d.currentType, d.currentTypePriority + 1)
|
d.putBetterType(d.currentType)
|
||||||
d.putItem(Item(value.dereference(), item.iname, None))
|
d.putItem(Item(value.dereference(), item.iname, None))
|
||||||
|
|
||||||
|
|
||||||
@@ -1355,7 +1359,7 @@ def qdump__QStack(d, item):
|
|||||||
|
|
||||||
|
|
||||||
def qdump__QStandardItem(d, item):
|
def qdump__QStandardItem(d, item):
|
||||||
d.putType(d.currentType, d.currentTypePriority + 1)
|
d.putBetterType(d.currentType)
|
||||||
try:
|
try:
|
||||||
d.putItem(Item(item.value["d_ptr"], item.iname, None, None))
|
d.putItem(Item(item.value["d_ptr"], item.iname, None, None))
|
||||||
except:
|
except:
|
||||||
@@ -1470,135 +1474,138 @@ def qdump__QUrl(d, item):
|
|||||||
d.putFields(Item(data, item.iname))
|
d.putFields(Item(data, item.iname))
|
||||||
|
|
||||||
|
|
||||||
def qdumpHelper__QVariant(d, value):
|
|
||||||
data = value["d"]["data"]
|
def qdumpHelper_QVariant_0(d, data):
|
||||||
variantType = int(value["d"]["type"])
|
# QVariant::Invalid
|
||||||
#warn("VARIANT TYPE: %s : " % variantType)
|
d.putBetterType("%sQVariant (invalid)" % d.ns)
|
||||||
val = None
|
|
||||||
inner = ""
|
|
||||||
innert = ""
|
|
||||||
if variantType == 0: # QVariant::Invalid
|
|
||||||
d.putValue("(invalid)")
|
d.putValue("(invalid)")
|
||||||
d.putNumChild(0)
|
|
||||||
elif variantType == 1: # QVariant::Bool
|
def qdumpHelper_QVariant_1(d, data):
|
||||||
|
# QVariant::Bool
|
||||||
|
d.putBetterType("%sQVariant (bool)" % d.ns)
|
||||||
if int(data["b"]):
|
if int(data["b"]):
|
||||||
d.putValue("true")
|
d.putValue("true")
|
||||||
else:
|
else:
|
||||||
d.putValue("false")
|
d.putValue("false")
|
||||||
d.putNumChild(0)
|
|
||||||
inner = "bool"
|
def qdumpHelper_QVariant_2(d, data):
|
||||||
elif variantType == 2: # QVariant::Int
|
# QVariant::Int
|
||||||
|
d.putBetterType("%sQVariant (int)" % d.ns)
|
||||||
d.putValue(data["i"])
|
d.putValue(data["i"])
|
||||||
d.putNumChild(0)
|
|
||||||
inner = "int"
|
def qdumpHelper_QVariant_3(d, data):
|
||||||
elif variantType == 3: # uint
|
# uint
|
||||||
|
d.putBetterType("%sQVariant (uint)" % d.ns)
|
||||||
d.putValue(data["u"])
|
d.putValue(data["u"])
|
||||||
d.putNumChild(0)
|
|
||||||
inner = "uint"
|
def qdumpHelper_QVariant_4(d, data):
|
||||||
elif variantType == 4: # qlonglong
|
# qlonglong
|
||||||
|
d.putBetterType("%sQVariant (qlonglong)" % d.ns)
|
||||||
d.putValue(data["ll"])
|
d.putValue(data["ll"])
|
||||||
d.putNumChild(0)
|
|
||||||
inner = "qlonglong"
|
def qdumpHelper_QVariant_5(d, data):
|
||||||
elif variantType == 5: # qulonglong
|
# qulonglong
|
||||||
|
d.putBetterType("%sQVariant (qulonglong)" % d.ns)
|
||||||
d.putValue(data["ull"])
|
d.putValue(data["ull"])
|
||||||
d.putNumChild(0)
|
|
||||||
inner = "qulonglong"
|
def qdumpHelper_QVariant_6(d, data):
|
||||||
elif variantType == 6: # QVariant::Double
|
# QVariant::Double
|
||||||
value = data["d"]
|
d.putBetterType("%sQVariant (double)" % d.ns)
|
||||||
d.putValue(data["d"])
|
d.putValue(data["d"])
|
||||||
|
|
||||||
|
qdumpHelper_QVariants_A = [
|
||||||
|
qdumpHelper_QVariant_0,
|
||||||
|
qdumpHelper_QVariant_1,
|
||||||
|
qdumpHelper_QVariant_2,
|
||||||
|
qdumpHelper_QVariant_3,
|
||||||
|
qdumpHelper_QVariant_4,
|
||||||
|
qdumpHelper_QVariant_5,
|
||||||
|
qdumpHelper_QVariant_6
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
qdumpHelper_QVariants_B = [
|
||||||
|
"QChar", # 7
|
||||||
|
None, # 8, QVariantMap
|
||||||
|
None, # 9, QVariantList
|
||||||
|
"QString", # 10
|
||||||
|
"QStringList", # 11
|
||||||
|
"QByteArray", # 12
|
||||||
|
"QBitArray", # 13
|
||||||
|
"QDate", # 14
|
||||||
|
"QTime", # 15
|
||||||
|
"QDateTime", # 16
|
||||||
|
"QUrl", # 17
|
||||||
|
"QLocale", # 18
|
||||||
|
"QRect", # 19
|
||||||
|
"QRectF", # 20
|
||||||
|
"QSize", # 21
|
||||||
|
"QSizeF", # 22
|
||||||
|
"QLine", # 23
|
||||||
|
"QLineF", # 24
|
||||||
|
"QPoint", # 25
|
||||||
|
"QPointF", # 26
|
||||||
|
"QRegExp", # 27
|
||||||
|
None, # 28, QVariantHash
|
||||||
|
]
|
||||||
|
|
||||||
|
qdumpHelper_QVariants_C = [
|
||||||
|
"QFont", # 64
|
||||||
|
"QPixmap", # 65
|
||||||
|
"QBrush", # 66
|
||||||
|
"QColor", # 67
|
||||||
|
"QPalette", # 68
|
||||||
|
"QIcon", # 69
|
||||||
|
"QImage", # 70
|
||||||
|
"QPolygon", # 71
|
||||||
|
"QRegion", # 72
|
||||||
|
"QBitmap", # 73
|
||||||
|
"QCursor", # 74
|
||||||
|
"QSizePolicy", # 75
|
||||||
|
"QKeySequence",# 76
|
||||||
|
"QPen", # 77
|
||||||
|
"QTextLength", # 78
|
||||||
|
"QTextFormat", # 79
|
||||||
|
"X", # 80
|
||||||
|
"QTransform", # 81
|
||||||
|
"QMatrix4x4", # 82
|
||||||
|
"QVector2D", # 83
|
||||||
|
"QVector3D", # 84
|
||||||
|
"QVector4D", # 85
|
||||||
|
"QQuadernion" # 86
|
||||||
|
]
|
||||||
|
|
||||||
|
def qdumpHelper__QVariant(d, value):
|
||||||
|
data = value["d"]["data"]
|
||||||
|
variantType = int(value["d"]["type"])
|
||||||
|
#warn("VARIANT TYPE: %s : " % variantType)
|
||||||
|
|
||||||
|
if variantType <= 6:
|
||||||
|
qdumpHelper_QVariants_A[variantType](d, data)
|
||||||
d.putNumChild(0)
|
d.putNumChild(0)
|
||||||
inner = "double"
|
return (None, None, None, True)
|
||||||
elif variantType == 7: # QVariant::QChar
|
|
||||||
inner = d.ns + "QChar"
|
inner = ""
|
||||||
|
innert = ""
|
||||||
|
val = None
|
||||||
|
|
||||||
|
if variantType <= 28:
|
||||||
|
inner = qdumpHelper_QVariants_B[variantType - 7]
|
||||||
|
if not inner is None:
|
||||||
|
innert = inner
|
||||||
elif variantType == 8: # QVariant::VariantMap
|
elif variantType == 8: # QVariant::VariantMap
|
||||||
inner = d.ns + "QMap<" + d.ns + "QString, " + d.ns + "QVariant>"
|
inner = d.ns + "QMap<" + d.ns + "QString, " + d.ns + "QVariant>"
|
||||||
innert = d.ns + "QVariantMap"
|
innert = d.ns + "QVariantMap"
|
||||||
elif variantType == 9: # QVariant::VariantList
|
elif variantType == 9: # QVariant::VariantList
|
||||||
inner = d.ns + "QList<" + d.ns + "QVariant>"
|
inner = d.ns + "QList<" + d.ns + "QVariant>"
|
||||||
innert = d.ns + "QVariantList"
|
innert = d.ns + "QVariantList"
|
||||||
elif variantType == 10: # QVariant::String
|
|
||||||
inner = d.ns + "QString"
|
|
||||||
elif variantType == 11: # QVariant::StringList
|
|
||||||
inner = d.ns + "QStringList"
|
|
||||||
elif variantType == 12: # QVariant::ByteArray
|
|
||||||
inner = d.ns + "QByteArray"
|
|
||||||
elif variantType == 13: # QVariant::BitArray
|
|
||||||
inner = d.ns + "QBitArray"
|
|
||||||
elif variantType == 14: # QVariant::Date
|
|
||||||
inner = d.ns + "QDate"
|
|
||||||
elif variantType == 15: # QVariant::Time
|
|
||||||
inner = d.ns + "QTime"
|
|
||||||
elif variantType == 16: # QVariant::DateTime
|
|
||||||
inner = d.ns + "QDateTime"
|
|
||||||
elif variantType == 17: # QVariant::Url
|
|
||||||
inner = d.ns + "QUrl"
|
|
||||||
elif variantType == 18: # QVariant::Locale
|
|
||||||
inner = d.ns + "QLocale"
|
|
||||||
elif variantType == 19: # QVariant::Rect
|
|
||||||
inner = d.ns + "QRect"
|
|
||||||
elif variantType == 20: # QVariant::RectF
|
|
||||||
inner = d.ns + "QRectF"
|
|
||||||
elif variantType == 21: # QVariant::Size
|
|
||||||
inner = d.ns + "QSize"
|
|
||||||
elif variantType == 22: # QVariant::SizeF
|
|
||||||
inner = d.ns + "QSizeF"
|
|
||||||
elif variantType == 23: # QVariant::Line
|
|
||||||
inner = d.ns + "QLine"
|
|
||||||
elif variantType == 24: # QVariant::LineF
|
|
||||||
inner = d.ns + "QLineF"
|
|
||||||
elif variantType == 25: # QVariant::Point
|
|
||||||
inner = d.ns + "QPoint"
|
|
||||||
elif variantType == 26: # QVariant::PointF
|
|
||||||
inner = d.ns + "QPointF"
|
|
||||||
elif variantType == 27: # QVariant::RegExp
|
|
||||||
inner = d.ns + "QRegExp"
|
|
||||||
elif variantType == 28: # QVariant::VariantHash
|
elif variantType == 28: # QVariant::VariantHash
|
||||||
inner = d.ns + "QHash<" + d.ns + "QString, " + d.ns + "QVariant>"
|
inner = d.ns + "QHash<" + d.ns + "QString, " + d.ns + "QVariant>"
|
||||||
innert = d.ns + "QVariantHash"
|
innert = d.ns + "QVariantHash"
|
||||||
elif variantType == 64: # QVariant::Font
|
|
||||||
inner = d.ns + "QFont"
|
elif variantType <= 86:
|
||||||
elif variantType == 65: # QVariant::Pixmap
|
inner = d.ns + qdumpHelper_QVariants_B[variantType - 64]
|
||||||
inner = d.ns + "QPixmap"
|
innert = inner
|
||||||
elif variantType == 66: # QVariant::Brush
|
|
||||||
inner = d.ns + "QBrush"
|
|
||||||
elif variantType == 67: # QVariant::Color
|
|
||||||
inner = d.ns + "QColor"
|
|
||||||
elif variantType == 68: # QVariant::Palette
|
|
||||||
inner = d.ns + "QPalette"
|
|
||||||
elif variantType == 69: # QVariant::Icon
|
|
||||||
inner = d.ns + "QIcon"
|
|
||||||
elif variantType == 70: # QVariant::Image
|
|
||||||
inner = d.ns + "QImage"
|
|
||||||
elif variantType == 71: # QVariant::Polygon and PointArray
|
|
||||||
inner = d.ns + "QPolygon"
|
|
||||||
elif variantType == 72: # QVariant::Region
|
|
||||||
inner = d.ns + "QRegion"
|
|
||||||
elif variantType == 73: # QVariant::Bitmap
|
|
||||||
inner = d.ns + "QBitmap"
|
|
||||||
elif variantType == 74: # QVariant::Cursor
|
|
||||||
inner = d.ns + "QCursor"
|
|
||||||
elif variantType == 75: # QVariant::SizePolicy
|
|
||||||
inner = d.ns + "QSizePolicy"
|
|
||||||
elif variantType == 76: # QVariant::KeySequence
|
|
||||||
inner = d.ns + "QKeySequence"
|
|
||||||
elif variantType == 77: # QVariant::Pen
|
|
||||||
inner = d.ns + "QPen"
|
|
||||||
elif variantType == 78: # QVariant::TextLength
|
|
||||||
inner = d.ns + "QTextLength"
|
|
||||||
elif variantType == 79: # QVariant::TextFormat
|
|
||||||
inner = d.ns + "QTextFormat"
|
|
||||||
elif variantType == 81: # QVariant::Transform
|
|
||||||
inner = d.ns + "QTransform"
|
|
||||||
elif variantType == 82: # QVariant::Matrix4x4
|
|
||||||
inner = d.ns + "QMatrix4x4"
|
|
||||||
elif variantType == 83: # QVariant::Vector2D
|
|
||||||
inner = d.ns + "QVector2D"
|
|
||||||
elif variantType == 84: # QVariant::Vector3D
|
|
||||||
inner = d.ns + "QVector3D"
|
|
||||||
elif variantType == 85: # QVariant::Vector4D
|
|
||||||
inner = d.ns + "QVector4D"
|
|
||||||
elif variantType == 86: # QVariant::Quadernion
|
|
||||||
inner = d.ns + "QQuadernion"
|
|
||||||
|
|
||||||
if len(inner):
|
if len(inner):
|
||||||
innerType = lookupType(inner)
|
innerType = lookupType(inner)
|
||||||
@@ -1610,40 +1617,40 @@ def qdumpHelper__QVariant(d, value):
|
|||||||
else:
|
else:
|
||||||
val = data.cast(innerType)
|
val = data.cast(innerType)
|
||||||
|
|
||||||
if len(innert) == 0:
|
return (val, inner, innert, False)
|
||||||
innert = inner
|
|
||||||
|
|
||||||
return val, inner, innert
|
|
||||||
|
|
||||||
|
|
||||||
def qdump__QVariant(d, item):
|
def qdump__QVariant(d, item):
|
||||||
val, inner, innert = qdumpHelper__QVariant(d, item.value)
|
d_ptr = item.value["d"]
|
||||||
#warn("VARIANT DATA: '%s' '%s' '%s': " % (val, inner, innert))
|
d_data = d_ptr["data"]
|
||||||
|
|
||||||
|
(val, inner, innert, handled) = qdumpHelper__QVariant(d, item.value)
|
||||||
|
|
||||||
|
if handled:
|
||||||
|
return
|
||||||
|
|
||||||
if len(inner):
|
if len(inner):
|
||||||
innerType = lookupType(inner)
|
innerType = lookupType(inner)
|
||||||
# FIXME: Why "shared"?
|
# FIXME: Why "shared"?
|
||||||
if innerType.sizeof > item.value["d"]["data"].type.sizeof:
|
if innerType.sizeof > d_data.type.sizeof:
|
||||||
v = item.value["d"]["data"]["shared"]["ptr"] \
|
v = d_data["shared"]["ptr"].cast(innerType.pointer()).dereference()
|
||||||
.cast(innerType.pointer()).dereference()
|
|
||||||
else:
|
else:
|
||||||
v = item.value["d"]["data"].cast(innerType)
|
v = d_data.cast(innerType)
|
||||||
d.putValue(" ", None, -99)
|
d.putValue(" ", None, -99)
|
||||||
d.putItem(Item(v, item.iname))
|
d.putItem(Item(v, item.iname))
|
||||||
d.putType("%sQVariant (%s)" % (d.ns, innert), d.currentTypePriority + 1)
|
d.putBetterType("%sQVariant (%s)" % (d.ns, innert))
|
||||||
return innert
|
return innert
|
||||||
|
|
||||||
# User types.
|
# User types.
|
||||||
d_member = item.value["d"]
|
|
||||||
type = str(call(item.value, "typeToName",
|
type = str(call(item.value, "typeToName",
|
||||||
"('%sQVariant::Type')%d" % (d.ns, d_member["type"])))
|
"('%sQVariant::Type')%d" % (d.ns, d_ptr["type"])))
|
||||||
type = type[type.find('"') + 1 : type.rfind('"')]
|
type = type[type.find('"') + 1 : type.rfind('"')]
|
||||||
type = type.replace("Q", d.ns + "Q") # HACK!
|
type = type.replace("Q", d.ns + "Q") # HACK!
|
||||||
type = type.replace("uint", "unsigned int") # HACK!
|
type = type.replace("uint", "unsigned int") # HACK!
|
||||||
type = type.replace("COMMA", ",") # HACK!
|
type = type.replace("COMMA", ",") # HACK!
|
||||||
#warn("TYPE: %s" % type)
|
warn("TYPE: %s" % type)
|
||||||
data = call(item.value, "constData")
|
data = call(item.value, "constData")
|
||||||
#warn("DATA: %s" % data)
|
warn("DATA: %s" % data)
|
||||||
d.putValue(" ", None, -99)
|
d.putValue(" ", None, -99)
|
||||||
d.putType("%sQVariant (%s)" % (d.ns, type))
|
d.putType("%sQVariant (%s)" % (d.ns, type))
|
||||||
d.putNumChild(1)
|
d.putNumChild(1)
|
||||||
@@ -2045,7 +2052,7 @@ def qdump__boost__optional(d, item):
|
|||||||
d.putValue("<uninitialized>")
|
d.putValue("<uninitialized>")
|
||||||
d.putNumChild(0)
|
d.putNumChild(0)
|
||||||
else:
|
else:
|
||||||
d.putType(item.value.type, d.currentTypePriority + 1)
|
d.putBetterType(item.value.type)
|
||||||
type = templateArgument(item.value.type, 0)
|
type = templateArgument(item.value.type, 0)
|
||||||
storage = item.value["m_storage"]
|
storage = item.value["m_storage"]
|
||||||
if type.code == gdb.TYPE_CODE_REF:
|
if type.code == gdb.TYPE_CODE_REF:
|
||||||
@@ -2290,7 +2297,7 @@ def qdump__QScriptValue(d, item):
|
|||||||
#d.putSubItem(Item(variant, item.iname, "variant", "variant"))
|
#d.putSubItem(Item(variant, item.iname, "variant", "variant"))
|
||||||
t = qdump__QVariant(d, Item(variant, "variant"))
|
t = qdump__QVariant(d, Item(variant, "variant"))
|
||||||
# Override the "QVariant (foo)" output
|
# Override the "QVariant (foo)" output
|
||||||
d.putType("%sQScriptValue (%s)" % (d.ns, t), d.currentTypePriority + 1)
|
d.putBetterType("%sQScriptValue (%s)" % (d.ns, t))
|
||||||
if t != "JSCoreValue":
|
if t != "JSCoreValue":
|
||||||
return
|
return
|
||||||
except:
|
except:
|
||||||
|
|||||||
@@ -122,16 +122,13 @@
|
|||||||
#include <xmmintrin.h>
|
#include <xmmintrin.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#endif
|
#endif
|
||||||
Q_DECLARE_METATYPE(QHostAddress)
|
|
||||||
Q_DECLARE_METATYPE(QList<int>)
|
|
||||||
Q_DECLARE_METATYPE(QStringList)
|
|
||||||
|
|
||||||
typedef QMap<uint, QStringList> MyType;
|
void dummyStatement(void *x= 0, void *y= 0)
|
||||||
#define COMMA ,
|
{
|
||||||
Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>)
|
Q_UNUSED(x);
|
||||||
|
Q_UNUSED(y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// tests multiple breakpoints
|
|
||||||
namespace multibp {
|
namespace multibp {
|
||||||
|
|
||||||
template <typename T> class Vector
|
template <typename T> class Vector
|
||||||
@@ -148,8 +145,9 @@ namespace multibp {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int test()
|
int testMultiBp()
|
||||||
{
|
{
|
||||||
|
// Tests multiple breakpoints
|
||||||
Vector<int> vi(10);
|
Vector<int> vi(10);
|
||||||
Vector<float> vf(10);
|
Vector<float> vf(10);
|
||||||
Vector<double> vd(10);
|
Vector<double> vd(10);
|
||||||
@@ -1678,49 +1676,26 @@ void testTypeFormats()
|
|||||||
// These tests should result in properly displayed umlauts in the
|
// These tests should result in properly displayed umlauts in the
|
||||||
// Locals&Watchers view. It is only support on gdb with Python.
|
// Locals&Watchers view. It is only support on gdb with Python.
|
||||||
|
|
||||||
// Select UTF-8 in "Change Format for Type" in L&W context menu.
|
|
||||||
const char *s = "aöa";
|
const char *s = "aöa";
|
||||||
|
|
||||||
// Windows: Select UTF-16 in "Change Format for Type" in L&W context menu.
|
|
||||||
// Other: Select UCS-6 in "Change Format for Type" in L&W context menu.
|
|
||||||
const wchar_t *w = L"aöa";
|
const wchar_t *w = L"aöa";
|
||||||
QString u;
|
QString u;
|
||||||
|
// <== break here
|
||||||
|
// All: Select UTF-8 in "Change Format for Type" in L&W context menu.
|
||||||
|
// Windows: Select UTF-16 in "Change Format for Type" in L&W context menu.
|
||||||
|
// Other: Select UCS-6 in "Change Format for Type" in L&W context menu.
|
||||||
|
|
||||||
if (sizeof(wchar_t) == 4)
|
if (sizeof(wchar_t) == 4)
|
||||||
u = QString::fromUcs4((uint *)w);
|
u = QString::fromUcs4((uint *)w);
|
||||||
else
|
else
|
||||||
u = QString::fromUtf16((ushort *)w);
|
u = QString::fromUtf16((ushort *)w);
|
||||||
|
|
||||||
// Make sure to undo "Change Format".
|
// Make sure to undo "Change Format".
|
||||||
int dummy = 1;
|
|
||||||
Q_UNUSED(s);
|
Q_UNUSED(s);
|
||||||
Q_UNUSED(w);
|
Q_UNUSED(w);
|
||||||
Q_UNUSED(dummy);
|
dummyStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class Thread : public QThread
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Thread(int id) : m_id(id) {}
|
|
||||||
|
|
||||||
void run()
|
|
||||||
{
|
|
||||||
int j = 2;
|
|
||||||
++j;
|
|
||||||
for (int i = 0; i != 100000; ++i) {
|
|
||||||
//sleep(1);
|
|
||||||
std::cerr << m_id;
|
|
||||||
}
|
|
||||||
if (m_id == 2) {
|
|
||||||
++j;
|
|
||||||
}
|
|
||||||
std::cerr << j;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
void testQTextCursor()
|
void testQTextCursor()
|
||||||
{
|
{
|
||||||
//int argc = 0;
|
//int argc = 0;
|
||||||
@@ -1736,8 +1711,34 @@ void testQTextCursor()
|
|||||||
Q_UNUSED(anc);
|
Q_UNUSED(anc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void testQThread()
|
|
||||||
{
|
namespace qthread {
|
||||||
|
|
||||||
|
class Thread : public QThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Thread(int id) : m_id(id) {}
|
||||||
|
|
||||||
|
void run()
|
||||||
|
{
|
||||||
|
int j = 2;
|
||||||
|
++j;
|
||||||
|
for (int i = 0; i != 100000; ++i) {
|
||||||
|
//sleep(1);
|
||||||
|
std::cerr << m_id;
|
||||||
|
}
|
||||||
|
if (m_id == 2) {
|
||||||
|
++j;
|
||||||
|
}
|
||||||
|
std::cerr << j;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
void testQThread()
|
||||||
|
{
|
||||||
Thread thread1(1);
|
Thread thread1(1);
|
||||||
Thread thread2(2);
|
Thread thread2(2);
|
||||||
thread1.setObjectName("This is the first thread");
|
thread1.setObjectName("This is the first thread");
|
||||||
@@ -1746,71 +1747,116 @@ void testQThread()
|
|||||||
thread2.start();
|
thread2.start();
|
||||||
thread1.wait();
|
thread1.wait();
|
||||||
thread2.wait();
|
thread2.wait();
|
||||||
|
dummyStatement(&thread1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testQVariant1()
|
|
||||||
{
|
|
||||||
QVariant v;
|
|
||||||
v = 1;
|
|
||||||
v = 1.0;
|
|
||||||
v = "string";
|
|
||||||
v = QRect(100, 200, 300, 400);
|
|
||||||
v = QRectF(100, 200, 300, 400);
|
|
||||||
v = 1;
|
|
||||||
//return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant testQVariant2()
|
Q_DECLARE_METATYPE(QHostAddress)
|
||||||
{
|
Q_DECLARE_METATYPE(QList<int>)
|
||||||
|
Q_DECLARE_METATYPE(QStringList)
|
||||||
|
#define COMMA ,
|
||||||
|
Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>)
|
||||||
|
|
||||||
|
namespace qvariant {
|
||||||
|
|
||||||
|
void testQVariant1()
|
||||||
|
{
|
||||||
QVariant value;
|
QVariant value;
|
||||||
QVariant::Type t = QVariant::String;
|
QVariant::Type t = QVariant::String;
|
||||||
value = QVariant(t, (void*)0);
|
value = QVariant(t, (void*)0);
|
||||||
*(QString*)value.data() = QString("XXX");
|
*(QString*)value.data() = QString("Some string");
|
||||||
|
int i = 1; // <=== break here
|
||||||
|
// Check the variant contains a proper QString.
|
||||||
|
}
|
||||||
|
|
||||||
int i = 1;
|
void testQVariant2()
|
||||||
++i;
|
{
|
||||||
++i;
|
QVariant var; // Type 0, invalid
|
||||||
++i;
|
// <== break here
|
||||||
#if 1
|
// Step through with F10.
|
||||||
|
// Check var contains objects of the types indicated.
|
||||||
|
var.setValue(true); // 1, bool
|
||||||
|
var.setValue(2); // 2, int
|
||||||
|
var.setValue(3u); // 3, uint
|
||||||
|
var.setValue(qlonglong(4)); // 4, qlonglong
|
||||||
|
var.setValue(qulonglong(5)); // 5, qulonglong
|
||||||
|
var.setValue(double(6)); // 6, double
|
||||||
|
|
||||||
|
var.setValue(QChar(7)); // 7, QChar
|
||||||
|
//None, # 8, QVariantMap
|
||||||
|
// None, # 9, QVariantList
|
||||||
|
var.setValue(QString("Hello 10")); // 10, QString
|
||||||
|
var.setValue(QRect(100, 200, 300, 400)); // 19 QRect
|
||||||
|
var.setValue(QRectF(100, 200, 300, 400)); // 19 QRectF
|
||||||
|
|
||||||
|
/*
|
||||||
|
"QStringList", # 11
|
||||||
|
"QByteArray", # 12
|
||||||
|
"QBitArray", # 13
|
||||||
|
"QDate", # 14
|
||||||
|
"QTime", # 15
|
||||||
|
"QDateTime", # 16
|
||||||
|
"QUrl", # 17
|
||||||
|
"QLocale", # 18
|
||||||
|
"QRect", # 19
|
||||||
|
"QRectF", # 20
|
||||||
|
"QSize", # 21
|
||||||
|
"QSizeF", # 22
|
||||||
|
"QLine", # 23
|
||||||
|
"QLineF", # 24
|
||||||
|
"QPoint", # 25
|
||||||
|
"QPointF", # 26
|
||||||
|
"QRegExp", # 27
|
||||||
|
*/
|
||||||
|
var.isValid(); // Dummy
|
||||||
|
}
|
||||||
|
|
||||||
|
void testQVariant3()
|
||||||
|
{
|
||||||
QVariant var;
|
QVariant var;
|
||||||
var.setValue(1);
|
// <== break here.
|
||||||
var.setValue(2);
|
// Expand var.
|
||||||
var.setValue(3);
|
// Step with F10.
|
||||||
var.setValue(QString("Hello"));
|
// Check the list is updated properly.
|
||||||
var.setValue(QString("World"));
|
|
||||||
var.setValue(QString("Hello"));
|
|
||||||
var.setValue(QStringList() << "World");
|
var.setValue(QStringList() << "World");
|
||||||
var.setValue(QStringList() << "World" << "Hello");
|
var.setValue(QStringList() << "World" << "Hello");
|
||||||
var.setValue(QStringList() << "Hello" << "Hello");
|
var.setValue(QStringList() << "Hello" << "Hello");
|
||||||
var.setValue(QStringList() << "World" << "Hello" << "Hello");
|
var.setValue(QStringList() << "World" << "Hello" << "Hello");
|
||||||
#endif
|
dummyStatement(&var);
|
||||||
#if 1
|
}
|
||||||
QVariant var3;
|
|
||||||
|
void testQVariant4()
|
||||||
|
{
|
||||||
|
QVariant var;
|
||||||
QHostAddress ha("127.0.0.1");
|
QHostAddress ha("127.0.0.1");
|
||||||
var.setValue(ha);
|
var.setValue(ha);
|
||||||
var3 = var;
|
|
||||||
var3 = var;
|
|
||||||
var3 = var;
|
|
||||||
var3 = var;
|
|
||||||
QHostAddress ha1 = var.value<QHostAddress>();
|
QHostAddress ha1 = var.value<QHostAddress>();
|
||||||
|
// <== break here
|
||||||
|
// Check var and ha1 look correct.
|
||||||
|
dummyStatement(&ha1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testQVariant5()
|
||||||
|
{
|
||||||
|
// This checks user defined types in QVariants.
|
||||||
typedef QMap<uint, QStringList> MyType;
|
typedef QMap<uint, QStringList> MyType;
|
||||||
MyType my;
|
MyType my;
|
||||||
my[1] = (QStringList() << "Hello");
|
my[1] = (QStringList() << "Hello");
|
||||||
my[3] = (QStringList() << "World");
|
my[3] = (QStringList() << "World");
|
||||||
|
QVariant var;
|
||||||
var.setValue(my);
|
var.setValue(my);
|
||||||
// FIXME: Known to break
|
// FIXME: Known to break
|
||||||
QString type = var.typeName();
|
//QString type = var.typeName();
|
||||||
|
var.setValue(my); // <== break here
|
||||||
var.setValue(my);
|
var.setValue(my);
|
||||||
var.setValue(my);
|
var.setValue(my);
|
||||||
var.setValue(my);
|
var.setValue(my);
|
||||||
var.setValue(my);
|
dummyStatement(&var);
|
||||||
#endif
|
}
|
||||||
QVariant result("sss");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant testQVariant3()
|
void testQVariant6()
|
||||||
{
|
{
|
||||||
QVariantList vl;
|
QVariantList vl;
|
||||||
vl.append(QVariant(1));
|
vl.append(QVariant(1));
|
||||||
vl.append(QVariant(2));
|
vl.append(QVariant(2));
|
||||||
@@ -1824,10 +1870,21 @@ QVariant testQVariant3()
|
|||||||
QVariant variant = qVariantFromValue(list);
|
QVariant variant = qVariantFromValue(list);
|
||||||
list.clear();
|
list.clear();
|
||||||
list = qVariantValue<QList<int> >(variant);
|
list = qVariantValue<QList<int> >(variant);
|
||||||
|
dummyStatement(&list);
|
||||||
|
}
|
||||||
|
|
||||||
|
void testQVariant()
|
||||||
|
{
|
||||||
|
testQVariant1();
|
||||||
|
testQVariant2();
|
||||||
|
testQVariant3();
|
||||||
|
testQVariant4();
|
||||||
|
testQVariant5();
|
||||||
|
testQVariant6();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace qvariant
|
||||||
|
|
||||||
QVariant result("xxx");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void testQVector()
|
void testQVector()
|
||||||
{
|
{
|
||||||
@@ -2625,11 +2682,11 @@ namespace bug3611 {
|
|||||||
{
|
{
|
||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
byte f = '2';
|
byte f = '2';
|
||||||
Q_UNUSED(f);
|
|
||||||
int *x = (int*)&f;
|
int *x = (int*)&f;
|
||||||
f += 1;
|
f += 1;
|
||||||
f += 1;
|
f += 1;
|
||||||
f += 1;
|
f += 1;
|
||||||
|
dummyStatement(&f);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace bug3611
|
} // namespace bug3611
|
||||||
@@ -2822,7 +2879,7 @@ namespace qc42170 {
|
|||||||
int id;
|
int id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Point: Object
|
struct Point : Object
|
||||||
{
|
{
|
||||||
Point(double x_, double y_, int id_) : Object(id_), x(x_), y(y_) {}
|
Point(double x_, double y_, int id_) : Object(id_), x(x_), y(y_) {}
|
||||||
double x, y;
|
double x, y;
|
||||||
@@ -2836,9 +2893,11 @@ namespace qc42170 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int helper(Object *obj)
|
void helper(Object *obj)
|
||||||
{
|
{
|
||||||
return 0; // <== break here
|
// <== break here
|
||||||
|
// Check that obj is shown as a 'Circle' object.
|
||||||
|
dummyStatement(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test42170()
|
void test42170()
|
||||||
@@ -2847,6 +2906,7 @@ namespace qc42170 {
|
|||||||
Object *obj = circle;
|
Object *obj = circle;
|
||||||
helper(circle);
|
helper(circle);
|
||||||
helper(obj);
|
helper(obj);
|
||||||
|
dummyStatement(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace qc42170
|
} // namespace qc42170
|
||||||
@@ -2867,10 +2927,10 @@ namespace qc41700 {
|
|||||||
m["two"].push_back("1");
|
m["two"].push_back("1");
|
||||||
m["two"].push_back("2");
|
m["two"].push_back("2");
|
||||||
m["two"].push_back("3");
|
m["two"].push_back("3");
|
||||||
map_t::const_iterator it = m.begin(); // <=== break here
|
map_t::const_iterator it = m.begin();
|
||||||
++it;
|
// <=== break here
|
||||||
++it;
|
// Check that m is displayed nicely.
|
||||||
++it;
|
dummyStatement(&it);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace qc41700
|
} // namespace qc41700
|
||||||
@@ -2881,7 +2941,7 @@ int main(int argc, char *argv[])
|
|||||||
bug4904::test4904();
|
bug4904::test4904();
|
||||||
qc41700::test41700();
|
qc41700::test41700();
|
||||||
qc42170::test42170();
|
qc42170::test42170();
|
||||||
multibp::test();
|
multibp::testMultiBp();
|
||||||
bug842::test842();
|
bug842::test842();
|
||||||
bug3611::test3611();
|
bug3611::test3611();
|
||||||
bug4019::test4019();
|
bug4019::test4019();
|
||||||
@@ -2991,10 +3051,8 @@ int main(int argc, char *argv[])
|
|||||||
testQStringList();
|
testQStringList();
|
||||||
testQScriptValue(argc, argv);
|
testQScriptValue(argc, argv);
|
||||||
testStruct();
|
testStruct();
|
||||||
//testQThread();
|
//qthread::testQThread();
|
||||||
testQVariant1();
|
qvariant::testQVariant();
|
||||||
testQVariant2();
|
|
||||||
testQVariant3();
|
|
||||||
testQVector();
|
testQVector();
|
||||||
testQVectorOfQList();
|
testQVectorOfQList();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user