11using Microsoft . CodeAnalysis ;
22using System ;
33using System . Collections . Generic ;
4+ using System . IO ;
45using System . Linq ;
56using 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