summaryrefslogtreecommitdiff
path: root/share/qtcreator/debugger/dumper.py
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-02-21 10:10:00 +0100
committerDavid Schulz <david.schulz@qt.io>2020-02-24 07:47:40 +0000
commite17c96cf11c90d2f36724265ed95655cac3e38e7 (patch)
tree05fd1d57a4442a660f4b35f3def78dcc4ceb894e /share/qtcreator/debugger/dumper.py
parentb2ceb7db793d05f7fe97ad12dc676d0aa1136ced (diff)
downloadqt-creator-e17c96cf11c90d2f36724265ed95655cac3e38e7.tar.gz
Dumper: move global enums and functions to utils
Change-Id: I11f5f0d970cd23a5fd907d33daa3cb8a441d0c58 Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'share/qtcreator/debugger/dumper.py')
-rw-r--r--share/qtcreator/debugger/dumper.py623
1 files changed, 260 insertions, 363 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py
index 8ce967d3a5..6d36368537 100644
--- a/share/qtcreator/debugger/dumper.py
+++ b/share/qtcreator/debugger/dumper.py
@@ -34,15 +34,19 @@ import re
import time
import inspect
import threading
+from utils import DisplayFormat, TypeCode
try:
# That's only used in native combined debugging right now, so
# we do not need to hard fail in cases of partial python installation
# that will never use this.
import json
-except:
+except ModuleNotFoundError:
+ DumperBase.warn("Python module json not found. "
+ "Native combined debugging might not work.")
pass
+
if sys.version_info[0] >= 3:
xrange = range
toInteger = int
@@ -50,98 +54,6 @@ else:
toInteger = long
-# Debugger start modes. Keep in sync with DebuggerStartMode in debuggerconstants.h
-NoStartMode, \
-StartInternal, \
-StartExternal, \
-AttachExternal, \
-AttachCrashedExternal, \
-AttachCore, \
-AttachToRemoteServer, \
-AttachToRemoteProcess, \
-StartRemoteProcess, \
- = range(0, 9)
-
-
-# Known special formats. Keep in sync with DisplayFormat in debuggerprotocol.h
-AutomaticFormat, \
-RawFormat, \
-SimpleFormat, \
-EnhancedFormat, \
-SeparateFormat, \
-Latin1StringFormat, \
-SeparateLatin1StringFormat, \
-Utf8StringFormat, \
-SeparateUtf8StringFormat, \
-Local8BitStringFormat, \
-Utf16StringFormat, \
-Ucs4StringFormat, \
-Array10Format, \
-Array100Format, \
-Array1000Format, \
-Array10000Format, \
-ArrayPlotFormat, \
-CompactMapFormat, \
-DirectQListStorageFormat, \
-IndirectQListStorageFormat, \
- = range(0, 20)
-
-# Breakpoints. Keep synchronized with BreakpointType in breakpoint.h
-UnknownType, \
-BreakpointByFileAndLine, \
-BreakpointByFunction, \
-BreakpointByAddress, \
-BreakpointAtThrow, \
-BreakpointAtCatch, \
-BreakpointAtMain, \
-BreakpointAtFork, \
-BreakpointAtExec, \
-BreakpointAtSysCall, \
-WatchpointAtAddress, \
-WatchpointAtExpression, \
-BreakpointOnQmlSignalEmit, \
-BreakpointAtJavaScriptThrow, \
- = range(0, 14)
-
-
-# Internal codes for types keep in sync with cdbextensions pytype.cpp
-TypeCodeTypedef, \
-TypeCodeStruct, \
-TypeCodeVoid, \
-TypeCodeIntegral, \
-TypeCodeFloat, \
-TypeCodeEnum, \
-TypeCodePointer, \
-TypeCodeArray, \
-TypeCodeComplex, \
-TypeCodeReference, \
-TypeCodeFunction, \
-TypeCodeMemberPointer, \
-TypeCodeFortranString, \
-TypeCodeUnresolvable, \
-TypeCodeBitfield, \
-TypeCodeRValueReference, \
- = range(0, 16)
-
-def isIntegralTypeName(name):
- return name in ('int', 'unsigned int', 'signed int',
- 'short', 'unsigned short',
- 'long', 'unsigned long',
- 'long long', 'unsigned long long',
- 'char', 'signed char', 'unsigned char',
- 'bool')
-
-def isFloatingPointTypeName(name):
- return name in ('float', 'double', 'long double')
-
-
-def arrayForms():
- return [ArrayPlotFormat]
-
-def mapForms():
- return [CompactMapFormat]
-
-
class ReportItem:
"""
Helper structure to keep temporary 'best' information about a value
@@ -159,21 +71,6 @@ class ReportItem:
% (self.value, self.encoding, self.priority, self.elided)
-def warn(message):
- DumperBase.warn(message)
-
-def xwarn(message):
- warn(message)
- import traceback
- traceback.print_stack()
-
-def error(message):
- raise RuntimeError(message)
-
-def showException(msg, exType, exValue, exTraceback):
- DumperBase.showException(msg, exType, exValue, exTraceback)
-
-
class Timer:
def __init__(self, d, desc):
self.d = d
@@ -220,7 +117,7 @@ class Children:
def __exit__(self, exType, exValue, exTraceBack):
if exType is not None:
if self.d.passExceptions:
- showException('CHILDREN', exType, exValue, exTraceBack)
+ self.d.showException('CHILDREN', exType, exValue, exTraceBack)
self.d.putSpecialValue('notaccessible')
self.d.putNumChild(0)
if self.d.currentMaxNumChild is not None:
@@ -267,11 +164,11 @@ class DumperBase:
@staticmethod
def showException(msg, exType, exValue, exTraceback):
- warn('**** CAUGHT EXCEPTION: %s ****' % msg)
+ self.warn('**** CAUGHT EXCEPTION: %s ****' % msg)
try:
import traceback
for line in traceback.format_exception(exType, exValue, exTraceback):
- warn('%s' % line)
+ self.warn('%s' % line)
except:
pass
@@ -353,9 +250,9 @@ class DumperBase:
self.uninitialized = list(map(lambda x: self.hexdecode(x), self.uninitialized))
self.partialUpdate = int(args.get('partial', '0'))
self.fallbackQtVersion = 0x50200
- #warn('NAMESPACE: "%s"' % self.qtNamespace())
- #warn('EXPANDED INAMES: %s' % self.expandedINames)
- #warn('WATCHERS: %s' % self.watchers)
+ #DumperBase.warn('NAMESPACE: "%s"' % self.qtNamespace())
+ #DumperBase.warn('EXPANDED INAMES: %s' % self.expandedINames)
+ #DumperBase.warn('WATCHERS: %s' % self.watchers)
def resetPerStepCaches(self):
self.perStepCache = {}
@@ -363,7 +260,7 @@ class DumperBase:
def resetCaches(self):
# This is a cache mapping from 'type name' to 'display alternatives'.
- self.qqFormats = { 'QVariant (QVariantMap)' : mapForms() }
+ self.qqFormats = { 'QVariant (QVariantMap)' : [DisplayFormat.CompactMapFormat] }
# This is a cache of all known dumpers.
self.qqDumpers = {} # Direct type match
@@ -434,7 +331,7 @@ class DumperBase:
self.currentType = ReportItem();
def exitSubItem(self, item, exType, exValue, exTraceBack):
- #warn('CURRENT VALUE: %s: %s %s' %
+ #DumperBase.warn('CURRENT VALUE: %s: %s %s' %
# (self.currentIName, self.currentValue, self.currentType))
if not exType is None:
if self.passExceptions:
@@ -493,7 +390,7 @@ class DumperBase:
def stripForFormat(self, typeName):
if not isinstance(typeName, str):
- error('Expected string in stripForFormat(), got %s' % type(typeName))
+ raise RuntimeError('Expected string in stripForFormat(), got %s' % type(typeName))
if typeName in self.cachedFormats:
return self.cachedFormats[typeName]
stripped = ''
@@ -541,7 +438,7 @@ class DumperBase:
tdata.name = typeId
tdata.typeId = typeId
tdata.lbitsize = 16
- tdata.code = TypeCodeIntegral
+ tdata.code = TypeCode.TypeCodeIntegral
self.registerType(typeId, tdata)
typeId = 'QChar'
@@ -549,7 +446,7 @@ class DumperBase:
tdata.name = typeId
tdata.typeId = typeId
tdata.lbitsize = 16
- tdata.code = TypeCodeStruct
+ tdata.code = TypeCode.TypeCodeStruct
tdata.lfields = [self.Field(dumper=self, name='ucs', type='unsigned short', bitsize=16, bitpos=0)]
tdata.lalignment = 2
tdata.templateArguments = []
@@ -576,14 +473,14 @@ class DumperBase:
inner = inner[6:].strip()
if inner.endswith(' const'):
inner = inner[:-6].strip()
- #warn("FOUND: %s" % inner)
+ #DumperBase.warn("FOUND: %s" % inner)
targs.append(inner)
- #warn("SPLITTING %s" % typename)
+ #DumperBase.warn("SPLITTING %s" % typename)
level = 0
inner = ''
for c in typename[::-1]: # Reversed...
- #warn("C: %s" % c)
+ #DumperBase.warn("C: %s" % c)
if c == '>':
if level > 0:
inner += c
@@ -597,7 +494,7 @@ class DumperBase:
inner = ''
break
elif c == ',':
- #warn('c: %s level: %s' % (c, level))
+ #DumperBase.warn('c: %s level: %s' % (c, level))
if level == 1:
push(inner)
inner = ''
@@ -606,7 +503,7 @@ class DumperBase:
else:
inner += c
- #warn("TARGS: %s %s" % (typename, targs))
+ #DumperBase.warn("TARGS: %s %s" % (typename, targs))
res = []
for item in targs[::-1]:
if len(item) == 0:
@@ -626,7 +523,7 @@ class DumperBase:
res.append(val)
else:
res.append(self.Type(self, item))
- #warn("RES: %s %s" % (typename, [(None if t is None else t.name) for t in res]))
+ #DumperBase.warn("RES: %s %s" % (typename, [(None if t is None else t.name) for t in res]))
return res
# Hex decoding operating on str, return str.
@@ -729,12 +626,12 @@ class DumperBase:
return elided, self.readMemory(data, shown)
def putCharArrayValue(self, data, size, charSize,
- displayFormat = AutomaticFormat):
+ displayFormat = DisplayFormat.AutomaticFormat):
bytelen = size * charSize
elided, shown = self.computeLimit(bytelen, self.displayStringLimit)
mem = self.readMemory(data, shown)
if charSize == 1:
- if displayFormat in (Latin1StringFormat, SeparateLatin1StringFormat):
+ if displayFormat in (DisplayFormat.Latin1StringFormat, DisplayFormat.SeparateLatin1StringFormat):
encodingType = 'latin1'
else:
encodingType = 'utf8'
@@ -748,12 +645,12 @@ class DumperBase:
self.putValue(mem, encodingType, elided=elided)
- if displayFormat in (SeparateLatin1StringFormat, SeparateUtf8StringFormat, SeparateFormat):
+ if displayFormat in (DisplayFormat.SeparateLatin1StringFormat, DisplayFormat.SeparateUtf8StringFormat, DisplayFormat.SeparateFormat):
elided, shown = self.computeLimit(bytelen, 100000)
self.putDisplay(encodingType + ':separate', self.readMemory(data, shown))
def putCharArrayHelper(self, data, size, charType,
- displayFormat = AutomaticFormat,
+ displayFormat = DisplayFormat.AutomaticFormat,
makeExpandable = True):
charSize = charType.size()
self.putCharArrayValue(data, size, charSize, displayFormat = displayFormat)
@@ -976,7 +873,7 @@ class DumperBase:
def check(self, exp):
if not exp:
- error('Check failed: %s' % exp)
+ raise RuntimeError('Check failed: %s' % exp)
def checkRef(self, ref):
# Assume there aren't a million references to any object.
@@ -985,7 +882,7 @@ class DumperBase:
def checkIntType(self, thing):
if not self.isInt(thing):
- error('Expected an integral value, got %s' % type(thing))
+ raise RuntimeError('Expected an integral value, got %s' % type(thing))
def readToFirstZero(self, base, tsize, maximum):
self.checkIntType(base)
@@ -1001,9 +898,9 @@ class DumperBase:
break
except:
maximum = int(maximum / 2)
- warn('REDUCING READING MAXIMUM TO %s' % maximum)
+ self.warn('REDUCING READING MAXIMUM TO %s' % maximum)
- #warn('BASE: 0x%x TSIZE: %s MAX: %s' % (base, tsize, maximum))
+ #DumperBase.warn('BASE: 0x%x TSIZE: %s MAX: %s' % (base, tsize, maximum))
for i in xrange(0, maximum, tsize):
t = struct.unpack_from(code, blob, i)[0]
if t == 0:
@@ -1179,7 +1076,7 @@ class DumperBase:
self.putItem(value)
def isExpanded(self):
- #warn('IS EXPANDED: %s in %s: %s' % (self.currentIName,
+ #DumperBase.warn('IS EXPANDED: %s in %s: %s' % (self.currentIName,
# self.expandedINames, self.currentIName in self.expandedINames))
return self.currentIName in self.expandedINames
@@ -1213,7 +1110,7 @@ class DumperBase:
n = arrayByteSize // innerType.size()
p = value.address()
- if displayFormat != RawFormat and p:
+ if displayFormat != DisplayFormat.RawFormat and p:
if innerType.name in ('char', 'wchar_t', 'unsigned char', 'signed char', 'CHAR', 'WCHAR'):
self.putCharArrayHelper(p, n, innerType, self.currentItemFormat(),
makeExpandable = False)
@@ -1236,7 +1133,7 @@ class DumperBase:
ns = self.qtNamespace()
if len(ns) > 0 and typeName.startswith(ns):
typeName = typeName[len(ns):]
- # warn( 'stripping %s' % typeName )
+ # DumperBase.warn( 'stripping %s' % typeName )
lvl = 0
pos = None
stripChunks = []
@@ -1251,24 +1148,24 @@ class DumperBase:
elif s == '>':
lvl -= 1
if lvl < 0 :
- error("Unbalanced '<' in type, @index %d" % index)
+ raise RuntimeError("Unbalanced '<' in type, @index %d" % index)
if lvl == 0:
stripChunks.append((pos, index+1))
if lvl != 0:
- error("unbalanced at end of type name")
+ raise RuntimeError("unbalanced at end of type name")
for (f, l) in reversed(stripChunks):
typeName = typeName[:f] + typeName[l:]
return typeName
def tryPutPrettyItem(self, typeName, value):
value.check()
- if self.useFancy and self.currentItemFormat() != RawFormat:
+ if self.useFancy and self.currentItemFormat() != DisplayFormat.RawFormat:
self.putType(typeName)
nsStrippedType = self.stripNamespaceFromType(typeName)\
.replace('::', '__')
- #warn('STRIPPED: %s' % nsStrippedType)
+ #DumperBase.warn('STRIPPED: %s' % nsStrippedType)
# The following block is only needed for D.
if nsStrippedType.startswith('_A'):
# DMD v2.058 encodes string[] as _Array_uns long long.
@@ -1281,7 +1178,7 @@ class DumperBase:
return True
dumper = self.qqDumpers.get(nsStrippedType)
- #warn('DUMPER: %s' % dumper)
+ #DumperBase.warn('DUMPER: %s' % dumper)
if dumper is not None:
dumper(self, value)
return True
@@ -1308,7 +1205,7 @@ class DumperBase:
# This is shared by pointer and array formatting.
def tryPutSimpleFormattedPointer(self, ptr, typeName, innerType, displayFormat, limit):
- if displayFormat == AutomaticFormat:
+ if displayFormat == DisplayFormat.AutomaticFormat:
if innerType.name in ('char', 'signed char', 'unsigned char', 'CHAR'):
# Use UTF-8 as default for char *.
self.putType(typeName)
@@ -1328,45 +1225,45 @@ class DumperBase:
self.putValue(data, 'ucs4', elided=elided)
return True
- if displayFormat == Latin1StringFormat:
+ if displayFormat == DisplayFormat.Latin1StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', elided=elided)
return True
- if displayFormat == SeparateLatin1StringFormat:
+ if displayFormat == DisplayFormat.SeparateLatin1StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'latin1', elided=elided)
self.putDisplay('latin1:separate', data)
return True
- if displayFormat == Utf8StringFormat:
+ if displayFormat == DisplayFormat.Utf8StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', elided=elided)
return True
- if displayFormat == SeparateUtf8StringFormat:
+ if displayFormat == DisplayFormat.SeparateUtf8StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'utf8', elided=elided)
self.putDisplay('utf8:separate', data)
return True
- if displayFormat == Local8BitStringFormat:
+ if displayFormat == DisplayFormat.Local8BitStringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 1, limit)
self.putValue(data, 'local8bit', elided=elided)
return True
- if displayFormat == Utf16StringFormat:
+ if displayFormat == DisplayFormat.Utf16StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 2, limit)
self.putValue(data, 'utf16', elided=elided)
return True
- if displayFormat == Ucs4StringFormat:
+ if displayFormat == DisplayFormat.Ucs4StringFormat:
self.putType(typeName)
(elided, data) = self.encodeCArray(ptr, 4, limit)
self.putValue(data, 'ucs4', elided=elided)
@@ -1390,12 +1287,12 @@ class DumperBase:
def putFormattedPointerX(self, value):
self.putOriginalAddress(value.address())
- #warn("PUT FORMATTED: %s" % value)
+ #DumperBase.warn("PUT FORMATTED: %s" % value)
pointer = value.pointer()
self.putAddress(pointer)
- #warn('POINTER: 0x%x' % pointer)
+ #DumperBase.warn('POINTER: 0x%x' % pointer)
if pointer == 0:
- #warn('NULL POINTER')
+ #DumperBase.warn('NULL POINTER')
self.putType(value.type)
self.putValue('0x0')
self.putNumChild(0)
@@ -1408,7 +1305,7 @@ class DumperBase:
except:
# Failure to dereference a pointer should at least
# show the value of a pointer.
- #warn('BAD POINTER: %s' % value)
+ #DumperBase.warn('BAD POINTER: %s' % value)
self.putValue('0x%x' % pointer)
self.putType(typeName)
self.putNumChild(0)
@@ -1422,15 +1319,15 @@ class DumperBase:
innerType = value.type.target() #.unqualified()
if innerType.name == 'void':
- #warn('VOID POINTER: %s' % displayFormat)
+ #DumperBase.warn('VOID POINTER: %s' % displayFormat)
self.putType(typeName)
self.putSymbolValue(pointer)
self.putNumChild(0)
return
- if displayFormat == RawFormat:
+ if displayFormat == DisplayFormat.RawFormat:
# Explicitly requested bald pointer.
- #warn('RAW')
+ #DumperBase.warn('RAW')
self.putType(typeName)
self.putValue('0x%x' % pointer)
self.putNumChild(1)
@@ -1441,38 +1338,38 @@ class DumperBase:
return
limit = self.displayStringLimit
- if displayFormat in (SeparateLatin1StringFormat, SeparateUtf8StringFormat):
+ if displayFormat in (DisplayFormat.SeparateLatin1StringFormat, DisplayFormat.SeparateUtf8StringFormat):
limit = 1000000
if self.tryPutSimpleFormattedPointer(pointer, typeName,
innerType, displayFormat, limit):
self.putNumChild(1)
return
- if Array10Format <= displayFormat and displayFormat <= Array1000Format:
- n = (10, 100, 1000, 10000)[displayFormat - Array10Format]
+ if DisplayFormat.Array10Format <= displayFormat and displayFormat <= DisplayFormat.Array1000Format:
+ n = (10, 100, 1000, 10000)[displayFormat - DisplayFormat.Array10Format]
self.putType(typeName)
self.putItemCount(n)
self.putArrayData(value.pointer(), n, innerType)
return
- if innerType.code == TypeCodeFunction:
+ if innerType.code == TypeCode.TypeCodeFunction:
# A function pointer.
self.putSymbolValue(pointer)
self.putType(typeName)
self.putNumChild(0)
return
- #warn('AUTODEREF: %s' % self.autoDerefPointers)
- #warn('INAME: %s' % self.currentIName)
- #warn('INNER: %s' % innerType.name)
+ #DumperBase.warn('AUTODEREF: %s' % self.autoDerefPointers)
+ #DumperBase.warn('INAME: %s' % self.currentIName)
+ #DumperBase.warn('INNER: %s' % innerType.name)
if self.autoDerefPointers:
# Generic pointer type with AutomaticFormat, but never dereference char types:
if innerType.name not in ('char', 'signed char', 'unsigned char', 'wchar_t', 'CHAR', 'WCHAR'):
self.putDerefedPointer(value)
return
- #warn('GENERIC PLAIN POINTER: %s' % value.type)
- #warn('ADDR PLAIN POINTER: 0x%x' % value.laddress)
+ #DumperBase.warn('GENERIC PLAIN POINTER: %s' % value.type)
+ #DumperBase.warn('ADDR PLAIN POINTER: 0x%x' % value.laddress)
self.putType(typeName)
self.putSymbolValue(pointer)
self.putNumChild(1)
@@ -1631,14 +1528,14 @@ class DumperBase:
# metaObjectFunc = self.extractPointer(vtablePtr)
# cmd = '((void*(*)(void*))0x%x)((void*)0x%x)' % (metaObjectFunc, objectPtr)
# try:
-# #warn('MO CMD: %s' % cmd)
+# #DumperBase.warn('MO CMD: %s' % cmd)
# res = self.parseAndEvaluate(cmd)
-# #warn('MO RES: %s' % res)
+# #DumperBase.warn('MO RES: %s' % res)
# self.bump('successfulMetaObjectCall')
# return res.pointer()
# except:
# self.bump('failedMetaObjectCall')
-# #warn('COULD NOT EXECUTE: %s' % cmd)
+# #DumperBase.warn('COULD NOT EXECUTE: %s' % cmd)
# return 0
def extractMetaObjectPtr(self, objectPtr, typeobj):
@@ -1659,14 +1556,14 @@ class DumperBase:
metaObjectFunc = self.extractPointer(vtablePtr)
cmd = '((void*(*)(void*))0x%x)((void*)0x%x)' % (metaObjectFunc, objectPtr)
try:
- #warn('MO CMD: %s' % cmd)
+ #DumperBase.warn('MO CMD: %s' % cmd)
res = self.parseAndEvaluate(cmd)
- #warn('MO RES: %s' % res)
+ #DumperBase.warn('MO RES: %s' % res)
self.bump('successfulMetaObjectCall')
return res.pointer()
except:
self.bump('failedMetaObjectCall')
- #warn('COULD NOT EXECUTE: %s' % cmd)
+ #DumperBase.warn('COULD NOT EXECUTE: %s' % cmd)
return 0
def extractStaticMetaObjectFromTypeHelper(someTypeObj):
@@ -1729,12 +1626,12 @@ class DumperBase:
result = self.knownStaticMetaObjects.get(typeName, None)
if result is not None: # Is 0 or the static metaobject.
self.bump('typecached')
- #warn('CACHED RESULT: %s %s 0x%x' % (self.currentIName, typeName, result))
+ #DumperBase.warn('CACHED RESULT: %s %s 0x%x' % (self.currentIName, typeName, result))
return result
if not self.couldBeQObjectPointer(objectPtr):
self.bump('cannotBeQObject')
- #warn('DOES NOT LOOK LIKE A QOBJECT: %s' % self.currentIName)
+ #DumperBase.warn('DOES NOT LOOK LIKE A QOBJECT: %s' % self.currentIName)
return 0
metaObjectPtr = 0
@@ -1761,7 +1658,7 @@ class DumperBase:
val = self.Value(self)
val.laddress = value
return val.split(pattern)
- error('CANNOT EXTRACT STRUCT FROM %s' % type(value))
+ raise RuntimeError('CANNOT EXTRACT STRUCT FROM %s' % type(value))
def extractCString(self, addr):
result = bytearray()
@@ -1878,9 +1775,9 @@ class DumperBase:
isQMetaObject = origType == 'QMetaObject'
isQObject = origType == 'QObject'
- #warn('OBJECT GUTS: %s 0x%x ' % (self.currentIName, metaObjectPtr))
+ #DumperBase.warn('OBJECT GUTS: %s 0x%x ' % (self.currentIName, metaObjectPtr))
dataPtr = extractDataPtr(metaObjectPtr)
- #warn('DATA PTRS: %s 0x%x ' % (self.currentIName, dataPtr))
+ #DumperBase.warn('DATA PTRS: %s 0x%x ' % (self.currentIName, dataPtr))
(revision, classname,
classinfo, classinfo2,
methodCount, methods,
@@ -2048,18 +1945,18 @@ class DumperBase:
# LLDB doesn't like calling it on a derived class, possibly
# due to type information living in a different shared object.
#base = self.createValue(qobjectPtr, '@QObject')
- #warn("CALL FUNC: 0x%x" % self.qtPropertyFunc)
+ #DumperBase.warn("CALL FUNC: 0x%x" % self.qtPropertyFunc)
cmd = '((QVariant(*)(void*,char*))0x%x)((void*)0x%x,"%s")' \
% (self.qtPropertyFunc, qobjectPtr, name)
try:
- #warn('PROP CMD: %s' % cmd)
+ #DumperBase.warn('PROP CMD: %s' % cmd)
res = self.parseAndEvaluate(cmd)
- #warn('PROP RES: %s' % res)
+ #DumperBase.warn('PROP RES: %s' % res)
except:
self.bump('failedMetaObjectCall')
putt(name, ' ')
continue
- #warn('COULD NOT EXECUTE: %s' % cmd)
+ #DumperBase.warn('COULD NOT EXECUTE: %s' % cmd)
#self.putCallItem(name, '@QVariant', base, 'property', '"' + name + '"')
if res is None:
self.bump('failedMetaObjectCall2')
@@ -2205,19 +2102,19 @@ class DumperBase:
break
def currentItemFormat(self, typeName = None):
- displayFormat = self.formats.get(self.currentIName, AutomaticFormat)
- if displayFormat == AutomaticFormat:
+ displayFormat = self.formats.get(self.currentIName, DisplayFormat.AutomaticFormat)
+ if displayFormat == DisplayFormat.AutomaticFormat:
if typeName is None:
typeName = self.currentType.value
needle = None if typeName is None else self.stripForFormat(typeName)
- displayFormat = self.typeformats.get(needle, AutomaticFormat)
+ displayFormat = self.typeformats.get(needle, DisplayFormat.AutomaticFormat)
return displayFormat
def putSubItem(self, component, value): # -> ReportItem
if not isinstance(value, self.Value):
- error('WRONG VALUE TYPE IN putSubItem: %s' % type(value))
+ raise RuntimeError('WRONG VALUE TYPE IN putSubItem: %s' % type(value))
if not isinstance(value.type, self.Type):
- error('WRONG TYPE TYPE IN putSubItem: %s' % type(value.type))
+ raise RuntimeError('WRONG TYPE TYPE IN putSubItem: %s' % type(value.type))
res = None
with SubItem(self, component):
self.putItem(value)
@@ -2230,7 +2127,7 @@ class DumperBase:
addrBase = base
innerSize = innerType.size()
self.putNumChild(n)
- #warn('ADDRESS: 0x%x INNERSIZE: %s INNERTYPE: %s' % (addrBase, innerSize, innerType))
+ #DumperBase.warn('ADDRESS: 0x%x INNERSIZE: %s INNERTYPE: %s' % (addrBase, innerSize, innerType))
enc = innerType.simpleEncoding()
if enc:
self.put('childtype="%s",' % innerType.name)
@@ -2262,7 +2159,7 @@ class DumperBase:
if n > maxNumChild:
self.putField('plotelided', n) # FIXME: Act on that in frontend
n = maxNumChild
- if self.currentItemFormat() == ArrayPlotFormat and innerType.isSimpleType():
+ if self.currentItemFormat() == DisplayFormat.ArrayPlotFormat and innerType.isSimpleType():
enc = innerType.simpleEncoding()
if enc:
self.putField('editencoding', enc)
@@ -2302,7 +2199,7 @@ class DumperBase:
def extractPointer(self, value):
try:
- if value.type.code == TypeCodeArray:
+ if value.type.code == TypeCode.TypeCodeArray:
return value.address()
except:
pass
@@ -2337,7 +2234,7 @@ class DumperBase:
return val.extractSomething(pattern, bitsize)
if isinstance(value, self.Value):
return value.extractSomething(pattern, bitsize)
- error('CANT EXTRACT FROM %s' % type(value))
+ raise RuntimeError('CANT EXTRACT FROM %s' % type(value))
# Parses a..b and a.(s).b
def parseRange(self, exp):
@@ -2394,13 +2291,13 @@ class DumperBase:
self.putField('numchild', numchild)
def handleLocals(self, variables):
- #warn('VARIABLES: %s' % variables)
+ #DumperBase.warn('VARIABLES: %s' % variables)
#with self.timer('locals'):
shadowed = {}
for value in variables:
if value.name == 'argv':
- if value.type.code == TypeCodePointer:
- if value.type.ltarget.code == TypeCodePointer:
+ if value.type.code == TypeCode.TypeCodePointer:
+ if value.type.ltarget.code == TypeCode.TypeCodePointer:
if value.type.ltarget.ltarget.name == 'char':
self.putSpecialArgv(value)
continue
@@ -2430,7 +2327,7 @@ class DumperBase:
def handleWatch(self, origexp, exp, iname):
exp = str(exp).strip()
escapedExp = self.hexencode(exp)
- #warn('HANDLING WATCH %s -> %s, INAME: "%s"' % (origexp, exp, iname))
+ #DumperBase.warn('HANDLING WATCH %s -> %s, INAME: "%s"' % (origexp, exp, iname))
# Grouped items separated by semicolon.
if exp.find(';') >= 0:
@@ -2450,7 +2347,7 @@ class DumperBase:
# Special array index: e.g a[1..199] or a[1.(3).199] for stride 3.
isRange, begin, step, end, template = self.parseRange(exp)
if isRange:
- #warn('RANGE: %s %s %s in %s' % (begin, step, end, template))
+ #DumperBase.warn('RANGE: %s %s %s in %s' % (begin, step, end, template))
r = range(begin, end, step)
n = len(r)
with TopLevelItem(self, iname):
@@ -2632,7 +2529,7 @@ class DumperBase:
resdict = json.loads(payload)
continue
except:
- warn('Cannot parse native payload: %s' % payload)
+ self.warn('Cannot parse native payload: %s' % payload)
else:
print('interpreteralien=%s'
% {'service': service, 'payload': self.hexencode(payload)})
@@ -2640,7 +2537,7 @@ class DumperBase:
expr = 'qt_qmlDebugClearBuffer()'
res = self.parseAndEvaluate(expr)
except RuntimeError as error:
- warn('Cleaning buffer failed: %s: %s' % (expr, error))
+ self.warn('Cleaning buffer failed: %s: %s' % (expr, error))
return resdict
@@ -2651,14 +2548,14 @@ class DumperBase:
try:
res = self.parseAndEvaluate(expr)
except RuntimeError as error:
- warn('Interpreter command failed: %s: %s' % (encoded, error))
+ self.warn('Interpreter command failed: %s: %s' % (encoded, error))
return {}
except AttributeError as error:
# Happens with LLDB and 'None' current thread.
- warn('Interpreter command failed: %s: %s' % (encoded, error))
+ self.warn('Interpreter command failed: %s: %s' % (encoded, error))
return {}
if not res:
- warn('Interpreter command failed: %s ' % encoded)
+ self.warn('Interpreter command failed: %s ' % encoded)
return {}
return self.fetchInterpreterResult()
@@ -2683,7 +2580,7 @@ class DumperBase:
self.doContinue()
def doInsertInterpreterBreakpoint(self, args, wasPending):
- #warn('DO INSERT INTERPRETER BREAKPOINT, WAS PENDING: %s' % wasPending)
+ #DumperBase.warn('DO INSERT INTERPRETER BREAKPOINT, WAS PENDING: %s' % wasPending)
# Will fail if the service is not yet up and running.
response = self.sendInterpreterRequest('setbreakpoint', args)
bp = None if response is None else response.get('breakpoint', None)
@@ -2738,7 +2635,7 @@ class DumperBase:
self.putItemX(value)
def putItemX(self, value):
- #warn('PUT ITEM: %s' % value.stringify())
+ #DumperBase.warn('PUT ITEM: %s' % value.stringify())
typeobj = value.type #unqualified()
typeName = typeobj.name
@@ -2753,23 +2650,23 @@ class DumperBase:
return
if not isinstance(value, self.Value):
- error('WRONG TYPE IN putItem: %s' % type(self.Value))
+ raise RuntimeError('WRONG TYPE IN putItem: %s' % type(self.Value))
# Try on possibly typedefed type first.
if self.tryPutPrettyItem(typeName, value):
- if typeobj.code == TypeCodePointer:
+ if typeobj.code == TypeCode.TypeCodePointer:
self.putOriginalAddress(value.address())
else:
self.putAddress(value.address())
return
- if typeobj.code == TypeCodeTypedef:
- #warn('TYPEDEF VALUE: %s' % value.stringify())
+ if typeobj.code == TypeCode.TypeCodeTypedef:
+ #DumperBase.warn('TYPEDEF VALUE: %s' % value.stringify())
self.putItem(value.detypedef())
self.putBetterType(typeName)
return
- if typeobj.code == TypeCodePointer:
+ if typeobj.code == TypeCode.TypeCodePointer:
self.putFormattedPointer(value)
if value.summary and self.useFancy:
self.putValue(self.hexencode(value.summary), 'utf8:1:0')
@@ -2777,50 +2674,50 @@ class DumperBase:
self.putAddress(value.address())
- if typeobj.code == TypeCodeFunction:
- #warn('FUNCTION VALUE: %s' % value)
+ if typeobj.code == TypeCode.TypeCodeFunction:
+ #DumperBase.warn('FUNCTION VALUE: %s' % value)
self.putType(typeobj)
self.putSymbolValue(value.pointer())
self.putNumChild(0)
return
- if typeobj.code == TypeCodeEnum:
- #warn('ENUM VALUE: %s' % value.stringify())
+ if typeobj.code == TypeCode.TypeCodeEnum:
+ #DumperBase.warn('ENUM VALUE: %s' % value.stringify())
self.putType(typeobj.name)
self.putValue(value.display())
self.putNumChild(0)
return
- if typeobj.code == TypeCodeArray:
- #warn('ARRAY VALUE: %s' % value)
+ if typeobj.code == TypeCode.TypeCodeArray:
+ #DumperBase.warn('ARRAY VALUE: %s' % value)
self.putCStyleArray(value)
return
- if typeobj.code == TypeCodeBitfield:
- #warn('BITFIELD VALUE: %s %d %s' % (value.name, value.lvalue, typeName))
+ if typeobj.code == TypeCode.TypeCodeBitfield:
+ #DumperBase.warn('BITFIELD VALUE: %s %d %s' % (value.name, value.lvalue, typeName))
self.putNumChild(0)
dd = typeobj.ltarget.typeData().enumDisplay
self.putValue(str(value.lvalue) if dd is None else dd(value.lvalue, value.laddress, '%d'))
self.putType(typeName)
return
- if typeobj.code == TypeCodeIntegral:
- #warn('INTEGER: %s %s' % (value.name, value))
+ if typeobj.code == TypeCode.TypeCodeIntegral:
+ #DumperBase.warn('INTEGER: %s %s' % (value.name, value))
val = value.value()
self.putNumChild(0)
self.putValue(val)
self.putType(typeName)
return
- if typeobj.code == TypeCodeFloat:
- #warn('FLOAT VALUE: %s' % value)
+ if typeobj.code == TypeCode.TypeCodeFloat:
+ #DumperBase.warn('FLOAT VALUE: %s' % value)
self.putValue(value.value())
self.putNumChild(0)
self.putType(typeobj.name)
return
- if typeobj.code in (TypeCodeReference, TypeCodeRValueReference):
- #warn('REFERENCE VALUE: %s' % value)
+ if typeobj.code in (TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
+ #DumperBase.warn('REFERENCE VALUE: %s' % value)
val = value.dereference()
if val.laddress != 0:
self.putItem(val)
@@ -2829,13 +2726,13 @@ class DumperBase:
self.putBetterType(typeName)
return
- if typeobj.code == TypeCodeComplex:
+ if typeobj.code == TypeCode.TypeCodeComplex:
self.putType(typeobj)
self.putValue(value.display())
self.putNumChild(0)
return
- if typeobj.code == TypeCodeFortranString:
+ if typeobj.code == TypeCode.TypeCodeFortranString:
self.putValue(self.hexencode(value.data()), 'latin1')
self.putNumChild(0)
self.putType(typeobj)
@@ -2850,12 +2747,12 @@ class DumperBase:
self.putArrayData(base.pointer(), n, base.type.target())
return
- #warn('SOME VALUE: %s' % value)
- #warn('HAS CHILDREN VALUE: %s' % value.hasChildren())
- #warn('GENERIC STRUCT: %s' % typeobj)
- #warn('INAME: %s ' % self.currentIName)
- #warn('INAMES: %s ' % self.expandedINames)
- #warn('EXPANDED: %s ' % (self.currentIName in self.expandedINames))
+ #DumperBase.warn('SOME VALUE: %s' % value)
+ #DumperBase.warn('HAS CHILDREN VALUE: %s' % value.hasChildren())
+ #DumperBase.warn('GENERIC STRUCT: %s' % typeobj)
+ #DumperBase.warn('INAME: %s ' % self.currentIName)
+ #DumperBase.warn('INAMES: %s ' % self.expandedINames)
+ #DumperBase.warn('EXPANDED: %s ' % (self.currentIName in self.expandedINames))
self.putType(typeName)
if value.summary is not None and self.useFancy:
@@ -2865,7 +2762,7 @@ class DumperBase:
self.putNumChild(1)
self.putEmptyValue()
- #warn('STRUCT GUTS: %s ADDRESS: 0x%x ' % (value.name, value.address()))
+ #DumperBase.warn('STRUCT GUTS: %s ADDRESS: 0x%x ' % (value.name, value.address()))
if self.showQObjectNames:
#with self.timer(self.currentIName):
self.putQObjectNameValue(value)
@@ -2888,7 +2785,7 @@ class DumperBase:
if addr:
# Only available with Qt 5.3+
(hookVersion, x, x, x, x, x, tiVersion) = self.split('ppppppp', addr)
- #warn('HOOK: %s TI: %s' % (hookVersion, tiVersion))
+ #DumperBase.warn('HOOK: %s TI: %s' % (hookVersion, tiVersion))
if hookVersion >= 3:
self.qtTypeInfoVersion = lambda: tiVersion
return tiVersion
@@ -2948,12 +2845,12 @@ class DumperBase:
def check(self):
if self.laddress is not None and not self.dumper.isInt(self.laddress):
- error('INCONSISTENT ADDRESS: %s' % type(self.laddress))
+ raise RuntimeError('INCONSISTENT ADDRESS: %s' % type(self.laddress))
if self.type is not None and not isinstance(self.type, self.dumper.Type):
- error('INCONSISTENT TYPE: %s' % type(self.type))
+ raise RuntimeError('INCONSISTENT TYPE: %s' % type(self.type))
def __str__(self):
- #error('Not implemented')
+ #raise RuntimeError('Not implemented')
return self.stringify()
def __int__(self):
@@ -2987,14 +2884,14 @@ class DumperBase:
return '<unknown data>'
def pointer(self):
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().pointer()
return self.extractInteger(self.dumper.ptrSize() * 8, True)
def integer(self, bitsize=None):
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().integer()
- elif self.type.code == TypeCodeBitfield:
+ elif self.type.code == TypeCode.TypeCodeBitfield:
return self.lvalue
# Could be something like 'short unsigned int'
unsigned = self.type.name == 'unsigned' \
@@ -3007,7 +2904,7 @@ class DumperBase:
def floatingPoint(self):
if self.nativeValue is not None and not self.dumper.isCdb:
return str(self.nativeValue)
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().floatingPoint()
if self.type.size() == 8:
return self.extractSomething('d', 64)
@@ -3022,7 +2919,7 @@ class DumperBase:
exp = (h & 0x7fff)
fraction = l
bit63 = (l >> 63) & 1
- #warn("SIGN: %s EXP: %s H: 0x%x L: 0x%x" % (sign, exp, h, l))
+ #DumperBase.warn("SIGN: %s EXP: %s H: 0x%x L: 0x%x" % (sign, exp, h, l))
if exp == 0:
if bit63 == 0:
if l == 0:
@@ -3039,7 +2936,7 @@ class DumperBase:
sign = h >> 63
exp = (h >> 48) & 0x7fff
fraction = h & (2**48 - 1)
- #warn("SIGN: %s EXP: %s FRAC: %s H: 0x%x L: 0x%x" % (sign, exp, fraction, h, l))
+ #DumperBase.warn("SIGN: %s EXP: %s FRAC: %s H: 0x%x L: 0x%x" % (sign, exp, fraction, h, l))
if exp == 0:
if fraction == 0:
res = -0.0 if sign else 0.0
@@ -3053,17 +2950,17 @@ class DumperBase:
def value(self):
if self.type is not None:
- if self.type.code == TypeCodeEnum:
+ if self.type.code == TypeCode.TypeCodeEnum:
return self.displayEnum()
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().value()
- if self.type.code == TypeCodeIntegral:
+ if self.type.code == TypeCode.TypeCodeIntegral:
return self.integer()
- if self.type.code == TypeCodeBitfield:
+ if self.type.code == TypeCode.TypeCodeBitfield:
return self.integer()
- if self.type.code == TypeCodeFloat:
+ if self.type.code == TypeCode.TypeCodeFloat:
return self.floatingPoint()
- if self.type.code == TypeCodePointer:
+ if self.type.code == TypeCode.TypeCodePointer:
return self.pointer()
return None
@@ -3072,42 +2969,42 @@ class DumperBase:
def findMemberByName(self, name):
self.check()
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.findMemberByName(self.detypedef())
- if self.type.code in (TypeCodePointer, TypeCodeReference, TypeCodeRValueReference):
+ if self.type.code in (TypeCode.TypeCodePointer, TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
res = self.dereference().findMemberByName(name)
if res is not None:
return res
- if self.type.code == TypeCodeStruct:
- #warn('SEARCHING FOR MEMBER: %s IN %s' % (name, self.type.name))
+ if self.type.code == TypeCode.TypeCodeStruct:
+ #DumperBase.warn('SEARCHING FOR MEMBER: %s IN %s' % (name, self.type.name))
members = self.members(True)
- #warn('MEMBERS: %s' % members)
+ #DumperBase.warn('MEMBERS: %s' % members)
for member in members:
- #warn('CHECKING FIELD %s' % member.name)
- if member.type.code == TypeCodeTypedef:
+ #DumperBase.warn('CHECKING FIELD %s' % member.name)
+ if member.type.code == TypeCode.TypeCodeTypedef:
member = member.detypedef()
if member.name == name:
return member
for member in members:
- if member.type.code == TypeCodeTypedef:
+ if member.type.code == TypeCode.TypeCodeTypedef:
member = member.detypedef()
if member.name == name: # Could be base class.
return member
- if member.type.code == TypeCodeStruct:
+ if member.type.code == TypeCode.TypeCodeStruct:
res = member.findMemberByName(name)
if res is not None:
return res
return None
def __getitem__(self, index):
- #warn('GET ITEM %s %s' % (self, index))
+ #DumperBase.warn('GET ITEM %s %s' % (self, index))
self.check()
- if self.type.code == TypeCodeTypedef:
- #warn('GET ITEM STRIP TYPEDEFS TO %s' % self.type.ltarget)
+ if self.type.code == TypeCode.TypeCodeTypedef:
+ #DumperBase.warn('GET ITEM STRIP TYPEDEFS TO %s' % self.type.ltarget)
return self.cast(self.type.ltarget).__getitem__(index)
if isinstance(index, str):
- if self.type.code == TypeCodePointer:
- #warn('GET ITEM %s DEREFERENCE TO %s' % (self, self.dereference()))
+ if self.type.code == TypeCode.TypeCodePointer:
+ #DumperBase.warn('GET ITEM %s DEREFERENCE TO %s' % (self, self.dereference()))
return self.dereference().__getitem__(index)
res = self.findMemberByName(index)
if res is None:
@@ -3117,40 +3014,40 @@ class DumperBase:
elif isinstance(index, self.dumper.Field):
field = index
elif self.dumper.isInt(index):
- if self.type.code == TypeCodeArray:
+ if self.type.code == TypeCode.TypeCodeArray:
addr = self.laddress + int(index) * self.type.ltarget.size()
return self.dumper.createValue(addr, self.type.ltarget)
- if self.type.code == TypeCodePointer:
+ if self.type.code == TypeCode.TypeCodePointer:
addr = self.pointer() + int(index) * self.type.ltarget.size()
return self.dumper.createValue(addr, self.type.ltarget)
return self.members(False)[index]
else:
- error('BAD INDEX TYPE %s' % type(index))
+ raise RuntimeError('BAD INDEX TYPE %s' % type(index))
field.check()
- #warn('EXTRACT FIELD: %s, BASE 0x%x' % (field, self.address()))
- if self.type.code == TypeCodePointer:
- #warn('IS TYPEDEFED POINTER!')
+ #DumperBase.warn('EXTRACT FIELD: %s, BASE 0x%x' % (field, self.address()))
+ if self.type.code == TypeCode.TypeCodePointer:
+ #DumperBase.warn('IS TYPEDEFED POINTER!')
res = self.dereference()
- #warn('WAS POINTER: %s' % res)
+ #DumperBase.warn('WAS POINTER: %s' % res)
return field.extract(self)
def extractField(self, field):
if not isinstance(field, self.dumper.Field):
- error('BAD INDEX TYPE %s' % type(field))
+ raise RuntimeError('BAD INDEX TYPE %s' % type(field))
if field.extractor is not None:
val = field.extractor(self)
if val is not None:
- #warn('EXTRACTOR SUCCEEDED: %s ' % val)
+ #DumperBase.warn('EXTRACTOR SUCCEEDED: %s ' % val)
return val
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.cast(self.type.ltarget).extractField(field)
- if self.type.code in (TypeCodeReference, TypeCodeRValueReference):
+ if self.type.code in (TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
return self.dereference().extractField(field)
- #warn('FIELD: %s ' % field)
+ #DumperBase.warn('FIELD: %s ' % field)
val = self.dumper.Value(self.dumper)
val.name = field.name
val.isBaseClass = field.isBase
@@ -3169,7 +3066,7 @@ class DumperBase:
fieldOffset = fieldBitpos // 8
fieldType = field.fieldType()
- if fieldType.code == TypeCodeBitfield:
+ if fieldType.code == TypeCode.TypeCodeBitfield:
fieldBitpos -= fieldOffset * 8
ldata = self.data()
data = 0
@@ -3193,12 +3090,12 @@ class DumperBase:
else:
self.dumper.check(False)
- if fieldType.code in (TypeCodeReference, TypeCodeRValueReference):
+ if fieldType.code in (TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
if val.laddress is not None:
val = self.dumper.createReferenceValue(val.laddress, fieldType.ltarget)
val.name = field.name
- #warn('GOT VAL %s FOR FIELD %s' % (val, field))
+ #DumperBase.warn('GOT VAL %s FOR FIELD %s' % (val, field))
val.lbitsize = fieldBitsize
val.check()
return val
@@ -3207,8 +3104,8 @@ class DumperBase:
# The native backends replace it in their fromNativeValue()
# implementations.
def members(self, includeBases):
- #warn("LISTING MEMBERS OF %s" % self)
- if self.type.code == TypeCodeTypedef:
+ #DumperBase.warn("LISTING MEMBERS OF %s" % self)
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().members(includeBases)
tdata = self.type.typeData()
@@ -3222,47 +3119,47 @@ class DumperBase:
else:
fields = list(tdata.lfields(self))
- #warn("FIELDS: %s" % fields)
+ #DumperBase.warn("FIELDS: %s" % fields)
res = []
for field in fields:
if isinstance(field, self.dumper.Value):
- #warn("USING VALUE DIRECTLY %s" % field.name)
+ #DumperBase.warn("USING VALUE DIRECTLY %s" % field.name)
res.append(field)
continue
if field.isBase and not includeBases:
- #warn("DROPPING BASE %s" % field.name)
+ #DumperBase.warn("DROPPING BASE %s" % field.name)
continue
res.append(self.extractField(field))
- #warn("GOT MEMBERS: %s" % res)
+ #DumperBase.warn("GOT MEMBERS: %s" % res)
return res
def __add__(self, other):
self.check()
if self.dumper.isInt(other):
stripped = self.type.stripTypedefs()
- if stripped.code == TypeCodePointer:
+ if stripped.code == TypeCode.TypeCodePointer:
address = self.pointer() + stripped.dereference().size() * other
val = self.dumper.Value(self.dumper)
val.laddress = None
val.ldata = bytes(struct.pack(self.dumper.packCode + 'Q', address))
val.type = self.type
return val
- error('BAD DATA TO ADD TO: %s %s' % (self.type, other))
+ raise RuntimeError('BAD DATA TO ADD TO: %s %s' % (self.type, other))
def __sub__(self, other):
self.check()
if self.type.name == other.type.name:
stripped = self.type.stripTypedefs()
- if stripped.code == TypeCodePointer:
+ if stripped.code == TypeCode.TypeCodePointer:
return (self.pointer() - other.pointer()) // stripped.dereference().size()
- error('BAD DATA TO SUB TO: %s %s' % (self.type, other))
+ raise RuntimeError('BAD DATA TO SUB TO: %s %s' % (self.type, other))
def dereference(self):
self.check()
- if self.type.code == TypeCodeTypedef:
+ if self.type.code == TypeCode.TypeCodeTypedef:
return self.detypedef().dereference()
val = self.dumper.Value(self.dumper)
- if self.type.code in (TypeCodeReference, TypeCodeRValueReference):
+ if self.type.code in (TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
val.summary = self.summary
if self.nativeValue is None:
val.laddress = self.pointer()
@@ -3271,16 +3168,16 @@ class DumperBase:
val.type = self.dumper.nativeDynamicType(val.laddress, self.type.dereference())
else:
val = self.dumper.nativeValueDereferenceReference(self)
- elif self.type.code == TypeCodePointer:
+ elif self.type.code == TypeCode.TypeCodePointer:
if self.nativeValue is None:
val.laddress = self.pointer()
val.type = self.dumper.nativeDynamicType(val.laddress, self.type.dereference())
else:
val = self.dumper.nativeValueDereferencePointer(self)
else:
- error("WRONG: %s" % self.type.code)
- #warn("DEREFERENCING FROM: %s" % self)
- #warn("DEREFERENCING TO: %s" % val)
+ raise RuntimeError("WRONG: %s" % self.type.code)
+ #DumperBase.warn("DEREFERENCING FROM: %s" % self)
+ #DumperBase.warn("DEREFERENCING TO: %s" % val)
#dynTypeName = val.type.dynamicTypeName(val.laddress)
#if dynTypeName is not None:
# val.type = self.dumper.createType(dynTypeName)
@@ -3288,12 +3185,12 @@ class DumperBase:
def detypedef(self):
self.check()
- if self.type.code != TypeCodeTypedef:
- error("WRONG")
+ if self.type.code != TypeCode.TypeCodeTypedef:
+ raise RuntimeError("WRONG")
val = self.copy()
val.type = self.type.ltarget
- #warn("DETYPEDEF FROM: %s" % self)
- #warn("DETYPEDEF TO: %s" % val)
+ #DumperBase.warn("DETYPEDEF FROM: %s" % self)
+ #DumperBase.warn("DETYPEDEF TO: %s" % val)
return val
def extend(self, size):
@@ -3304,7 +3201,7 @@ class DumperBase:
return val
if self.type.size() == size:
return self
- error('NOT IMPLEMENTED')
+ raise RuntimeError('NOT IMPLEMENTED')
def zeroExtend(self, data, size):
ext = '\0' * (size - len(data))
@@ -3337,7 +3234,7 @@ class DumperBase:
return self.ldata
if size < len(self.ldata):
return self.ldata[:size]
- #error('ZERO-EXTENDING DATA TO %s BYTES: %s' % (size, self))
+ #raise RuntimeError('ZERO-EXTENDING DATA TO %s BYTES: %s' % (size, self))
return self.zeroExtend(self.ldata, size)
if self.laddress is not None:
if size is None:
@@ -3345,8 +3242,8 @@ class DumperBase:
res = self.dumper.readRawMemory(self.laddress, size)
if len(res) > 0:
return res
- error('CANNOT CONVERT ADDRESS TO BYTES: %s' % self)
- error('CANNOT CONVERT TO BYTES: %s' % self)
+ raise RuntimeError('CANNOT CONVERT ADDRESS TO BYTES: %s' % self)
+ raise RuntimeError('CANNOT CONVERT TO BYTES: %s' % self)
def extractInteger(self, bitsize, unsigned):
#with self.dumper.timer('extractInt'):
@@ -3365,7 +3262,7 @@ class DumperBase:
code = 'B' if unsigned else 'b'
rawBytes = self.data(size)
res = struct.unpack_from(self.dumper.packCode + code, rawBytes, 0)[0]
- #warn('Extract: Code: %s Bytes: %s Bitsize: %s Size: %s'
+ #DumperBase.warn('Extract: Code: %s Bytes: %s Bitsize: %s Size: %s'
# % (self.dumper.packCode + code, self.dumper.hexencode(rawBytes), bitsize, size))
return res
@@ -3382,25 +3279,25 @@ class DumperBase:
def split(self, pattern):
#with self.dumper.timer('split'):
- #warn('EXTRACT STRUCT FROM: %s' % self.type)
+ #DumperBase.warn('EXTRACT STRUCT FROM: %s' % self.type)
(pp, size, fields) = self.dumper.describeStruct(pattern)
- #warn('SIZE: %s ' % size)
+ #DumperBase.warn('SIZE: %s ' % size)
result = struct.unpack_from(self.dumper.packCode + pp, self.data(size))
def structFixer(field, thing):
- #warn('STRUCT MEMBER: %s' % type(thing))
+ #DumperBase.warn('STRUCT MEMBER: %s' % type(thing))
if field.isStruct:
#if field.type != field.fieldType():
- # error('DO NOT SIMPLIFY')
- #warn('FIELD POS: %s' % field.type.stringify())
- #warn('FIELD TYE: %s' % field.fieldType().stringify())
+ # raise RuntimeError('DO NOT SIMPLIFY')
+ #DumperBase.warn('FIELD POS: %s' % field.type.stringify())
+ #DumperBase.warn('FIELD TYE: %s' % field.fieldType().stringify())
res = self.dumper.createValue(thing, field.fieldType())
- #warn('RES TYPE: %s' % res.type)
+ #DumperBase.warn('RES TYPE: %s' % res.type)
if self.laddress is not None:
res.laddress = self.laddress + field.offset()
return res
return thing
if len(fields) != len(result):
- error('STRUCT ERROR: %s %s' % (fields, result))
+ raise RuntimeError('STRUCT ERROR: %s %s' % (fields, result))
return tuple(map(structFixer, fields, result))
def checkPointer(self, p, align = 1):
@@ -3424,14 +3321,14 @@ class DumperBase:
return (type_name[0:pos1].strip(), type_name[pos2+1:].strip(), int(item_count))
def registerType(self, typeId, tdata):
- #warn('REGISTER TYPE: %s' % typeId)
+ #DumperBase.warn('REGISTER TYPE: %s' % typeId)
self.typeData[typeId] = tdata
#typeId = typeId.replace(' ', '')
#self.typeData[typeId] = tdata
- #warn('REGISTERED: %s' % self.typeData)
+ #DumperBase.warn('REGISTERED: %s' % self.typeData)
def registerTypeAlias(self, existingTypeId, aliasId):
- #warn('REGISTER ALIAS %s FOR %s' % (aliasId, existingTypeId))
+ #DumperBase.warn('REGISTER ALIAS %s FOR %s' % (aliasId, existingTypeId))
self.typeData[aliasId] = self.typeData[existingTypeId]
class TypeData:
@@ -3475,13 +3372,13 @@ class DumperBase:
def typeData(self):
tdata = self.dumper.typeData.get(self.typeId, None)
if tdata is not None:
- #warn('USING : %s' % self.typeId)
+ #DumperBase.warn('USING : %s' % self.typeId)
return tdata
typeId = self.typeId.replace(' ', '')
if tdata is not None:
- #warn('USING FALLBACK : %s' % self.typeId)
+ #DumperBase.warn('USING FALLBACK : %s' % self.typeId)
return tdata
- #warn('EXPANDING LAZILY: %s' % self.typeId)
+ #DumperBase.warn('EXPANDING LAZILY: %s' % self.typeId)
self.dumper.lookupType(self.typeId)
return self.dumper.typeData.get(self.typeId)
@@ -3522,19 +3419,19 @@ class DumperBase:
def __getitem__(self, index):
if self.dumper.isInt(index):
return self.templateArgument(index)
- error('CANNOT INDEX TYPE')
+ raise RuntimeError('CANNOT INDEX TYPE')
def dynamicTypeName(self, address):
tdata = self.typeData()
if tdata is None:
return None
- if tdata.code != TypeCodeStruct:
+ if tdata.code != TypeCode.TypeCodeStruct:
return None
try:
vtbl = self.dumper.extractPointer(address)
except:
return None
- #warn('VTBL: 0x%x' % vtbl)
+ #DumperBase.warn('VTBL: 0x%x' % vtbl)
if not self.dumper.couldBePointer(vtbl):
return None
return self.dumper.nativeDynamicTypeName(address, self)
@@ -3552,12 +3449,12 @@ class DumperBase:
def check(self):
tdata = self.typeData()
if tdata is None:
- error('TYPE WITHOUT DATA: %s ALL: %s' % (self.typeId, self.dumper.typeData.keys()))
+ raise RuntimeError('TYPE WITHOUT DATA: %s ALL: %s' % (self.typeId, self.dumper.typeData.keys()))
if tdata.name is None:
- error('TYPE WITHOUT NAME: %s' % self.typeId)
+ raise RuntimeError('TYPE WITHOUT NAME: %s' % self.typeId)
def dereference(self):
- if self.code == TypeCodeTypedef:
+ if self.code == TypeCode.TypeCodeTypedef:
return self.ltarget.dereference()
self.check()
return self.ltarget
@@ -3573,18 +3470,18 @@ class DumperBase:
def templateArgument(self, position):
tdata = self.typeData()
- #warn('TDATA: %s' % tdata)
- #warn('ID: %s' % self.typeId)
+ #DumperBase.warn('TDATA: %s' % tdata)
+ #DumperBase.warn('ID: %s' % self.typeId)
if tdata is None:
# Native lookups didn't help. Happens for 'wrong' placement of 'const'
# etc. with LLDB. But not all is lost:
ta = self.dumper.listTemplateParameters(self.typeId)
- #warn('MANUAL: %s' % ta)
+ #DumperBase.warn('MANUAL: %s' % ta)
res = ta[position]
- #warn('RES: %s' % res.typeId)
+ #DumperBase.warn('RES: %s' % res.typeId)
return res
- #warn('TA: %s %s' % (position, self.typeId))
- #warn('ARGS: %s' % tdata.templateArguments)
+ #DumperBase.warn('TA: %s %s' % (position, self.typeId))
+ #DumperBase.warn('ARGS: %s' % tdata.templateArguments)
return tdata.templateArguments[position]
def simpleEncoding(self):
@@ -3605,18 +3502,18 @@ class DumperBase:
return res
def isSimpleType(self):
- return self.code in (TypeCodeIntegral, TypeCodeFloat, TypeCodeEnum)
+ return self.code in (TypeCode.TypeCodeIntegral, TypeCode.TypeCodeFloat, TypeCode.TypeCodeEnum)
def alignment(self):
tdata = self.typeData()
- if tdata.code == TypeCodeTypedef:
+ if tdata.code == TypeCode.TypeCodeTypedef:
return tdata.ltarget.alignment()
- if tdata.code in (TypeCodeIntegral, TypeCodeFloat, TypeCodeEnum):
+ if tdata.code in (TypeCode.TypeCodeIntegral, TypeCode.TypeCodeFloat, TypeCode.TypeCodeEnum):
if tdata.name in ('double', 'long long', 'unsigned long long'):
# Crude approximation.
return 8 if self.dumper.isWindowsTarget() else self.dumper.ptrSize()
return self.size()
- if tdata.code in (TypeCodePointer, TypeCodeReference, TypeCodeRValueReference):
+ if tdata.code in (TypeCode.TypeCodePointer, TypeCode.TypeCodeReference, TypeCode.TypeCodeRValueReference):
return self.dumper.ptrSize()
if tdata.lalignment is not None:
#if isinstance(tdata.lalignment, function): # Does not work that way.
@@ -3632,24 +3529,24 @@ class DumperBase:
return self.typeData().ltarget
def stripTypedefs(self):
- if isinstance(self, self.dumper.Type) and self.code != TypeCodeTypedef:
- #warn('NO TYPEDEF: %s' % self)
+ if isinstance(self, self.dumper.Type) and self.code != TypeCode.TypeCodeTypedef:
+ #DumperBase.warn('NO TYPEDEF: %s' % self)
return self
return self.ltarget
def size(self):
bs = self.bitsize()
if bs % 8 != 0:
- warn('ODD SIZE: %s' % self)
+ DumperBase.warn('ODD SIZE: %s' % self)
return (7 + bs) >> 3
def bitsize(self):
if self.lbitsize is not None:
return self.lbitsize
- error('DONT KNOW SIZE: %s' % self)
+ raise RuntimeError('DONT KNOW SIZE: %s' % self)
def isMovableType(self):
- if self.code in (TypeCodePointer, TypeCodeIntegral, TypeCodeFloat):
+ if self.code in (TypeCode.TypeCodePointer, TypeCode.TypeCodeIntegral, TypeCode.TypeCodeFloat):
return True
strippedName = self.dumper.stripNamespaceFromType(self.name)
if strippedName in (
@@ -3704,7 +3601,7 @@ class DumperBase:
def fieldType(self):
if self.type is not None:
return self.type
- error('CANT GET FIELD TYPE FOR %s' % self)
+ raise RuntimeError('CANT GET FIELD TYPE FOR %s' % self)
return None
def ptrCode(self):
@@ -3712,7 +3609,7 @@ class DumperBase:
def toPointerData(self, address):
if not self.isInt(address):
- error('wrong')
+ raise RuntimeError('wrong')
return bytes(struct.pack(self.packCode + self.ptrCode(), address))
def fromPointerData(self, bytes_value):
@@ -3720,10 +3617,10 @@ class DumperBase:
def createPointerValue(self, targetAddress, targetTypish):
if not isinstance(targetTypish, self.Type) and not isinstance(targetTypish, str):
- error('Expected type in createPointerValue(), got %s'
+ raise RuntimeError('Expected type in createPointerValue(), got %s'
% type(targetTypish))
if not self.isInt(targetAddress):
- error('Expected integral address value in createPointerValue(), got %s'
+ raise RuntimeError('Expected integral address value in createPointerValue(), got %s'
% type(targetTypish))
val = self.Value(self)
val.ldata = self.toPointerData(targetAddress)
@@ -3733,10 +3630,10 @@ class DumperBase:
def createReferenceValue(self, targetAddress, targetType):
if not isinstance(targetType, self.Type):
- error('Expected type in createReferenceValue(), got %s'
+ raise RuntimeError('Expected type in createReferenceValue(), got %s'
% type(targetType))
if not self.isInt(targetAddress):
- error('Expected integral address value in createReferenceValue(), got %s'
+ raise RuntimeError('Expected integral address value in createReferenceValue(), got %s'
% type(targetType))
val = self.Value(self)
val.ldata = self.toPointerData(targetAddress)
@@ -3746,27 +3643,27 @@ class DumperBase:
def createPointerType(self, targetType):
if not isinstance(targetType, self.Type):
- error('Expected type in createPointerType(), got %s'
+ raise RuntimeError('Expected type in createPointerType(), got %s'
% type(targetType))
typeId = targetType.typeId + ' *'
tdata = self.TypeData(self)
tdata.name = targetType.name + '*'
tdata.typeId = typeId
tdata.lbitsize = 8 * self.ptrSize()
- tdata.code = TypeCodePointer
+ tdata.code = TypeCode.TypeCodePointer
tdata.ltarget = targetType
self.registerType(typeId, tdata)
return self.Type(self, typeId)
def createReferenceType(self, targetType):
if not isinstance(targetType, self.Type):
- error('Expected type in createReferenceType(), got %s'
+ raise RuntimeError('Expected type in createReferenceType(), got %s'
% type(targetType))
typeId = targetType.typeId + ' &'
tdata = self.TypeData(self)
tdata.name = targetType.name + ' &'
tdata.typeId = typeId
- tdata.code = TypeCodeReference
+ tdata.code = TypeCode.TypeCodeReference
tdata.ltarget = targetType
tdata.lbitsize = 8 * self.ptrSize() # Needed for Gdb13393 test.
#tdata.lbitsize = None
@@ -3775,13 +3672,13 @@ class DumperBase:
def createRValueReferenceType(self, targetType):
if not isinstance(targetType, self.Type):
- error('Expected type in createRValueReferenceType(), got %s'
+ raise RuntimeError('Expected type in createRValueReferenceType(), got %s'
% type(targetType))
typeId = targetType.typeId + ' &&'
tdata = self.TypeData(self)
tdata.name = targetType.name + ' &&'
tdata.typeId = typeId
- tdata.code = TypeCodeRValueReference
+ tdata.code = TypeCode.TypeCodeRValueReference
tdata.ltarget = targetType
tdata.lbitsize = None
self.registerType(typeId, tdata)
@@ -3789,7 +3686,7 @@ class DumperBase:
def createArrayType(self, targetType, count):
if not isinstance(targetType, self.Type):
- error('Expected type in createArrayType(), got %s'
+ raise RuntimeError('Expected type in createArrayType(), got %s'
% type(targetType))
targetTypeId = targetType.typeId
@@ -3804,7 +3701,7 @@ class DumperBase:
tdata = self.TypeData(self)
tdata.name = type_name
tdata.typeId = type_id
- tdata.code = TypeCodeArray
+ tdata.code = TypeCode.TypeCodeArray
tdata.ltarget = targetType
tdata.lbitsize = targetType.lbitsize * count
self.registerType(type_id, tdata)
@@ -3812,13 +3709,13 @@ class DumperBase:
def createBitfieldType(self, targetType, bitsize):
if not isinstance(targetType, self.Type):
- error('Expected type in createBitfieldType(), got %s'
+ raise RuntimeError('Expected type in createBitfieldType(), got %s'
% type(targetType))
typeId = '%s:%d' % (targetType.typeId, bitsize)
tdata = self.TypeData(self)
tdata.name = '%s : %d' % (targetType.typeId, bitsize)
tdata.typeId = typeId
- tdata.code = TypeCodeBitfield
+ tdata.code = TypeCode.TypeCodeBitfield
tdata.ltarget = targetType
tdata.lbitsize = bitsize
self.registerType(typeId, tdata)
@@ -3828,7 +3725,7 @@ class DumperBase:
if typeId is None:
typeId = typeName
if not isinstance(targetType, self.Type):
- error('Expected type in createTypedefType(), got %s'
+ raise RuntimeError('Expected type in createTypedefType(), got %s'
% type(targetType))
# Happens for C-style struct in GDB: typedef { int x; } struct S1;
if targetType.typeId == typeId:
@@ -3836,7 +3733,7 @@ class DumperBase:
tdata = self.TypeData(self)
tdata.name = typeName
tdata.typeId = typeId
- tdata.code = TypeCodeTypedef
+ tdata.code = TypeCode.TypeCodeTypedef
tdata.ltarget = targetType
tdata.lbitsize = targetType.lbitsize
#tdata.lfields = targetType.lfields
@@ -3889,12 +3786,12 @@ class DumperBase:
return self.Type(self, typish)
knownType = self.lookupType(typish)
- #warn('KNOWN: %s' % knownType)
+ #DumperBase.warn('KNOWN: %s' % knownType)
if knownType is not None:
- #warn('USE FROM NATIVE')
+ #DumperBase.warn('USE FROM NATIVE')
return knownType
- #warn('FAKING: %s SIZE: %s' % (typish, size))
+ #DumperBase.warn('FAKING: %s SIZE: %s' % (typish, size))
tdata = self.TypeData(self)
tdata.name = typish
tdata.typeId = typish
@@ -3903,25 +3800,25 @@ class DumperBase:
tdata.lbitsize = 8 * size
self.registerType(typish, tdata)
typeobj = self.Type(self, typish)
- #warn('CREATE TYPE: %s' % typeobj.stringify())
+ #DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify())
typeobj.check()
return typeobj
- error('NEED TYPE, NOT %s' % type(typish))
+ raise RuntimeError('NEED TYPE, NOT %s' % type(typish))
def createValue(self, datish, typish):
val = self.Value(self)
val.type = self.createType(typish)
if self.isInt(datish): # Used as address.
- #warn('CREATING %s AT 0x%x' % (val.type.name, datish))
+ #DumperBase.warn('CREATING %s AT 0x%x' % (val.type.name, datish))
val.laddress = datish
val.type = val.type.dynamicType(datish)
return val
if isinstance(datish, bytes):
- #warn('CREATING %s WITH DATA %s' % (val.type.name, self.hexencode(datish)))
+ #DumperBase.warn('CREATING %s WITH DATA %s' % (val.type.name, self.hexencode(datish)))
val.ldata = datish
val.check()
return val
- error('EXPECTING ADDRESS OR BYTES, GOT %s' % type(datish))
+ raise RuntimeError('EXPECTING ADDRESS OR BYTES, GOT %s' % type(datish))
def createContainerItem(self, data, innerTypish, container):
innerType = self.createType(innerTypish)
@@ -3966,7 +3863,7 @@ class DumperBase:
if self.autoPadNext:
self.currentBitsize = 8 * ((self.currentBitsize + 7) >> 3) # Fill up byte.
padding = (fieldAlign - (self.currentBitsize >> 3)) % fieldAlign
- #warn('AUTO PADDING AT %s BITS BY %s BYTES' % (self.currentBitsize, padding))
+ #DumperBase.warn('AUTO PADDING AT %s BITS BY %s BYTES' % (self.currentBitsize, padding))
field = self.dumper.Field(self.dumper, bitpos=self.currentBitsize,
bitsize=padding*8)
self.pattern += '%ds' % padding
@@ -3976,7 +3873,7 @@ class DumperBase:
if fieldAlign > self.maxAlign:
self.maxAlign = fieldAlign
- #warn("MAX ALIGN: %s" % self.maxAlign)
+ #DumperBase.warn("MAX ALIGN: %s" % self.maxAlign)
field = self.dumper.Field(dumper=self.dumper, name=fieldName, type=fieldType,
isStruct=fieldIsStruct, bitpos=self.currentBitsize,
@@ -4046,7 +3943,7 @@ class DumperBase:
builder.fields.append(field)
n = None
else:
- error('UNKNOWN STRUCT CODE: %s' % c)
+ raise RuntimeError('UNKNOWN STRUCT CODE: %s' % c)
pp = builder.pattern
size = (builder.currentBitsize + 7) >> 3
fields = builder.fields