Skip to content

Commit 4d3e1cc

Browse files
committed
check in assembly, add example, instrument for debugging
1 parent c61ffce commit 4d3e1cc

File tree

4 files changed

+50
-10
lines changed

4 files changed

+50
-10
lines changed

Common.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<AnalysisModeReliability>Recommended</AnalysisModeReliability>
77
<AnalysisModePerformance>Recommended</AnalysisModePerformance>
88
<AnalysisModeUsage>Recommended</AnalysisModeUsage>
9-
<EmitCompilerGeneratedFiles>false</EmitCompilerGeneratedFiles> <!-- enable to copy Roslyn Source Generators' outputs to $(ProjectDir)/obj/.../generated -->
9+
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <!-- enable to copy Roslyn Source Generators' outputs to $(ProjectDir)/obj/.../generated -->
1010
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
1111
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
1212
<ContinuousIntegrationBuild Condition=" '$(GITLAB_CI)' != '' Or '$(APPVEYOR)' != '' ">true</ContinuousIntegrationBuild>

ExternalProjects/BizHawk.SrcGen.InlineArray/InlineArrayGenerator.cs

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,52 @@ file readonly struct UnmanagedWidthCalculator()
7979

8080
private readonly WidthResultCache _cache = new();
8181

82-
private WidthResult Calc(ITypeSymbol typeSym)
82+
private WidthResult Calc(ITypeSymbol typeSym, StringBuilder log)
8383
{
8484
if (_cache[typeSym] is WidthResult cached) return cached;
85-
if (!typeSym.IsValueType) return _cache.Add(typeSym, INVALID);
86-
if (typeSym.WidthAsPrimitive() is WidthResult primitive) return _cache.Add(typeSym, primitive);
85+
if (!typeSym.IsValueType)
86+
{
87+
log.Append($";{typeSym.Name} is reference type");
88+
return _cache.Add(typeSym, INVALID);
89+
}
90+
if (typeSym.WidthAsPrimitive() is WidthResult primitive)
91+
{
92+
log.Append($";{typeSym.Name} is primitive {primitive.WidthBytesExpr}");
93+
return _cache.Add(typeSym, primitive);
94+
}
8795
var fields = typeSym.GetInstanceFields().ToArray();
88-
if (fields.Length <= 1) return _cache.Add(typeSym, fields.Length is 0 ? INVALID : Calc(fields[0].Type));
96+
if (fields.Length <= 1)
97+
{
98+
if (fields.Length is 0)
99+
{
100+
log.Append($";{typeSym.Name} has no fields?");
101+
return _cache.Add(typeSym, INVALID);
102+
}
103+
else
104+
{
105+
var single = Calc(fields[0].Type, log);
106+
log.Append($";{typeSym.Name} has single field {single.WidthBytesExpr}");
107+
return _cache.Add(typeSym, single);
108+
}
109+
}
89110
var totalWidth = 0;
90111
foreach (var field in fields)
91112
{
92-
var result = Calc(field.Type);
93-
if (result.WidthBytes < 0) return _cache.Add(typeSym, result);
113+
var result = Calc(field.Type, log);
114+
if (result.WidthBytes < 0)
115+
{
116+
log.Append($";{typeSym.Name} has invalid field");
117+
return _cache.Add(typeSym, result);
118+
}
94119
totalWidth += result.WidthBytes;
95120
}
121+
log.Append($";{typeSym.Name} totals {totalWidth}");
96122
return _cache.Add(typeSym, (null, totalWidth));
97123
}
98124

99-
public string For(ITypeSymbol typeSym)
125+
public string For(ITypeSymbol typeSym, StringBuilder log)
100126
{
101-
var (widthBytesExpr, widthBytes) = Calc(typeSym);
127+
var (widthBytesExpr, widthBytes) = Calc(typeSym, log);
102128
return widthBytesExpr is null ? widthBytes.ToString() : widthBytesExpr;
103129
}
104130
}
@@ -179,7 +205,9 @@ public void Execute(
179205
var isROStruct = sym.IsReadOnly;
180206
var structName = sym.Name;
181207
var elemTypeName = elem0Sym.Type.GetCSharpKeywordOrName();
182-
sb.Append($"\n{indent}[StructLayout(LayoutKind.Sequential, Size = ELEM_COUNT * {sizeCalc.For(elem0Sym.Type)})]\n{
208+
StringBuilder log = new();
209+
var widthExpr = sizeCalc.For(elem0Sym.Type, log);
210+
sb.Append($"\n/*{log}*/\n{indent}[StructLayout(LayoutKind.Sequential, Size = ELEM_COUNT * {widthExpr})]\n{
183211
indent}[UnsafeValueType]\n{
184212
indent}{sym.GetAccessModifierKeyword()} {(isROStruct ? "readonly partial struct" : "partial struct")} {structName}\n{
185213
indent}{{\n");
36.5 KB
Binary file not shown.

src/BizHawk.Common/Util.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@
1313

1414
namespace BizHawk.Common
1515
{
16+
[InlineArray1(10)]
17+
public readonly partial struct TestROStruct
18+
{
19+
private readonly Guid _element0;
20+
}
21+
22+
[InlineArray1(10)]
23+
public partial struct TestRWStruct
24+
{
25+
private int _element0;
26+
}
27+
1628
public static class Util
1729
{
1830
[Conditional("DEBUG")]

0 commit comments

Comments
 (0)