Browse Source

Fix generation of SequentialLayout structures (#1499)

pull/1463/head
josetr 5 years ago committed by GitHub
parent
commit
42dda6b12f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      src/AST/TypeExtensions.cs
  2. 11
      src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs
  3. 56
      src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs
  4. 19
      src/Generator/Extensions/LayoutFieldExtensions.cs
  5. 22
      src/Generator/Extensions/ParserIntTypeExtensions.cs
  6. 82
      src/Generator/Extensions/PrimitiveTypeExtensions.cs
  7. 48
      src/Generator/Extensions/TypeExtensions.cs
  8. 35
      src/Generator/Generators/CSharp/CSharpSources.cs
  9. 50
      src/Generator/Generators/CSharp/CSharpTypePrinter.cs
  10. 10
      tests/CSharp/CSharp.Tests.cs
  11. 21
      tests/CSharp/CSharp.h

7
src/AST/TypeExtensions.cs

@ -439,7 +439,12 @@ @@ -439,7 +439,12 @@
public static long GetSizeInBytes(this ArrayType array)
{
return array.Size * (array.ElementSize / 8);
return GetSizeInBits(array) / 8;
}
public static long GetSizeInBits(this ArrayType array)
{
return array.Size * array.ElementSize;
}
}
}

11
src/CppParser/Bindings/CSharp/i686-pc-win32-msvc/CppSharp.CppParser.cs

@ -14257,6 +14257,7 @@ namespace CppSharp @@ -14257,6 +14257,7 @@ namespace CppSharp
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Friend___N_std_S_allocator__S0_ Friends;
internal global::Std.Map.__Internalc__N_std_S_map____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_less__S0____N_std_S_allocator____N_std_S_pair__1S0__S3_ anonymous;
internal byte isAnonymous;
internal fixed byte isInlinePadding[3];
internal byte isInline;
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0Namespace@AST@CppParser@CppSharp@@QAE@XZ", CallingConvention = __CallingConvention.ThisCall)]
@ -14822,6 +14823,7 @@ namespace CppSharp @@ -14822,6 +14823,7 @@ namespace CppSharp
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Friend___N_std_S_allocator__S0_ Friends;
internal global::Std.Map.__Internalc__N_std_S_map____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_less__S0____N_std_S_allocator____N_std_S_pair__1S0__S3_ anonymous;
internal byte isAnonymous;
internal fixed byte isInlinePadding[3];
internal byte isInline;
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C fileName;
internal byte isSystemHeader;
@ -21788,6 +21790,7 @@ namespace CppSharp @@ -21788,6 +21790,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isUniquePadding[3];
internal byte isUnique;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal __IntPtr sourceExpr;
@ -22562,6 +22565,7 @@ namespace CppSharp @@ -22562,6 +22565,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte exactPadding[3];
internal byte exact;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal double valueAsApproximateDouble;
@ -26936,6 +26940,7 @@ namespace CppSharp @@ -26936,6 +26940,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isConditionTruePadding[3];
internal byte isConditionTrue;
internal __IntPtr cond;
internal __IntPtr lHS;
@ -31372,6 +31377,7 @@ namespace CppSharp @@ -31372,6 +31377,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte valuePadding[3];
internal byte value;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
@ -31836,6 +31842,7 @@ namespace CppSharp @@ -31836,6 +31842,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isImplicitAccessPadding[3];
internal byte isImplicitAccess;
internal __IntPtr baseExpr;
internal byte isArrow;
@ -33163,6 +33170,7 @@ namespace CppSharp @@ -33163,6 +33170,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte constructsVBasePadding[3];
internal byte constructsVBase;
internal byte inheritedFromVBase;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
@ -34308,6 +34316,7 @@ namespace CppSharp @@ -34308,6 +34316,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isGlobalDeletePadding[3];
internal byte isGlobalDelete;
internal byte isArrayForm;
internal byte isArrayFormAsWritten;
@ -34693,6 +34702,7 @@ namespace CppSharp @@ -34693,6 +34702,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte valuePadding[3];
internal byte value;
internal uint numArgs;
@ -36041,6 +36051,7 @@ namespace CppSharp @@ -36041,6 +36051,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isImplicitAccessPadding[3];
internal byte isImplicitAccess;
internal __IntPtr @base;
internal global::CppSharp.Parser.AST.QualifiedType.__Internal baseType;

