Skip to content

Commit 2d75735

Browse files
committed
Fix all leaks of memory in the old expressions
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent a1dc53c commit 2d75735

File tree

1 file changed

+32
-24
lines changed

1 file changed

+32
-24
lines changed

src/CppParser/AST.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,29 @@ static std::vector<T> split(const T & str, const T & delimiters) {
5757

5858
namespace CppSharp { namespace CppParser { namespace AST {
5959

60+
static void deleteExpression(ExpressionObsolete* expression)
61+
{
62+
if (expression)
63+
{
64+
// HACK: see https://github.com/mono/CppSharp/issues/598
65+
switch (expression->_class)
66+
{
67+
case StatementClassObsolete::BinaryOperator:
68+
delete static_cast<BinaryOperatorObsolete*>(expression);
69+
break;
70+
case StatementClassObsolete::CallExprClass:
71+
delete static_cast<CallExprObsolete*>(expression);
72+
break;
73+
case StatementClassObsolete::CXXConstructExprClass:
74+
delete static_cast<CXXConstructExprObsolete*>(expression);
75+
break;
76+
default:
77+
delete expression;
78+
break;
79+
}
80+
}
81+
}
82+
6083
Type::Type(TypeKind kind) : kind(kind) {}
6184
Type::Type(const Type& rhs) : kind(rhs.kind), isDependent(rhs.isDependent) {}
6285

@@ -144,7 +167,10 @@ NonTypeTemplateParameter::NonTypeTemplateParameter(const NonTypeTemplateParamete
144167
{
145168
}
146169

147-
NonTypeTemplateParameter::~NonTypeTemplateParameter() {}
170+
NonTypeTemplateParameter::~NonTypeTemplateParameter()
171+
{
172+
deleteExpression(defaultArgument);
173+
}
148174

149175
TemplateArgument::TemplateArgument() : declaration(0), integral(0) {}
150176

@@ -578,8 +604,8 @@ BinaryOperatorObsolete::BinaryOperatorObsolete(const std::string& str, Expressio
578604

579605
BinaryOperatorObsolete::~BinaryOperatorObsolete()
580606
{
581-
delete LHS;
582-
delete RHS;
607+
deleteExpression(LHS);
608+
deleteExpression(RHS);
583609
}
584610

585611

@@ -589,7 +615,7 @@ CallExprObsolete::CallExprObsolete(const std::string& str, Declaration* decl)
589615
CallExprObsolete::~CallExprObsolete()
590616
{
591617
for (auto& arg : Arguments)
592-
delete arg;
618+
deleteExpression(arg);
593619
}
594620

595621
DEF_VECTOR(CallExprObsolete, ExpressionObsolete*, Arguments)
@@ -600,7 +626,7 @@ CXXConstructExprObsolete::CXXConstructExprObsolete(const std::string& str, Decla
600626
CXXConstructExprObsolete::~CXXConstructExprObsolete()
601627
{
602628
for (auto& arg : Arguments)
603-
delete arg;
629+
deleteExpression(arg);
604630
}
605631

606632
DEF_VECTOR(CXXConstructExprObsolete, ExpressionObsolete*, Arguments)
@@ -616,25 +642,7 @@ Parameter::Parameter()
616642

617643
Parameter::~Parameter()
618644
{
619-
if (defaultArgument)
620-
{
621-
// HACK: see https://github.com/mono/CppSharp/issues/598
622-
switch (defaultArgument->_class)
623-
{
624-
case StatementClassObsolete::BinaryOperator:
625-
delete static_cast<BinaryOperatorObsolete*>(defaultArgument);
626-
break;
627-
case StatementClassObsolete::CallExprClass:
628-
delete static_cast<CallExprObsolete*>(defaultArgument);
629-
break;
630-
case StatementClassObsolete::CXXConstructExprClass:
631-
delete static_cast<CXXConstructExprObsolete*>(defaultArgument);
632-
break;
633-
default:
634-
delete defaultArgument;
635-
break;
636-
}
637-
}
645+
deleteExpression(defaultArgument);
638646
}
639647

640648
Function::Function()

0 commit comments

Comments
 (0)