Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /