Skip to content

Commit 918ecac

Browse files
committed
- PR comments
1 parent ad91607 commit 918ecac

File tree

2 files changed

+26
-37
lines changed

2 files changed

+26
-37
lines changed

src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ public TClass DeserializeClass(BsonDeserializationContext context)
152152
var allMemberMaps = _classMap.AllMemberMaps;
153153
var extraElementsMemberMapIndex = _classMap.ExtraElementsMemberMapIndex;
154154

155-
var (bitArrayLength, useStackAlloc) = FastMemberMapHelper.GetBitArrayLength(_classMap.AllMemberMaps.Count);
156-
using var bitArray = useStackAlloc ? FastMemberMapHelper.GetBitArray(stackalloc uint[bitArrayLength]) : FastMemberMapHelper.GetBitArray(bitArrayLength);
155+
var (bitArrayLength, useStackAlloc) = FastMemberMapHelper.GetMembersBitArrayLength(_classMap.AllMemberMaps.Count);
156+
using var bitArray = useStackAlloc ? FastMemberMapHelper.GetMembersBitArray(stackalloc uint[bitArrayLength]) : FastMemberMapHelper.GetMembersBitArray(bitArrayLength);
157157

158158
bsonReader.ReadStartDocument();
159159
var elementTrie = _classMap.ElementTrie;
@@ -686,25 +686,29 @@ private bool ShouldSerializeDiscriminator(Type nominalType)
686686
// helper class that implements member map bit array helper functions
687687
internal static class FastMemberMapHelper
688688
{
689-
internal ref struct BitArray()
689+
internal ref struct MembersBitArray()
690690
{
691691
private readonly ArrayPool<uint> _arrayPool;
692692
private readonly Span<uint> _bitArray;
693693
private readonly uint[] _rentedBuffer;
694694
private bool _isDisposed = false;
695695

696-
public BitArray(Span<uint> bitArray) : this()
696+
public MembersBitArray(Span<uint> bitArray) : this()
697697
{
698698
_arrayPool = null;
699699
_bitArray = bitArray;
700700
_rentedBuffer = null;
701+
702+
_bitArray.Clear();
701703
}
702704

703-
public BitArray(int spanLength, uint[] rentedBuffer, ArrayPool<uint> arrayPool) : this()
705+
public MembersBitArray(int spanLength, uint[] rentedBuffer, ArrayPool<uint> arrayPool) : this()
704706
{
705707
_arrayPool = arrayPool;
706708
_bitArray = rentedBuffer.AsSpan(0, spanLength);
707709
_rentedBuffer = rentedBuffer;
710+
711+
_bitArray.Clear();
708712
}
709713

710714
public Span<uint> Span => _bitArray;
@@ -726,32 +730,17 @@ public void Dispose()
726730
}
727731
}
728732

729-
public static (int BitArrayLength, bool UseStackAlloc) GetBitArrayLength(int membersCount)
733+
public static (int BitArrayLength, bool UseStackAlloc) GetMembersBitArrayLength(int membersCount)
730734
{
731735
var length = (membersCount + 31) >> 5;
732736
return (length, length <= 8); // Use stackalloc for up to 256 members
733737
}
734738

735-
public static BitArray GetBitArray(Span<uint> span) =>
736-
new(ResetSpan(span));
737-
738-
public static BitArray GetBitArray(int length)
739-
{
740-
var rentedBuffer = ArrayPool<uint>.Shared.Rent(length);
741-
ResetSpan(rentedBuffer);
742-
743-
return new(length, rentedBuffer, ArrayPool<uint>.Shared);
744-
}
739+
public static MembersBitArray GetMembersBitArray(Span<uint> span) =>
740+
new(span);
745741

746-
private static Span<uint> ResetSpan(Span<uint> span)
747-
{
748-
for (var i = 0; i < span.Length; i++)
749-
{
750-
span[i] = 0;
751-
}
752-
753-
return span;
754-
}
742+
public static MembersBitArray GetMembersBitArray(int length) =>
743+
new(length, ArrayPool<uint>.Shared.Rent(length), ArrayPool<uint>.Shared);
755744
}
756745
}
757746
}