56
src/CppParser/Bindings/CSharp/x86_64-pc-win32-msvc/CppSharp.CppParser.cs

@ -9302,6 +9302,7 @@ namespace CppSharp @@ -9302,6 +9302,7 @@ namespace CppSharp
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Friend___N_std_S_allocator__S0_ Friends;
internal global::Std.Map.__Internalc__N_std_S_map____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_less__S0____N_std_S_allocator____N_std_S_pair__1S0__S3_ anonymous;
internal byte isAnonymous;
internal fixed byte modifiersPadding[4];
internal global::CppSharp.Parser.AST.Enumeration.EnumModifiers modifiers;
internal __IntPtr type;
internal __IntPtr builtinType;
@ -14257,6 +14258,7 @@ namespace CppSharp @@ -14257,6 +14258,7 @@ namespace CppSharp
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Friend___N_std_S_allocator__S0_ Friends;
internal global::Std.Map.__Internalc__N_std_S_map____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_less__S0____N_std_S_allocator____N_std_S_pair__1S0__S3_ anonymous;
internal byte isAnonymous;
internal fixed byte isInlinePadding[7];
internal byte isInline;
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0Namespace@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
@ -14822,6 +14824,7 @@ namespace CppSharp @@ -14822,6 +14824,7 @@ namespace CppSharp
internal global::Std.Vector.__Internalc__N_std_S_vector_____N_CppSharp_N_CppParser_N_AST_S_Friend___N_std_S_allocator__S0_ Friends;
internal global::Std.Map.__Internalc__N_std_S_map____N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C____N_CppSharp_N_CppParser_N_AST_S_Declaration___N_std_S_less__S0____N_std_S_allocator____N_std_S_pair__1S0__S3_ anonymous;
internal byte isAnonymous;
internal fixed byte isInlinePadding[7];
internal byte isInline;
internal global::Std.BasicString.__Internalc__N_std_S_basic_string__C___N_std_S_char_traits__C___N_std_S_allocator__C fileName;
internal byte isSystemHeader;
@ -21788,6 +21791,7 @@ namespace CppSharp @@ -21788,6 +21791,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isUniquePadding[7];
internal byte isUnique;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal __IntPtr sourceExpr;
@ -21922,6 +21926,7 @@ namespace CppSharp @@ -21922,6 +21926,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal byte hadMultipleCandidates;
internal byte hasQualifier;
@ -22182,6 +22187,7 @@ namespace CppSharp @@ -22182,6 +22187,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal ulong value;
@ -22301,6 +22307,7 @@ namespace CppSharp @@ -22301,6 +22307,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal ulong value;
@ -22420,6 +22427,7 @@ namespace CppSharp @@ -22420,6 +22427,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal global::CppSharp.Parser.AST.CharacterLiteral.CharacterKind kind;
internal uint value;
@ -22562,6 +22570,7 @@ namespace CppSharp @@ -22562,6 +22570,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte exactPadding[7];
internal byte exact;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal double valueAsApproximateDouble;
@ -23131,6 +23140,7 @@ namespace CppSharp @@ -23131,6 +23140,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal global::CppSharp.Parser.AST.PredefinedExpr.IdentKind identKind;
@ -23396,6 +23406,7 @@ namespace CppSharp @@ -23396,6 +23406,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte opcodePadding[4];
internal global::CppSharp.Parser.AST.UnaryOperatorKind opcode;
internal __IntPtr subExpr;
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
@ -23642,6 +23653,7 @@ namespace CppSharp @@ -23642,6 +23653,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte operatorLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
internal uint numComponents;
@ -23789,6 +23801,7 @@ namespace CppSharp @@ -23789,6 +23801,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte kindPadding[4];
internal global::CppSharp.Parser.AST.UnaryExprOrTypeTrait kind;
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
@ -24840,6 +24853,7 @@ namespace CppSharp @@ -24840,6 +24853,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -25053,6 +25067,7 @@ namespace CppSharp @@ -25053,6 +25067,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -25170,6 +25185,7 @@ namespace CppSharp @@ -25170,6 +25185,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -25301,6 +25317,7 @@ namespace CppSharp @@ -25301,6 +25317,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -25428,6 +25445,7 @@ namespace CppSharp @@ -25428,6 +25445,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte operatorLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
internal global::CppSharp.Parser.AST.BinaryOperatorKind opcode;
internal __IntPtr lHS;
@ -25823,6 +25841,7 @@ namespace CppSharp @@ -25823,6 +25841,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte operatorLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
internal global::CppSharp.Parser.AST.BinaryOperatorKind opcode;
internal __IntPtr lHS;
@ -26416,6 +26435,7 @@ namespace CppSharp @@ -26416,6 +26435,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte ampAmpLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal ampAmpLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal labelLoc;
@ -26669,6 +26689,7 @@ namespace CppSharp @@ -26669,6 +26689,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte builtinLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal builtinLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
internal uint numSubExprs;
@ -26936,6 +26957,7 @@ namespace CppSharp @@ -26936,6 +26957,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isConditionTruePadding[7];
internal byte isConditionTrue;
internal __IntPtr cond;
internal __IntPtr lHS;
@ -27143,6 +27165,7 @@ namespace CppSharp @@ -27143,6 +27165,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte tokenLocationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal tokenLocation;
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0GNUNullExpr@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
@ -27658,6 +27681,7 @@ namespace CppSharp @@ -27658,6 +27681,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte equalOrColonLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal equalOrColonLoc;
internal __IntPtr init;
internal uint size;
@ -28788,6 +28812,7 @@ namespace CppSharp @@ -28788,6 +28812,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte numExprsPadding[4];
internal uint numExprs;
internal global::CppSharp.Parser.SourceLocation.__Internal lParenLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
@ -28921,6 +28946,7 @@ namespace CppSharp @@ -28921,6 +28946,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte numAssocsPadding[4];
internal uint numAssocs;
internal global::CppSharp.Parser.SourceLocation.__Internal genericLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal defaultLoc;
@ -29288,6 +29314,7 @@ namespace CppSharp @@ -29288,6 +29314,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte caretLocationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal caretLocation;
internal __IntPtr body;
@ -30597,6 +30624,7 @@ namespace CppSharp @@ -30597,6 +30624,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -30775,6 +30803,7 @@ namespace CppSharp @@ -30775,6 +30803,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -30878,6 +30907,7 @@ namespace CppSharp @@ -30878,6 +30907,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -30995,6 +31025,7 @@ namespace CppSharp @@ -30995,6 +31025,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -31098,6 +31129,7 @@ namespace CppSharp @@ -31098,6 +31129,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -31372,6 +31404,7 @@ namespace CppSharp @@ -31372,6 +31404,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte valuePadding[7];
internal byte value;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
@ -31491,6 +31524,7 @@ namespace CppSharp @@ -31491,6 +31524,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0CXXNullPtrLiteralExpr@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
@ -31836,6 +31870,7 @@ namespace CppSharp @@ -31836,6 +31870,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isImplicitAccessPadding[7];
internal byte isImplicitAccess;
internal __IntPtr baseExpr;
internal byte isArrow;
@ -31984,6 +32019,7 @@ namespace CppSharp @@ -31984,6 +32019,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte rBracketLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal rBracketLoc;
internal __IntPtr @base;
internal __IntPtr idx;
@ -32272,6 +32308,7 @@ namespace CppSharp @@ -32272,6 +32308,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal byte @implicit;
@ -33163,6 +33200,7 @@ namespace CppSharp @@ -33163,6 +33200,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte constructsVBasePadding[7];
internal byte constructsVBase;
internal byte inheritedFromVBase;
internal global::CppSharp.Parser.SourceLocation.__Internal location;
@ -33296,6 +33334,7 @@ namespace CppSharp @@ -33296,6 +33334,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte castKindPadding[4];
internal global::CppSharp.Parser.AST.CastKind castKind;
internal __IntPtr subExpr;
internal __IntPtr castKindName;
@ -33837,6 +33876,7 @@ namespace CppSharp @@ -33837,6 +33876,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte rParenLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
[SuppressUnmanagedCodeSecurity, DllImport("CppSharp.CppParser.dll", EntryPoint = "??0CXXScalarValueInitExpr@AST@CppParser@CppSharp@@QEAA@XZ", CallingConvention = __CallingConvention.Cdecl)]
@ -34308,6 +34348,7 @@ namespace CppSharp @@ -34308,6 +34348,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isGlobalDeletePadding[7];
internal byte isGlobalDelete;
internal byte isArrayForm;
internal byte isArrayFormAsWritten;
@ -34693,6 +34734,7 @@ namespace CppSharp @@ -34693,6 +34734,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte valuePadding[7];
internal byte value;
internal uint numArgs;
@ -35068,6 +35110,7 @@ namespace CppSharp @@ -35068,6 +35110,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte numDeclsPadding[4];
internal uint numDecls;
internal global::CppSharp.Parser.SourceLocation.__Internal nameLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal templateKeywordLoc;
@ -35381,6 +35424,7 @@ namespace CppSharp @@ -35381,6 +35424,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte numDeclsPadding[4];
internal uint numDecls;
internal global::CppSharp.Parser.SourceLocation.__Internal nameLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal templateKeywordLoc;
@ -35389,6 +35433,7 @@ namespace CppSharp @@ -35389,6 +35433,7 @@ namespace CppSharp
internal byte hasTemplateKeyword;
internal byte hasExplicitTemplateArgs;
internal uint numTemplateArgs;
internal fixed byte requiresADLPadding[4];
internal byte requiresADL;
internal byte isOverloaded;
@ -35508,6 +35553,7 @@ namespace CppSharp @@ -35508,6 +35553,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte locationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal location;
internal global::CppSharp.Parser.SourceLocation.__Internal templateKeywordLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal lAngleLoc;
@ -36041,6 +36087,7 @@ namespace CppSharp @@ -36041,6 +36087,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte isImplicitAccessPadding[7];
internal byte isImplicitAccess;
internal __IntPtr @base;
internal global::CppSharp.Parser.AST.QualifiedType.__Internal baseType;
@ -36318,6 +36365,7 @@ namespace CppSharp @@ -36318,6 +36365,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte numDeclsPadding[4];
internal uint numDecls;
internal global::CppSharp.Parser.SourceLocation.__Internal nameLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal templateKeywordLoc;
@ -36326,6 +36374,7 @@ namespace CppSharp @@ -36326,6 +36374,7 @@ namespace CppSharp
internal byte hasTemplateKeyword;
internal byte hasExplicitTemplateArgs;
internal uint numTemplateArgs;
internal fixed byte isImplicitAccessPadding[4];
internal byte isImplicitAccess;
internal __IntPtr @base;
internal global::CppSharp.Parser.AST.QualifiedType.__Internal baseType;
@ -36758,6 +36807,7 @@ namespace CppSharp @@ -36758,6 +36807,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte operatorLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal operatorLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal packLoc;
internal global::CppSharp.Parser.SourceLocation.__Internal rParenLoc;
@ -36934,6 +36984,7 @@ namespace CppSharp @@ -36934,6 +36984,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte nameLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal nameLoc;
internal __IntPtr replacement;
@ -37054,6 +37105,7 @@ namespace CppSharp @@ -37054,6 +37105,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte parameterPackLocationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal parameterPackLocation;
internal global::CppSharp.Parser.AST.TemplateArgument.__Internal argumentPack;
@ -37175,6 +37227,7 @@ namespace CppSharp @@ -37175,6 +37227,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte parameterPackLocationPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal parameterPackLocation;
internal uint numExpansions;
@ -37743,6 +37796,7 @@ namespace CppSharp @@ -37743,6 +37796,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte keywordLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal keywordLoc;
internal __IntPtr commonExpr;
internal __IntPtr opaqueValue;
@ -37949,6 +38003,7 @@ namespace CppSharp @@ -37949,6 +38003,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte keywordLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal keywordLoc;
internal __IntPtr commonExpr;
internal __IntPtr opaqueValue;
@ -38210,6 +38265,7 @@ namespace CppSharp @@ -38210,6 +38265,7 @@ namespace CppSharp
internal __IntPtr sourceBitField;
internal __IntPtr referencedDeclOfCallee;
internal byte hasPlaceholderType;
internal fixed byte keywordLocPadding[4];
internal global::CppSharp.Parser.SourceLocation.__Internal keywordLoc;
internal __IntPtr commonExpr;
internal __IntPtr opaqueValue;

