Browse Source

Fixed the v-table interop to be compilable.

Signed-off-by: Dimitar Dobrev <dpldobrev@yahoo.com>
pull/59/head
Dimitar Dobrev 12 years ago
parent
commit
348c3db122
  1. 24
      src/Generator/AST/VTables.cs
  2. 13
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  3. 18
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs

24
src/Generator/AST/VTables.cs

@ -25,21 +25,15 @@ namespace CppSharp.AST @@ -25,21 +25,15 @@ namespace CppSharp.AST
public static List<VTableComponent> GatherVTableMethodEntries(VTableLayout layout)
{
var entries = new List<VTableComponent>();
foreach (var component in layout.Components)
{
if (component.Kind == VTableComponentKind.CompleteDtorPointer)
continue;
if (component.Kind == VTableComponentKind.RTTI)
continue;
if (component.Kind == VTableComponentKind.UnusedFunctionPointer)
continue;
if (component.Method != null)
entries.Add(component);
}
if (layout == null)
return entries;
entries.AddRange(from component in layout.Components
where component.Kind != VTableComponentKind.CompleteDtorPointer &&
component.Kind != VTableComponentKind.RTTI &&
component.Kind != VTableComponentKind.UnusedFunctionPointer &&
component.Method != null
select component);
return entries;
}

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

@ -534,8 +534,7 @@ namespace CppSharp.Generators.CSharp @@ -534,8 +534,7 @@ namespace CppSharp.Generators.CSharp
ReturnType = field.QualifiedType
};
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx);
marshal.VarSuffix = i;
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx) { VarSuffix = i };
field.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
@ -1075,8 +1074,9 @@ namespace CppSharp.Generators.CSharp @@ -1075,8 +1074,9 @@ namespace CppSharp.Generators.CSharp
}
var marshals = new List<string>();
foreach (var param in method.Parameters)
for (int i = 0; i < method.Parameters.Count; i++)
{
var param = method.Parameters[i];
if (param.Ignore)
continue;
@ -1089,7 +1089,7 @@ namespace CppSharp.Generators.CSharp @@ -1089,7 +1089,7 @@ namespace CppSharp.Generators.CSharp
ReturnVarName = SafeIdentifier(param.Name)
};
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx);
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx) { VarSuffix = i };
param.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
@ -1104,7 +1104,7 @@ namespace CppSharp.Generators.CSharp @@ -1104,7 +1104,7 @@ namespace CppSharp.Generators.CSharp
if (hasReturn)
Write("var _ret = ");
WriteLine("target.{0}({1});", method.Name, string.Join(", ", marshals));
WriteLine("target.{0}({1});", SafeIdentifier(method.Name), string.Join(", ", marshals));
// TODO: Handle hidden structure return types.
@ -1170,7 +1170,8 @@ namespace CppSharp.Generators.CSharp @@ -1170,7 +1170,8 @@ namespace CppSharp.Generators.CSharp
public string GetVTableMethodDelegateName(Method method)
{
return string.Format("_{0}Delegate", GetFunctionIdentifier(method));
// trim '@' (if any) because '@' is valid only as the first symbol
return string.Format("_{0}Delegate", GetFunctionIdentifier(method).Trim('@'));
}
public void GenerateVTablePointers(Class @class)

18
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -47,6 +47,24 @@ namespace CppSharp.Passes @@ -47,6 +47,24 @@ namespace CppSharp.Passes
return base.VisitDeclaration(decl);
}
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);
}
}
return base.VisitClassDecl(@class);
}
public override bool VisitFunctionDecl(Function function)
{
uniqueName = 0;

Loading…
Cancel
Save