Skip to content

Commit

Permalink
Array shouldn't expose memory slices non-simple targets
Browse files Browse the repository at this point in the history
Things that have different types for getters/setters cause covariance issues with spans/slices
  • Loading branch information
Noggog committed Oct 12, 2024
1 parent b69baaa commit 96b24c3
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<ImplicitUsings>true</ImplicitUsings>
<VersionPrefix>2.64.1</VersionPrefix>
<VersionPrefix>2.66</VersionPrefix>
</PropertyGroup>

</Project>
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<ItemGroup>
<PackageVersion Include="Noggog.CSharpExt" Version="2.65.1-nightly-20240911-092507" />
<PackageVersion Include="Noggog.CSharpExt" Version="2.65.1-nightly-20241010-092782" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
Expand Down
34 changes: 30 additions & 4 deletions Loqui.Generation/Fields/ArrayType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,26 @@ public class ArrayType : ListType
public override bool HasDefault => true;
public override string TypeName(bool getter, bool needsCovariance = false)
{
var itemTypeName = ItemTypeName(getter);
if (getter)
{
return $"ReadOnlyMemorySlice<{ItemTypeName(getter)}>";
if (SimpleTarget)
{
return $"ReadOnlyMemorySlice<{itemTypeName}>";
}
else
{
return $"IReadOnlyList<{itemTypeName}>";
}
}
else
{
return $"{ItemTypeName(getter)}[]";
return $"{itemTypeName}[]";
}
}

public int? FixedSize;
public bool SimpleTarget => ItemTypeName(getter: false) == ItemTypeName(getter: true);

public override async Task Load(XElement node, bool requireName = true)
{
Expand Down Expand Up @@ -54,7 +63,7 @@ protected override string GetActualItemClass(bool ctor = false)
}
else
{
return $"Array.Empty{SubTypeGeneration.TypeName(getter: false, needsCovariance: true)}()";
return "[]";
}
}

Expand All @@ -67,7 +76,14 @@ public override string ListTypeName(bool getter, bool internalInterface)
}
if (getter)
{
return $"ReadOnlyMemorySlice<{itemTypeName}>";
if (SimpleTarget)
{
return $"ReadOnlyMemorySlice<{itemTypeName}>";
}
else
{
return $"IReadOnlyList<{itemTypeName}>";
}
}
else
{
Expand Down Expand Up @@ -116,6 +132,11 @@ public override void GenerateClear(StructuredStringBuilder sb, Accessor accessor

public override void GenerateForEquals(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, Accessor maskAccessor)
{
if (!SimpleTarget)
{
base.GenerateForEquals(sb, accessor, rhsAccessor, maskAccessor);
return;
}
sb.AppendLine($"if ({GetTranslationIfAccessor(maskAccessor)})");
using (sb.CurlyBrace())
{
Expand All @@ -136,6 +157,11 @@ public override void GenerateForEquals(StructuredStringBuilder sb, Accessor acce

public override void GenerateForEqualsMask(StructuredStringBuilder sb, Accessor accessor, Accessor rhsAccessor, string retAccessor)
{
if (!SimpleTarget)
{
base.GenerateForEqualsMask(sb, accessor, rhsAccessor, retAccessor);
return;
}
string funcStr;
var loqui = SubTypeGeneration as LoquiType;
if (loqui != null)
Expand Down

0 comments on commit 96b24c3

Please sign in to comment.