Skip to content

[manual] Merge branch 'release/9.0' => 'release/9.0-staging' #111565

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 74 commits into from
Jan 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
0d4e67b
Use explicit full-path for loading MsQuic.dll
rzikm Aug 28, 2024
fae6c3e
Fix comment wording
rzikm Aug 28, 2024
703a5be
Merged PR 42181: Use explicit full-path for loading MsQuic.dll
rzikm Oct 7, 2024
f0d72e3
Merge commit '09393c29fa9730ef36a220ba81c0414f3b152e5c'
Oct 7, 2024
7e717e3
Merge commit 'ccff2d8b13f6d3da7c83e158bffb3d689f1b170e'
Oct 7, 2024
d268545
Merge commit '25d5a1fc973c5aa272570c613e6136b2b22e7c00'
Oct 7, 2024
4eddcac
Merge commit 'dfff9ad29ac9ac8f487a51aad2c814ab158676b9'
Oct 8, 2024
507d1a8
Merge commit '5a1eedb3026ee115b654c41ad6422c503e4b0dda'
Oct 8, 2024
8273648
Merge commit '5c0d2265f06b665eba09879ce5990b876602860f'
Oct 9, 2024
02ae0c5
Merge commit '24cfc7cc9dabdbe8607a3bf81ffbedf7e2cbb97f'
Oct 9, 2024
d16f41a
[release/9.0] Simplify array handling to fix issues with jagged and a…
Oct 9, 2024
0017b18
Merge commit 'efbd310dfe4071eb159a42e9952a694fa92d6b17'
Oct 9, 2024
2d871e6
Merge commit '9e16fe2d3d1b88cea5b529c4645a9fb3239890a2'
Oct 10, 2024
1302a7e
Merge commit '226c0347b92c4f9649bcc7ad580f74cb0409580e'
Oct 10, 2024
625d418
Merge commit '24e3ac980094f86022d0a3cc80813f743f67c978'
Oct 10, 2024
c8e2baf
Merge commit '05adda580b5d792fee9c8724236b9719141d213a'
Oct 10, 2024
e4c2c7f
Merge commit 'dd3bd1d48ddee767a0f098f3bed81afb81fca026'
Oct 10, 2024
1ebdea8
Merge commit '870e4660ed1d42f015ff76d6dc7ca92bd7977ce2'
Oct 11, 2024
b9d8a2f
Merge commit '0eb4083345461014ca55682111c273948fe2ec25'
Oct 11, 2024
0ff78bb
Merge commit '4b3ab70d6a7bce7f1980fcc0c6ad2f60c3f5bcb2'
Oct 11, 2024
ce2fe14
Merge commit '6aafadbead76ce05cef125a9a79253bd0cd6b236'
Oct 11, 2024
5127a1f
Merge commit 'b030c4dfdfa1bf287f10f96006619a06bc2000ae'
Oct 11, 2024
f7cb588
Merge commit 'c2da91e256ebcb69f71040eb93b186b0985a2384'
Oct 14, 2024
15324df
Merge commit 'def10840ad64ab4977f0f1dab8eb8de2c75c0589'
Oct 14, 2024
209242a
Merge commit 'a0038e206b689443caf3609836ffbf6ce3568c80'
Oct 14, 2024
695e2b5
Merge commit 'b182a0bdb845cee080bc34e0bc70be154a836431'
Oct 15, 2024
5b7ebdc
Merge commit 'dc9d87fd744deb37df9aa49c1886aba72a67a6c6'
Oct 15, 2024
fcf5dc7
Merge commit 'cf1c582931dc647b8e6ca58c34fcfb20d5d07a42'
Oct 15, 2024
0bdcebf
Merge commit 'b8f5d2538d402d4714b4567af4b05b98aac94d2d'
Oct 15, 2024
d7cbea0
Merge commit '9305d7f71d73c1d1edeb2a06478c998e40deda8d'
Oct 16, 2024
48bcd24
Merge commit '5d276d9e9b096229176fc9c760e9b29e7ad0733c'
Oct 16, 2024
64edceb
Merge commit 'd3981726bc8b0e179db50301daf9f22d42393096'
Oct 16, 2024
0621080
Merge commit 'd1944e672a6f819ddd2ad90533c9f35a30258aa9'
Oct 17, 2024
644ee36
Merge commit '937db9fe04f9e952619950ae86acdfaebfc80c77'
Oct 17, 2024
77833cf
Merge commit '5663a27d225fc982455a99f18e837338889baa88'
Oct 17, 2024
59cbc74
Suppress IL3000 in MsQuicApi constructor
elinor-fung Oct 17, 2024
a84babf
Merge commit 'e3130360deb1341e96af622ff1128439f649005e'
Oct 17, 2024
abd2c00
Merge commit '316d718c78317e249c651f925d8a4b68638d9af1'
Oct 17, 2024
26f3296
Merge commit 'b678c8a49022eb25e8c9de5ed3496d4a26b56e31'
Oct 18, 2024
e8d2552
Merge commit '83d152c4b5ff2f50a6d01a20fcc22be07da05ab3'
Oct 18, 2024
87ac28b
Merge commit 'ecefb5e0412bd05841012efe3d7fd914c400343a'
Oct 18, 2024
9c52987
Merge commit '197db4ff0ded5f02e2d050f1310f297265d19e3d'
Oct 18, 2024
ab1c0fb
Merge commit 'd5baa14e684167fabdd980ee16d307994398f912'
Oct 22, 2024
2df1137
Merge commit 'f9b6a512f7dea63d0c55648576b11790362c7e12'
Oct 22, 2024
0456c7e
Merge commit '2b46f3a7eb3d0df99c523e5648f00cc8b53caa05'
Oct 23, 2024
5f6da41
Merge commit '7b9e6158be5956687564d249afdad36fbc57750e'
Oct 28, 2024
7dab903
Update dependencies from https://github.com/dotnet/emsdk build 202410…
dotnet-maestro[bot] Oct 29, 2024
9d5a6a9
Merge commit '7dab903b20269d78c6bc08d5269947db7d35c22b'
Oct 29, 2024
940e395
Update branding to 9.0.1 (#109563)
vseanreesermsft Nov 7, 2024
29dbf1a
Merge commit '940e395337ef32782723b789e530aa4abd72b054'
Nov 7, 2024
e7a0653
Merge commit '9d5a6a9aa463d6d10b0b0ba6d5982cc82f363dc3' into internal…
vseanreesermsft Nov 12, 2024
f6615d2
Merging internal commits for release/9.0 (#109744)
carlossanlop Nov 26, 2024
74e5e40
Merge commit 'f6615d27fdbef2e7216d9762aaea9a6aa49e1be5'
Nov 26, 2024
32d8ea6
Merged PR 45621: Update DIA to 17.12.0-beta1.24603.5
Dec 3, 2024
9da8c6a
[release/9.0] Fix length check for Convert.TryToHexString{Lower} (#11…
github-actions[bot] Dec 3, 2024
6221f4e
Merge commit '9da8c6a4a6ea03054e776275d3fd5c752897842e'
Dec 3, 2024
cc58c28
[release/9.0] Update dependencies from dotnet/emsdk (#109523)
dotnet-maestro[bot] Dec 3, 2024
8437635
Merge commit 'cc58c2832c5c5bcbf90d118a8b3c504b2a87c820'
Dec 3, 2024
38709f8
Merge branch 'release/9.0' into release/9.0-staging
carlossanlop Dec 3, 2024
462630b
Merge pull request #110370 from carlossanlop/release/9.0-staging
carlossanlop Dec 3, 2024
69ae1ac
Merge commit '462630b3c311cade6426c53e9b3ee3b89bf217a2'
Dec 3, 2024
757d97b
Switch to automatic 8.0 version updates (#110586)
marcpopMSFT Dec 10, 2024
6c7cf91
Merge commit '757d97b1a5f00cab30fc37f68aba9eec6e8b4e00'
Dec 10, 2024
756e620
Update dependencies from https://github.com/dotnet/emsdk build 202412…
dotnet-maestro[bot] Dec 10, 2024
c8acea2
Merge commit '756e62050722c168cd3b753be73b7cbcd93f06d6'
Dec 10, 2024
3c456bc
Update branding to 9.0.2 (#111172)
vseanreesermsft Jan 10, 2025
d8b1554
Merge branch 'release/9.0' into release/9.0-staging
carlossanlop Jan 14, 2025
55b2924
[release/9.0] Fix Encoding regression (#111367)
github-actions[bot] Jan 14, 2025
63b7284
Merge pull request #111378 from carlossanlop/release/9.0-staging
carlossanlop Jan 14, 2025
f8e3b98
Merge commit 'c8acea22626efab11c13778c028975acdc34678f' into internal…
vseanreesermsft Jan 14, 2025
cbcec76
Merge pull request #111422 from carlossanlop/release/9.0-staging
carlossanlop Jan 14, 2025
63cb882
Since we bumped the NDK in https://github.com/dotnet/dotnet-buildtool…
steveisok Jan 14, 2025
6a86517
[release/9.0] Support generic fields in PersistedAssemblyBuilder (#11…
github-actions[bot] Jan 15, 2025
692a3b6
Merged PR 45621: Update DIA to 17.12.0-beta1.24603.5 (#111428)
carlossanlop Jan 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NuGet.config
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<!--Begin: Package sources managed by Dependency Flow automation. Do not edit the sources below.-->
<!-- Begin: Package sources from dotnet-emsdk -->
<add key="darc-pub-dotnet-emsdk-2c27e40" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-2c27e405/nuget/v3/index.json" />
<add key="darc-pub-dotnet-emsdk-4c9d1b1" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-4c9d1b11/nuget/v3/index.json" />
<!-- End: Package sources from dotnet-emsdk -->
<!-- Begin: Package sources from dotnet-sdk -->
<add key="darc-pub-dotnet-sdk-a345a00" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-sdk-a345a003/nuget/v3/index.json" />
Expand Down
8 changes: 4 additions & 4 deletions eng/Versions.props
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project>
<PropertyGroup>
<!-- The .NET product branding version -->
<ProductVersion>9.0.1</ProductVersion>
<ProductVersion>9.0.2</ProductVersion>
<!-- File version numbers -->
<MajorVersion>9</MajorVersion>
<MinorVersion>0</MinorVersion>
<PatchVersion>1</PatchVersion>
<PatchVersion>2</PatchVersion>
<SdkBandVersion>9.0.100</SdkBandVersion>
<PackageVersionNet8>8.0.11</PackageVersionNet8>
<PackageVersionNet8>8.0.$([MSBuild]::Add($(PatchVersion),11))</PackageVersionNet8>
<PackageVersionNet7>7.0.20</PackageVersionNet7>
<PackageVersionNet6>6.0.36</PackageVersionNet6>
<PreReleaseVersionLabel>servicing</PreReleaseVersionLabel>
Expand Down Expand Up @@ -164,7 +164,7 @@
<optimizationPGOCoreCLRVersion>1.0.0-prerelease.24462.2</optimizationPGOCoreCLRVersion>
<!-- Not auto-updated. -->
<MicrosoftDiaSymReaderVersion>2.0.0</MicrosoftDiaSymReaderVersion>
<MicrosoftDiaSymReaderNativeVersion>17.10.0-beta1.24272.1</MicrosoftDiaSymReaderNativeVersion>
<MicrosoftDiaSymReaderNativeVersion>17.12.0-beta1.24603.5</MicrosoftDiaSymReaderNativeVersion>
<SystemCommandLineVersion>2.0.0-beta4.24324.3</SystemCommandLineVersion>
<TraceEventVersion>3.1.7</TraceEventVersion>
<NETStandardLibraryRefVersion>2.1.0</NETStandardLibraryRefVersion>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace System.Formats.Nrbf
public abstract partial class ArrayRecord : System.Formats.Nrbf.SerializationRecord
{
internal ArrayRecord() { }
public virtual long FlattenedLength { get { throw null; } }
public override System.Formats.Nrbf.SerializationRecordId Id { get { throw null; } }
public abstract System.ReadOnlySpan<int> Lengths { get; }
public int Rank { get { throw null; } }
Expand Down
2 changes: 1 addition & 1 deletion src/libraries/System.Formats.Nrbf/src/PACKAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ There are more than a dozen different serialization [record types](https://learn
- `PrimitiveTypeRecord<T>` derives from the non-generic [PrimitiveTypeRecord](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.primitivetyperecord), which also exposes a [Value](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.primitivetyperecord.value) property. But on the base class, the value is returned as `object` (which introduces boxing for value types).
- [ClassRecord](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.classrecord): describes all `class` and `struct` besides the aforementioned primitive types.
- [ArrayRecord](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.arrayrecord): describes all array records, including jagged and multi-dimensional arrays.
- [`SZArrayRecord<T>`](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.szarrayrecord-1): describes single-dimensional, zero-indexed array records, where `T` can be either a primitive type or a `ClassRecord`.
- [`SZArrayRecord<T>`](https://learn.microsoft.com/dotnet/api/system.formats.nrbf.szarrayrecord-1): describes single-dimensional, zero-indexed array records, where `T` can be either a primitive type or a `SerializationRecord`.

```csharp
SerializationRecord rootObject = NrbfDecoder.Decode(payload); // payload is a Stream
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,13 @@ internal enum AllowedRecordTypes : uint
ArraySingleString = 1 << SerializationRecordType.ArraySingleString,

Nulls = ObjectNull | ObjectNullMultiple256 | ObjectNullMultiple,
Arrays = ArraySingleObject | ArraySinglePrimitive | ArraySingleString | BinaryArray,

/// <summary>
/// Any .NET object (a primitive, a reference type, a reference or single null).
/// </summary>
AnyObject = MemberPrimitiveTyped
| ArraySingleObject | ArraySinglePrimitive | ArraySingleString | BinaryArray
| Arrays
| ClassWithId | ClassWithMembersAndTypes | SystemClassWithMembersAndTypes
| BinaryObjectString
| MemberReference
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection.Metadata;
using System.Formats.Nrbf.Utils;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.Serialization;

namespace System.Formats.Nrbf;

Expand All @@ -27,12 +30,6 @@ private protected ArrayRecord(ArrayInfo arrayInfo)
/// <value>A buffer of integers that represent the number of elements in every dimension.</value>
public abstract ReadOnlySpan<int> Lengths { get; }

/// <summary>
/// When overridden in a derived class, gets the total number of all elements in every dimension.
/// </summary>
/// <value>A number that represent the total number of all elements in every dimension.</value>
public virtual long FlattenedLength => ArrayInfo.FlattenedLength;

/// <summary>
/// Gets the rank of the array.
/// </summary>
Expand Down Expand Up @@ -118,4 +115,86 @@ private void HandleNext(object value, NextInfo info, int size)
}

internal abstract (AllowedRecordTypes allowed, PrimitiveType primitiveType) GetAllowedRecordType();

internal static void Populate(List<SerializationRecord> source, Array destination, int[] lengths, AllowedRecordTypes allowedRecordTypes, bool allowNulls)
{
int[] indices = new int[lengths.Length];
nuint numElementsWritten = 0; // only for debugging; not used in release builds

foreach (SerializationRecord record in source)
{
object? value = GetActualValue(record, allowedRecordTypes, out int incrementCount);
if (value is not null)
{
// null is a default element for all array of reference types, so we don't call SetValue for nulls.
destination.SetValue(value, indices);
Debug.Assert(incrementCount == 1, "IncrementCount other than 1 is allowed only for null records.");
}
else if (!allowNulls)
{
ThrowHelper.ThrowArrayContainedNulls();
}

while (incrementCount > 0)
{
incrementCount--;
numElementsWritten++;
int dimension = indices.Length - 1;
while (dimension >= 0)
{
indices[dimension]++;
if (indices[dimension] < lengths[dimension])
{
break;
}
indices[dimension] = 0;
dimension--;
}

if (dimension < 0)
{
break;
}
}
}

Debug.Assert(numElementsWritten == (uint)source.Count, "We should have traversed the entirety of the source records collection.");
Debug.Assert(numElementsWritten == (ulong)destination.LongLength, "We should have traversed the entirety of the destination array.");
}

private static object? GetActualValue(SerializationRecord record, AllowedRecordTypes allowedRecordTypes, out int repeatCount)
{
repeatCount = 1;

if (record is NullsRecord nullsRecord)
{
repeatCount = nullsRecord.NullCount;
return null;
}
else if (record.RecordType == SerializationRecordType.MemberReference)
{
record = ((MemberReferenceRecord)record).GetReferencedRecord();
}

if (allowedRecordTypes == AllowedRecordTypes.BinaryObjectString)
{
if (record is not BinaryObjectStringRecord stringRecord)
{
throw new SerializationException(SR.Serialization_InvalidReference);
}

return stringRecord.Value;
}
else if (allowedRecordTypes == AllowedRecordTypes.Arrays)
{
if (record is not ArrayRecord arrayRecord)
{
throw new SerializationException(SR.Serialization_InvalidReference);
}

return arrayRecord;
}

return record;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Formats.Nrbf.Utils;
using System.Linq;
using System.Reflection.Metadata;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace System.Formats.Nrbf
{
internal sealed class ArrayRectangularPrimitiveRecord<T> : ArrayRecord where T : unmanaged
{
private readonly int[] _lengths;
private readonly IReadOnlyList<T> _values;
private TypeName? _typeName;

internal ArrayRectangularPrimitiveRecord(ArrayInfo arrayInfo, int[] lengths, IReadOnlyList<T> values) : base(arrayInfo)
{
_lengths = lengths;
_values = values;
ValuesToRead = 0; // there is nothing to read anymore
}

public override ReadOnlySpan<int> Lengths => _lengths;

public override SerializationRecordType RecordType => SerializationRecordType.BinaryArray;

public override TypeName TypeName
=> _typeName ??= TypeNameHelpers.GetPrimitiveTypeName(TypeNameHelpers.GetPrimitiveType<T>()).MakeArrayTypeName(Rank);

internal override (AllowedRecordTypes allowed, PrimitiveType primitiveType) GetAllowedRecordType() => throw new InvalidOperationException();

private protected override void AddValue(object value) => throw new InvalidOperationException();

[RequiresDynamicCode("May call Array.CreateInstance().")]
private protected override Array Deserialize(Type arrayType, bool allowNulls)
{
Array result =
#if NET9_0_OR_GREATER
Array.CreateInstanceFromArrayType(arrayType, _lengths);
#else
Array.CreateInstance(typeof(T), _lengths);
#endif
int[] indices = new int[_lengths.Length];
nuint numElementsWritten = 0; // only for debugging; not used in release builds

for (int i = 0; i < _values.Count; i++)
{
result.SetValue(_values[i], indices);
numElementsWritten++;

int dimension = indices.Length - 1;
while (dimension >= 0)
{
indices[dimension]++;
if (indices[dimension] < Lengths[dimension])
{
break;
}
indices[dimension] = 0;
dimension--;
}

if (dimension < 0)
{
break;
}
}

Debug.Assert(numElementsWritten == (uint)_values.Count, "We should have traversed the entirety of the source values collection.");
Debug.Assert(numElementsWritten == (ulong)result.LongLength, "We should have traversed the entirety of the destination array.");

return result;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ namespace System.Formats.Nrbf;
/// <remarks>
/// ArraySingleObject records are described in <see href="https://learn.microsoft.com/openspecs/windows_protocols/ms-nrbf/982b2f50-6367-402a-aaf2-44ee96e2a5e0">[MS-NRBF] 2.4.3.2</see>.
/// </remarks>
internal sealed class ArraySingleObjectRecord : SZArrayRecord<object?>
internal sealed class ArraySingleObjectRecord : SZArrayRecord<SerializationRecord>
{
private ArraySingleObjectRecord(ArrayInfo arrayInfo) : base(arrayInfo) => Records = [];
internal ArraySingleObjectRecord(ArrayInfo arrayInfo) : base(arrayInfo) => Records = [];

public override SerializationRecordType RecordType => SerializationRecordType.ArraySingleObject;

Expand All @@ -27,25 +27,26 @@ public override TypeName TypeName
private List<SerializationRecord> Records { get; }

/// <inheritdoc/>
public override object?[] GetArray(bool allowNulls = true)
=> (object?[])(allowNulls ? _arrayNullsAllowed ??= ToArray(true) : _arrayNullsNotAllowed ??= ToArray(false));
public override SerializationRecord?[] GetArray(bool allowNulls = true)
=> (SerializationRecord?[])(allowNulls ? _arrayNullsAllowed ??= ToArray(true) : _arrayNullsNotAllowed ??= ToArray(false));

private object?[] ToArray(bool allowNulls)
private SerializationRecord?[] ToArray(bool allowNulls)
{
object?[] values = new object?[Length];
SerializationRecord?[] values = new SerializationRecord?[Length];

int valueIndex = 0;
for (int recordIndex = 0; recordIndex < Records.Count; recordIndex++)
{
SerializationRecord record = Records[recordIndex];

int nullCount = record is NullsRecord nullsRecord ? nullsRecord.NullCount : 0;
if (nullCount == 0)
if (record is MemberReferenceRecord referenceRecord)
{
// "new object[] { <SELF> }" is special cased because it allows for storing reference to itself.
values[valueIndex++] = record is MemberReferenceRecord referenceRecord && referenceRecord.Reference.Equals(Id)
? values // a reference to self, and a way to get StackOverflow exception ;)
: record.GetValue();
record = referenceRecord.GetReferencedRecord();
}

if (record is not NullsRecord nullsRecord)
{
values[valueIndex++] = record;
continue;
}

Expand All @@ -54,6 +55,7 @@ public override TypeName TypeName
ThrowHelper.ThrowArrayContainedNulls();
}

int nullCount = nullsRecord.NullCount;
do
{
values[valueIndex++] = null;
Expand Down
Loading
Loading