Browse Source

Fixed the memory leaks when parsing enumerations.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/600/head
Dimitar Dobrev 10 years ago
parent
commit
088530dacf
  1. 6
      src/CppParser/AST.cpp
  2. 2
      src/CppParser/AST.h
  3. 6
      src/CppParser/Bindings/CLI/AST.cpp
  4. 14
      src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs
  5. 16
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs
  6. 14
      src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs
  7. 14
      src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs
  8. 6
      src/CppParser/Parser.cpp

6
src/CppParser/AST.cpp

@ -557,7 +557,7 @@ Method::Method()
Enumeration::Enumeration() : DeclarationContext(DeclarationKind::Enumeration), Enumeration::Enumeration() : DeclarationContext(DeclarationKind::Enumeration),
Modifiers((EnumModifiers)0), Type(0), BuiltinType(0) {} Modifiers((EnumModifiers)0), Type(0), BuiltinType(0) {}
DEF_VECTOR(Enumeration, Enumeration::Item, Items) DEF_VECTOR(Enumeration, Enumeration::Item*, Items)
Enumeration::Item::Item() : Declaration(DeclarationKind::EnumerationItem) {} Enumeration::Item::Item() : Declaration(DeclarationKind::EnumerationItem) {}
@ -569,9 +569,9 @@ DEF_STRING(Enumeration::Item, Expression)
Enumeration::Item* Enumeration::FindItemByName(const std::string& Name) Enumeration::Item* Enumeration::FindItemByName(const std::string& Name)
{ {
auto foundEnumItem = std::find_if(Items.begin(), Items.end(), auto foundEnumItem = std::find_if(Items.begin(), Items.end(),
[&](Item _item) { return _item.Name == Name; }); [&](Item* _item) { return _item->Name == Name; });
if (foundEnumItem != Items.end()) if (foundEnumItem != Items.end())
return &*foundEnumItem; return *foundEnumItem;
return nullptr; return nullptr;
} }

2
src/CppParser/AST.h

@ -675,7 +675,7 @@ public:
EnumModifiers Modifiers; EnumModifiers Modifiers;
CppSharp::CppParser::AST::Type* Type; CppSharp::CppParser::AST::Type* Type;
CppSharp::CppParser::AST::BuiltinType* BuiltinType; CppSharp::CppParser::AST::BuiltinType* BuiltinType;
VECTOR(Item, Items) VECTOR(Item*, Items)
Item* FindItemByName(const std::string& Name); Item* FindItemByName(const std::string& Name);
}; };

6
src/CppParser/Bindings/CLI/AST.cpp

@ -2790,15 +2790,15 @@ CppSharp::Parser::AST::Enumeration::Enumeration()
CppSharp::Parser::AST::Enumeration::Item^ CppSharp::Parser::AST::Enumeration::getItems(unsigned int i) CppSharp::Parser::AST::Enumeration::Item^ CppSharp::Parser::AST::Enumeration::getItems(unsigned int i)
{ {
auto __ret = ((::CppSharp::CppParser::AST::Enumeration*)NativePtr)->getItems(i); auto __ret = ((::CppSharp::CppParser::AST::Enumeration*)NativePtr)->getItems(i);
auto ____ret = new ::CppSharp::CppParser::AST::Enumeration::Item(__ret); if (__ret == nullptr) return nullptr;
return (____ret == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Enumeration::Item((::CppSharp::CppParser::AST::Enumeration::Item*)____ret); return (__ret == nullptr) ? nullptr : gcnew CppSharp::Parser::AST::Enumeration::Item((::CppSharp::CppParser::AST::Enumeration::Item*)__ret);
} }
void CppSharp::Parser::AST::Enumeration::addItems(CppSharp::Parser::AST::Enumeration::Item^ s) void CppSharp::Parser::AST::Enumeration::addItems(CppSharp::Parser::AST::Enumeration::Item^ s)
{ {
if (ReferenceEquals(s, nullptr)) if (ReferenceEquals(s, nullptr))
throw gcnew ::System::ArgumentNullException("s", "s cannot be null because it is a C++ reference (&)."); throw gcnew ::System::ArgumentNullException("s", "s cannot be null because it is a C++ reference (&).");
auto &arg0 = *(::CppSharp::CppParser::AST::Enumeration::Item*)s->NativePtr; auto arg0 = (::CppSharp::CppParser::AST::Enumeration::Item*)s->NativePtr;
((::CppSharp::CppParser::AST::Enumeration*)NativePtr)->addItems(arg0); ((::CppSharp::CppParser::AST::Enumeration*)NativePtr)->addItems(arg0);
} }

14
src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/AST.cs

@ -6179,11 +6179,11 @@ namespace CppSharp
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")]
internal static extern void getItems_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i); internal static extern global::System.IntPtr getItems_0(global::System.IntPtr instance, uint i);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERNS2_4ItemE")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERPNS2_4ItemE")]
internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s); internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -6415,9 +6415,13 @@ namespace CppSharp
public CppSharp.Parser.AST.Enumeration.Item getItems(uint i) public CppSharp.Parser.AST.Enumeration.Item getItems(uint i)
{ {
var __ret = new CppSharp.Parser.AST.Enumeration.Item.Internal(); var __ret = Internal.getItems_0((__Instance + __PointerAdjustment), i);
Internal.getItems_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i); CppSharp.Parser.AST.Enumeration.Item __result0;
return CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret); if (__ret == IntPtr.Zero) __result0 = null;
else if (CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap.ContainsKey(__ret))
__result0 = (CppSharp.Parser.AST.Enumeration.Item) CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap[__ret];
else __result0 = CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret);
return __result0;
} }
public void addItems(CppSharp.Parser.AST.Enumeration.Item s) public void addItems(CppSharp.Parser.AST.Enumeration.Item s)

