Browse Source

Fixed wrapping of virtual overloaded operators.

References #389.
pull/395/head
triton 11 years ago committed by Joao Matos
parent
commit
684a9ff52b
  1. 2
      src/Generator/Generators/CLI/CLIHeadersTemplate.cs
  2. 17
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 3
      src/Generator/Passes/CheckOperatorsOverloads.cs
  4. 6
      tests/Basic/Basic.h

2
src/Generator/Generators/CLI/CLIHeadersTemplate.cs

@ -683,7 +683,7 @@ namespace CppSharp.Generators.CLI @@ -683,7 +683,7 @@ namespace CppSharp.Generators.CLI
GenerateDeclarationCommon(method);
if (method.IsVirtual || method.IsOverride)
if ((method.IsVirtual || method.IsOverride) && !method.IsOperator)
Write("virtual ");
var isBuiltinOperator = method.IsOperator &&

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

@ -1285,10 +1285,16 @@ namespace CppSharp.Generators.CSharp @@ -1285,10 +1285,16 @@ namespace CppSharp.Generators.CSharp
#region Virtual Tables
public List<VTableComponent> GetValidVTableMethodEntries(Class @class)
{
var entries = VTables.GatherVTableMethodEntries(@class);
return entries.Where(e => !e.Ignore && !e.Method.IsOperator).ToList();
}
public List<VTableComponent> GetUniqueVTableMethodEntries(Class @class)
{
var uniqueEntries = new OrderedSet<VTableComponent>();
foreach (var entry in VTables.GatherVTableMethodEntries(@class))
foreach (var entry in GetValidVTableMethodEntries(@class))
uniqueEntries.Add(entry);
return uniqueEntries.ToList();
@ -1297,8 +1303,7 @@ namespace CppSharp.Generators.CSharp @@ -1297,8 +1303,7 @@ namespace CppSharp.Generators.CSharp
public void GenerateVTable(Class @class)
{
var entries = VTables.GatherVTableMethodEntries(@class);
var wrappedEntries = GetUniqueVTableMethodEntries(@class).Where(
e => !e.Ignore).ToList();
var wrappedEntries = GetUniqueVTableMethodEntries(@class);
if (wrappedEntries.Count == 0)
return;
@ -1479,7 +1484,7 @@ namespace CppSharp.Generators.CSharp @@ -1479,7 +1484,7 @@ namespace CppSharp.Generators.CSharp
private void GenerateVTableClassSetupCall(Class @class, bool addPointerGuard = false)
{
var entries = VTables.GatherVTableMethodEntries(@class);
var entries = GetUniqueVTableMethodEntries(@class);
if (Options.GenerateVirtualTables && @class.IsDynamic && entries.Count != 0)
{
// called from internal ctors which may have been passed an IntPtr.Zero
@ -1489,7 +1494,9 @@ namespace CppSharp.Generators.CSharp @@ -1489,7 +1494,9 @@ namespace CppSharp.Generators.CSharp
Helpers.InstanceIdentifier);
PushIndent();
}
WriteLine("SetupVTables({0});", Generator.GeneratedIdentifier("Instance"));
if (addPointerGuard)
PopIndent();
}
@ -2070,7 +2077,7 @@ namespace CppSharp.Generators.CSharp @@ -2070,7 +2077,7 @@ namespace CppSharp.Generators.CSharp
Write(Helpers.GetAccess(GetValidMethodAccess(method)));
}
if (method.IsVirtual && !method.IsOverride &&
if (method.IsVirtual && !method.IsOverride && !method.IsOperator &&
(!Driver.Options.GenerateAbstractImpls || !method.IsPure))
Write("virtual ");

3
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -57,6 +57,7 @@ namespace CppSharp.Passes @@ -57,6 +57,7 @@ namespace CppSharp.Passes
@operator.ExplicitlyIgnore();
continue;
}
if (@operator.IsNonMemberOperator)
continue;
@ -70,7 +71,7 @@ namespace CppSharp.Passes @@ -70,7 +71,7 @@ namespace CppSharp.Passes
if (@operator.IsStatic)
@operator.Parameters = @operator.Parameters.Skip(1).ToList();
var type = new PointerType()
var type = new PointerType
{
QualifiedPointee = new QualifiedType(new TagType(@class)),
Modifier = PointerType.TypeModifier.LVReference

6
tests/Basic/Basic.h

@ -445,12 +445,18 @@ public: @@ -445,12 +445,18 @@ public:
operator char();
operator int();
operator short();
virtual bool operator<(const ClassWithOverloadedOperators &other) const;
};
ClassWithOverloadedOperators::ClassWithOverloadedOperators() {}
ClassWithOverloadedOperators::operator char() { return 1; }
ClassWithOverloadedOperators::operator int() { return 2; }
ClassWithOverloadedOperators::operator short() { return 3; }
bool ClassWithOverloadedOperators::
operator<(const ClassWithOverloadedOperators &other) const {
return true;
}
// Tests global static function generation
DLL_API int Function()

Loading…
Cancel
Save