tests/MongoDB.Bson.Tests/Serialization/BsonClassMapSerializerTests.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void Deserialize_should_not_throw_when_all_required_elements_present(
8585
[InlineData(1024, 993)]
8686
[InlineData(1024, 1000)]
8787
[InlineData(1024, 1023)]
88-
public void Deserialize_should_throw_FormatException_when_no_required_element_is_found(int membersCount, int missingMemberIndex)
88+
public void Deserialize_should_throw_FormatException_when_required_element_is_not_found(int membersCount, int missingMemberIndex)
8989
{
9090
var subject = BuildTypeAndGetSerializer("Prop", membersCount);
9191
var properties = Enumerable
@@ -197,19 +197,19 @@ public void Equals_with_not_equal_field_should_return_false()
197197
[InlineData(33, 2, true)]
198198
[InlineData(256, 8, true)]
199199
[InlineData(257, 9, false)]
200-
public void FastMemberMapHelper_GetBitArrayLength_should_return_correctValue(int memberCount, int expectedBitArrayLength, bool expectedUseStackAlloc)
200+
public void FastMemberMapHelper_GetMembersBitArrayLength_should_return_correctValue(int memberCount, int expectedBitArrayLength, bool expectedUseStackAlloc)
201201
{
202-
var (bitArrayLength, useStackAlloc) = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetBitArrayLength(memberCount);
202+
var (bitArrayLength, useStackAlloc) = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetMembersBitArrayLength(memberCount);
203203

204204
bitArrayLength.ShouldBeEquivalentTo(expectedBitArrayLength);
205205
useStackAlloc.ShouldBeEquivalentTo(expectedUseStackAlloc);
206206
}
207207

208208
[Fact]
209-
public void FastMemberMapHelper_GetBitArray_with_span_should_use_the_provided_span()
209+
public void FastMemberMapHelper_GetMembersBitArray_with_span_should_use_the_provided_span()
210210
{
211211
var backingArray = new uint[] { 1, 2, 3 };
212-
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetBitArray(backingArray);
212+
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetMembersBitArray(backingArray);
213213

214214
bitArray.Span.ToArray().ShouldBeEquivalentTo(new uint[] { 0, 0, 0 });
215215
bitArray.ArrayPool.Should().Be(null);
@@ -221,9 +221,9 @@ public void FastMemberMapHelper_GetBitArray_with_span_should_use_the_provided_sp
221221
[Theory]
222222
[InlineData(3)]
223223
[InlineData(25)]
224-
public void FastMemberMapHelper_GetBitArray_with_length_should_allocate_span(int length)
224+
public void FastMemberMapHelper_GetMembersBitArray_with_length_should_allocate_span(int length)
225225
{
226-
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetBitArray(length);
226+
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetMembersBitArray(length);
227227

228228
bitArray.Span.ToArray().ShouldBeEquivalentTo(Enumerable.Repeat<uint>(0, length));
229229
bitArray.ArrayPool.Should().Be(ArrayPool<uint>.Shared);
@@ -232,12 +232,12 @@ public void FastMemberMapHelper_GetBitArray_with_length_should_allocate_span(int
232232
[Theory]
233233
[InlineData(1)]
234234
[InlineData(2)]
235-
public void FastMemberMapHelper_BitArray_with_arraypool_should_dispose_only_once(int disposeCount)
235+
public void FastMemberMapHelper_MembersBitArray_with_arraypool_should_dispose_only_once(int disposeCount)
236236
{
237237
var backingArray = new uint[] { 1, 2, 3 };
238238

239239
var mockArrayPool = new Mock<ArrayPool<uint>>();
240-
var bitArray = new BsonClassMapSerializer<MyModel>.FastMemberMapHelper.BitArray(backingArray.Length, backingArray, mockArrayPool.Object);
240+
var bitArray = new BsonClassMapSerializer<MyModel>.FastMemberMapHelper.MembersBitArray(backingArray.Length, backingArray, mockArrayPool.Object);
241241

242242
for (int i = 0; i < disposeCount; i++)
243243
{
@@ -255,10 +255,10 @@ public void FastMemberMapHelper_BitArray_with_arraypool_should_dispose_only_once
255255
[InlineData(266, 255)]
256256
[InlineData(544, 0)]
257257
[InlineData(621, 255)]
258-
public void FastMemberMapHelper_GetBitArray_SetMemberIndex_should_set_correct_bit(int membersCount, int memberIndex)
258+
public void FastMemberMapHelper_GetMembersBitArray_SetMemberIndex_should_set_correct_bit(int membersCount, int memberIndex)
259259
{
260-
var (length, _) = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetBitArrayLength(membersCount);
261-
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetBitArray(length);
260+
var (length, _) = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetMembersBitArrayLength(membersCount);
261+
using var bitArray = BsonClassMapSerializer<MyModel>.FastMemberMapHelper.GetMembersBitArray(length);
262262

263263
var span = bitArray.Span;
264264
var blockIndex = memberIndex >> 5;

0 commit comments

Comments
 (0)