Skip to content

Commit 5d33da4

Browse files
committed
Fix memory leak caused by retain cycle formed by recursive type.
Break the cycle manually when the parser and parser manager get reset.
1 parent 46e5471 commit 5d33da4

3 files changed

Lines changed: 13 additions & 0 deletions

File tree

lib/include/pl/core/parser_manager.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ namespace pl::core {
3636

3737
void reset() {
3838
this->m_onceIncluded.clear();
39+
for(const auto &[_, types] : this->m_parsedTypes) {
40+
for(const auto &[_, type] : types) {
41+
type->setType(nullptr);
42+
}
43+
}
3944
this->m_parsedTypes.clear();
4045
}
4146

lib/source/pl/core/parser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,6 +2813,11 @@ namespace pl::core {
28132813
}
28142814

28152815
void Parser::reset() {
2816+
for(const auto &[_, type] : this->m_types) {
2817+
if(type != nullptr) {
2818+
type->setType(nullptr);
2819+
}
2820+
}
28162821
this->m_types.clear();
28172822
this->m_currTemplateType.clear();
28182823
this->m_matchedOptionals.clear();

lib/source/pl/pattern_language.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ namespace pl {
5252
PatternLanguage::~PatternLanguage() {
5353
if (this->m_flattenThread.joinable())
5454
this->m_flattenThread.join();
55+
this->m_parserManager.reset();
56+
if(this->m_internals.parser)
57+
this->m_internals.parser->reset();
5558
this->m_patterns.clear();
5659
this->m_flattenedPatterns.clear();
5760
this->m_flattenedPatternsValid = false;

0 commit comments

Comments
 (0)