diff --git a/src/Generator/AST/VTables.cs b/src/Generator/AST/VTables.cs index edd24d44..c6dbdcb2 100644 --- a/src/Generator/AST/VTables.cs +++ b/src/Generator/AST/VTables.cs @@ -25,21 +25,15 @@ namespace CppSharp.AST public static List GatherVTableMethodEntries(VTableLayout layout) { var entries = new List(); - - 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; } diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 3ffdb32c..096c4d95 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -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 } var marshals = new List(); - 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 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 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 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) diff --git a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs index fc2092e8..6c7ab372 100644 --- a/src/Generator/Passes/CleanInvalidDeclNamesPass.cs +++ b/src/Generator/Passes/CleanInvalidDeclNamesPass.cs @@ -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;