Skip to content

Commit 6721c65

Browse files
committed
Utilize spans and the AlternateLookup APIs to reduce allocations
1 parent 2f5eb43 commit 6721c65

File tree

9 files changed

+381
-292
lines changed

9 files changed

+381
-292
lines changed

sources/ClangSharp.PInvokeGenerator/CSharp/CSharpOutputBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public void WriteBlockEnd()
8080

8181
public void Write<T>(T value) => _ = _currentLine.Append(value);
8282

83+
public void Write(ReadOnlySpan<char> value) => _ = _currentLine.Append(value);
84+
8385
public void WriteIndentation()
8486
{
8587
WriteNewlineIfNeeded();

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,7 +1116,7 @@ private void VisitIndirectFieldDecl(IndirectFieldDecl indirectFieldDecl)
11161116

11171117
if (arraySize == 1)
11181118
{
1119-
if (TryGetRemappedValue(indirectFieldDecl, _config.WithLengths, out var length))
1119+
if (TryGetRemappedValue(indirectFieldDecl, _config._withLengths, out var length))
11201120
{
11211121
code.Write(length);
11221122
}
@@ -1510,7 +1510,7 @@ private void VisitRecordDecl(RecordDecl recordDecl)
15101510
baseTypeNames = [.. baseTypeNamesBuilder];
15111511
}
15121512

1513-
if (!TryGetRemappedValue(recordDecl, _config.WithPackings, out var pack))
1513+
if (!TryGetRemappedValue(recordDecl, _config._withPackings, out var pack))
15141514
{
15151515
pack = alignment < maxAlignm ? alignment.ToString(CultureInfo.InvariantCulture) : null;
15161516
}
@@ -3310,7 +3310,7 @@ void ForUnderlyingType(TypedefDecl typedefDecl, Type underlyingType, bool onlyHa
33103310
{
33113311
if (!_allValidNameRemappings.TryGetValue(underlyingName, out var allRemappings))
33123312
{
3313-
allRemappings = new HashSet<string>(StringComparer.Ordinal);
3313+
allRemappings = new HashSet<string>(QualifiedNameComparer.Default);
33143314
_allValidNameRemappings[underlyingName] = allRemappings;
33153315
}
33163316
_ = allRemappings.Add(typedefName);
@@ -3320,7 +3320,7 @@ void ForUnderlyingType(TypedefDecl typedefDecl, Type underlyingType, bool onlyHa
33203320
{
33213321
if (!_traversedValidNameRemappings.TryGetValue(underlyingName, out var traversedRemappings))
33223322
{
3323-
traversedRemappings = new HashSet<string>(StringComparer.Ordinal);
3323+
traversedRemappings = new HashSet<string>(QualifiedNameComparer.Default);
33243324
_traversedValidNameRemappings[underlyingName] = traversedRemappings;
33253325
}
33263326
_ = traversedRemappings.Add(typedefName);

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ private void VisitCXXOperatorCallExpr(CXXOperatorCallExpr cxxOperatorCallExpr)
751751
{
752752
Visit(args[0]);
753753
outputBuilder.Write(' ');
754-
outputBuilder.Write(functionDeclName[8..]);
754+
outputBuilder.Write(functionDeclName.AsSpan()[8..]);
755755
outputBuilder.Write(' ');
756756
Visit(args[1]);
757757
StopCSharpCode();
@@ -760,7 +760,7 @@ private void VisitCXXOperatorCallExpr(CXXOperatorCallExpr cxxOperatorCallExpr)
760760

761761
case "operator~":
762762
{
763-
outputBuilder.Write(functionDeclName[8..]);
763+
outputBuilder.Write(functionDeclName.AsSpan()[8..]);
764764
Visit(args[0]);
765765
StopCSharpCode();
766766
return;
@@ -1108,7 +1108,7 @@ private void VisitFloatingLiteral(FloatingLiteral floatingLiteral)
11081108
var outputBuilder = StartCSharpCode();
11091109
if (floatingLiteral.ValueString.EndsWith(".f", StringComparison.Ordinal))
11101110
{
1111-
outputBuilder.Write(floatingLiteral.ValueString[0..^1]);
1111+
outputBuilder.Write(floatingLiteral.ValueString.AsSpan()[..^1]);
11121112
outputBuilder.Write("0f");
11131113
}
11141114
else
@@ -1901,67 +1901,76 @@ void HandleUnmanagedConstant(CSharpOutputBuilder outputBuilder, InitListExpr ini
19011901

19021902
private void VisitIntegerLiteral(IntegerLiteral integerLiteral)
19031903
{
1904-
var valueString = integerLiteral.ValueString;
1904+
var valueString = integerLiteral.ValueString.AsSpan();
1905+
var valueSuffix = "";
19051906

19061907
if (valueString.EndsWith("ui8", StringComparison.OrdinalIgnoreCase))
19071908
{
1908-
valueString = valueString[0..^3];
1909+
valueString = valueString[..^3];
19091910
}
19101911
else if (valueString.EndsWith("i8", StringComparison.OrdinalIgnoreCase))
19111912
{
1912-
valueString = valueString[0..^2];
1913+
valueString = valueString[..^2];
19131914
}
19141915
else if (valueString.EndsWith("ui16", StringComparison.OrdinalIgnoreCase))
19151916
{
1916-
valueString = valueString[0..^4];
1917+
valueString = valueString[..^4];
19171918
}
19181919
else if (valueString.EndsWith("i16", StringComparison.OrdinalIgnoreCase))
19191920
{
1920-
valueString = valueString[0..^3];
1921+
valueString = valueString[..^3];
19211922
}
19221923
else if (valueString.EndsWith("ui32", StringComparison.OrdinalIgnoreCase))
19231924
{
1924-
valueString = valueString[0..^4] + "U";
1925+
valueString = valueString[..^4];
1926+
valueSuffix = "U";
19251927
}
19261928
else if (valueString.EndsWith("i32", StringComparison.OrdinalIgnoreCase))
19271929
{
1928-
valueString = valueString[0..^3];
1930+
valueString = valueString[..^3];
19291931
}
19301932
else if (valueString.EndsWith("ui64", StringComparison.OrdinalIgnoreCase))
19311933
{
1932-
valueString = valueString[0..^4] + "UL";
1934+
valueString = valueString[..^4];
1935+
valueSuffix = "UL";
19331936
}
19341937
else if (valueString.EndsWith("i64", StringComparison.OrdinalIgnoreCase))
19351938
{
1936-
valueString = valueString[0..^3] + "L";
1939+
valueString = valueString[..^3];
1940+
valueSuffix = "L";
19371941
}
19381942
else if (
19391943
valueString.EndsWith("ull", StringComparison.OrdinalIgnoreCase) ||
19401944
valueString.EndsWith("llu", StringComparison.OrdinalIgnoreCase))
19411945
{
1942-
valueString = valueString[0..^3] + "UL";
1946+
valueString = valueString[..^3];
1947+
valueSuffix = "UL";
19431948
}
19441949
else if (valueString.EndsWith("ll", StringComparison.OrdinalIgnoreCase))
19451950
{
1946-
valueString = valueString[0..^2] + "L";
1951+
valueString = valueString[..^2];
1952+
valueSuffix = "L";
19471953
}
19481954
else if (
19491955
valueString.EndsWith("ul", StringComparison.OrdinalIgnoreCase) ||
19501956
valueString.EndsWith("lu", StringComparison.OrdinalIgnoreCase))
19511957
{
1952-
valueString = valueString[0..^2] + "U";
1958+
valueString = valueString[..^2];
1959+
valueSuffix = "U";
19531960
}
19541961
else if (valueString.EndsWith('u') || valueString.EndsWith('U'))
19551962
{
1956-
valueString = valueString[0..^1] + "U";
1963+
valueString = valueString[..^1];
1964+
valueSuffix = "U";
19571965
}
19581966
else if (valueString.EndsWith('l') || valueString.EndsWith('L'))
19591967
{
1960-
valueString = valueString[0..^1];
1968+
valueString = valueString[..^1];
19611969
}
19621970

19631971
var outputBuilder = StartCSharpCode();
19641972
outputBuilder.Write(valueString);
1973+
outputBuilder.Write(valueSuffix);
19651974
StopCSharpCode();
19661975
}
19671976

@@ -2944,12 +2953,12 @@ private void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr unaryExprOrT
29442953
{
29452954
if ((parentType.Handle.SizeOf == 8) && IsPrevContextDecl<VarDecl>(out var varDecl, out _))
29462955
{
2947-
var cursorName = GetCursorName(varDecl);
2956+
var cursorName = GetCursorName(varDecl).AsSpan();
29482957

29492958
if (cursorName.StartsWith("ClangSharpMacro_", StringComparison.Ordinal))
29502959
{
29512960
cursorName = cursorName["ClangSharpMacro_".Length..];
2952-
parentTypeIsVariableSized |= _config.WithTypes.TryGetValue(cursorName, out var remappedTypeName) && (remappedTypeName.Equals("int", StringComparison.Ordinal) || remappedTypeName.Equals("uint", StringComparison.Ordinal));
2961+
parentTypeIsVariableSized |= _config._withTypes.GetAlternateLookup<ReadOnlySpan<char>>().TryGetValue(cursorName, out var remappedTypeName) && (remappedTypeName.Equals("int", StringComparison.Ordinal) || remappedTypeName.Equals("uint", StringComparison.Ordinal));
29532962
}
29542963
}
29552964

0 commit comments

Comments
 (0)