Browse Source

Fixed destructors by keeping track when they are non-trivial.

pull/146/merge
triton 12 years ago
parent
commit
0954ad0c7e
  1. 3
      src/AST/Class.cs
  2. 1
      src/Core/Parser/ASTConverter.cs
  3. 1
      src/CppParser/AST.h
  4. 1
      src/CppParser/Parser.cpp
  5. 9
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  6. 1
      src/Parser/Parser.cpp

3
src/AST/Class.cs

@ -96,6 +96,9 @@ namespace CppSharp.AST @@ -96,6 +96,9 @@ namespace CppSharp.AST
// True if the class has a non trivial copy constructor.
public bool HasNonTrivialCopyConstructor;
// True if the class has a non trivial destructor.
public bool HasNonTrivialDestructor;
public Class()
{
Bases = new List<BaseClassSpecifier>();

1
src/Core/Parser/ASTConverter.cs

@ -110,6 +110,7 @@ namespace CppSharp @@ -110,6 +110,7 @@ namespace CppSharp
_class.IsPolymorphic = @class.IsPolymorphic;
_class.HasNonTrivialDefaultConstructor = @class.HasNonTrivialDefaultConstructor;
_class.HasNonTrivialCopyConstructor = @class.HasNonTrivialCopyConstructor;
_class.HasNonTrivialDestructor = @class.HasNonTrivialDestructor;
_class.Layout = VisitClassLayout(@class.Layout);

1
src/CppParser/AST.h

@ -559,6 +559,7 @@ struct CS_API Class : public DeclarationContext @@ -559,6 +559,7 @@ struct CS_API Class : public DeclarationContext
bool IsPolymorphic;
bool HasNonTrivialDefaultConstructor;
bool HasNonTrivialCopyConstructor;
bool HasNonTrivialDestructor;
ClassLayout Layout;
};

1
src/CppParser/Parser.cpp

@ -585,6 +585,7 @@ Class* Parser::WalkRecordCXX(clang::CXXRecordDecl* Record) @@ -585,6 +585,7 @@ Class* Parser::WalkRecordCXX(clang::CXXRecordDecl* Record)
RC->IsPolymorphic = Record->isPolymorphic();
RC->HasNonTrivialDefaultConstructor = Record->hasNonTrivialDefaultConstructor();
RC->HasNonTrivialCopyConstructor = Record->hasNonTrivialCopyConstructor();
RC->HasNonTrivialDestructor = Record->hasNonTrivialDestructor();
bool hasLayout = !Record->isDependentType() && !Record->isInvalidDecl();

9
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -526,10 +526,9 @@ namespace CppSharp.Generators.CSharp @@ -526,10 +526,9 @@ namespace CppSharp.Generators.CSharp
tryAddOverload(ctor);
}
foreach (var dtor in @class.Destructors)
{
tryAddOverload(dtor);
}
if (@class.HasNonTrivialDestructor)
foreach (var dtor in @class.Destructors)
tryAddOverload(dtor);
foreach (var method in @class.Methods)
{
@ -1644,7 +1643,7 @@ namespace CppSharp.Generators.CSharp @@ -1644,7 +1643,7 @@ namespace CppSharp.Generators.CSharp
if (ShouldGenerateClassNativeField(@class))
{
var dtor = @class.Methods.FirstOrDefault(method => method.IsDestructor);
if (dtor != null)
if (dtor != null && @class.HasNonTrivialDestructor)
WriteLine("Internal.{0}({1});", GetFunctionNativeIdentifier(dtor),
Helpers.InstanceIdentifier);

1
src/Parser/Parser.cpp

@ -553,6 +553,7 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record, @@ -553,6 +553,7 @@ void Parser::WalkRecordCXX(clang::CXXRecordDecl* Record,
RC->IsPolymorphic = Record->isPolymorphic();
RC->HasNonTrivialDefaultConstructor = Record->hasNonTrivialDefaultConstructor();
RC->HasNonTrivialCopyConstructor = Record->hasNonTrivialCopyConstructor();
RC->HasNonTrivialDestructor = Record->hasNonTrivialDestructor();
bool hasLayout = !Record->isDependentType() && !Record->isInvalidDecl();

Loading…
Cancel
Save