From 3902dd4acc49a4a51a269902ea0bfc2d353c437e Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Sat, 10 May 2014 14:07:38 +0300 Subject: [PATCH] Add PrimitiveTypes Long and ULong The enum PrimitiveType represents, according to the comment, "the C++ built-in types.". However, it does not contain values for C++'s "long" or "unsigned long", and the parser converts long to int. This is not correct, and is a problem with 64bit support. This patch adds Long and ULong values to PrimitiveType, and adds those to all the switch-cases all around the code. For now Long and ULong are handled exactly like Int and UInt, so this patch does not change behavior. Signed-off-by: Tomi Valkeinen --- src/AST/Type.cs | 3 +++ src/Core/Parser/ASTConverter.cs | 4 ++++ src/CppParser/AST.h | 2 ++ src/CppParser/Bindings/CLI/AST.h | 12 +++++++----- src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs | 12 +++++++----- src/CppParser/Parser.cpp | 4 ++-- src/Generator/Generators/CLI/CLIMarshal.cs | 4 ++++ src/Generator/Generators/CLI/CLITypePrinter.cs | 2 ++ src/Generator/Generators/CSharp/CSharpMarshal.cs | 6 +++++- src/Generator/Generators/CSharp/CSharpTypePrinter.cs | 2 ++ src/Generator/Types/CppTypePrinter.cs | 2 ++ src/Parser/Parser.cpp | 4 ++-- 12 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/AST/Type.cs b/src/AST/Type.cs index 3442c033..1bff7a06 100644 --- a/src/AST/Type.cs +++ b/src/AST/Type.cs @@ -665,6 +665,8 @@ namespace CppSharp.AST UInt16, Int32, UInt32, + Long, + ULong, Int64, UInt64, Float, @@ -698,6 +700,7 @@ namespace CppSharp.AST case PrimitiveType.UInt8: case PrimitiveType.UInt16: case PrimitiveType.UInt32: + case PrimitiveType.ULong: case PrimitiveType.UInt64: return true; } diff --git a/src/Core/Parser/ASTConverter.cs b/src/Core/Parser/ASTConverter.cs index 1e2bb0c2..81c3848e 100644 --- a/src/Core/Parser/ASTConverter.cs +++ b/src/Core/Parser/ASTConverter.cs @@ -568,6 +568,10 @@ namespace CppSharp return AST.PrimitiveType.Int32; case PrimitiveType.UInt32: return AST.PrimitiveType.UInt32; + case PrimitiveType.Long: + return AST.PrimitiveType.Long; + case PrimitiveType.ULong: + return AST.PrimitiveType.ULong; case PrimitiveType.Int64: return AST.PrimitiveType.Int64; case PrimitiveType.UInt64: diff --git a/src/CppParser/AST.h b/src/CppParser/AST.h index 11261cf6..1da02a87 100644 --- a/src/CppParser/AST.h +++ b/src/CppParser/AST.h @@ -242,6 +242,8 @@ enum struct PrimitiveType UInt16, Int32, UInt32, + Long, + ULong, Int64, UInt64, Float, diff --git a/src/CppParser/Bindings/CLI/AST.h b/src/CppParser/Bindings/CLI/AST.h index c24b1cd5..ee202111 100644 --- a/src/CppParser/Bindings/CLI/AST.h +++ b/src/CppParser/Bindings/CLI/AST.h @@ -245,11 +245,13 @@ namespace CppSharp UInt16 = 7, Int32 = 8, UInt32 = 9, - Int64 = 10, - UInt64 = 11, - Float = 12, - Double = 13, - IntPtr = 14 + Long = 10, + ULong = 11, + Int64 = 12, + UInt64 = 13, + Float = 14, + Double = 15, + IntPtr = 16 }; public enum struct RawCommentKind diff --git a/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs b/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs index 0a05b797..4af8adc1 100644 --- a/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs +++ b/src/CppParser/Bindings/CSharp/i686-pc-win32/AST.cs @@ -173,11 +173,13 @@ namespace CppSharp UInt16 = 7, Int32 = 8, UInt32 = 9, - Int64 = 10, - UInt64 = 11, - Float = 12, - Double = 13, - IntPtr = 14 + Long = 10, + ULong = 11, + Int64 = 12, + UInt64 = 13, + Float = 14, + Double = 15, + IntPtr = 16 } public enum RawCommentKind diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 4c1ca359..64694956 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -1335,8 +1335,8 @@ static PrimitiveType WalkBuiltinType(const clang::BuiltinType* Builtin) case clang::BuiltinType::Int: return PrimitiveType::Int32; case clang::BuiltinType::UInt: return PrimitiveType::UInt32; - case clang::BuiltinType::Long: return PrimitiveType::Int32; - case clang::BuiltinType::ULong: return PrimitiveType::UInt32; + case clang::BuiltinType::Long: return PrimitiveType::Long; + case clang::BuiltinType::ULong: return PrimitiveType::ULong; case clang::BuiltinType::LongLong: return PrimitiveType::Int64; case clang::BuiltinType::ULongLong: return PrimitiveType::UInt64; diff --git a/src/Generator/Generators/CLI/CLIMarshal.cs b/src/Generator/Generators/CLI/CLIMarshal.cs index f2993dcf..3e0978e6 100644 --- a/src/Generator/Generators/CLI/CLIMarshal.cs +++ b/src/Generator/Generators/CLI/CLIMarshal.cs @@ -162,6 +162,8 @@ namespace CppSharp.Generators.CLI case PrimitiveType.UInt16: case PrimitiveType.Int32: case PrimitiveType.UInt32: + case PrimitiveType.Long: + case PrimitiveType.ULong: case PrimitiveType.Int64: case PrimitiveType.UInt64: case PrimitiveType.Float: @@ -501,6 +503,8 @@ namespace CppSharp.Generators.CLI case PrimitiveType.UInt16: case PrimitiveType.Int32: case PrimitiveType.UInt32: + case PrimitiveType.Long: + case PrimitiveType.ULong: case PrimitiveType.Int64: case PrimitiveType.UInt64: case PrimitiveType.Float: diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 8d4fd89d..279e8d28 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -195,6 +195,8 @@ namespace CppSharp.Generators.CLI case PrimitiveType.UInt16: return "unsigned short"; case PrimitiveType.Int32: return "int"; case PrimitiveType.UInt32: return "unsigned int"; + case PrimitiveType.Long: return "int"; + case PrimitiveType.ULong: return "unsigned int"; case PrimitiveType.Int64: return "long long"; case PrimitiveType.UInt64: return "unsigned long long"; case PrimitiveType.Float: return "float"; diff --git a/src/Generator/Generators/CSharp/CSharpMarshal.cs b/src/Generator/Generators/CSharp/CSharpMarshal.cs index 7d0b7e94..4f1bec47 100644 --- a/src/Generator/Generators/CSharp/CSharpMarshal.cs +++ b/src/Generator/Generators/CSharp/CSharpMarshal.cs @@ -193,6 +193,8 @@ namespace CppSharp.Generators.CSharp case PrimitiveType.UInt16: case PrimitiveType.Int32: case PrimitiveType.UInt32: + case PrimitiveType.Long: + case PrimitiveType.ULong: case PrimitiveType.Int64: case PrimitiveType.UInt64: case PrimitiveType.Float: @@ -513,6 +515,8 @@ namespace CppSharp.Generators.CSharp case PrimitiveType.UInt16: case PrimitiveType.Int32: case PrimitiveType.UInt32: + case PrimitiveType.Long: + case PrimitiveType.ULong: case PrimitiveType.Int64: case PrimitiveType.UInt64: case PrimitiveType.Float: @@ -524,7 +528,7 @@ namespace CppSharp.Generators.CSharp return false; } - return false; + throw new NotImplementedException(); } public override bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals) diff --git a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs index d7965d84..c89e8784 100644 --- a/src/Generator/Generators/CSharp/CSharpTypePrinter.cs +++ b/src/Generator/Generators/CSharp/CSharpTypePrinter.cs @@ -392,6 +392,8 @@ namespace CppSharp.Generators.CSharp case PrimitiveType.UInt16: return "ushort"; case PrimitiveType.Int32: return "int"; case PrimitiveType.UInt32: return "uint"; + case PrimitiveType.Long: return "int"; + case PrimitiveType.ULong: return "uint"; case PrimitiveType.Int64: return "long"; case PrimitiveType.UInt64: return "ulong"; case PrimitiveType.Float: return "float"; diff --git a/src/Generator/Types/CppTypePrinter.cs b/src/Generator/Types/CppTypePrinter.cs index 13487332..89b4b505 100644 --- a/src/Generator/Types/CppTypePrinter.cs +++ b/src/Generator/Types/CppTypePrinter.cs @@ -110,6 +110,8 @@ namespace CppSharp.Types case PrimitiveType.UInt16: return "unsigned short"; case PrimitiveType.Int32: return "int"; case PrimitiveType.UInt32: return "unsigned int"; + case PrimitiveType.Long: return "int"; + case PrimitiveType.ULong: return "unsigned int"; case PrimitiveType.Int64: return "long long"; case PrimitiveType.UInt64: return "unsigned long long"; case PrimitiveType.Float: return "float"; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 431f12c4..2614065a 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1341,8 +1341,8 @@ static CppSharp::AST::PrimitiveType WalkBuiltinType(const clang::BuiltinType* Bu case clang::BuiltinType::Int: return PrimitiveType::Int32; case clang::BuiltinType::UInt: return PrimitiveType::UInt32; - case clang::BuiltinType::Long: return PrimitiveType::Int32; - case clang::BuiltinType::ULong: return PrimitiveType::UInt32; + case clang::BuiltinType::Long: return PrimitiveType::Long; + case clang::BuiltinType::ULong: return PrimitiveType::ULong; case clang::BuiltinType::LongLong: return PrimitiveType::Int64; case clang::BuiltinType::ULongLong: return PrimitiveType::UInt64;