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 @@ -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;
}
}

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

@ -428,7 +428,8 @@ namespace CppSharp.Generators.CSharp @@ -428,7 +428,8 @@ namespace CppSharp.Generators.CSharp
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
var @interface = @class.Namespace.Classes.FirstOrDefault(
@ -2183,8 +2184,8 @@ namespace CppSharp.Generators.CSharp @@ -2183,8 +2184,8 @@ namespace CppSharp.Generators.CSharp
if (@class.IsRefType)
{
if (@class.HasBaseClass)
WriteLine("{0} = {1};", Helpers.PointerAdjustmentIdentifier,
if (@class.BaseClass?.Layout.HasSubclassAtNonZeroOffset == true)
WriteLine("{0} = {1};", Helpers.PrimaryBaseOffsetIdentifier,
GetOffsetToBase(@class, @class.BaseClass));
if (!@class.IsAbstractImpl)
{
@ -2945,17 +2946,17 @@ namespace CppSharp.Generators.CSharp @@ -2945,17 +2946,17 @@ namespace CppSharp.Generators.CSharp
to = to.OriginalClass ?? to;
baseOffset = GetOffsetToBase(from, to);
}
var isPrimaryBase = (from.BaseClass?.OriginalClass ?? from.BaseClass) == to;
if (isPrimaryBase)
bool isPrimaryBase = (from.BaseClass?.OriginalClass ?? from.BaseClass) == to;
bool isOrHasSubclassAtNonZeroOffset =
from.Layout.HasSubclassAtNonZeroOffset ||
to?.Layout.HasSubclassAtNonZeroOffset == true;
if (isPrimaryBase && isOrHasSubclassAtNonZeroOffset)
{
return string.Format("({0} + {1}{2})",
Helpers.InstanceIdentifier,
Helpers.PointerAdjustmentIdentifier,
baseOffset == 0 ? string.Empty : (" - " + baseOffset));
return Helpers.InstanceIdentifier +
(baseOffset == 0 ? " + " + Helpers.PrimaryBaseOffsetIdentifier : string.Empty);
}
return string.Format("({0}{1})",
Helpers.InstanceIdentifier,
baseOffset == 0 ? string.Empty : " + " + baseOffset);
return Helpers.InstanceIdentifier +
(baseOffset == 0 ? string.Empty : " + " + baseOffset);
}
private static uint GetOffsetToBase(Class from, Class to)

2
src/Generator/Generators/CodeGenerator.cs

@ -1209,7 +1209,7 @@ namespace CppSharp.Generators @@ -1209,7 +1209,7 @@ namespace CppSharp.Generators
public static readonly string InternalStruct = Generator.GeneratedIdentifier("Internal");
public static readonly string InstanceField = 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 DummyIdentifier = Generator.GeneratedIdentifier("dummy");
public static readonly string TargetIdentifier = Generator.GeneratedIdentifier("target");

8
src/Parser/ASTConverter.cs

@ -1587,7 +1587,15 @@ namespace CppSharp @@ -1587,7 +1587,15 @@ namespace CppSharp
_class.IsInjected = @class.IsInjected;
if (@class.Layout != null)
{
_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)

Loading…
Cancel
Save