Skip to content

Commit 412b513

Browse files
Merge pull request #3417 from icsharpcode/roslyn413
Roslyn 4.13
2 parents bada92e + f0f95ef commit 412b513

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

Diff for: Directory.Packages.props

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<PackageVersion Include="K4os.Compression.LZ4" Version="1.3.8" />
1616
<PackageVersion Include="McMaster.Extensions.CommandLineUtils" Version="4.1.1" />
1717
<PackageVersion Include="McMaster.Extensions.Hosting.CommandLine" Version="4.1.1" />
18-
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
19-
<PackageVersion Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.12.0" />
18+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
19+
<PackageVersion Include="Microsoft.CodeAnalysis.VisualBasic" Version="4.13.0" />
2020
<PackageVersion Include="Microsoft.DiaSymReader.Converter.Xml" Version="1.1.0-beta2-22171-02" />
2121
<PackageVersion Include="Microsoft.DiaSymReader" Version="1.4.0" />
2222
<PackageVersion Include="Microsoft.DiaSymReader.Native" Version="17.0.0-beta1.21524.1" />

Diff for: ICSharpCode.Decompiler/IL/ControlFlow/StateRangeAnalysis.cs

+26-3
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,8 @@
2121
using System;
2222
using System.Collections.Generic;
2323
using System.Diagnostics;
24-
using System.Diagnostics.CodeAnalysis;
2524
using System.Linq;
26-
using System.Text;
2725
using System.Threading;
28-
using System.Threading.Tasks;
2926

3027
using ICSharpCode.Decompiler.TypeSystem;
3128
using ICSharpCode.Decompiler.Util;
@@ -225,6 +222,32 @@ public LongSet AssignStateRanges(ILInstruction inst, LongSet stateRange)
225222
goto default;
226223
}
227224
}
225+
case StObj stobj when mode == StateRangeAnalysisMode.IteratorDispose:
226+
{
227+
if (stobj.MatchStFld(out var target, out var field, out var value) && target.MatchLdThis())
228+
{
229+
if (field.MemberDefinition == stateField && value.MatchLdcI4(-2))
230+
{
231+
// Roslyn 4.13 sets the state field in Dispose() to mark the iterator as disposed,
232+
// don't consider this user code.
233+
return stateRange;
234+
}
235+
else if (value.MatchDefaultOrNullOrZero())
236+
{
237+
// Roslyn 4.13 clears any local hoisted local variables in Dispose(),
238+
// don't consider this user code.
239+
return stateRange;
240+
}
241+
else
242+
{
243+
goto default;
244+
}
245+
}
246+
else
247+
{
248+
goto default;
249+
}
250+
}
228251
default:
229252
// User code - abort analysis
230253
if (mode == StateRangeAnalysisMode.IteratorDispose && !(inst is Leave l && l.IsLeavingFunction))

0 commit comments

Comments
 (0)