diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index 3ff44e2bb..fc8734e1a 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -104,6 +104,7 @@ + @@ -129,6 +130,7 @@ + diff --git a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs index 04c94d089..5a86d4e81 100644 --- a/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/ILPrettyTestRunner.cs @@ -207,6 +207,12 @@ namespace ICSharpCode.Decompiler.Tests await Run(); } + [Test] + public async Task Issue3421() + { + await Run(); + } + [Test] public async Task Issue2260SwitchString() { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.cs b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.cs new file mode 100644 index 000000000..d09c674fd --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.cs @@ -0,0 +1,28 @@ +internal class Issue3421 +{ + private string name; + private object value; + + public virtual void SetValue(object value) + { + if (name == null) + { + return; + } + switch (name) + { + case "##Name##": + return; + case "##Value##": + this.value = value; + return; + case "##InnerText##": + this.value = value.ToString(); + return; + } + if (this.value == null) + { + this.value = ""; + } + } +} diff --git a/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.il b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.il new file mode 100644 index 000000000..541c8094b --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/ILPretty/Issue3421.il @@ -0,0 +1,116 @@ +#define CORE_ASSEMBLY "System.Runtime" + +.assembly extern CORE_ASSEMBLY +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:0:0:0 +} + +.class private auto ansi beforefieldinit Issue3421 + extends [CORE_ASSEMBLY]System.Object +{ + // Fields + .field private string name + .field private object 'value' + .field private static class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2 '<>f__switch$map1D' + .custom instance void [CORE_ASSEMBLY]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( + 01 00 00 00 + ) + + // Methods + .method public hidebysig virtual + instance void SetValue ( + object 'value' + ) cil managed + { + // Method begins at RVA 0x2050 + // Header size: 12 + // Code size: 180 (0xb4) + .maxstack 27 + .locals init ( + [0] string, + [1] class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2, + [2] int32 + ) + + IL_0000: ldarg.0 + IL_0001: ldfld string Issue3421::name + IL_0006: stloc.0 + IL_0007: ldloc.0 + IL_0008: brfalse IL_0093 + + IL_000d: ldsfld class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2 Issue3421::'<>f__switch$map1D' + IL_0012: brtrue IL_0048 + + IL_0017: ldc.i4.3 + IL_0018: newobj instance void class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2::.ctor(int32) + IL_001d: stloc.1 + IL_001e: ldloc.1 + IL_001f: ldstr "##Name##" + IL_0024: ldc.i4.0 + IL_0025: callvirt instance void class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2::Add(!0, !1) + IL_002a: ldloc.1 + IL_002b: ldstr "##Value##" + IL_0030: ldc.i4.1 + IL_0031: callvirt instance void class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2::Add(!0, !1) + IL_0036: ldloc.1 + IL_0037: ldstr "##InnerText##" + IL_003c: ldc.i4.2 + IL_003d: callvirt instance void class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2::Add(!0, !1) + IL_0042: ldloc.1 + IL_0043: stsfld class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2 Issue3421::'<>f__switch$map1D' + + IL_0048: ldsfld class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2 Issue3421::'<>f__switch$map1D' + IL_004d: ldloc.0 + IL_004e: ldloca.s 2 + IL_0050: callvirt instance bool class [CORE_ASSEMBLY]System.Collections.Generic.Dictionary`2::TryGetValue(!0, !1&) + IL_0055: brfalse IL_0098 + + IL_005a: ldloc.2 + IL_005b: switch (IL_0071, IL_0076, IL_0082) + + IL_006c: br IL_0098 + + IL_0071: br IL_00b3 + + IL_0076: ldarg.0 + IL_0077: ldarg.1 + IL_0078: stfld object Issue3421::'value' + IL_007d: br IL_00b3 + + IL_0082: ldarg.0 + IL_0083: ldarg.1 + IL_0084: callvirt instance string [CORE_ASSEMBLY]System.Object::ToString() + IL_0089: stfld object Issue3421::'value' + IL_008e: br IL_00b3 + + IL_0093: br IL_00b3 + + IL_0098: ldarg.0 + IL_0099: ldfld object Issue3421::'value' + IL_009e: brtrue IL_00ae + + IL_00a3: ldarg.0 + IL_00a4: ldstr "" + IL_00a9: stfld object Issue3421::'value' + + IL_00ae: br IL_00b3 + + IL_00b3: ret + } // end of method Issue3421::SetValue + + .method public hidebysig specialname rtspecialname + instance void .ctor () cil managed + { + // Method begins at RVA 0x2110 + // Header size: 1 + // Code size: 8 (0x8) + .maxstack 8 + + IL_0000: ldarg.0 + IL_0001: call instance void [CORE_ASSEMBLY]System.Object::.ctor() + IL_0006: nop + IL_0007: ret + } // end of method Issue3421::.ctor + +} // end of class Issue3421