16
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/AST.cs

@ -6178,12 +6178,12 @@ namespace CppSharp
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
EntryPoint="?getItems@Enumeration@AST@CppParser@CppSharp@@QAE?AVItem@1234@I@Z")] EntryPoint="?getItems@Enumeration@AST@CppParser@CppSharp@@QAEPAVItem@1234@I@Z")]
internal static extern void getItems_0(global::System.IntPtr instance, global::System.IntPtr @return, uint i); internal static extern global::System.IntPtr getItems_0(global::System.IntPtr instance, uint i);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.ThisCall,
EntryPoint="?addItems@Enumeration@AST@CppParser@CppSharp@@QAEXAAVItem@1234@@Z")] EntryPoint="?addItems@Enumeration@AST@CppParser@CppSharp@@QAEXAAPAVItem@1234@@Z")]
internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s); internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -6415,9 +6415,13 @@ namespace CppSharp
public CppSharp.Parser.AST.Enumeration.Item getItems(uint i) public CppSharp.Parser.AST.Enumeration.Item getItems(uint i)
{ {
var __ret = new CppSharp.Parser.AST.Enumeration.Item.Internal(); var __ret = Internal.getItems_0((__Instance + __PointerAdjustment), i);
Internal.getItems_0((__Instance + __PointerAdjustment), new IntPtr(&__ret), i); CppSharp.Parser.AST.Enumeration.Item __result0;
return CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret); if (__ret == IntPtr.Zero) __result0 = null;
else if (CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap.ContainsKey(__ret))
__result0 = (CppSharp.Parser.AST.Enumeration.Item) CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap[__ret];
else __result0 = CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret);
return __result0;
} }
public void addItems(CppSharp.Parser.AST.Enumeration.Item s) public void addItems(CppSharp.Parser.AST.Enumeration.Item s)

14
src/CppParser/Bindings/CSharp/x86_64-apple-darwin12.4.0/AST.cs

@ -6178,11 +6178,11 @@ namespace CppSharp
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")]
internal static extern void getItems_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i); internal static extern global::System.IntPtr getItems_0(global::System.IntPtr instance, uint i);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERNS2_4ItemE")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERPNS2_4ItemE")]
internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s); internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -6414,9 +6414,13 @@ namespace CppSharp
public CppSharp.Parser.AST.Enumeration.Item getItems(uint i) public CppSharp.Parser.AST.Enumeration.Item getItems(uint i)
{ {
var __ret = new CppSharp.Parser.AST.Enumeration.Item.Internal(); var __ret = Internal.getItems_0((__Instance + __PointerAdjustment), i);
Internal.getItems_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i); CppSharp.Parser.AST.Enumeration.Item __result0;
return CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret); if (__ret == IntPtr.Zero) __result0 = null;
else if (CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap.ContainsKey(__ret))
__result0 = (CppSharp.Parser.AST.Enumeration.Item) CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap[__ret];
else __result0 = CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret);
return __result0;
} }
public void addItems(CppSharp.Parser.AST.Enumeration.Item s) public void addItems(CppSharp.Parser.AST.Enumeration.Item s)

14
src/CppParser/Bindings/CSharp/x86_64-linux-gnu/AST.cs

@ -6178,11 +6178,11 @@ namespace CppSharp
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")]
internal static extern void getItems_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i); internal static extern global::System.IntPtr getItems_0(global::System.IntPtr instance, uint i);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
[DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl, [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERNS2_4ItemE")] EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERPNS2_4ItemE")]
internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s); internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s);
[SuppressUnmanagedCodeSecurity] [SuppressUnmanagedCodeSecurity]
@ -6414,9 +6414,13 @@ namespace CppSharp
public CppSharp.Parser.AST.Enumeration.Item getItems(uint i) public CppSharp.Parser.AST.Enumeration.Item getItems(uint i)
{ {
var __ret = new CppSharp.Parser.AST.Enumeration.Item.Internal(); var __ret = Internal.getItems_0((__Instance + __PointerAdjustment), i);
Internal.getItems_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i); CppSharp.Parser.AST.Enumeration.Item __result0;
return CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret); if (__ret == IntPtr.Zero) __result0 = null;
else if (CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap.ContainsKey(__ret))
__result0 = (CppSharp.Parser.AST.Enumeration.Item) CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap[__ret];
else __result0 = CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret);
return __result0;
} }
public void addItems(CppSharp.Parser.AST.Enumeration.Item s) public void addItems(CppSharp.Parser.AST.Enumeration.Item s)

6
src/CppParser/Parser.cpp

@ -2130,7 +2130,7 @@ Enumeration* Parser::WalkEnum(clang::EnumDecl* ED)
E->IsIncomplete = false; E->IsIncomplete = false;
for(auto it = ED->enumerator_begin(); it != ED->enumerator_end(); ++it) for(auto it = ED->enumerator_begin(); it != ED->enumerator_end(); ++it)
{ {
E->Items.push_back(*WalkEnumItem(*it)); E->Items.push_back(WalkEnumItem(*it));
} }
return E; return E;
@ -2921,7 +2921,9 @@ Declaration* Parser::WalkDeclaration(clang::Decl* D,
case Decl::EnumConstant: case Decl::EnumConstant:
{ {
auto ED = cast<EnumConstantDecl>(D); auto ED = cast<EnumConstantDecl>(D);
Decl = WalkEnumItem(ED); auto E = cast<Enumeration>(GetNamespace(ED));
assert(E && "Expected a valid enumeration");
Decl = E->FindItemByName(ED->getNameAsString());
break; break;
} }
case Decl::Function: case Decl::Function:

Loading…
Cancel
Save