Skip to content

Commit 41b2276

Browse files
ddobrevtritao
authored andcommitted
Fixed the marshalling of std::string with GCC 6+ on Linux.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 43bb2ee commit 41b2276

File tree

22 files changed

+46319
-46782
lines changed

22 files changed

+46319
-46782
lines changed

src/CppParser/Bindings/CLI/CppParser.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ namespace CppSharp
281281

282282
void ClearSupportedStdTypes();
283283

284-
protected:
284+
protected:
285285
bool __ownsNativeInstance;
286286
};
287287

@@ -334,7 +334,7 @@ namespace CppSharp
334334
void set(int);
335335
}
336336

337-
protected:
337+
protected:
338338
bool __ownsNativeInstance;
339339
};
340340

@@ -392,7 +392,7 @@ namespace CppSharp
392392

393393
void ClearDiagnostics();
394394

395-
protected:
395+
protected:
396396
bool __ownsNativeInstance;
397397
};
398398

@@ -419,7 +419,7 @@ namespace CppSharp
419419

420420
static CppSharp::Parser::ParserResult^ ParseLibrary(CppSharp::Parser::CppParserOptions^ Opts);
421421

422-
protected:
422+
protected:
423423
bool __ownsNativeInstance;
424424
};
425425
}

src/CppParser/Bindings/CLI/Sources.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace CppSharp
3737

3838
static operator CppSharp::Parser::SourceLocation(unsigned int ID);
3939

40-
private:
40+
private:
4141
unsigned int __ID;
4242
};
4343
}

src/CppParser/Bindings/CLI/Target.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ namespace CppSharp
302302
void set(unsigned int);
303303
}
304304

305-
protected:
305+
protected:
306306
bool __ownsNativeInstance;
307307
};
308308
}

src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/CppSharp.CppParser.cs

Lines changed: 7694 additions & 7777 deletions
Large diffs are not rendered by default.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <string>
22

33

4-
template __attribute__((visibility("default"))) std::allocator<char>::allocator() noexcept;
5-
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type*, const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::allocator_type&);
4+
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::basic_string();
65
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string() noexcept;
6+
template __attribute__((visibility("default"))) std::basic_string<char, std::char_traits<char>, std::allocator<char>>& std::basic_string<char, std::char_traits<char>, std::allocator<char>>::assign(const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type*);
77
template __attribute__((visibility("default"))) const std::basic_string<char, std::char_traits<char>, std::allocator<char>>::value_type* std::basic_string<char, std::char_traits<char>, std::allocator<char>>::c_str() const noexcept;

src/CppParser/Bindings/CSharp/i686-apple-darwin12.4.0/Std.cs

Lines changed: 69 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,6 @@ namespace Allocator
5050
[StructLayout(LayoutKind.Explicit, Size = 0)]
5151
public unsafe partial struct __Internal
5252
{
53-
[SuppressUnmanagedCodeSecurity]
54-
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
55-
EntryPoint="_ZNSt3__19allocatorIcEC2Ev")]
56-
internal static extern void ctorc__N_std_N___1_S_allocator__C(global::System.IntPtr instance);
5753
}
5854
}
5955

@@ -98,20 +94,6 @@ protected Allocator(void* native, bool skipVTables = false)
9894
__Instance = new global::System.IntPtr(native);
9995
}
10096

