From a07e9450e8a27dafdcaa5e59bdfcb855da56adf7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 11 Oct 2016 14:29:10 +0200 Subject: [PATCH] Debugger: Fix type lookup for pointers Change-Id: Ie89a120cafd6755f1e2f61f15eb39fd64f0494d5 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/pytype.cpp | 34 ++++++++++++++++++++--------- src/libs/qtcreatorcdbext/pytype.h | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/libs/qtcreatorcdbext/pytype.cpp b/src/libs/qtcreatorcdbext/pytype.cpp index 2e769fa61f5..1610637ef9f 100644 --- a/src/libs/qtcreatorcdbext/pytype.cpp +++ b/src/libs/qtcreatorcdbext/pytype.cpp @@ -53,11 +53,30 @@ PyObject *lookupType(const std::string &typeNameIn) { std::string typeName = typeNameIn; CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); + std::string fullTypeName = typeName; + // GetSymbolTypeId doesn't support pointer types so we need to strip off the '*' first + while (endsWith(typeName, '*')) + typeName.pop_back(); ULONG64 module; ULONG typeId; if (FAILED(symbols->GetSymbolTypeId(typeName.c_str(), &typeId, &module))) Py_RETURN_NONE; - return createType(module, typeId); + if (typeName != fullTypeName) { + if (module == 0) { // found some builtin type like char so we take the first module available to look up the pointer type + ULONG loaded, unloaded; + if (FAILED(symbols->GetNumberModules(&loaded, &unloaded))) + Py_RETURN_NONE; + if ((loaded + unloaded == 0) || FAILED(symbols->GetModuleByIndex(0, &module))) + Py_RETURN_NONE; + } + if (FAILED(symbols->GetTypeId(module, fullTypeName.c_str(), &typeId))) + Py_RETURN_NONE; + } + size_t typeNameLength = fullTypeName.length(); + char *cTypeName = new char[typeNameLength + 1]; + fullTypeName.copy(cTypeName, fullTypeName.length()); + cTypeName[typeNameLength] = 0; + return createType(module, typeId, cTypeName); } char *getTypeName(ULONG64 module, ULONG typeId) @@ -143,13 +162,8 @@ PyObject *type_Target(Type *self) Py_XINCREF(self); return (PyObject *)self; } - typeName = typeName.substr(0, typeName.length() - 1); - - CIDebugSymbols *symbols = ExtensionCommandContext::instance()->symbols(); - ULONG typeId; - if (FAILED(symbols->GetTypeId(self->m_module, typeName.c_str(), &typeId))) - return NULL; - return createType(self->m_module, typeId); + typeName.pop_back(); + return lookupType(typeName); } PyObject *type_StripTypedef(Type *self) @@ -270,12 +284,12 @@ void type_Dealloc(Type *self) delete[] self->m_name; } -PyObject *createType(ULONG64 module, ULONG typeId) +PyObject *createType(ULONG64 module, ULONG typeId, char* name) { Type *type = PyObject_New(Type, type_pytype()); type->m_module = module; type->m_typeId = typeId; - type->m_name = nullptr; + type->m_name = name; return reinterpret_cast(type); } diff --git a/src/libs/qtcreatorcdbext/pytype.h b/src/libs/qtcreatorcdbext/pytype.h index 51d2e2071fc..ec8df6ffdf4 100644 --- a/src/libs/qtcreatorcdbext/pytype.h +++ b/src/libs/qtcreatorcdbext/pytype.h @@ -44,4 +44,4 @@ PyTypeObject *type_pytype(); char *getTypeName(ULONG64 module, ULONG typeId); PyObject *lookupType(const std::string &typeName); -PyObject *createType(ULONG64 module, ULONG typeId); +PyObject *createType(ULONG64 module, ULONG typeId, char *name = nullptr);