Browse Source

Free returned by value instances, not object ones

This was a dangerous bug by as the object remained in a deleted state to be used later.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1635/head
Dimitar Dobrev 4 years ago
parent
commit
50feab050f
  1. 10
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 2
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 3
      tests/Common/Common.Tests.cs
  4. 17
      tests/Common/Common.cpp
  5. 4
      tests/Common/Common.h

10
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -300,14 +300,16 @@ namespace CppSharp.Generators.CSharp @@ -300,14 +300,16 @@ namespace CppSharp.Generators.CSharp
if (Context.Context.ParserOptions.IsMicrosoftAbi)
vtableIndex = @class.Layout.VFTables.IndexOf(@class.Layout.VFTables.First(
v => v.Layout.Components.Any(c => c.Method == dtor)));
string instance = $"new {typePrinter.IntPtrType}(&{Context.ReturnVarName})";
Context.Before.WriteLine($@"var __vtables = new IntPtr[] {{ {
string.Join(", ", originalClass.Layout.VTablePointers.Select(
x => $" * (IntPtr*) ({ Helpers.InstanceIdentifier} + {x.Offset})"))} }};");
Context.Before.WriteLine($"var __slot = *(IntPtr*) (__vtables[{vtableIndex}] + {i} * sizeof(IntPtr));");
Context.Before.Write($"Marshal.GetDelegateForFunctionPointer<{dtor.FunctionType}>(__slot)({Helpers.InstanceIdentifier}");
x => $"*({typePrinter.IntPtrType}*) ({instance} + {x.Offset})"))} }};");
Context.Before.WriteLine($@"var __slot = *({typePrinter.IntPtrType}*) (__vtables[{
vtableIndex}] + {i} * sizeof({typePrinter.IntPtrType}));");
Context.Before.Write($"Marshal.GetDelegateForFunctionPointer<{dtor.FunctionType}>(__slot)({instance}");
if (dtor.GatherInternalParams(Context.Context.ParserOptions.IsItaniumLikeAbi).Count > 1)
{
Context.Before.WriteLine(", 0");
Context.Before.Write(", 0");
}
Context.Before.WriteLine(");");
}

2
src/Generator/Generators/CSharp/CSharpSources.cs

@ -2689,7 +2689,7 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty @@ -2689,7 +2689,7 @@ internal static{(@new ? " new" : string.Empty)} {printedClass} __GetInstance({Ty
}
private bool GenerateMethodBody(Class @class, Method method,
QualifiedType returnType = default(QualifiedType))
QualifiedType returnType = default)
{
var specialization = @class as ClassTemplateSpecialization;
if (specialization != null)

3
tests/Common/Common.Tests.cs

@ -52,6 +52,9 @@ public class CommonTests @@ -52,6 +52,9 @@ public class CommonTests
{
hasPropertyNamedAsParent.hasPropertyNamedAsParent.GetHashCode();
}
using (Common.FreeFunctionReturnsVirtualDtor)
{
}
EnumWithUnderscores.lOWER_BEFORE_CAPITAL.GetHashCode();
EnumWithUnderscores.UnderscoreAtEnd.GetHashCode();
EnumWithUnderscores.CAPITALS_More.GetHashCode();

17
tests/Common/Common.cpp

@ -386,6 +386,18 @@ AbstractFoo::~AbstractFoo() @@ -386,6 +386,18 @@ AbstractFoo::~AbstractFoo()
{
}
ImplementsAbstractFoo::ImplementsAbstractFoo()
{
}
ImplementsAbstractFoo::ImplementsAbstractFoo(const ImplementsAbstractFoo& other)
{
}
ImplementsAbstractFoo::~ImplementsAbstractFoo()
{
}
int ImplementsAbstractFoo::pureFunction(typedefInOverride i)
{
return 5;
@ -1349,6 +1361,11 @@ ReturnByValueWithReturnParam ReturnByValueWithReturnParamFactory::generate() @@ -1349,6 +1361,11 @@ ReturnByValueWithReturnParam ReturnByValueWithReturnParamFactory::generate()
return ReturnByValueWithReturnParam();
}
ImplementsAbstractFoo freeFunctionReturnsVirtualDtor()
{
return ImplementsAbstractFoo();
}
void integerOverload(int i)
{
}

4
tests/Common/Common.h

@ -268,6 +268,9 @@ public: @@ -268,6 +268,9 @@ public:
class DLL_API ImplementsAbstractFoo : public AbstractFoo
{
public:
ImplementsAbstractFoo();
ImplementsAbstractFoo(const ImplementsAbstractFoo& other);
~ImplementsAbstractFoo();
typedef int typedefInOverride;
virtual int pureFunction(typedefInOverride i = 0);
virtual int pureFunction1();
@ -1455,6 +1458,7 @@ template<int N> using TypeAlias = InvokeGenSeq<DerivedTypeAlias<N>>; @@ -1455,6 +1458,7 @@ template<int N> using TypeAlias = InvokeGenSeq<DerivedTypeAlias<N>>;
template<int N>
struct DerivedTypeAlias : TypeAlias<N / 2> {};
DLL_API ImplementsAbstractFoo freeFunctionReturnsVirtualDtor();
DLL_API void integerOverload(int i);
DLL_API void integerOverload(unsigned int i);
DLL_API void integerOverload(long i);

Loading…
Cancel
Save