aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2021-09-06 09:36:01 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2021-09-06 14:00:41 +0200
commit4c5c75ee5a949b42472c3491614b8a88f321471b (patch)
treecda180b07c4e70100159eb6bf749c17f740b97e8
parent6bddba36e03212a4a7d522938152519dfeec96c2 (diff)
shiboken6: Fix some memory leaks shown by the address sanitizer
Change-Id: I31f3a2c6f3c124fa7ec566459cf255c29070e0ff Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp5
-rw-r--r--sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp4
-rw-r--r--sources/shiboken6/ApiExtractor/modifications.h8
-rw-r--r--sources/shiboken6/ApiExtractor/typesystemparser.cpp33
4 files changed, 36 insertions, 14 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
index 91da71cb9..6c4200395 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
@@ -75,6 +75,11 @@ public:
{
}
+ ~AbstractMetaClassPrivate()
+ {
+ qDeleteAll(m_templateArgs);
+ }
+
void addFunction(const AbstractMetaFunctionCPtr &function);
void addConstructor(AbstractMetaFunction::FunctionType t,
Access access,
diff --git a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
index de0f2eb4f..0b6c87ffc 100644
--- a/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
+++ b/sources/shiboken6/ApiExtractor/clangparser/clangbuilder.cpp
@@ -144,6 +144,10 @@ public:
{
m_scopeStack.push(NamespaceModelItem(new _FileModelItem(m_model)));
}
+ ~BuilderPrivate()
+ {
+ delete m_model;
+ }
// Determine scope from top item. Note that the scope list does not necessarily
// match the scope stack in case of forward-declared inner classes whose definition
diff --git a/sources/shiboken6/ApiExtractor/modifications.h b/sources/shiboken6/ApiExtractor/modifications.h
index 3335c8098..b97d7f292 100644
--- a/sources/shiboken6/ApiExtractor/modifications.h
+++ b/sources/shiboken6/ApiExtractor/modifications.h
@@ -107,18 +107,20 @@ struct ArgumentOwner
int index = InvalidIndex;
};
+using TemplateInstancePtr = QSharedPointer<TemplateInstance>;
+
class CodeSnipFragment
{
public:
CodeSnipFragment() = default;
explicit CodeSnipFragment(const QString &code) : m_code(code) {}
- explicit CodeSnipFragment(TemplateInstance *instance) : m_instance(instance) {}
+ explicit CodeSnipFragment(const TemplateInstancePtr &instance) : m_instance(instance) {}
QString code() const;
private:
QString m_code;
- TemplateInstance *m_instance = nullptr;
+ QSharedPointer<TemplateInstance> m_instance;
};
class CodeSnipAbstract : public CodeSnipHelpers
@@ -129,7 +131,7 @@ public:
void addCode(const QString &code);
void addCode(QStringView code) { addCode(code.toString()); }
- void addTemplateInstance(TemplateInstance *ti)
+ void addTemplateInstance(const TemplateInstancePtr &ti)
{
codeList.append(CodeSnipFragment(ti));
}
diff --git a/sources/shiboken6/ApiExtractor/typesystemparser.cpp b/sources/shiboken6/ApiExtractor/typesystemparser.cpp
index 7bcf24eab..8ad885089 100644
--- a/sources/shiboken6/ApiExtractor/typesystemparser.cpp
+++ b/sources/shiboken6/ApiExtractor/typesystemparser.cpp
@@ -907,28 +907,39 @@ bool TypeSystemParser::endElement(QStringView localName)
if (m_current->parent->parent->type == StackElement::Root) {
CodeSnipList snips = m_current->parent->entry->codeSnips();
CodeSnip snip = snips.takeLast();
- snip.addTemplateInstance(m_current->value.templateInstance);
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ snip.addTemplateInstance(ti);
snips.append(snip);
m_current->parent->entry->setCodeSnips(snips);
break;
}
Q_FALLTHROUGH();
case StackElement::NativeToTarget:
- case StackElement::AddConversion:
- m_contextStack.top()->codeSnips.last().addTemplateInstance(m_current->value.templateInstance);
+ case StackElement::AddConversion: {
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ m_contextStack.top()->codeSnips.last().addTemplateInstance(ti);
+ }
break;
- case StackElement::Template:
- m_current->parent->value.templateEntry->addTemplateInstance(m_current->value.templateInstance);
+ case StackElement::Template: {
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ m_current->parent->value.templateEntry->addTemplateInstance(ti);
+ }
break;
case StackElement::CustomMetaConstructor:
- case StackElement::CustomMetaDestructor:
- m_current->parent->value.customFunction->addTemplateInstance(m_current->value.templateInstance);
+ case StackElement::CustomMetaDestructor: {
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ m_current->parent->value.customFunction->addTemplateInstance(ti);
+ }
break;
- case StackElement::ConversionRule:
- m_contextStack.top()->functionMods.last().argument_mods().last().conversionRules().last().addTemplateInstance(m_current->value.templateInstance);
+ case StackElement::ConversionRule: {
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ m_contextStack.top()->functionMods.last().argument_mods().last().conversionRules().last().addTemplateInstance(ti);
+ }
break;
- case StackElement::InjectCodeInFunction:
- m_contextStack.top()->functionMods.last().snips().last().addTemplateInstance(m_current->value.templateInstance);
+ case StackElement::InjectCodeInFunction: {
+ TemplateInstancePtr ti(m_current->value.templateInstance);
+ m_contextStack.top()->functionMods.last().snips().last().addTemplateInstance(ti);
+ }
break;
default:
break; // nada