Browse Source

Fixed a crash with abstract overrides originating from secondary bases.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/256/merge
Dimitar Dobrev 10 years ago
parent
commit
d3644dcf5d
  1. 5
      src/AST/ClassExtensions.cs
  2. 10
      src/AST/FunctionExtensions.cs
  3. 1
      src/Generator/AST/VTables.cs
  4. 10
      src/Generator/Passes/GenerateAbstractImplementationsPass.cs
  5. 4
      tests/CSharp/CSharp.cpp
  6. 7
      tests/CSharp/CSharp.h

5
src/AST/ClassExtensions.cs

@ -75,10 +75,7 @@ namespace CppSharp.AST @@ -75,10 +75,7 @@ namespace CppSharp.AST
}
baseMethod = (from method in @base.Class.Methods
where (method.OriginalName == @override.OriginalName &&
method.ReturnType == @override.ReturnType &&
method.Parameters.SequenceEqual(@override.Parameters, parameterTypeComparer)) ||
(@override.IsDestructor && method.IsDestructor && method.IsVirtual)
where @override.CanOverride(method, parameterTypeComparer)
select method).FirstOrDefault();
if (baseMethod != null)
return baseMethod;

10
src/AST/FunctionExtensions.cs

@ -72,5 +72,15 @@ namespace CppSharp.AST @@ -72,5 +72,15 @@ namespace CppSharp.AST
return @params;
}
public static bool CanOverride(this Method @override, Method method,
ParameterTypeComparer parameterTypeComparer = null)
{
parameterTypeComparer = parameterTypeComparer ?? new ParameterTypeComparer();
return (method.OriginalName == @override.OriginalName &&
method.ReturnType == @override.ReturnType &&
method.Parameters.SequenceEqual(@override.Parameters, parameterTypeComparer)) ||
(@override.IsDestructor && method.IsDestructor && method.IsVirtual);
}
}
}

1
src/Generator/AST/VTables.cs

@ -54,7 +54,6 @@ namespace CppSharp.AST @@ -54,7 +54,6 @@ namespace CppSharp.AST
return GatherVTableMethodEntries(@class.Layout.Layout);
}
public static int GetVTableIndex(Function function, Class @class)
{
switch (@class.Layout.ABI)

10
src/Generator/Passes/GenerateAbstractImplementationsPass.cs

@ -130,8 +130,14 @@ namespace CppSharp.Passes @@ -130,8 +130,14 @@ namespace CppSharp.Passes
private static List<Method> GetAbstractMethods(Class @class)
{
var abstractMethods = @class.Methods.Where(m => m.IsPure).ToList();
foreach (var @base in @class.Bases)
abstractMethods.AddRange(GetAbstractMethods(@base.Class));
var abstractOverrides = abstractMethods.Where(a => a.IsOverride).ToList();
foreach (var baseAbstractMethods in @class.Bases.Select(b => GetAbstractMethods(b.Class)))
{
for (var i = baseAbstractMethods.Count - 1; i >= 0; i--)
if (abstractOverrides.Any(a => a.CanOverride(baseAbstractMethods[i])))
baseAbstractMethods.RemoveAt(i);
abstractMethods.AddRange(baseAbstractMethods);
}
return abstractMethods;
}

4
tests/CSharp/CSharp.cpp

@ -883,6 +883,10 @@ int OverridePropertyFromIndirectPrimaryBase::property() @@ -883,6 +883,10 @@ int OverridePropertyFromIndirectPrimaryBase::property()
return 5;
}
AbstractOverrideFromSecondaryBase::AbstractOverrideFromSecondaryBase()
{
}
QObject::QObject()
{
}

7
tests/CSharp/CSharp.h

@ -780,6 +780,13 @@ public: @@ -780,6 +780,13 @@ public:
int property();
};
class DLL_API AbstractOverrideFromSecondaryBase : public Foo, public OverridePropertyFromIndirectPrimaryBaseBase
{
public:
AbstractOverrideFromSecondaryBase();
virtual void setProperty(int value) = 0;
};
class DLL_API QObject
{
public:

Loading…
Cancel
Save