Skip to content

Commit cbd0313

Browse files
chore(generator): guard memorymarshal helpers for unity
Wrap MemoryMarshal.GetArrayDataReference usage behind UNITY_2020_2_OR_NEWER so older Unity runtimes fall back to array indexing. Co-authored-by: OpenAI Codex <codex@openai.com>
1 parent 7f93c22 commit cbd0313

3 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/Nino.Core/TypeCollector.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,16 @@ public class ListView<T>
3939
[SuppressMessage("ReSharper", "InconsistentNaming")]
4040
public class DictionaryView<TKey, TValue>
4141
{
42-
public int[]? _buckets; // Do not rename (binary serialization)
43-
public Entry[]? _entries; // Do not rename (binary serialization)
42+
public int[] _buckets; // Do not rename (binary serialization)
43+
public Entry[] _entries; // Do not rename (binary serialization)
4444
public int _count; // Do not rename (binary serialization)
4545
public int _version; // Do not rename (binary serialization)
4646
public int _freeList; // Do not rename (binary serialization)
4747
public int _freeCount; // Do not rename (binary serialization)
48-
public IEqualityComparer<TKey>? _comparer; // Do not rename (binary serialization)
49-
public Dictionary<TKey, TValue>.KeyCollection? _keys; // Do not rename (binary serialization)
50-
public Dictionary<TKey, TValue>.ValueCollection? _values; // Do not rename (binary serialization)
51-
public object? _syncRoot; // Do not rename (binary serialization)
48+
public IEqualityComparer<TKey> _comparer; // Do not rename (binary serialization)
49+
public Dictionary<TKey, TValue>.KeyCollection _keys; // Do not rename (binary serialization)
50+
public Dictionary<TKey, TValue>.ValueCollection _values; // Do not rename (binary serialization)
51+
public object _syncRoot; // Do not rename (binary serialization)
5252

5353
[SuppressMessage("ReSharper", "InconsistentNaming")]
5454
public struct Entry

src/Nino.Generator/BuiltInType/ArrayGenerator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,15 @@ protected override void GenerateSerializer(ITypeSymbol typeSymbol, Writer writer
8282
writer.AppendLine(" int cnt = value.Length;");
8383
writer.AppendLine(" writer.Write(TypeCollector.GetCollectionHeader(cnt));");
8484
writer.AppendLine();
85-
writer.AppendLine($" ref var cur = ref System.Runtime.InteropServices.MemoryMarshal.GetArrayDataReference(value);");
85+
writer.AppendLine("#if !UNITY_2020_2_OR_NEWER");
86+
writer.AppendLine(" ref var cur = ref System.Runtime.InteropServices.MemoryMarshal.GetArrayDataReference(value);");
87+
writer.AppendLine("#else");
88+
writer.AppendLine(" if (cnt == 0)");
89+
writer.AppendLine(" {");
90+
writer.AppendLine(" return;");
91+
writer.AppendLine(" }");
92+
writer.AppendLine(" ref var cur = ref value[0];");
93+
writer.AppendLine("#endif");
8694
writer.AppendLine(" ref var end = ref System.Runtime.CompilerServices.Unsafe.Add(ref cur, cnt);");
8795
writer.AppendLine(" while (!System.Runtime.CompilerServices.Unsafe.AreSame(ref cur, ref end))");
8896
writer.AppendLine(" {");

src/Nino.Generator/BuiltInType/DictionaryGenerator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,16 @@ protected override void GenerateSerializer(ITypeSymbol typeSymbol, Writer writer
109109
writer.AppendLine(" return;");
110110
writer.AppendLine(" }");
111111
writer.AppendLine(" int count = dict._count;");
112+
writer.AppendLine(" if (count == 0)");
113+
writer.AppendLine(" {");
114+
writer.AppendLine(" return;");
115+
writer.AppendLine(" }");
112116
writer.AppendLine(" // Iterate entries via direct ref to avoid bounds checks");
117+
writer.AppendLine("#if !UNITY_2020_2_OR_NEWER");
113118
writer.AppendLine(" ref var entryRef = ref System.Runtime.InteropServices.MemoryMarshal.GetArrayDataReference(entries);");
119+
writer.AppendLine("#else");
120+
writer.AppendLine(" ref var entryRef = ref entries[0];");
121+
writer.AppendLine("#endif");
114122
writer.AppendLine(" int index = 0;");
115123
writer.AppendLine(" while ((uint)index < (uint)count)");
116124
writer.AppendLine(" {");

0 commit comments

Comments
 (0)