101-
public Allocator()
102-
{
103-
var ___Tp = typeof(_Tp);
104-
if (___Tp.IsAssignableFrom(typeof(sbyte)))
105-
{
106-
__Instance = Marshal.AllocHGlobal(sizeof(global::Std.Allocator.__Internal));
107-
__ownsNativeInstance = true;
108-
NativeToManagedMap[__Instance] = this;
109-
global::Std.Allocator.__Internal.ctorc__N_std_N___1_S_allocator__C((__Instance + __PointerAdjustment));
110-
return;
111-
}
112-
throw new ArgumentOutOfRangeException("_Tp", string.Join(", ", new[] { typeof(_Tp).FullName }), "global::Std.Allocator<_Tp> maps a C++ template class and therefore it only supports a limited set of types and their subclasses: <sbyte>.");
113-
}
114-
11597
public void Dispose()
11698
{
11799
Dispose(disposing: true);
@@ -661,47 +643,6 @@ public unsafe partial struct __Internalc__N_std_N___1_S_map____N_std_N___1_S_bas
661643

662644
namespace Std
663645
{
664-
public unsafe static partial class BasicStringExtensions
665-
{
666-
[StructLayout(LayoutKind.Explicit, Size = 0)]
667-
public partial struct __Internal
668-
{
669-
[SuppressUnmanagedCodeSecurity]
670-
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
671-
EntryPoint="_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EPKcRKS4_")]
672-
internal static extern global::System.IntPtr BasicString(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string __s, global::System.IntPtr __a);
673-
674-
[SuppressUnmanagedCodeSecurity]
675-
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
676-
EntryPoint="_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv")]
677-
internal static extern global::System.IntPtr CStr(global::System.IntPtr instance);
678-
}
679-
680-
public static global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> BasicString(string __s, global::Std.Allocator<sbyte> __a)
681-
{
682-
if (ReferenceEquals(__a, null))
683-
throw new global::System.ArgumentNullException("__a", "Cannot be null because it is a C++ reference (&).");
684-
var __arg1 = __a.__Instance;
685-
if (ReferenceEquals(__s, null))
686-
throw new global::System.ArgumentNullException(__s, "The underlying std::string cannot take null.");
687-
var __ret = Marshal.AllocHGlobal(12);
688-
__Internal.BasicString(__ret, __s, __arg1);
689-
global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> __result0;
690-
if (__ret == IntPtr.Zero) __result0 = null;
691-
else if (global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.NativeToManagedMap.ContainsKey(__ret))
692-
__result0 = (global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>) global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.NativeToManagedMap[__ret];
693-
else __result0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(__ret);
694-
return __result0;
695-
}
696-
697-
public static string CStr(this global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> @this)
698-
{
699-
var __arg0 = ReferenceEquals(@this, null) ? global::System.IntPtr.Zero : @this.__Instance;
700-
var __ret = __Internal.CStr(__arg0);
701-
return Marshal.PtrToStringAnsi(__ret);
702-
}
703-
}
704-
705646
namespace BasicString
706647
{
707648
[StructLayout(LayoutKind.Explicit, Size = 12)]
@@ -710,6 +651,11 @@ public unsafe partial struct __Internalc__N_std_N___1_S_basic_string__C___N_std_
710651
[FieldOffset(0)]
711652
internal global::Std.CompressedPair.__Internal __r_;
712653

654+
[SuppressUnmanagedCodeSecurity]
655+
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
656+
EntryPoint="_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev")]
657+
internal static extern void ctorc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C(global::System.IntPtr instance);
658+
713659
[SuppressUnmanagedCodeSecurity]
714660
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
715661
EntryPoint="_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev")]
@@ -847,6 +793,22 @@ protected BasicString(void* native, bool skipVTables = false)
847793
__Instance = new global::System.IntPtr(native);
848794
}
849795

