Browse Source

Remove needless pointer offsets from generated C#

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1300/head
Dimitar Dobrev 5 years ago
parent
commit
6fe81fddcc
  1. 5
      src/AST/ClassLayout.cs
  2. 25
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 2
      src/Generator/Generators/CodeGenerator.cs
  4. 8
      src/Parser/ASTConverter.cs

5
src/AST/ClassLayout.cs

@ -171,6 +171,11 @@ namespace CppSharp.AST
} }
} }
/// <summary>
/// Indicates whether this class layout has a subclass at a non-zero offset.
/// </summary>
public bool HasSubclassAtNonZeroOffset { get; set; }
private List<LayoutField> vTablePointers; private List<LayoutField> vTablePointers;
} }
} }

25
src/Generator/Generators/CSharp/CSharpSources.cs

@ -428,7 +428,8 @@ namespace CppSharp.Generators.CSharp
PushBlock(BlockKind.Field); PushBlock(BlockKind.Field);
WriteLine("protected int {0};", Helpers.PointerAdjustmentIdentifier); if (@class.Layout.HasSubclassAtNonZeroOffset)
WriteLine($"protected int {Helpers.PrimaryBaseOffsetIdentifier};");
// use interfaces if any - derived types with a secondary base this class must be compatible with the map // use interfaces if any - derived types with a secondary base this class must be compatible with the map
var @interface = @class.Namespace.Classes.FirstOrDefault( var @interface = @class.Namespace.Classes.FirstOrDefault(
@ -2183,8 +2184,8 @@ namespace CppSharp.Generators.CSharp
if (@class.IsRefType) if (@class.IsRefType)
{ {
if (@class.HasBaseClass) if (@class.BaseClass?.Layout.HasSubclassAtNonZeroOffset == true)
WriteLine("{0} = {1};", Helpers.PointerAdjustmentIdentifier, WriteLine("{0} = {1};", Helpers.PrimaryBaseOffsetIdentifier,
GetOffsetToBase(@class, @class.BaseClass)); GetOffsetToBase(@class, @class.BaseClass));
if (!@class.IsAbstractImpl) if (!@class.IsAbstractImpl)
{ {
@ -2945,17 +2946,17 @@ namespace CppSharp.Generators.CSharp
to = to.OriginalClass ?? to; to = to.OriginalClass ?? to;
baseOffset = GetOffsetToBase(from, to); baseOffset = GetOffsetToBase(from, to);
} }
var isPrimaryBase = (from.BaseClass?.OriginalClass ?? from.BaseClass) == to; bool isPrimaryBase = (from.BaseClass?.OriginalClass ?? from.BaseClass) == to;
if (isPrimaryBase) bool isOrHasSubclassAtNonZeroOffset =
from.Layout.HasSubclassAtNonZeroOffset ||
to?.Layout.HasSubclassAtNonZeroOffset == true;
if (isPrimaryBase && isOrHasSubclassAtNonZeroOffset)
{ {
return string.Format("({0} + {1}{2})", return Helpers.InstanceIdentifier +
Helpers.InstanceIdentifier, (baseOffset == 0 ? " + " + Helpers.PrimaryBaseOffsetIdentifier : string.Empty);
Helpers.PointerAdjustmentIdentifier,
baseOffset == 0 ? string.Empty : (" - " + baseOffset));
} }
return string.Format("({0}{1})", return Helpers.InstanceIdentifier +
Helpers.InstanceIdentifier, (baseOffset == 0 ? string.Empty : " + " + baseOffset);
baseOffset == 0 ? string.Empty : " + " + baseOffset);
} }
private static uint GetOffsetToBase(Class from, Class to) private static uint GetOffsetToBase(Class from, Class to)

2
src/Generator/Generators/CodeGenerator.cs

@ -1209,7 +1209,7 @@ namespace CppSharp.Generators
public static readonly string InternalStruct = Generator.GeneratedIdentifier("Internal"); public static readonly string InternalStruct = Generator.GeneratedIdentifier("Internal");
public static readonly string InstanceField = Generator.GeneratedIdentifier("instance"); public static readonly string InstanceField = Generator.GeneratedIdentifier("instance");
public static readonly string InstanceIdentifier = Generator.GeneratedIdentifier("Instance"); public static readonly string InstanceIdentifier = Generator.GeneratedIdentifier("Instance");
public static readonly string PointerAdjustmentIdentifier = Generator.GeneratedIdentifier("PointerAdjustment"); public static readonly string PrimaryBaseOffsetIdentifier = Generator.GeneratedIdentifier("PrimaryBaseOffset");
public static readonly string ReturnIdentifier = Generator.GeneratedIdentifier("ret"); public static readonly string ReturnIdentifier = Generator.GeneratedIdentifier("ret");
public static readonly string DummyIdentifier = Generator.GeneratedIdentifier("dummy"); public static readonly string DummyIdentifier = Generator.GeneratedIdentifier("dummy");
public static readonly string TargetIdentifier = Generator.GeneratedIdentifier("target"); public static readonly string TargetIdentifier = Generator.GeneratedIdentifier("target");

8
src/Parser/ASTConverter.cs

@ -1587,7 +1587,15 @@ namespace CppSharp
_class.IsInjected = @class.IsInjected; _class.IsInjected = @class.IsInjected;
if (@class.Layout != null) if (@class.Layout != null)
{
_class.Layout = VisitClassLayout(@class.Layout); _class.Layout = VisitClassLayout(@class.Layout);
if (_class.BaseClass != null)
{
AST.LayoutBase @base = _class.Layout.Bases.Find(
b => b.Class == _class.BaseClass);
_class.BaseClass.Layout.HasSubclassAtNonZeroOffset = @base.Offset > 0;
}
}
} }
public override AST.Declaration VisitClass(Class @class) public override AST.Declaration VisitClass(Class @class)

Loading…
Cancel
Save