19
src/Generator/Extensions/LayoutFieldExtensions.cs

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Parser;
namespace CppSharp.Extensions
{
public static class LayoutFieldExtensions
{
internal static int CalculateOffset(this LayoutField field, LayoutField previousField, ParserTargetInfo targetInfo)
{
var type = field.QualifiedType.Type.Desugar();
var prevFieldSize = previousField.QualifiedType.Type.Desugar().GetWidth(targetInfo) / 8;
var unalignedOffset = previousField.Offset + prevFieldSize;
var alignment = type.GetAlignment(targetInfo) / 8;
var alignedOffset = (unalignedOffset + (alignment - 1)) & -alignment;
return (int)alignedOffset;
}
}
}

22
src/Generator/Extensions/ParserIntTypeExtensions.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
using CppSharp.Parser;
namespace CppSharp.Extensions
{
public static class ParserIntTypeExtensions
{
public static bool IsSigned(this ParserIntType intType)
{
switch (intType)
{
case ParserIntType.SignedChar:
case ParserIntType.SignedShort:
case ParserIntType.SignedInt:
case ParserIntType.SignedLong:
case ParserIntType.SignedLongLong:
return true;
default:
return false;
}
}
}
}

82
src/Generator/Extensions/PrimitiveTypeExtensions.cs

