Skip to content

Commit 4b66de4

Browse files
author
Vyacheslav
committed
feat: Extra byte for null marker #38
1 parent d13dd2b commit 4b66de4

File tree

5 files changed

+249
-74
lines changed

5 files changed

+249
-74
lines changed

Src/StackMemoryCollections/GenerateHelpers.cs

Lines changed: 143 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.CodeAnalysis;
22
using System;
33
using System.Collections.Generic;
4+
using System.IO;
45
using System.Linq;
56
using System.Text;
67

@@ -45,7 +46,7 @@ in StringBuilder builder
4546
}
4647
else
4748
{
48-
GenerateGetСompositeValue(in builder, in memberInfo);
49+
GenerateGetСompositeValue(in builder, in memberInfo, in currentType);
4950
GenerateSetСompositeValueFrom(in builder, in memberInfo, in currentType);
5051
}
5152
}
@@ -89,7 +90,7 @@ in TypeInfo typeInfo
8990
builder.Append($@"
9091
public static nuint GetSize()
9192
{{
92-
return {typeInfo.Members.Sum(s => s.Size)};
93+
return {typeInfo.Members.Sum(s => s.Size) + (typeInfo.IsValueType ? 0 : 1)};
9394
}}
9495
9596
");
@@ -194,7 +195,8 @@ in MemberInfo memberInfo
194195

195196
private void GenerateGetСompositeValue(
196197
in StringBuilder builder,
197-
in MemberInfo memberInfo
198+
in MemberInfo memberInfo,
199+
in INamedTypeSymbol currentType
198200
)
199201
{
200202
if (memberInfo.IsValueType)
@@ -203,6 +205,18 @@ in MemberInfo memberInfo
203205
[SkipLocalsInit]
204206
public static {memberInfo.TypeName} Get{memberInfo.MemberName}Value(in void* ptr)
205207
{{
208+
");
209+
if(!currentType.IsValueType)
210+
{
211+
builder.Append($@"
212+
if(*((byte*)ptr) == 0)
213+
{{
214+
throw new NullReferenceException(""ptr is null value"");
215+
}}
216+
");
217+
}
218+
219+
builder.Append($@"
206220
{memberInfo.TypeName} result;
207221
Unsafe.SkipInit(out result);
208222
{memberInfo.TypeName}Helper.CopyToValue((byte*)ptr + {memberInfo.Offset}, ref result);
@@ -211,13 +225,29 @@ in MemberInfo memberInfo
211225
}}
212226
213227
");
214-
return;
215228
}
216229
else
217230
{
218231
builder.Append($@"
219232
public static {memberInfo.TypeName} Get{memberInfo.MemberName}Value(in void* ptr)
220233
{{
234+
");
235+
if (!currentType.IsValueType)
236+
{
237+
builder.Append($@"
238+
if(*((byte*)ptr) == 0)
239+
{{
240+
throw new NullReferenceException(""ptr is null value"");
241+
}}
242+
");
243+
}
244+
245+
builder.Append($@"
246+
if(*((byte*)ptr + {memberInfo.Offset}) == 0)
247+
{{
248+
return null;
249+
}}
250+
221251
{memberInfo.TypeName} result = new {memberInfo.TypeName}();
222252
{memberInfo.TypeName}Helper.CopyToValue((byte*)ptr + {memberInfo.Offset}, ref result);
223253
return result;
@@ -232,12 +262,54 @@ private void GenerateSetСompositeValueFrom(
232262
in INamedTypeSymbol currentType
233263
)
234264
{
235-
builder.Append($@"
265+
if(memberInfo.IsValueType)
266+
{
267+
builder.Append($@"
236268
public static void Set{memberInfo.MemberName}Value(in void* ptr, in {currentType.Name} value)
237269
{{
270+
");
271+
if (!currentType.IsValueType)
272+
{
273+
builder.Append($@"
274+
if(*((byte*)ptr) == 0)
275+
{{
276+
throw new NullReferenceException(""ptr is null value"");
277+
}}
278+
");
279+
}
280+
281+
builder.Append($@"
282+
{memberInfo.TypeName}Helper.CopyToPtr(value.{memberInfo.MemberName}, (byte*)ptr + {memberInfo.Offset});
283+
}}
284+
");
285+
}
286+
else
287+
{
288+
builder.Append($@"
289+
public static void Set{memberInfo.MemberName}Value(in void* ptr, in {currentType.Name} value)
290+
{{
291+
");
292+
if (!currentType.IsValueType)
293+
{
294+
builder.Append($@"
295+
if(*((byte*)ptr) == 0)
296+
{{
297+
throw new NullReferenceException(""ptr is null value"");
298+
}}
299+
");
300+
}
301+
302+
builder.Append($@"
303+
if(value.{memberInfo.MemberName} == null)
304+
{{
305+
*((byte*)ptr + {memberInfo.Offset}) = 0;
306+
return;
307+
}}
308+
238309
{memberInfo.TypeName}Helper.CopyToPtr(value.{memberInfo.MemberName}, (byte*)ptr + {memberInfo.Offset});
239310
}}
240311
");
312+
}
241313
}
242314

243315
private void GenerateCopyToPtr(
@@ -249,8 +321,22 @@ in INamedTypeSymbol currentType
249321
builder.Append($@"
250322
public static void CopyToPtr(in {currentType.Name} value, in void* ptr)
251323
{{
252-
253324
");
325+
if(!currentType.IsValueType)
326+
{
327+
builder.Append($@"
328+
if(value == null)
329+
{{
330+
*((byte*)ptr) = 0;
331+
return;
332+
}}
333+
else
334+
{{
335+
*((byte*)ptr) = 1;
336+
}}
337+
");
338+
}
339+
254340
foreach (var memberInfo in typeInfo.Members)
255341
{
256342
builder.Append($@"
@@ -259,7 +345,6 @@ public static void CopyToPtr(in {currentType.Name} value, in void* ptr)
259345
}
260346

261347
builder.Append($@"
262-
263348
}}
264349
");
265350
}
@@ -273,8 +358,18 @@ in INamedTypeSymbol currentType
273358
builder.Append($@"
274359
public static void CopyToValue(in void* ptr, ref {currentType.Name} value)
275360
{{
276-
277361
");
362+
if (!currentType.IsValueType)
363+
{
364+
builder.Append($@"
365+
if(*((byte*)ptr) == 0)
366+
{{
367+
value = null;
368+
return;
369+
}}
370+
");
371+
}
372+
278373
foreach (var memberInfo in typeInfo.Members)
279374
{
280375
builder.Append($@"
@@ -318,8 +413,22 @@ public static void CopyToValueOut(in void* ptr, out {currentType.Name} value)
318413
builder.Append($@"
319414
public static void CopyToValueOut(in void* ptr, out {currentType.Name} value)
320415
{{
416+
");
417+
if (!currentType.IsValueType)
418+
{
419+
builder.Append($@"
420+
if(*((byte*)ptr) == 0)
421+
{{
422+
value = null;
423+
return;
424+
}}
425+
");
426+
}
427+
428+
builder.Append($@"
321429
value = new {currentType.Name}();
322430
");
431+
323432
foreach (var memberInfo in typeInfo.Members)
324433
{
325434
builder.Append($@"
@@ -338,17 +447,40 @@ private void GenerateCopy(
338447
in TypeInfo typeInfo
339448
)
340449
{
341-
builder.Append($@"
450+
if (typeInfo.IsValueType)
451+
{
452+
builder.Append($@"
453+
public static void Copy(in void* ptrSource, in void* ptrDest)
454+
{{
455+
Buffer.MemoryCopy(
456+
ptrSource,
457+
ptrDest,
458+
{typeInfo.Members.Sum(s => s.Size) + (typeInfo.IsValueType ? 0 : 1)},
459+
{typeInfo.Members.Sum(s => s.Size) + (typeInfo.IsValueType ? 0 : 1)}
460+
);
461+
}}
462+
");
463+
}
464+
else
465+
{
466+
builder.Append($@"
342467
public static void Copy(in void* ptrSource, in void* ptrDest)
343468
{{
469+
if(*((byte*)ptrSource) == 0)
470+
{{
471+
*((byte*)ptrDest) = 0;
472+
return;
473+
}}
474+
344475
Buffer.MemoryCopy(
345476
ptrSource,
346477
ptrDest,
347-
{typeInfo.Members.Sum(s => s.Size)},
348-
{typeInfo.Members.Sum(s => s.Size)}
478+
{typeInfo.Members.Sum(s => s.Size) + (typeInfo.IsValueType ? 0 : 1)},
479+
{typeInfo.Members.Sum(s => s.Size) + (typeInfo.IsValueType ? 0 : 1)}
349480
);
350481
}}
351482
");
483+
}
352484
}
353485

354486
private void GenerateEnd(in StringBuilder builder)

0 commit comments

Comments
 (0)