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
GenerateDeclarationCommon(method); GenerateDeclarationCommon(method);
if (method.IsVirtual || method.IsOverride) if ((method.IsVirtual || method.IsOverride) && !method.IsOperator)
Write("virtual "); Write("virtual ");
var isBuiltinOperator = method.IsOperator && var isBuiltinOperator = method.IsOperator &&

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

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

3
src/Generator/Passes/CheckOperatorsOverloads.cs

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

6
tests/Basic/Basic.h

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

Loading…
Cancel
Save