From cf0fa9f5320a1d57379f2ab22bf128a61ed0aaa7 Mon Sep 17 00:00:00 2001 From: Jonathan Carvalhosa Date: Fri, 16 Oct 2026 16:33:36 -0300 Subject: [PATCH] C#: deserialize a struct without building its Default first Reading a struct allocated its Default value up to twice and threw it away: Get(out value) evaluated Default as the argument of Get(out value, defaults) even when the stream held the struct, and GetFields started from Default before assigning every field. A struct with fixed arrays, vectors, lists, sets or maps allocated each of those collections two more times than the value it returned holds, and an array of structs did the same for every element. Get(out value) builds Default only when the stream holds no struct, and GetFields starts from default(T): every field is assigned from the stream or from its declared default, a collection field gets a new collection of its own before it is read, and a missing parent is set to the parent's Default. The value returned still owns every collection it holds, so a caller may keep it. FieldModelArray.Get(ref T[]) no longer requires a non-null array, since it always replaces it. Co-Authored-By: Claude Opus 5.5 --- projects/CSharp/Proto/com.chronoxor.enums.cs | 18 +- projects/CSharp/Proto/com.chronoxor.fbe.cs | 16 - projects/CSharp/Proto/com.chronoxor.proto.cs | 113 ++++- .../CSharp/Proto/com.chronoxor.protoex.cs | 115 ++++- projects/CSharp/Proto/com.chronoxor.test.cs | 446 ++++++++++++++---- source/generator_csharp.cpp | 51 +- 6 files changed, 610 insertions(+), 149 deletions(-) diff --git a/projects/CSharp/Proto/com.chronoxor.enums.cs b/projects/CSharp/Proto/com.chronoxor.enums.cs index 00b17bd63..8529d8d59 100644 --- a/projects/CSharp/Proto/com.chronoxor.enums.cs +++ b/projects/CSharp/Proto/com.chronoxor.enums.cs @@ -3723,7 +3723,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Enums fbeValue) { Get(out fbeValue, Enums.Default); } + public override void Get(out Enums fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Enums.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Enums fbeValue, Enums defaults) { long fbeBegin = GetBegin(); @@ -3743,7 +3755,7 @@ public void GetFields(out Enums fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Enums.Default; + fbeValue = default(Enums); if ((fbeCurrentSize + byte0.FBESize) <= fbeStructSize) byte0.Get(out fbeValue.byte0, global::com.chronoxor.enums.EnumByte.ENUM_VALUE_0); @@ -4995,7 +5007,7 @@ public long GetFields(out Enums fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Enums.Default; + fbeValue = default(Enums); byte0.FBEOffset = fbeCurrentOffset; fbeFieldSize = byte0.Get(out fbeValue.byte0); diff --git a/projects/CSharp/Proto/com.chronoxor.fbe.cs b/projects/CSharp/Proto/com.chronoxor.fbe.cs index 3277c5706..c1fca3d33 100644 --- a/projects/CSharp/Proto/com.chronoxor.fbe.cs +++ b/projects/CSharp/Proto/com.chronoxor.fbe.cs @@ -1951,10 +1951,6 @@ public virtual bool Verify() // Get the array public void Get(ref T[] values) { - Debug.Assert((values != null), "Invalid values parameter!"); - if (values == null) - throw new ArgumentNullException(nameof(values), "Invalid values parameter!"); - values = new T[_size]; var fbeModel = this[0]; @@ -2084,10 +2080,6 @@ public virtual bool Verify() // Get the array public void Get(ref T[] values) { - Debug.Assert((values != null), "Invalid values parameter!"); - if (values == null) - throw new ArgumentNullException(nameof(values), "Invalid values parameter!"); - values = new T[_size]; var fbeModel = this[0]; @@ -2217,10 +2209,6 @@ public virtual bool Verify() // Get the array public void Get(ref T?[] values) { - Debug.Assert((values != null), "Invalid values parameter!"); - if (values == null) - throw new ArgumentNullException(nameof(values), "Invalid values parameter!"); - values = new T?[_size]; var fbeModel = this[0]; @@ -2350,10 +2338,6 @@ public virtual bool Verify() // Get the array public void Get(ref T[] values) { - Debug.Assert((values != null), "Invalid values parameter!"); - if (values == null) - throw new ArgumentNullException(nameof(values), "Invalid values parameter!"); - values = new T[_size]; var fbeModel = this[0]; diff --git a/projects/CSharp/Proto/com.chronoxor.proto.cs b/projects/CSharp/Proto/com.chronoxor.proto.cs index 70997faae..f57977071 100644 --- a/projects/CSharp/Proto/com.chronoxor.proto.cs +++ b/projects/CSharp/Proto/com.chronoxor.proto.cs @@ -1075,7 +1075,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Order fbeValue) { Get(out fbeValue, Order.Default); } + public override void Get(out Order fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Order.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Order fbeValue, Order defaults) { long fbeBegin = GetBegin(); @@ -1095,7 +1107,7 @@ public void GetFields(out Order fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Order.Default; + fbeValue = default(Order); if ((fbeCurrentSize + id.FBESize) <= fbeStructSize) id.Get(out fbeValue.id); @@ -1387,7 +1399,7 @@ public long GetFields(out Order fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Order.Default; + fbeValue = default(Order); id.FBEOffset = fbeCurrentOffset; fbeFieldSize = id.Get(out fbeValue.id); @@ -1800,7 +1812,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Balance fbeValue) { Get(out fbeValue, Balance.Default); } + public override void Get(out Balance fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Balance.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Balance fbeValue, Balance defaults) { long fbeBegin = GetBegin(); @@ -1820,7 +1844,7 @@ public void GetFields(out Balance fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Balance.Default; + fbeValue = default(Balance); if ((fbeCurrentSize + currency.FBESize) <= fbeStructSize) currency.Get(out fbeValue.currency); @@ -2048,7 +2072,7 @@ public long GetFields(out Balance fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Balance.Default; + fbeValue = default(Balance); currency.FBEOffset = fbeCurrentOffset; fbeFieldSize = currency.Get(out fbeValue.currency); @@ -2491,7 +2515,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Account fbeValue) { Get(out fbeValue, Account.Default); } + public override void Get(out Account fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Account.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Account fbeValue, Account defaults) { long fbeBegin = GetBegin(); @@ -2511,7 +2547,7 @@ public void GetFields(out Account fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Account.Default; + fbeValue = default(Account); if ((fbeCurrentSize + id.FBESize) <= fbeStructSize) id.Get(out fbeValue.id); @@ -2544,9 +2580,12 @@ public void GetFields(out Account fbeValue, long fbeStructSize) fbeCurrentSize += asset.FBESize; if ((fbeCurrentSize + orders.FBESize) <= fbeStructSize) + { + fbeValue.orders = new List(); orders.Get(ref fbeValue.orders); + } else - fbeValue.orders.Clear(); + fbeValue.orders = new List(); fbeCurrentSize += orders.FBESize; } @@ -2803,7 +2842,7 @@ public long GetFields(out Account fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Account.Default; + fbeValue = default(Account); id.FBEOffset = fbeCurrentOffset; fbeFieldSize = id.Get(out fbeValue.id); @@ -3192,7 +3231,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out OrderMessage fbeValue) { Get(out fbeValue, OrderMessage.Default); } + public override void Get(out OrderMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = OrderMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out OrderMessage fbeValue, OrderMessage defaults) { long fbeBegin = GetBegin(); @@ -3212,7 +3263,7 @@ public void GetFields(out OrderMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = OrderMessage.Default; + fbeValue = default(OrderMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -3424,7 +3475,7 @@ public long GetFields(out OrderMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = OrderMessage.Default; + fbeValue = default(OrderMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); @@ -3763,7 +3814,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out BalanceMessage fbeValue) { Get(out fbeValue, BalanceMessage.Default); } + public override void Get(out BalanceMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = BalanceMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out BalanceMessage fbeValue, BalanceMessage defaults) { long fbeBegin = GetBegin(); @@ -3783,7 +3846,7 @@ public void GetFields(out BalanceMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = BalanceMessage.Default; + fbeValue = default(BalanceMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -3995,7 +4058,7 @@ public long GetFields(out BalanceMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = BalanceMessage.Default; + fbeValue = default(BalanceMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); @@ -4334,7 +4397,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out AccountMessage fbeValue) { Get(out fbeValue, AccountMessage.Default); } + public override void Get(out AccountMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = AccountMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out AccountMessage fbeValue, AccountMessage defaults) { long fbeBegin = GetBegin(); @@ -4354,7 +4429,7 @@ public void GetFields(out AccountMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = AccountMessage.Default; + fbeValue = default(AccountMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -4566,7 +4641,7 @@ public long GetFields(out AccountMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = AccountMessage.Default; + fbeValue = default(AccountMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); diff --git a/projects/CSharp/Proto/com.chronoxor.protoex.cs b/projects/CSharp/Proto/com.chronoxor.protoex.cs index 7e747b668..c7d3fced4 100644 --- a/projects/CSharp/Proto/com.chronoxor.protoex.cs +++ b/projects/CSharp/Proto/com.chronoxor.protoex.cs @@ -1125,7 +1125,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Order fbeValue) { Get(out fbeValue, Order.Default); } + public override void Get(out Order fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Order.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Order fbeValue, Order defaults) { long fbeBegin = GetBegin(); @@ -1145,7 +1157,7 @@ public void GetFields(out Order fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Order.Default; + fbeValue = default(Order); if ((fbeCurrentSize + id.FBESize) <= fbeStructSize) id.Get(out fbeValue.id); @@ -1469,7 +1481,7 @@ public long GetFields(out Order fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Order.Default; + fbeValue = default(Order); id.FBEOffset = fbeCurrentOffset; fbeFieldSize = id.Get(out fbeValue.id); @@ -1910,7 +1922,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Balance fbeValue) { Get(out fbeValue, Balance.Default); } + public override void Get(out Balance fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Balance.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Balance fbeValue, Balance defaults) { long fbeBegin = GetBegin(); @@ -1930,10 +1954,12 @@ public void GetFields(out Balance fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Balance.Default; + fbeValue = default(Balance); if ((fbeCurrentSize + parent.FBEBody - 4 - 4) <= fbeStructSize) parent.GetFields(out fbeValue.parent, fbeStructSize); + else + fbeValue.parent = proto.Balance.Default; fbeCurrentSize += parent.FBEBody - 4 - 4; if ((fbeCurrentSize + locked.FBESize) <= fbeStructSize) @@ -2156,7 +2182,7 @@ public long GetFields(out Balance fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Balance.Default; + fbeValue = default(Balance); parent.FBEOffset = fbeCurrentOffset; fbeFieldSize = parent.GetFields(out fbeValue.parent); @@ -2599,7 +2625,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out Account fbeValue) { Get(out fbeValue, Account.Default); } + public override void Get(out Account fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = Account.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out Account fbeValue, Account defaults) { long fbeBegin = GetBegin(); @@ -2619,7 +2657,7 @@ public void GetFields(out Account fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = Account.Default; + fbeValue = default(Account); if ((fbeCurrentSize + id.FBESize) <= fbeStructSize) id.Get(out fbeValue.id); @@ -2652,9 +2690,12 @@ public void GetFields(out Account fbeValue, long fbeStructSize) fbeCurrentSize += asset.FBESize; if ((fbeCurrentSize + orders.FBESize) <= fbeStructSize) + { + fbeValue.orders = new List(); orders.Get(ref fbeValue.orders); + } else - fbeValue.orders.Clear(); + fbeValue.orders = new List(); fbeCurrentSize += orders.FBESize; } @@ -2911,7 +2952,7 @@ public long GetFields(out Account fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = Account.Default; + fbeValue = default(Account); id.FBEOffset = fbeCurrentOffset; fbeFieldSize = id.Get(out fbeValue.id); @@ -3300,7 +3341,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out OrderMessage fbeValue) { Get(out fbeValue, OrderMessage.Default); } + public override void Get(out OrderMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = OrderMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out OrderMessage fbeValue, OrderMessage defaults) { long fbeBegin = GetBegin(); @@ -3320,7 +3373,7 @@ public void GetFields(out OrderMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = OrderMessage.Default; + fbeValue = default(OrderMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -3532,7 +3585,7 @@ public long GetFields(out OrderMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = OrderMessage.Default; + fbeValue = default(OrderMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); @@ -3871,7 +3924,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out BalanceMessage fbeValue) { Get(out fbeValue, BalanceMessage.Default); } + public override void Get(out BalanceMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = BalanceMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out BalanceMessage fbeValue, BalanceMessage defaults) { long fbeBegin = GetBegin(); @@ -3891,7 +3956,7 @@ public void GetFields(out BalanceMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = BalanceMessage.Default; + fbeValue = default(BalanceMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -4103,7 +4168,7 @@ public long GetFields(out BalanceMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = BalanceMessage.Default; + fbeValue = default(BalanceMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); @@ -4442,7 +4507,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out AccountMessage fbeValue) { Get(out fbeValue, AccountMessage.Default); } + public override void Get(out AccountMessage fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = AccountMessage.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out AccountMessage fbeValue, AccountMessage defaults) { long fbeBegin = GetBegin(); @@ -4462,7 +4539,7 @@ public void GetFields(out AccountMessage fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = AccountMessage.Default; + fbeValue = default(AccountMessage); if ((fbeCurrentSize + body.FBESize) <= fbeStructSize) body.Get(out fbeValue.body); @@ -4674,7 +4751,7 @@ public long GetFields(out AccountMessage fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = AccountMessage.Default; + fbeValue = default(AccountMessage); body.FBEOffset = fbeCurrentOffset; fbeFieldSize = body.Get(out fbeValue.body); diff --git a/projects/CSharp/Proto/com.chronoxor.test.cs b/projects/CSharp/Proto/com.chronoxor.test.cs index 21a3f6ed2..57cd16462 100644 --- a/projects/CSharp/Proto/com.chronoxor.test.cs +++ b/projects/CSharp/Proto/com.chronoxor.test.cs @@ -2421,7 +2421,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructSimple fbeValue) { Get(out fbeValue, StructSimple.Default); } + public override void Get(out StructSimple fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructSimple.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructSimple fbeValue, StructSimple defaults) { long fbeBegin = GetBegin(); @@ -2441,7 +2453,7 @@ public void GetFields(out StructSimple fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructSimple.Default; + fbeValue = default(StructSimple); if ((fbeCurrentSize + id.FBESize) <= fbeStructSize) id.Get(out fbeValue.id); @@ -3357,7 +3369,7 @@ public long GetFields(out StructSimple fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructSimple.Default; + fbeValue = default(StructSimple); id.FBEOffset = fbeCurrentOffset; fbeFieldSize = id.Get(out fbeValue.id); @@ -5078,7 +5090,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructOptional fbeValue) { Get(out fbeValue, StructOptional.Default); } + public override void Get(out StructOptional fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructOptional.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructOptional fbeValue, StructOptional defaults) { long fbeBegin = GetBegin(); @@ -5098,10 +5122,12 @@ public void GetFields(out StructOptional fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructOptional.Default; + fbeValue = default(StructOptional); if ((fbeCurrentSize + parent.FBEBody - 4 - 4) <= fbeStructSize) parent.GetFields(out fbeValue.parent, fbeStructSize); + else + fbeValue.parent = StructSimple.Default; fbeCurrentSize += parent.FBEBody - 4 - 4; if ((fbeCurrentSize + f100.FBESize) <= fbeStructSize) @@ -6364,7 +6390,7 @@ public long GetFields(out StructOptional fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructOptional.Default; + fbeValue = default(StructOptional); parent.FBEOffset = fbeCurrentOffset; fbeFieldSize = parent.GetFields(out fbeValue.parent); @@ -7549,7 +7575,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructNested fbeValue) { Get(out fbeValue, StructNested.Default); } + public override void Get(out StructNested fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructNested.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructNested fbeValue, StructNested defaults) { long fbeBegin = GetBegin(); @@ -7569,10 +7607,12 @@ public void GetFields(out StructNested fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructNested.Default; + fbeValue = default(StructNested); if ((fbeCurrentSize + parent.FBEBody - 4 - 4) <= fbeStructSize) parent.GetFields(out fbeValue.parent, fbeStructSize); + else + fbeValue.parent = StructOptional.Default; fbeCurrentSize += parent.FBEBody - 4 - 4; if ((fbeCurrentSize + f1000.FBESize) <= fbeStructSize) @@ -7971,7 +8011,7 @@ public long GetFields(out StructNested fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructNested.Default; + fbeValue = default(StructNested); parent.FBEOffset = fbeCurrentOffset; fbeFieldSize = parent.GetFields(out fbeValue.parent); @@ -8457,7 +8497,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructBytes fbeValue) { Get(out fbeValue, StructBytes.Default); } + public override void Get(out StructBytes fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructBytes.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructBytes fbeValue, StructBytes defaults) { long fbeBegin = GetBegin(); @@ -8477,7 +8529,7 @@ public void GetFields(out StructBytes fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructBytes.Default; + fbeValue = default(StructBytes); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) f1.Get(out fbeValue.f1); @@ -8721,7 +8773,7 @@ public long GetFields(out StructBytes fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructBytes.Default; + fbeValue = default(StructBytes); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -9345,7 +9397,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructArray fbeValue) { Get(out fbeValue, StructArray.Default); } + public override void Get(out StructArray fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructArray.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructArray fbeValue, StructArray defaults) { long fbeBegin = GetBegin(); @@ -9365,7 +9429,7 @@ public void GetFields(out StructArray fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructArray.Default; + fbeValue = default(StructArray); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) f1.Get(ref fbeValue.f1); @@ -9721,7 +9785,7 @@ public long GetFields(out StructArray fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructArray.Default; + fbeValue = default(StructArray); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -10415,7 +10479,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructVector fbeValue) { Get(out fbeValue, StructVector.Default); } + public override void Get(out StructVector fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructVector.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructVector fbeValue, StructVector defaults) { long fbeBegin = GetBegin(); @@ -10435,66 +10511,96 @@ public void GetFields(out StructVector fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructVector.Default; + fbeValue = default(StructVector); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new List(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new List(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new List(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new List(); fbeCurrentSize += f2.FBESize; if ((fbeCurrentSize + f3.FBESize) <= fbeStructSize) + { + fbeValue.f3 = new List(); f3.Get(ref fbeValue.f3); + } else - fbeValue.f3.Clear(); + fbeValue.f3 = new List(); fbeCurrentSize += f3.FBESize; if ((fbeCurrentSize + f4.FBESize) <= fbeStructSize) + { + fbeValue.f4 = new List(); f4.Get(ref fbeValue.f4); + } else - fbeValue.f4.Clear(); + fbeValue.f4 = new List(); fbeCurrentSize += f4.FBESize; if ((fbeCurrentSize + f5.FBESize) <= fbeStructSize) + { + fbeValue.f5 = new List(); f5.Get(ref fbeValue.f5); + } else - fbeValue.f5.Clear(); + fbeValue.f5 = new List(); fbeCurrentSize += f5.FBESize; if ((fbeCurrentSize + f6.FBESize) <= fbeStructSize) + { + fbeValue.f6 = new List(); f6.Get(ref fbeValue.f6); + } else - fbeValue.f6.Clear(); + fbeValue.f6 = new List(); fbeCurrentSize += f6.FBESize; if ((fbeCurrentSize + f7.FBESize) <= fbeStructSize) + { + fbeValue.f7 = new List(); f7.Get(ref fbeValue.f7); + } else - fbeValue.f7.Clear(); + fbeValue.f7 = new List(); fbeCurrentSize += f7.FBESize; if ((fbeCurrentSize + f8.FBESize) <= fbeStructSize) + { + fbeValue.f8 = new List(); f8.Get(ref fbeValue.f8); + } else - fbeValue.f8.Clear(); + fbeValue.f8 = new List(); fbeCurrentSize += f8.FBESize; if ((fbeCurrentSize + f9.FBESize) <= fbeStructSize) + { + fbeValue.f9 = new List(); f9.Get(ref fbeValue.f9); + } else - fbeValue.f9.Clear(); + fbeValue.f9 = new List(); fbeCurrentSize += f9.FBESize; if ((fbeCurrentSize + f10.FBESize) <= fbeStructSize) + { + fbeValue.f10 = new List(); f10.Get(ref fbeValue.f10); + } else - fbeValue.f10.Clear(); + fbeValue.f10 = new List(); fbeCurrentSize += f10.FBESize; } @@ -10791,7 +10897,7 @@ public long GetFields(out StructVector fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructVector.Default; + fbeValue = default(StructVector); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -11485,7 +11591,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructList fbeValue) { Get(out fbeValue, StructList.Default); } + public override void Get(out StructList fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructList.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructList fbeValue, StructList defaults) { long fbeBegin = GetBegin(); @@ -11505,66 +11623,96 @@ public void GetFields(out StructList fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructList.Default; + fbeValue = default(StructList); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new LinkedList(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new LinkedList(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new LinkedList(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new LinkedList(); fbeCurrentSize += f2.FBESize; if ((fbeCurrentSize + f3.FBESize) <= fbeStructSize) + { + fbeValue.f3 = new LinkedList(); f3.Get(ref fbeValue.f3); + } else - fbeValue.f3.Clear(); + fbeValue.f3 = new LinkedList(); fbeCurrentSize += f3.FBESize; if ((fbeCurrentSize + f4.FBESize) <= fbeStructSize) + { + fbeValue.f4 = new LinkedList(); f4.Get(ref fbeValue.f4); + } else - fbeValue.f4.Clear(); + fbeValue.f4 = new LinkedList(); fbeCurrentSize += f4.FBESize; if ((fbeCurrentSize + f5.FBESize) <= fbeStructSize) + { + fbeValue.f5 = new LinkedList(); f5.Get(ref fbeValue.f5); + } else - fbeValue.f5.Clear(); + fbeValue.f5 = new LinkedList(); fbeCurrentSize += f5.FBESize; if ((fbeCurrentSize + f6.FBESize) <= fbeStructSize) + { + fbeValue.f6 = new LinkedList(); f6.Get(ref fbeValue.f6); + } else - fbeValue.f6.Clear(); + fbeValue.f6 = new LinkedList(); fbeCurrentSize += f6.FBESize; if ((fbeCurrentSize + f7.FBESize) <= fbeStructSize) + { + fbeValue.f7 = new LinkedList(); f7.Get(ref fbeValue.f7); + } else - fbeValue.f7.Clear(); + fbeValue.f7 = new LinkedList(); fbeCurrentSize += f7.FBESize; if ((fbeCurrentSize + f8.FBESize) <= fbeStructSize) + { + fbeValue.f8 = new LinkedList(); f8.Get(ref fbeValue.f8); + } else - fbeValue.f8.Clear(); + fbeValue.f8 = new LinkedList(); fbeCurrentSize += f8.FBESize; if ((fbeCurrentSize + f9.FBESize) <= fbeStructSize) + { + fbeValue.f9 = new LinkedList(); f9.Get(ref fbeValue.f9); + } else - fbeValue.f9.Clear(); + fbeValue.f9 = new LinkedList(); fbeCurrentSize += f9.FBESize; if ((fbeCurrentSize + f10.FBESize) <= fbeStructSize) + { + fbeValue.f10 = new LinkedList(); f10.Get(ref fbeValue.f10); + } else - fbeValue.f10.Clear(); + fbeValue.f10 = new LinkedList(); fbeCurrentSize += f10.FBESize; } @@ -11861,7 +12009,7 @@ public long GetFields(out StructList fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructList.Default; + fbeValue = default(StructList); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -12387,7 +12535,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructSet fbeValue) { Get(out fbeValue, StructSet.Default); } + public override void Get(out StructSet fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructSet.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructSet fbeValue, StructSet defaults) { long fbeBegin = GetBegin(); @@ -12407,30 +12567,42 @@ public void GetFields(out StructSet fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructSet.Default; + fbeValue = default(StructSet); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new HashSet(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new HashSet(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new HashSet(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new HashSet(); fbeCurrentSize += f2.FBESize; if ((fbeCurrentSize + f3.FBESize) <= fbeStructSize) + { + fbeValue.f3 = new HashSet(); f3.Get(ref fbeValue.f3); + } else - fbeValue.f3.Clear(); + fbeValue.f3 = new HashSet(); fbeCurrentSize += f3.FBESize; if ((fbeCurrentSize + f4.FBESize) <= fbeStructSize) + { + fbeValue.f4 = new HashSet(); f4.Get(ref fbeValue.f4); + } else - fbeValue.f4.Clear(); + fbeValue.f4 = new HashSet(); fbeCurrentSize += f4.FBESize; } @@ -12667,7 +12839,7 @@ public long GetFields(out StructSet fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructSet.Default; + fbeValue = default(StructSet); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -13321,7 +13493,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructMap fbeValue) { Get(out fbeValue, StructMap.Default); } + public override void Get(out StructMap fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructMap.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructMap fbeValue, StructMap defaults) { long fbeBegin = GetBegin(); @@ -13341,66 +13525,96 @@ public void GetFields(out StructMap fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructMap.Default; + fbeValue = default(StructMap); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new SortedDictionary(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new SortedDictionary(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new SortedDictionary(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new SortedDictionary(); fbeCurrentSize += f2.FBESize; if ((fbeCurrentSize + f3.FBESize) <= fbeStructSize) + { + fbeValue.f3 = new SortedDictionary(); f3.Get(ref fbeValue.f3); + } else - fbeValue.f3.Clear(); + fbeValue.f3 = new SortedDictionary(); fbeCurrentSize += f3.FBESize; if ((fbeCurrentSize + f4.FBESize) <= fbeStructSize) + { + fbeValue.f4 = new SortedDictionary(); f4.Get(ref fbeValue.f4); + } else - fbeValue.f4.Clear(); + fbeValue.f4 = new SortedDictionary(); fbeCurrentSize += f4.FBESize; if ((fbeCurrentSize + f5.FBESize) <= fbeStructSize) + { + fbeValue.f5 = new SortedDictionary(); f5.Get(ref fbeValue.f5); + } else - fbeValue.f5.Clear(); + fbeValue.f5 = new SortedDictionary(); fbeCurrentSize += f5.FBESize; if ((fbeCurrentSize + f6.FBESize) <= fbeStructSize) + { + fbeValue.f6 = new SortedDictionary(); f6.Get(ref fbeValue.f6); + } else - fbeValue.f6.Clear(); + fbeValue.f6 = new SortedDictionary(); fbeCurrentSize += f6.FBESize; if ((fbeCurrentSize + f7.FBESize) <= fbeStructSize) + { + fbeValue.f7 = new SortedDictionary(); f7.Get(ref fbeValue.f7); + } else - fbeValue.f7.Clear(); + fbeValue.f7 = new SortedDictionary(); fbeCurrentSize += f7.FBESize; if ((fbeCurrentSize + f8.FBESize) <= fbeStructSize) + { + fbeValue.f8 = new SortedDictionary(); f8.Get(ref fbeValue.f8); + } else - fbeValue.f8.Clear(); + fbeValue.f8 = new SortedDictionary(); fbeCurrentSize += f8.FBESize; if ((fbeCurrentSize + f9.FBESize) <= fbeStructSize) + { + fbeValue.f9 = new SortedDictionary(); f9.Get(ref fbeValue.f9); + } else - fbeValue.f9.Clear(); + fbeValue.f9 = new SortedDictionary(); fbeCurrentSize += f9.FBESize; if ((fbeCurrentSize + f10.FBESize) <= fbeStructSize) + { + fbeValue.f10 = new SortedDictionary(); f10.Get(ref fbeValue.f10); + } else - fbeValue.f10.Clear(); + fbeValue.f10 = new SortedDictionary(); fbeCurrentSize += f10.FBESize; } @@ -13697,7 +13911,7 @@ public long GetFields(out StructMap fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructMap.Default; + fbeValue = default(StructMap); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -14411,7 +14625,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructHash fbeValue) { Get(out fbeValue, StructHash.Default); } + public override void Get(out StructHash fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructHash.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructHash fbeValue, StructHash defaults) { long fbeBegin = GetBegin(); @@ -14431,66 +14657,96 @@ public void GetFields(out StructHash fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructHash.Default; + fbeValue = default(StructHash); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new Dictionary(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new Dictionary(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new Dictionary(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new Dictionary(); fbeCurrentSize += f2.FBESize; if ((fbeCurrentSize + f3.FBESize) <= fbeStructSize) + { + fbeValue.f3 = new Dictionary(); f3.Get(ref fbeValue.f3); + } else - fbeValue.f3.Clear(); + fbeValue.f3 = new Dictionary(); fbeCurrentSize += f3.FBESize; if ((fbeCurrentSize + f4.FBESize) <= fbeStructSize) + { + fbeValue.f4 = new Dictionary(); f4.Get(ref fbeValue.f4); + } else - fbeValue.f4.Clear(); + fbeValue.f4 = new Dictionary(); fbeCurrentSize += f4.FBESize; if ((fbeCurrentSize + f5.FBESize) <= fbeStructSize) + { + fbeValue.f5 = new Dictionary(); f5.Get(ref fbeValue.f5); + } else - fbeValue.f5.Clear(); + fbeValue.f5 = new Dictionary(); fbeCurrentSize += f5.FBESize; if ((fbeCurrentSize + f6.FBESize) <= fbeStructSize) + { + fbeValue.f6 = new Dictionary(); f6.Get(ref fbeValue.f6); + } else - fbeValue.f6.Clear(); + fbeValue.f6 = new Dictionary(); fbeCurrentSize += f6.FBESize; if ((fbeCurrentSize + f7.FBESize) <= fbeStructSize) + { + fbeValue.f7 = new Dictionary(); f7.Get(ref fbeValue.f7); + } else - fbeValue.f7.Clear(); + fbeValue.f7 = new Dictionary(); fbeCurrentSize += f7.FBESize; if ((fbeCurrentSize + f8.FBESize) <= fbeStructSize) + { + fbeValue.f8 = new Dictionary(); f8.Get(ref fbeValue.f8); + } else - fbeValue.f8.Clear(); + fbeValue.f8 = new Dictionary(); fbeCurrentSize += f8.FBESize; if ((fbeCurrentSize + f9.FBESize) <= fbeStructSize) + { + fbeValue.f9 = new Dictionary(); f9.Get(ref fbeValue.f9); + } else - fbeValue.f9.Clear(); + fbeValue.f9 = new Dictionary(); fbeCurrentSize += f9.FBESize; if ((fbeCurrentSize + f10.FBESize) <= fbeStructSize) + { + fbeValue.f10 = new Dictionary(); f10.Get(ref fbeValue.f10); + } else - fbeValue.f10.Clear(); + fbeValue.f10 = new Dictionary(); fbeCurrentSize += f10.FBESize; } @@ -14787,7 +15043,7 @@ public long GetFields(out StructHash fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructHash.Default; + fbeValue = default(StructHash); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -15261,7 +15517,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructHashEx fbeValue) { Get(out fbeValue, StructHashEx.Default); } + public override void Get(out StructHashEx fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructHashEx.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructHashEx fbeValue, StructHashEx defaults) { long fbeBegin = GetBegin(); @@ -15281,18 +15549,24 @@ public void GetFields(out StructHashEx fbeValue, long fbeStructSize) { long fbeCurrentSize = 4 + 4; - fbeValue = StructHashEx.Default; + fbeValue = default(StructHashEx); if ((fbeCurrentSize + f1.FBESize) <= fbeStructSize) + { + fbeValue.f1 = new Dictionary(); f1.Get(ref fbeValue.f1); + } else - fbeValue.f1.Clear(); + fbeValue.f1 = new Dictionary(); fbeCurrentSize += f1.FBESize; if ((fbeCurrentSize + f2.FBESize) <= fbeStructSize) + { + fbeValue.f2 = new Dictionary(); f2.Get(ref fbeValue.f2); + } else - fbeValue.f2.Clear(); + fbeValue.f2 = new Dictionary(); fbeCurrentSize += f2.FBESize; } @@ -15509,7 +15783,7 @@ public long GetFields(out StructHashEx fbeValue) long fbeCurrentSize = 0; long fbeFieldSize; - fbeValue = StructHashEx.Default; + fbeValue = default(StructHashEx); f1.FBEOffset = fbeCurrentOffset; fbeFieldSize = f1.Get(out fbeValue.f1); @@ -15837,7 +16111,19 @@ public void GetEnd(long fbeBegin) } // Get the struct value - public override void Get(out StructEmpty fbeValue) { Get(out fbeValue, StructEmpty.Default); } + public override void Get(out StructEmpty fbeValue) + { + long fbeBegin = GetBegin(); + if (fbeBegin == 0) + { + fbeValue = StructEmpty.Default; + return; + } + + uint fbeStructSize = ReadUInt32(0); + GetFields(out fbeValue, fbeStructSize); + GetEnd(fbeBegin); + } public override void Get(out StructEmpty fbeValue, StructEmpty defaults) { long fbeBegin = GetBegin(); diff --git a/source/generator_csharp.cpp b/source/generator_csharp.cpp index 533dfb6bf..0f89c5cd2 100644 --- a/source/generator_csharp.cpp +++ b/source/generator_csharp.cpp @@ -1435,10 +1435,6 @@ void GeneratorCSharp::GenerateFBEFieldModelArray(bool valueType, bool optional) // Get the array public void Get(ref _ARGS_[] values) { - Debug.Assert((values != null), "Invalid values parameter!"); - if (values == null) - throw new ArgumentNullException(nameof(values), "Invalid values parameter!"); - values = new _ARGS_[_size]; var fbeModel = this[0]; @@ -5954,7 +5950,24 @@ void GeneratorCSharp::GenerateStructFieldModel(const std::string& domain, const // Generate struct field model Get() methods WriteLine(); WriteLineIndent("// Get the struct value"); - WriteLineIndent("public override void Get(out " + *s->name + " fbeValue) { Get(out fbeValue, " + *s->name + ".Default); }"); + // The default value is built only when it is the result, since building it allocates its collections + WriteLineIndent("public override void Get(out " + *s->name + " fbeValue)"); + WriteLineIndent("{"); + Indent(1); + WriteLineIndent("long fbeBegin = GetBegin();"); + WriteLineIndent("if (fbeBegin == 0)"); + WriteLineIndent("{"); + Indent(1); + WriteLineIndent("fbeValue = " + *s->name + ".Default;"); + WriteLineIndent("return;"); + Indent(-1); + WriteLineIndent("}"); + WriteLine(); + WriteLineIndent("uint fbeStructSize = ReadUInt32(0);"); + WriteLineIndent("GetFields(out fbeValue, fbeStructSize);"); + WriteLineIndent("GetEnd(fbeBegin);"); + Indent(-1); + WriteLineIndent("}"); WriteLineIndent("public override void Get(out " + *s->name + " fbeValue, " + *s->name + " defaults)"); WriteLineIndent("{"); Indent(1); @@ -5981,9 +5994,11 @@ void GeneratorCSharp::GenerateStructFieldModel(const std::string& domain, const Indent(1); if ((s->base && !s->base->empty()) || (s->body && !s->body->fields.empty())) { + // Every field is assigned below, from the stream or its default, so the value starts empty + // instead of from Default, whose collections would be allocated only to be replaced WriteLineIndent("long fbeCurrentSize = 4 + 4;"); WriteLine(); - WriteLineIndent("fbeValue = " + *s->name + ".Default;"); + WriteLineIndent("fbeValue = default(" + *s->name + ");"); if (s->base && !s->base->empty()) { WriteLine(); @@ -5991,6 +6006,10 @@ void GeneratorCSharp::GenerateStructFieldModel(const std::string& domain, const Indent(1); WriteLineIndent("parent.GetFields(out fbeValue.parent, fbeStructSize);"); Indent(-1); + WriteLineIndent("else"); + Indent(1); + WriteLineIndent("fbeValue.parent = " + ConvertTypeName(*s->base, false) + ".Default;"); + Indent(-1); WriteLineIndent("fbeCurrentSize += parent.FBEBody - 4 - 4;"); } if (s->body) @@ -6000,17 +6019,25 @@ void GeneratorCSharp::GenerateStructFieldModel(const std::string& domain, const WriteLine(); WriteLineIndent("if ((fbeCurrentSize + " + *field->name + ".FBESize) <= fbeStructSize)"); Indent(1); - if (field->array || field->vector || field->list || field->set || field->map || field->hash) + if (field->array) + WriteLineIndent(*field->name + ".Get(ref fbeValue." + *field->name + ");"); + else if (field->vector || field->list || field->set || field->map || field->hash) + { + Indent(-1); + WriteLineIndent("{"); + Indent(1); + WriteLineIndent("fbeValue." + *field->name + " = " + ConvertDefault(domain, *p->name, *field) + ";"); WriteLineIndent(*field->name + ".Get(ref fbeValue." + *field->name + ");"); + Indent(-1); + WriteLineIndent("}"); + Indent(1); + } else WriteLineIndent(*field->name + ".Get(out fbeValue." + *field->name + (field->value ? (", " + ConvertConstant(domain, *p->name, *field->type, *field->value, field->optional)) : "") + ");"); Indent(-1); WriteLineIndent("else"); Indent(1); - if (field->vector || field->list || field->set || field->map || field->hash) - WriteLineIndent("fbeValue." + *field->name + ".Clear();"); - else - WriteLineIndent("fbeValue." + *field->name + " = " + ConvertDefault(domain, *p->name, *field) + ";"); + WriteLineIndent("fbeValue." + *field->name + " = " + ConvertDefault(domain, *p->name, *field) + ";"); Indent(-1); WriteLineIndent("fbeCurrentSize += " + *field->name + ".FBESize;"); } @@ -6393,7 +6420,7 @@ void GeneratorCSharp::GenerateStructFinalModel(const std::string& domain, const WriteLineIndent("long fbeCurrentSize = 0;"); WriteLineIndent("long fbeFieldSize;"); WriteLine(); - WriteLineIndent("fbeValue = " + *s->name + ".Default;"); + WriteLineIndent("fbeValue = default(" + *s->name + ");"); if (s->base && !s->base->empty()) { WriteLine();