@@ -44,6 +44,7 @@ in Dictionary<string, TypeInfo> typeInfos
4444 WrapperConstructor2 ( in currentType , in typeInfo , in builder , in sizeOfStr ) ;
4545 WrapperConstructor3 ( in currentType , in typeInfo , in builder , in sizeOfStr ) ;
4646 WrapperConstructor4 ( in currentType , in typeInfo , in builder ) ;
47+ WrapperCreateInstance ( in typeInfo , in builder ) ;
4748
4849 WrapperProperties ( in typeInfo , in builder , in typeInfos ) ;
4950
@@ -103,27 +104,7 @@ in string sizeOfStr
103104" ) ;
104105 }
105106
106- for ( int i = 0 ; i < typeInfo . Members . Count ; i ++ )
107- {
108- var currentMember = typeInfo . Members [ i ] ;
109- if ( ! currentMember . IsValueType && ! currentMember . AsPointer )
110- {
111- builder . Append ( $@ "
112- //set null marker { currentMember . MemberName }
113- *((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = 0;
114- " ) ;
115- continue ;
116- }
117-
118- if ( currentMember . AsPointer )
119- {
120- builder . Append ( $@ "
121- //IntPtr must be a valid structure, so write it down. Member: { currentMember . MemberName }
122- *(IntPtr*)((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = IntPtr.Zero;
123- " ) ;
124- continue ;
125- }
126- }
107+ ResetPointerAndReference ( in typeInfo , in builder , " " ) ;
127108
128109 builder . Append ( $@ "
129110 }}
@@ -157,27 +138,7 @@ in string sizeOfStr
157138" ) ;
158139 }
159140
160- for ( int i = 0 ; i < typeInfo . Members . Count ; i ++ )
161- {
162- var currentMember = typeInfo . Members [ i ] ;
163- if ( ! currentMember . IsValueType && ! currentMember . AsPointer )
164- {
165- builder . Append ( $@ "
166- //set null marker { currentMember . MemberName }
167- *((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = 0;
168- " ) ;
169- continue ;
170- }
171-
172- if ( currentMember . AsPointer )
173- {
174- builder . Append ( $@ "
175- //IntPtr must be a valid structure, so write it down. Member: { currentMember . MemberName }
176- *(IntPtr*)((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = IntPtr.Zero;
177- " ) ;
178- continue ;
179- }
180- }
141+ ResetPointerAndReference ( in typeInfo , in builder , " " ) ;
181142
182143 builder . Append ( $@ "
183144 }}
@@ -212,27 +173,7 @@ StackMemoryCollections.Class.StackMemory stackMemory
212173" ) ;
213174 }
214175
215- for ( int i = 0 ; i < typeInfo . Members . Count ; i ++ )
216- {
217- var currentMember = typeInfo . Members [ i ] ;
218- if ( ! currentMember . IsValueType && ! currentMember . AsPointer )
219- {
220- builder . Append ( $@ "
221- //set null marker { currentMember . MemberName }
222- *((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = 0;
223- " ) ;
224- continue ;
225- }
226-
227- if ( currentMember . AsPointer )
228- {
229- builder . Append ( $@ "
230- //IntPtr must be a valid structure, so write it down. Member: { currentMember . MemberName }
231- *(IntPtr*)((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = IntPtr.Zero;
232- " ) ;
233- continue ;
234- }
235- }
176+ ResetPointerAndReference ( in typeInfo , in builder , " " ) ;
236177
237178 builder . Append ( $@ "
238179 }}
@@ -263,7 +204,7 @@ bool createInstance
263204 builder . Append ( $@ "
264205 if(createInstance)
265206 {{
266-
207+
267208" ) ;
268209
269210 if ( ! currentType . IsValueType )
@@ -273,32 +214,59 @@ bool createInstance
273214" ) ;
274215 }
275216
217+ ResetPointerAndReference ( in typeInfo , in builder , " " ) ;
218+ builder . Append ( $@ "
219+ }}
220+ }}
221+ " ) ;
222+ }
223+
224+ private void ResetPointerAndReference (
225+ in TypeInfo typeInfo ,
226+ in StringBuilder builder ,
227+ in string paddings
228+ )
229+ {
276230 for ( int i = 0 ; i < typeInfo . Members . Count ; i ++ )
277231 {
278232 var currentMember = typeInfo . Members [ i ] ;
279233 if ( ! currentMember . IsValueType && ! currentMember . AsPointer )
280234 {
281235 builder . Append ( $@ "
282- //set null marker { currentMember . MemberName }
283- *((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = 0;
236+ { paddings } //set null marker { currentMember . MemberName }
237+ { paddings } *((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ typeInfo . TypeName } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = 0;
284238" ) ;
285239 continue ;
286240 }
287241
288242 if ( currentMember . AsPointer )
289243 {
290244 builder . Append ( $@ "
291- //IntPtr must be a valid structure, so write it down. Member: { currentMember . MemberName }
292- *(IntPtr*)((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ currentType . Name } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = IntPtr.Zero;
245+ { paddings } //IntPtr must be a valid structure, so write it down. Member: { currentMember . MemberName }
246+ { paddings } *(IntPtr*)((byte*)_start + { ( currentMember . IsRuntimeOffsetCalculated ? $ "{ typeInfo . TypeName } Helper.{ currentMember . MemberName } Offset" : $ "{ currentMember . Offset } ") } ) = IntPtr.Zero;
293247" ) ;
294248 continue ;
295249 }
296250 }
251+ }
297252
298- builder . Append ( $@ "
299- }}
253+ private void WrapperCreateInstance (
254+ in TypeInfo typeInfo ,
255+ in StringBuilder builder
256+ )
257+ {
258+ if ( ! typeInfo . IsValueType )
259+ {
260+ builder . Append ( $@ "
261+ public void CreateInstance()
262+ {{
263+ *((byte*)_start) = 1;
264+ " ) ;
265+ ResetPointerAndReference ( in typeInfo , in builder , " " ) ;
266+ builder . Append ( $@ "
300267 }}
301268" ) ;
269+ }
302270 }
303271
304272 private void WrapperDispose (
@@ -390,6 +358,7 @@ in Dictionary<string, TypeInfo> typeInfos
390358 )
391359 {
392360 WrapperPtr ( in builder ) ;
361+ WrapperIsNull ( in typeInfo , in builder ) ;
393362 PrimitiveWrapperChangePtr ( in builder ) ;
394363 WrapperGetValue ( in typeInfo , in builder ) ;
395364 WrapperFillValue ( in typeInfo , in builder ) ;
@@ -441,6 +410,19 @@ in StringBuilder builder
441410" ) ;
442411 }
443412
413+ private void WrapperIsNull (
414+ in TypeInfo typeInfo ,
415+ in StringBuilder builder
416+ )
417+ {
418+ if ( ! typeInfo . IsValueType )
419+ {
420+ builder . Append ( $@ "
421+ public bool IsNull => *((byte*)_start) == 0;
422+ " ) ;
423+ }
424+ }
425+
444426 private void WrapperGetValue (
445427 in TypeInfo typeInfo ,
446428 in StringBuilder builder
0 commit comments