@ -0,0 +1,82 @@ @@ -0,0 +1,82 @@
using CppSharp.AST;
using CppSharp.Parser;
using System;
using System.Security.Cryptography;
namespace CppSharp.Extensions
{
public static class PrimitiveTypeExtensions
{
public static (uint Width, uint Alignment) GetInfo(this PrimitiveType primitive, ParserTargetInfo targetInfo, out bool signed)
{
signed = false;
switch (primitive)
{
case PrimitiveType.Bool:
return (targetInfo.BoolWidth, targetInfo.BoolAlign);
case PrimitiveType.Short:
signed = true;
return (targetInfo.ShortWidth, targetInfo.ShortAlign);
case PrimitiveType.Int:
signed = true;
return (targetInfo.IntWidth, targetInfo.IntAlign);
case PrimitiveType.Long:
signed = true;
return (targetInfo.LongWidth, targetInfo.LongAlign);
case PrimitiveType.LongLong:
signed = true;
return (targetInfo.LongLongWidth, targetInfo.LongLongAlign);
case PrimitiveType.UShort:
return (targetInfo.ShortWidth, targetInfo.ShortAlign);
case PrimitiveType.UInt:
return (targetInfo.IntWidth, targetInfo.IntAlign);
case PrimitiveType.ULong:
return (targetInfo.LongWidth, targetInfo.LongAlign);
case PrimitiveType.ULongLong:
return (targetInfo.LongLongWidth, targetInfo.LongLongAlign);
case PrimitiveType.Char:
signed = true;
return (targetInfo.CharWidth, targetInfo.CharAlign);
case PrimitiveType.UChar:
return (targetInfo.CharWidth, targetInfo.CharAlign);
case PrimitiveType.WideChar:
signed = targetInfo.WCharType.IsSigned();
return (targetInfo.WCharWidth, targetInfo.WCharAlign);
case PrimitiveType.Char16:
signed = targetInfo.Char16Type.IsSigned();
return (targetInfo.Char16Width, targetInfo.Char16Align);
case PrimitiveType.Char32:
signed = targetInfo.Char32Type.IsSigned();
return (targetInfo.Char32Width, targetInfo.Char32Align);
case PrimitiveType.Float:
signed = true;
return (targetInfo.FloatWidth, targetInfo.FloatAlign);
case PrimitiveType.Double:
signed = true;
return (targetInfo.DoubleWidth, targetInfo.DoubleAlign);
case PrimitiveType.LongDouble:
signed = true;
return (targetInfo.LongDoubleWidth, targetInfo.LongDoubleAlign);
case PrimitiveType.Half:
signed = true;
return (targetInfo.HalfWidth, targetInfo.HalfAlign);
case PrimitiveType.Float128:
signed = true;
return (targetInfo.Float128Width, targetInfo.Float128Align);
case PrimitiveType.IntPtr:
case PrimitiveType.UIntPtr:
signed = targetInfo.IntPtrType.IsSigned();
return (targetInfo.PointerWidth, targetInfo.PointerAlign);
default:
throw new NotImplementedException();
}
}
}
}

