Browse Source

Merge pull request #504 from ddobrev/master

Removed three hacks about method objects in v-tables
pull/506/head
João Matos 10 years ago
parent
commit
a0a5156715
  1. 8
      src/AST/ClassExtensions.cs
  2. 6
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 13
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs

8
src/AST/ClassExtensions.cs

@ -61,7 +61,7 @@ namespace CppSharp.AST @@ -61,7 +61,7 @@ namespace CppSharp.AST
let baseMethod = (
from method in @base.Class.Methods
where
method.Name == @override.Name &&
method.OriginalName == @override.OriginalName &&
method.ReturnType == @override.ReturnType &&
method.Parameters.SequenceEqual(@override.Parameters,
new ParameterTypeComparer())
@ -78,7 +78,7 @@ namespace CppSharp.AST @@ -78,7 +78,7 @@ namespace CppSharp.AST
let baseProperty = (
from property in @base.Class.Properties
where
property.Name == @override.Name &&
property.OriginalName == @override.OriginalName &&
property.Parameters.SequenceEqual(@override.Parameters,
new ParameterTypeComparer())
select property).FirstOrDefault()
@ -123,9 +123,7 @@ namespace CppSharp.AST @@ -123,9 +123,7 @@ namespace CppSharp.AST
public static Method GetMethodByName(this Class c, string methodName)
{
var method = c.Methods.FirstOrDefault(
// HACK: because of the non-shared v-table entries bug one copy may have been renamed and the other not
m => string.Compare(m.Name, methodName, StringComparison.OrdinalIgnoreCase) == 0);
var method = c.Methods.FirstOrDefault(m => m.Name == methodName);
if (method != null)
return method;

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

@ -1461,15 +1461,13 @@ namespace CppSharp.Generators.CSharp @@ -1461,15 +1461,13 @@ namespace CppSharp.Generators.CSharp
if (hasReturn)
Write("var {0} = ", Helpers.ReturnIdentifier);
// HACK: because of the non-shared v-table entries bug we must look for the real method by name
Method m = ((Class) method.Namespace).GetMethodByName(method.Name);
if (m.IsGenerated)
if (method.IsGenerated)
{
WriteLine("target.{0}({1});", method.Name, string.Join(", ", marshals));
}
else
{
InvokeProperty(m, marshals);
InvokeProperty(method, marshals);
}
if (hasReturn)

13
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -56,19 +56,6 @@ namespace CppSharp.Passes @@ -56,19 +56,6 @@ namespace CppSharp.Passes
public override bool VisitClassDecl(Class @class)
{
if (@class.IsDynamic)
{
// HACK: entries in v-tables are not shared (as objects) with the virtual methods they represent;
// this is why this pass fixes only the arg names used with real methods,
// while the v-table entries could remain with empty names;
// this should be fixed in the parser: it should reuse method objects
foreach (var parameter in VTables.GatherVTableMethodEntries(@class).Where(
entry => entry.Method != null).SelectMany(entry => entry.Method.Parameters))
{
parameter.Name = CheckName(parameter.Name);
}
}
var currentUniqueName = this.uniqueName;
this.uniqueName = 0;
var ret = base.VisitClassDecl(@class);

Loading…
Cancel
Save