Skip to content
This repository was archived by the owner on May 16, 2022. It is now read-only.

Commit aeaac6b

Browse files
committed
Conflicts: sandbox/Sandbox/Program.cs tests/ZeroFormatter.UnityTests/Assets/Dlls/Sandbox.Shared.dll tests/ZeroFormatter.UnityTests/Assets/Dlls/ZeroFormatter.Interfaces.dll tests/ZeroFormatter.UnityTests/Assets/Dlls/ZeroFormatter.dll tests/ZeroFormatter.UnityTests/Assets/Dlls/ZeroFormatter.dll.mdb tests/ZeroFormatter.UnityTests/Assets/Dlls/ZeroFormatter.dll.mdb.meta tests/ZeroFormatter.UnityTests/Assets/Scripts/Tests/_UnitTestLoader.cs tests/ZeroFormatter.UnityTests/ZeroFormatter.UnityTests.CSharp.csproj
2 parents e661736 + 93a65c9 commit aeaac6b

File tree

19 files changed

+529
-207
lines changed

19 files changed

+529
-207
lines changed

nuget/check_zfc.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
zfc -i "C:\Users\y.kawai\Documents\neuecc\ZeroFormatter\sandbox\Sandbox.Shared\Sandbox.Shared.csproj" -o "C:\Users\y.kawai\Documents\neuecc\ZeroFormatter\tests\ZeroFormatter.UnityTests\Assets\ZeroFormatterGenerated.cs" -c UNITY -u
1+
zfc -i "C:\Users\neuecc\Documents\Git\neuecc\ZeroFormatter\sandbox\Sandbox.Shared\Sandbox.Shared.csproj" -o "C:\Users\neuecc\Documents\Git\neuecc\ZeroFormatter\tests\ZeroFormatter.UnityTests\Assets\ZeroFormatterGenerated.cs" -c UNITY -u

sandbox/Sandbox.Shared/Sandbox.Shared.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<TargetFrameworkVersion Condition="'$(Configuration)|$(Platform)' != 'Unity|AnyCPU'">v4.5</TargetFrameworkVersion>
1313
<TargetFrameworkVersion Condition="'$(Configuration)|$(Platform)' == 'Unity|AnyCPU'">v3.5</TargetFrameworkVersion>
1414
<FileAlignment>512</FileAlignment>
15+
<TargetFrameworkProfile />
1516
</PropertyGroup>
1617
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
1718
<DebugSymbols>true</DebugSymbols>
@@ -41,8 +42,6 @@
4142
<Reference Include="System" />
4243
<Reference Include="System.Core" />
4344
<Reference Include="System.Runtime.Serialization" />
44-
<Reference Include="System.Xml.Linq" />
45-
<Reference Include="System.Data.DataSetExtensions" />
4645
<Reference Include="System.Data" />
4746
<Reference Include="System.Xml" />
4847
</ItemGroup>
@@ -59,6 +58,7 @@
5958
<Compile Include="Properties\AssemblyInfo.cs" />
6059
<Compile Include="UnionType.cs" />
6160
<Compile Include="Versioning.cs" />
61+
<Compile Include="ZeroArgument.cs" />
6262
<Compile Include="ZeroFormatter.Tests\TestClasses.cs" />
6363
</ItemGroup>
6464
<ItemGroup>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+

2+
using ZeroFormatter;
3+
4+
namespace Sandbox.Shared
5+
{
6+
[ZeroFormattable]
7+
public class ZeroClass
8+
{
9+
10+
}
11+
12+
[ZeroFormattable]
13+
public struct ZeroStruct
14+
{
15+
16+
}
17+
}

sandbox/Sandbox/Program.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,17 @@ public class Nest
241241
}
242242

243243

244+
[ZeroFormattable]
245+
public struct ZeroA
246+
{
247+
}
248+
244249
class Program
245250
{
246251
static void Main(string[] args)
247252
{
248-
249-
250-
var bytes = ZeroFormatterSerializer.Serialize(Tuple.Create(100, 200));
251-
252-
foreach (var item in bytes)
253-
{
254-
Console.WriteLine(item);
255-
}
253+
var a = ZeroFormatterSerializer.Serialize(default(ZeroA));
254+
256255

257256
}
258257
}

