Skip to content

Commit 6e963c1

Browse files
committed
Remove useless creation of managed std::strings
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 739858f commit 6e963c1

File tree

2 files changed

+8
-19
lines changed

2 files changed

+8
-19
lines changed

src/CppParser/Parser.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -934,11 +934,10 @@ bool Parser::IsSupported(const clang::CXXMethodDecl* MD)
934934
auto CopyCtor = llvm::dyn_cast<CXXConstructorDecl>(MD);
935935

936936
return !c->getSourceManager().isInSystemHeader(MD->getBeginLoc()) ||
937-
(CopyCtor && (MD->getNumParams() == 0 ||
938-
(CopyCtor->isCopyConstructor() && !CopyCtor->isTrivial()))) ||
937+
(isa<CXXConstructorDecl>(MD) && MD->getNumParams() == 0) ||
939938
isa<CXXDestructorDecl>(MD) ||
940939
(MD->getDeclName().isIdentifier() &&
941-
((MD->getName() == "c_str" && MD->getNumParams() == 0) ||
940+
((MD->getName() == "data" && MD->getNumParams() == 0) ||
942941
(MD->getName() == "assign" && MD->getNumParams() == 1 &&
943942
MD->parameters()[0]->getType()->isPointerType())) &&
944943
supportedStdTypes.find(MD->getParent()->getName()) !=

src/Generator/Types/Std/Stdlib.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -374,27 +374,17 @@ public override void CSharpMarshalToManaged(CSharpMarshalContext ctx)
374374
{
375375
var type = Type.Desugar(resolveTemplateSubstitution: false);
376376
ClassTemplateSpecialization basicString = GetBasicString(type);
377-
var c_str = basicString.Methods.First(m => m.OriginalName == "c_str");
377+
var data = basicString.Methods.First(m => m.OriginalName == "data");
378378
var typePrinter = new CSharpTypePrinter(ctx.Context);
379379
string qualifiedBasicString = GetQualifiedBasicString(basicString);
380380
string varBasicString = $"__basicStringRet{ctx.ParameterIndex}";
381+
bool usePointer = type.IsAddress() || ctx.MarshalKind == MarshalKind.NativeField;
381382
ctx.Before.WriteLine($@"var {varBasicString} = {
382383
basicString.Visit(typePrinter)}.{Helpers.CreateInstanceIdentifier}({
383-
ctx.ReturnVarName});");
384-
if (type.IsAddress())
385-
{
386-
ctx.Return.Write($@"{qualifiedBasicString}Extensions.{c_str.Name}({
387-
varBasicString})");
388-
}
389-
else
390-
{
391-
string varString = $"__stringRet{ctx.ParameterIndex}";
392-
ctx.Before.WriteLine($@"var {varString} = {
393-
qualifiedBasicString}Extensions.{c_str.Name}({varBasicString});");
394-
ctx.Before.WriteLine($@"{varBasicString}.Dispose({
395-
(ctx.MarshalKind == MarshalKind.NativeField ? "false" : string.Empty)});");
396-
ctx.Return.Write(varString);
397-
}
384+
(usePointer ? string.Empty : $"new {typePrinter.IntPtrType}(&")}{
385+
ctx.ReturnVarName}{(usePointer ? string.Empty : ")")});");
386+
ctx.Return.Write($@"{qualifiedBasicString}Extensions.{data.Name}({
387+
varBasicString})");
398388
}
399389

400390
private static string GetQualifiedBasicString(ClassTemplateSpecialization basicString)

0 commit comments

Comments
 (0)