796+
public BasicString()
797+
{
798+
var ___CharT = typeof(_CharT);
799+
var ___Traits = typeof(_Traits);
800+
var ___Allocator = typeof(_Allocator);
801+
if (___CharT.IsAssignableFrom(typeof(sbyte)) && ___Traits.IsAssignableFrom(typeof(global::Std.CharTraits<sbyte>)) && ___Allocator.IsAssignableFrom(typeof(global::Std.Allocator<sbyte>)))
802+
{
803+
__Instance = Marshal.AllocHGlobal(sizeof(global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C));
804+
__ownsNativeInstance = true;
805+
NativeToManagedMap[__Instance] = this;
806+
global::Std.BasicString.__Internalc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C.ctorc__N_std_N___1_S_basic_string__C___N_std_N___1_S_char_traits__C___N_std_N___1_S_allocator__C((__Instance + __PointerAdjustment));
807+
return;
808+
}
809+
throw new ArgumentOutOfRangeException("_CharT, _Traits, _Allocator", string.Join(", ", new[] { typeof(_CharT).FullName, typeof(_Traits).FullName, typeof(_Allocator).FullName }), "global::Std.BasicString<_CharT, _Traits, _Allocator> maps a C++ template class and therefore it only supports a limited set of types and their subclasses: <sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.");
810+
}
811+
850812
public void Dispose()
851813
{
852814
Dispose(disposing: true);
@@ -874,6 +836,18 @@ public virtual void Dispose(bool disposing)
874836
Marshal.FreeHGlobal(__Instance);
875837
__Instance = IntPtr.Zero;
876838
}
839+
840+
public global::Std.BasicString<_CharT, _Traits, _Allocator> Assign(global::Std.BasicString<_CharT, _Traits, _Allocator> str)
841+
{
842+
var ___CharT = typeof(_CharT);
843+
var ___Traits = typeof(_Traits);
844+
var ___Allocator = typeof(_Allocator);
845+
if (___CharT.IsAssignableFrom(typeof(sbyte)) && ___Traits.IsAssignableFrom(typeof(global::Std.CharTraits<sbyte>)) && ___Allocator.IsAssignableFrom(typeof(global::Std.Allocator<sbyte>)))
846+
{
847+
throw new MissingMethodException("Method Assign ignored in specialization global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.");
848+
}
849+
throw new ArgumentOutOfRangeException("_CharT, _Traits, _Allocator", string.Join(", ", new[] { typeof(_CharT).FullName, typeof(_Traits).FullName, typeof(_Allocator).FullName }), "global::Std.BasicString<_CharT, _Traits, _Allocator> maps a C++ template class and therefore it only supports a limited set of types and their subclasses: <sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.");
850+
}
877851
}
878852

879853
namespace CharTraits
@@ -941,4 +915,40 @@ public virtual void Dispose(bool disposing)
941915
__Instance = IntPtr.Zero;
942916
}
943917
}
918+
919+
public unsafe static partial class BasicStringExtensions
920+
{
921+
[StructLayout(LayoutKind.Explicit, Size = 0)]
922+
public partial struct __Internal
923+
{
924+
[SuppressUnmanagedCodeSecurity]
925+
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
926+
EntryPoint="_ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc")]
927+
internal static extern global::System.IntPtr Assign(global::System.IntPtr instance, [MarshalAs(UnmanagedType.LPStr)] string __s);
928+
929+
[SuppressUnmanagedCodeSecurity]
930+
[DllImport("Std-symbols", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
931+
EntryPoint="_ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv")]
932+
internal static extern global::System.IntPtr CStr(global::System.IntPtr instance);
933+
}
934+
935+
public static global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> Assign(this global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> @this, string __s)
936+
{
937+
var __arg0 = ReferenceEquals(@this, null) ? global::System.IntPtr.Zero : @this.__Instance;
938+
var __ret = __Internal.Assign(__arg0, __s);
939+
global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> __result0;
940+
if (__ret == IntPtr.Zero) __result0 = null;
941+
else if (global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.NativeToManagedMap.ContainsKey(__ret))
942+
__result0 = (global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>) global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.NativeToManagedMap[__ret];
943+
else __result0 = global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>>.__CreateInstance(__ret);
944+
return __result0;
945+
}
946+
947+
public static string CStr(this global::Std.BasicString<sbyte, global::Std.CharTraits<sbyte>, global::Std.Allocator<sbyte>> @this)
948+
{
949+
var __arg0 = ReferenceEquals(@this, null) ? global::System.IntPtr.Zero : @this.__Instance;
950+
var __ret = __Internal.CStr(__arg0);
951+
return Marshal.PtrToStringAnsi(__ret);
952+
}
953+
}
944954
}

0 commit comments

Comments
 (0)