src/ZeroFormatter.CodeGenerator/GeneratorPartial.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public int[] ElementFixedSizes
8787
{
8888
get
8989
{
90+
if (Properties.Length == 0) return new int[0];
91+
9092
var schemaLastIndex = Properties.Select(x => x.Index).LastOrDefault();
9193
var dict = Properties.Where(x => x.IsFixedSize).ToDictionary(x => x.Index, x => x.FixedSize);
9294
var elementSizes = new int[schemaLastIndex + 1];
@@ -101,6 +103,20 @@ public int[] ElementFixedSizes
101103
return elementSizes;
102104
}
103105
}
106+
107+
public int? GetLength()
108+
{
109+
if (Properties.Length == 0) return 0;
110+
111+
var sum = 0;
112+
foreach (var item in Properties)
113+
{
114+
if (!item.IsFixedSize) return null;
115+
sum += item.FixedSize;
116+
}
117+
118+
return sum;
119+
}
104120
}
105121

106122
public partial class InitializerGenerator

src/ZeroFormatter.CodeGenerator/StructGenerator.cs

Lines changed: 56 additions & 35 deletions
Large diffs are not rendered by default.

src/ZeroFormatter.CodeGenerator/StructGenerator.tt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,14 @@ namespace <#= Namespace #>
4545

4646
public override int? GetLength()
4747
{
48-
return <#= t.ElementFixedSizes.Any(x => x == 0) ? "null" : t.ElementFixedSizes.Sum().ToString() #>;
48+
return <#= (t.GetLength() == null) ? "null" : t.GetLength().ToString() #>;
4949
}
5050

