Skip to content

Commit 443d755

Browse files
author
Vyacheslav
committed
feat:
+ wrapper nullable test: create instance, Fill(null) #10
1 parent b50278f commit 443d755

File tree

2 files changed

+75
-70
lines changed

2 files changed

+75
-70
lines changed

Src/StackMemoryCollections/GenerateWrappers.cs

Lines changed: 52 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Src/Tests/WrapperFixture.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,29 @@ public void GetPtrTest()
9797
}
9898
}
9999

100+
[Test]
101+
public void NullableTest()
102+
{
103+
unsafe
104+
{
105+
using (var memory = new StackMemoryCollections.Struct.StackMemory(HelpClassHelper.SizeOf))
106+
{
107+
{
108+
var wrap2 = new Struct.HelpClassWrapper(memory.Current, true);
109+
Assert.That(wrap2.HelpClass2, Is.EqualTo(IntPtr.Zero));
110+
Assert.That(wrap2.IsNull, Is.EqualTo(false));
111+
wrap2.HelpClass2 = new IntPtr(456421332);
112+
Assert.That(wrap2.HelpClass2, Is.Not.EqualTo(IntPtr.Zero));
113+
wrap2.Fill(null);
114+
Assert.That(wrap2.IsNull, Is.EqualTo(true));
115+
wrap2.CreateInstance();
116+
Assert.That(wrap2.IsNull, Is.EqualTo(false));
117+
Assert.That(wrap2.HelpClass2, Is.EqualTo(IntPtr.Zero));
118+
}
119+
}
120+
}
121+
}
122+
100123
[Test]
101124
public void GetOutTest()
102125
{

0 commit comments

Comments
 (0)