48
src/Generator/Extensions/TypeExtensions.cs

@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Parser;
namespace CppSharp.Extensions
{
public static class TypeExtensions
{
public static int GetWidth(this Type type, ParserTargetInfo targetInfo)
{
if (type.IsPrimitiveType(out var primitiveType))
return (int)primitiveType.GetInfo(targetInfo, out _).Width;
if (type.IsAddress())
return (int)targetInfo.PointerWidth;
if (type.TryGetEnum(out Enumeration enumeration))
return GetWidth(enumeration.BuiltinType, targetInfo);
if (type is ArrayType array)
return (int)array.GetSizeInBits();
type.TryGetClass(out Class @class);
return @class.Layout.Size * 8;
}
public static int GetAlignment(this Type type, ParserTargetInfo targetInfo)
{
if (type.IsPrimitiveType(out var primitiveType))
return (int)primitiveType.GetInfo(targetInfo, out _).Alignment;
if (type.IsAddress())
return (int)targetInfo.PointerAlign;
if (type.TryGetEnum(out Enumeration enumeration))
return GetAlignment(enumeration.BuiltinType, targetInfo);
if (type is ArrayType array)
return GetAlignment(array.Type.Desugar(), targetInfo);
type.TryGetClass(out Class @class);
if (@class.MaxFieldAlignment != 0)
return @class.MaxFieldAlignment * 8;
return @class.Layout.Alignment * 8;
}
}
}

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

