diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 30dcb008..5e0f4308 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -934,11 +934,10 @@ bool Parser::IsSupported(const clang::CXXMethodDecl* MD) auto CopyCtor = llvm::dyn_cast(MD); return !c->getSourceManager().isInSystemHeader(MD->getBeginLoc()) || - (CopyCtor && (MD->getNumParams() == 0 || - (CopyCtor->isCopyConstructor() && !CopyCtor->isTrivial()))) || + (isa(MD) && MD->getNumParams() == 0) || isa(MD) || (MD->getDeclName().isIdentifier() && - ((MD->getName() == "c_str" && MD->getNumParams() == 0) || + ((MD->getName() == "data" && MD->getNumParams() == 0) || (MD->getName() == "assign" && MD->getNumParams() == 1 && MD->parameters()[0]->getType()->isPointerType())) && supportedStdTypes.find(MD->getParent()->getName()) != diff --git a/src/Generator/Types/Std/Stdlib.cs b/src/Generator/Types/Std/Stdlib.cs index a18bbc5b..33ed3f58 100644 --- a/src/Generator/Types/Std/Stdlib.cs +++ b/src/Generator/Types/Std/Stdlib.cs @@ -374,27 +374,17 @@ namespace CppSharp.Types.Std { var type = Type.Desugar(resolveTemplateSubstitution: false); ClassTemplateSpecialization basicString = GetBasicString(type); - var c_str = basicString.Methods.First(m => m.OriginalName == "c_str"); + var data = basicString.Methods.First(m => m.OriginalName == "data"); var typePrinter = new CSharpTypePrinter(ctx.Context); string qualifiedBasicString = GetQualifiedBasicString(basicString); string varBasicString = $"__basicStringRet{ctx.ParameterIndex}"; + bool usePointer = type.IsAddress() || ctx.MarshalKind == MarshalKind.NativeField; ctx.Before.WriteLine($@"var {varBasicString} = { basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({ - ctx.ReturnVarName});"); - if (type.IsAddress()) - { - ctx.Return.Write($@"{qualifiedBasicString}Extensions.{c_str.Name}({ - varBasicString})"); - } - else - { - string varString = $"__stringRet{ctx.ParameterIndex}"; - ctx.Before.WriteLine($@"var {varString} = { - qualifiedBasicString}Extensions.{c_str.Name}({varBasicString});"); - ctx.Before.WriteLine($@"{varBasicString}.Dispose({ - (ctx.MarshalKind == MarshalKind.NativeField ? "false" : string.Empty)});"); - ctx.Return.Write(varString); - } + (usePointer ? string.Empty : $"new {typePrinter.IntPtrType}(&")}{ + ctx.ReturnVarName}{(usePointer ? string.Empty : ")")});"); + ctx.Return.Write($@"{qualifiedBasicString}Extensions.{data.Name}({ + varBasicString})"); } private static string GetQualifiedBasicString(ClassTemplateSpecialization basicString)