Browse Source

Partially (const wchar_t*) support wide strings

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
const-wchar_t
Dimitar Dobrev 5 years ago
parent
commit
09ac12bc48
  1. 22
      src/Generator/Types/Std/Stdlib.cs
  2. 33
      tests/CSharp/CSharp.Tests.cs
  3. 6
      tests/CSharp/CSharp.cpp
  4. 2
      tests/CSharp/CSharp.h

22
src/Generator/Types/Std/Stdlib.cs

@ -149,20 +149,23 @@ namespace CppSharp.Types.Std @@ -149,20 +149,23 @@ namespace CppSharp.Types.Std
if (ctx.Kind == TypePrinterContextKind.Managed)
return new CILType(typeof(string));
if (ctx.Parameter == null || ctx.Parameter.Name == Helpers.ReturnIdentifier)
bool isWStr;
if (ctx.Parameter == null || ctx.Parameter.Name == Helpers.ReturnIdentifier ||
(isWStr = ctx.Parameter.Type.Desugar().IsPointerToPrimitiveType(PrimitiveType.WideChar) &&
Context.TargetInfo.WCharWidth > 16))
{
var typePrinter = new CSharpTypePrinter(Context);
return new CustomType(typePrinter.IntPtrType);
}
if (Context.Options.Encoding == Encoding.Unicode ||
Context.Options.Encoding == Encoding.BigEndianUnicode || isWStr)
return new CustomType("[MarshalAs(UnmanagedType.LPWStr)] string");
if (Context.Options.Encoding == Encoding.ASCII ||
Context.Options.Encoding == Encoding.UTF8)
return new CustomType("[MarshalAs(UnmanagedType.LPUTF8Str)] string");
if (Context.Options.Encoding == Encoding.Unicode ||
Context.Options.Encoding == Encoding.BigEndianUnicode)
return new CustomType("[MarshalAs(UnmanagedType.LPWStr)] string");
throw new System.NotSupportedException(
$"{Context.Options.Encoding.EncodingName} is not supported yet.");
}
@ -170,12 +173,15 @@ namespace CppSharp.Types.Std @@ -170,12 +173,15 @@ namespace CppSharp.Types.Std
public override void CSharpMarshalToNative(CSharpMarshalContext ctx)
{
string param = ctx.Parameter.Name;
Type type = ctx.Parameter.Type.Desugar(resolveTemplateSubstitution: false);
if (ctx.Parameter.Usage == ParameterUsage.Unknown &&
!ctx.Parameter.Type.IsReference() &&
!(ctx.Parameter.Type is TemplateParameterSubstitutionType) &&
!type.IsReference() &&
!(type is TemplateParameterSubstitutionType) &&
ctx.MarshalKind != MarshalKind.NativeField &&
ctx.MarshalKind != MarshalKind.VTableReturnValue &&
ctx.MarshalKind != MarshalKind.Variable)
ctx.MarshalKind != MarshalKind.Variable &&
(!type.IsPointerToPrimitiveType(PrimitiveType.WideChar) ||
Context.TargetInfo.WCharWidth == 16))
{
ctx.Return.Write(param);
return;

33
tests/CSharp/CSharp.Tests.cs

@ -1389,6 +1389,39 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -1389,6 +1389,39 @@ public unsafe class CSharpTests : GeneratorTestFixture
}
}
[Test]
public void TestWideString()
{
var strings = new[] { "ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" +
"ѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩ" +
"ҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽ" +
"ӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓ",
"აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ",
"ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆև",
"々〆〱〲〳〴〵〻〼ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづて" +
"でとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕ" +
"ゖゝゞゟァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニ" +
"ヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ" +
"ーヽヾヿㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ",
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ" +
"ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵ" +
"ĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊ" +
"ƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝ" +
"ǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳ" +
"ȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽ" +
"ḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚ" +
"ẛẞẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹ" +
"ⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱱⱲⱳⱴⱵⱶⱷ" };
foreach (var @string in strings)
{
Assert.That(CSharp.CSharp.TakeReturnWideString(@string), Is.EqualTo(@string));
}
}
[Test]
public void TestImplicitConversionToString()
{

6
tests/CSharp/CSharp.cpp

@ -1693,6 +1693,12 @@ const Foo*& takeReturnReferenceToPointer(const Foo*& foo) @@ -1693,6 +1693,12 @@ const Foo*& takeReturnReferenceToPointer(const Foo*& foo)
return foo;
}
const wchar_t* takeReturnWideString(const wchar_t* wideString)
{
WideString = wideString;
return WideString.data();
}
boolean_t takeTypemapTypedefParam(boolean_t b)
{
return b;

2
tests/CSharp/CSharp.h

@ -1379,6 +1379,8 @@ DLL_API char* takeConstCharRef(const char& c); @@ -1379,6 +1379,8 @@ DLL_API char* takeConstCharRef(const char& c);
DLL_API const char*& takeConstCharStarRef(const char*& c);
DLL_API const void*& rValueReferenceToPointer(void*&& v);
DLL_API const Foo*& takeReturnReferenceToPointer(const Foo*& foo);
DLL_API const wchar_t* takeReturnWideString(const wchar_t* wideString);
DLL_API std::wstring WideString;
struct {
struct {

Loading…
Cancel
Save