@ -8,6 +8,7 @@ using System.Text; @@ -8,6 +8,7 @@ using System.Text;
using System.Text.RegularExpressions;
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Extensions;
using CppSharp.Parser;
using CppSharp.Types;
using CppSharp.Utils;
@ -816,7 +817,7 @@ namespace CppSharp.Generators.CSharp @@ -816,7 +817,7 @@ namespace CppSharp.Generators.CSharp
return true;
}
private void GenerateClassInternalsFields(Class @class, bool sequentalLayout)
private void GenerateClassInternalsFields(Class @class, bool sequentialLayout)
{
var fields = @class.Layout.Fields;
@ -829,7 +830,17 @@ namespace CppSharp.Generators.CSharp @@ -829,7 +830,17 @@ namespace CppSharp.Generators.CSharp
PushBlock(BlockKind.Field);
if (!sequentalLayout)
if (sequentialLayout && i > 0)
{
var padding = field.Offset - field.CalculateOffset(fields[i - 1], Context.TargetInfo);
if (padding > 1)
WriteLine($"internal fixed byte {field.Name}Padding[{padding}];");
else if (padding > 0)
WriteLine($"internal byte {field.Name}Padding;");
}
if (!sequentialLayout)
WriteLine($"[FieldOffset({field.Offset})]");
Write($"internal {retType}");
@ -840,25 +851,7 @@ namespace CppSharp.Generators.CSharp @@ -840,25 +851,7 @@ namespace CppSharp.Generators.CSharp
}
WriteLine(";");
// Sometimes padding is needed due to aligment.
// The linux 32 bit target pads at the end the structure
// which is already handled by using [StructLayout(Size = n)].
// However the windows 32 bit target will add some of the padding at the front,
// right after the vtable pointer, which is what we are handling here.
// See https://github.com/dotnet/runtime/issues/44378 for more info.
if (sequentalLayout && fields[i].IsVTablePtr)
{
var nativePointerSize = Context.TargetInfo.PointerWidth / 8;
if (i + 1 < fields.Count)
{
var padding = fields[i + 1].Offset - field.Offset - nativePointerSize;
if (padding > 0 && padding <= @class.Layout.Size)
WriteLine($"internal fixed byte {field.Name}Padding[{padding}];");
}
}
PopBlock(sequentalLayout && i + 1 != fields.Count ? NewLineKind.Never : NewLineKind.BeforeNextBlock);
PopBlock(sequentialLayout && i + 1 != fields.Count ? NewLineKind.Never : NewLineKind.BeforeNextBlock);
}
}

50
src/Generator/Generators/CSharp/CSharpTypePrinter.cs

