Browse Source

Merge pull request #59 from ddobrev/master

Fixed the v-table interop to be compilable
pull/60/merge
João Matos 12 years ago
parent
commit
8511d578f5
  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
public static List<VTableComponent> GatherVTableMethodEntries(VTableLayout layout) public static List<VTableComponent> GatherVTableMethodEntries(VTableLayout layout)
{ {
var entries = new List<VTableComponent>(); var entries = new List<VTableComponent>();
if (layout == null)
foreach (var component in layout.Components) return entries;
{
if (component.Kind == VTableComponentKind.CompleteDtorPointer) entries.AddRange(from component in layout.Components
continue; where component.Kind != VTableComponentKind.CompleteDtorPointer &&
component.Kind != VTableComponentKind.RTTI &&
if (component.Kind == VTableComponentKind.RTTI) component.Kind != VTableComponentKind.UnusedFunctionPointer &&
continue; component.Method != null
select component);
if (component.Kind == VTableComponentKind.UnusedFunctionPointer)
continue;
if (component.Method != null)
entries.Add(component);
}
return entries; return entries;
} }

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

@ -534,8 +534,7 @@ namespace CppSharp.Generators.CSharp
ReturnType = field.QualifiedType ReturnType = field.QualifiedType
}; };
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx); var marshal = new CSharpMarshalNativeToManagedPrinter(ctx) { VarSuffix = i };
marshal.VarSuffix = i;
field.Visit(marshal); field.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
@ -1075,8 +1074,9 @@ namespace CppSharp.Generators.CSharp
} }
var marshals = new List<string>(); 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) if (param.Ignore)
continue; continue;
@ -1089,7 +1089,7 @@ namespace CppSharp.Generators.CSharp
ReturnVarName = SafeIdentifier(param.Name) ReturnVarName = SafeIdentifier(param.Name)
}; };
var marshal = new CSharpMarshalNativeToManagedPrinter(ctx); var marshal = new CSharpMarshalNativeToManagedPrinter(ctx) { VarSuffix = i };
param.Visit(marshal); param.Visit(marshal);
if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore)) if (!string.IsNullOrWhiteSpace(marshal.Context.SupportBefore))
@ -1104,7 +1104,7 @@ namespace CppSharp.Generators.CSharp
if (hasReturn) if (hasReturn)
Write("var _ret = "); 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. // TODO: Handle hidden structure return types.
@ -1170,7 +1170,8 @@ namespace CppSharp.Generators.CSharp
public string GetVTableMethodDelegateName(Method method) 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) public void GenerateVTablePointers(Class @class)

18
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

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

Loading…
Cancel
Save