5151
public override int Serialize(ref byte[] bytes, int offset, <#= t.FullName #> value)
5252
{
53+
<# if (t.GetLength() != null) { #>
54+
BinaryUtil.EnsureCapacity(ref bytes, offset, <#= t.GetLength() #>);
55+
<# } #>
5356
var startOffset = offset;
5457
<# for(var i = 0; i < t.Properties.Length; i++) { var p = t.Properties[i]; #>
5558
offset += formatter<#= i #>.Serialize(ref bytes, offset, value.<#= p.Name #>);

src/ZeroFormatter/Formatters/DynamicFormatter.cs

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -478,10 +478,13 @@ public static object Create<TTypeResolver, T>()
478478
constructorTypes.Add(item.Item2.MemberType);
479479
}
480480

481-
var info = t.GetTypeInfo().GetConstructor(constructorTypes.ToArray());
482-
if (info == null)
481+
if (expected != 0)
483482
{
484-
throw new InvalidOperationException("Struct needs full parameter constructor of index property types. Type:" + t.FullName);
483+
var info = t.GetTypeInfo().GetConstructor(constructorTypes.ToArray());
484+
if (info == null)
485+
{
486+
throw new InvalidOperationException("Struct needs full parameter constructor of index property types. Type:" + t.FullName);
487+
}
485488
}
486489

487490
return isNullable ? (int?)null : lengthSum;
@@ -627,45 +630,55 @@ static TypeInfo BuildFormatter(ModuleBuilder builder, Type resolverType, Type el
627630

628631
var il = method.GetILGenerator();
629632

630-
il.DeclareLocal(typeof(int)); // size
631-
foreach (var item in formattersInField)
633+
if (memberInfos.Length != 0)
632634
{
633-
il.DeclareLocal(item.Item2.MemberType); // item1, item2...
634-
}
635-
il.DeclareLocal(elementType); // result
635+
il.DeclareLocal(typeof(int)); // size
636+
foreach (var item in formattersInField)
637+
{
638+
il.DeclareLocal(item.Item2.MemberType); // item1, item2...
639+
}
640+
il.DeclareLocal(elementType); // result
636641

637-
il.Emit(OpCodes.Ldarg_S, (byte)4);
638-
il.Emit(OpCodes.Ldc_I4_0);
639-
il.Emit(OpCodes.Stind_I4);
640-
foreach (var item in formattersInField)
641-
{
642-
il.Emit(OpCodes.Ldarg_0);
643-
il.Emit(OpCodes.Ldfld, item.Item3);
644-
il.Emit(OpCodes.Ldarg_1);
645-
il.Emit(OpCodes.Ldarg_2);
646-
il.Emit(OpCodes.Ldarg_3);
647-
il.Emit(OpCodes.Ldloca_S, (byte)0);
648-
il.Emit(OpCodes.Callvirt, item.Item3.FieldType.GetTypeInfo().GetMethod("Deserialize"));
649-
il.Emit(OpCodes.Stloc, item.Item1 + 1);
650-
il.Emit(OpCodes.Ldarg_2);
651-
il.Emit(OpCodes.Ldloc_0);
652-
il.Emit(OpCodes.Add);
653-
il.Emit(OpCodes.Starg_S, (byte)2);
654642
il.Emit(OpCodes.Ldarg_S, (byte)4);
655-
il.Emit(OpCodes.Dup);
656-
il.Emit(OpCodes.Ldind_I4);
657-
il.Emit(OpCodes.Ldloc_0);
658-
il.Emit(OpCodes.Add);
643+
il.Emit(OpCodes.Ldc_I4_0);
659644
il.Emit(OpCodes.Stind_I4);
660-
}
645+
foreach (var item in formattersInField)
646+
{
647+
il.Emit(OpCodes.Ldarg_0);
648+
il.Emit(OpCodes.Ldfld, item.Item3);
649+
il.Emit(OpCodes.Ldarg_1);
650+
il.Emit(OpCodes.Ldarg_2);
651+
il.Emit(OpCodes.Ldarg_3);
652+
il.Emit(OpCodes.Ldloca_S, (byte)0);
653+
il.Emit(OpCodes.Callvirt, item.Item3.FieldType.GetTypeInfo().GetMethod("Deserialize"));
654+
il.Emit(OpCodes.Stloc, item.Item1 + 1);
655+
il.Emit(OpCodes.Ldarg_2);
656+
il.Emit(OpCodes.Ldloc_0);
657+
il.Emit(OpCodes.Add);
658+
il.Emit(OpCodes.Starg_S, (byte)2);
659+
il.Emit(OpCodes.Ldarg_S, (byte)4);
660+
il.Emit(OpCodes.Dup);
661+
il.Emit(OpCodes.Ldind_I4);
662+
il.Emit(OpCodes.Ldloc_0);
663+
il.Emit(OpCodes.Add);
664+
il.Emit(OpCodes.Stind_I4);
665+
}
666+
667+
for (int i = 0; i < memberInfos.Length; i++)
668+
{
669+
il.Emit(OpCodes.Ldloc, i + 1);
670+
}
661671

662-
for (int i = 0; i < memberInfos.Length; i++)
672+
var constructor = elementType.GetTypeInfo().GetConstructor(memberInfos.Select(x => x.Item2.MemberType).ToArray());
673+
il.Emit(OpCodes.Newobj, constructor);
674+
}
675+
else
663676
{
664-
il.Emit(OpCodes.Ldloc, i + 1);
677+
il.DeclareLocal(elementType);
678+
il.Emit(OpCodes.Ldloca_S, (byte)0);
679+
il.Emit(OpCodes.Initobj, elementType);
680+
il.Emit(OpCodes.Ldloc_0);
665681
}
666-
667-
var constructor = elementType.GetTypeInfo().GetConstructor(memberInfos.Select(x => x.Item2.MemberType).ToArray());
668-
il.Emit(OpCodes.Newobj, constructor);
669682
il.Emit(OpCodes.Ret);
670683
}
671684

src/ZeroFormatter/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,4 @@
3838

3939

4040
[assembly: InternalsVisibleTo("ZeroFormatter.Tests")]
41-
[assembly: InternalsVisibleTo("ZeroFormatter.NETCore.Tests")]
42-
41+
[assembly: InternalsVisibleTo("ZeroFormatter.NETCore.Tests")]

0 commit comments

Comments
 (0)