@ -5,6 +5,7 @@ using System.Linq; @@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Extensions;
using CppSharp.Types;
using ParserTargetInfo = CppSharp.Parser.ParserTargetInfo;
using Type = CppSharp.AST.Type;
@ -395,54 +396,9 @@ namespace CppSharp.Generators.CSharp @@ -395,54 +396,9 @@ namespace CppSharp.Generators.CSharp
return QualifiedType(type.Type.FullName);
}
public static void GetPrimitiveTypeWidth(PrimitiveType primitive,
ParserTargetInfo targetInfo, out uint width, out bool signed)
public static void GetPrimitiveTypeWidth(PrimitiveType primitive, ParserTargetInfo targetInfo, out uint width, out bool signed)
{
switch (primitive)
{
case PrimitiveType.Char:
width = targetInfo?.CharWidth ?? 8;
signed = true;
break;
case PrimitiveType.UChar:
width = targetInfo?.CharWidth ?? 8;
signed = false;
break;
case PrimitiveType.Short:
width = targetInfo?.ShortWidth ?? 16;
signed = true;
break;
case PrimitiveType.UShort:
width = targetInfo?.ShortWidth ?? 16;
signed = false;
break;
case PrimitiveType.Int:
width = targetInfo?.IntWidth ?? 32;
signed = true;
break;
case PrimitiveType.UInt:
width = targetInfo?.IntWidth ?? 32;
signed = false;
break;
case PrimitiveType.Long:
width = targetInfo?.LongWidth ?? 32;
signed = true;
break;
case PrimitiveType.ULong:
width = targetInfo?.LongWidth ?? 32;
signed = false;
break;
case PrimitiveType.LongLong:
width = targetInfo?.LongLongWidth ?? 64;
signed = true;
break;
case PrimitiveType.ULongLong:
width = targetInfo?.LongLongWidth ?? 64;
signed = false;
break;
default:
throw new NotImplementedException();
}
width = primitive.GetInfo(targetInfo, out signed).Width;
}
static string GetIntString(PrimitiveType primitive, ParserTargetInfo targetInfo)

10
tests/CSharp/CSharp.Tests.cs

@ -752,12 +752,16 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -752,12 +752,16 @@ public unsafe class CSharpTests : GeneratorTestFixture
foreach (var (type, offsets) in new (Type, int[])[] {
(typeof(ClassCustomTypeAlignment), CSharp.CSharp.ClassCustomTypeAlignmentOffsets),
(typeof(ClassCustomObjectAligment), CSharp.CSharp.ClassCustomObjectAligmentOffsets),
(typeof(ClassMicrosoftObjectAlignment), CSharp.CSharp.ClassMicrosoftObjectAlignmentOffsets),
})
{
var internalType = type.GetNestedType("__Internal");
var managedOffsets = internalType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic).Select(field =>
(int)Marshal.OffsetOf(internalType, field.Name)
);
var managedOffsets = internalType
.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
.SkipWhile(x => x.FieldType == typeof(IntPtr))
.Where(x => !x.Name.EndsWith("Padding"))
.Select(field => (int)Marshal.OffsetOf(internalType, field.Name));
Assert.That(managedOffsets, Is.EqualTo(offsets));
Assert.That(Marshal.SizeOf(internalType), Is.EqualTo(internalType.StructLayoutAttribute.Size));
}

21
tests/CSharp/CSharp.h

@ -1549,6 +1549,27 @@ static constexpr const int ClassCustomObjectAligmentOffsets[] { @@ -1549,6 +1549,27 @@ static constexpr const int ClassCustomObjectAligmentOffsets[] {
offsetof(ClassCustomObjectAligment, charAligned8),
};
struct DLL_API ClassMicrosoftObjectAlignmentBase
{
uint8_t u8;
double dbl;
int16_t i16;
virtual void Method() { }
};
struct DLL_API ClassMicrosoftObjectAlignment : ClassMicrosoftObjectAlignmentBase
{
bool boolean;
};
static constexpr const int ClassMicrosoftObjectAlignmentOffsets[]
{
offsetof(ClassMicrosoftObjectAlignment, u8),
offsetof(ClassMicrosoftObjectAlignment, dbl),
offsetof(ClassMicrosoftObjectAlignment, i16),
offsetof(ClassMicrosoftObjectAlignment, boolean),
};
DLL_API const char* TestCSharpString(const char* in, CS_OUT const char** out);
DLL_API const wchar_t* TestCSharpStringWide(const wchar_t* in, CS_OUT const wchar_t** out);
DLL_API const char16_t* TestCSharpString16(const char16_t* in, CS_OUT const char16_t** out);

Loading…
Cancel
Save