From 3f1a7a93bb01ad0f311b4e59d0ebcfaad24e3e74 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 17 Nov 2016 14:19:33 +0100 Subject: [PATCH] Debugger: Use type name from symbol Type names generated from module and type id are sometimes incorrect. Change-Id: I4bbd4db029e7952703efe09f9beb92f703e400d9 Reviewed-by: Christian Stenger --- src/libs/qtcreatorcdbext/pytype.cpp | 3 ++- src/libs/qtcreatorcdbext/pyvalue.cpp | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/libs/qtcreatorcdbext/pytype.cpp b/src/libs/qtcreatorcdbext/pytype.cpp index 4a69b460139..f7534fd783f 100644 --- a/src/libs/qtcreatorcdbext/pytype.cpp +++ b/src/libs/qtcreatorcdbext/pytype.cpp @@ -350,11 +350,12 @@ void type_Dealloc(Type *self) PyObject *createType(ULONG64 module, ULONG typeId, const std::string &name) { + std::string typeName = SymbolGroupValue::stripClassPrefixes(name); Type *type = PyObject_New(Type, type_pytype()); type->m_module = module; type->m_typeId = typeId; type->m_resolved = true; - type->m_name = name.empty() ? nullptr : strdup(name.c_str()); + type->m_name = typeName.empty() ? nullptr : strdup(typeName.c_str()); return reinterpret_cast(type); } diff --git a/src/libs/qtcreatorcdbext/pyvalue.cpp b/src/libs/qtcreatorcdbext/pyvalue.cpp index 21ef0233ddb..da26c2a0e88 100644 --- a/src/libs/qtcreatorcdbext/pyvalue.cpp +++ b/src/libs/qtcreatorcdbext/pyvalue.cpp @@ -52,15 +52,31 @@ PyObject *value_Name(Value *self) return Py_BuildValue("s", symbolName.c_str()); } +char *getTypeName(Value *value) +{ + char *typeName = nullptr; + ULONG size = 0; + value->m_symbolGroup->GetSymbolTypeName(value->m_index, NULL, 0, &size); + if (size > 0) { + typeName = new char[size+3]; + if (SUCCEEDED(value->m_symbolGroup->GetSymbolTypeName(value->m_index, typeName, size, NULL))) + return typeName; + delete[] typeName; + } + return nullptr; +} + PyObject *value_Type(Value *self) { if (!self->m_symbolGroup) Py_RETURN_NONE; DEBUG_SYMBOL_PARAMETERS params; - const HRESULT hr = self->m_symbolGroup->GetSymbolParameters(self->m_index, 1, ¶ms); - if (FAILED(hr)) + if (FAILED(self->m_symbolGroup->GetSymbolParameters(self->m_index, 1, ¶ms))) Py_RETURN_NONE; - return createType(params.Module, params.TypeId); + char *typeName = getTypeName(self); + auto ret = createType(params.Module, params.TypeId, typeName ? typeName : std::string()); + delete[] typeName; + return ret; } PyObject *value_Bitsize(Value *self)