Browse Source

Fix #1042: Wrong decompile result for collection initializers

pull/1040/head
Siegfried Pammer 7 years ago
parent
commit
9689667515
  1. 15
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs
  2. 12
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il
  3. 12
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il
  4. 45
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il
  5. 50
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il
  6. 2
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

15
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs

@ -376,6 +376,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -376,6 +376,21 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
}
});
}
public void NestedListWithIndexInitializer()
{
#if !OPT
List<List<int>> list = new List<List<int>> {
#else
List<List<int>> obj = new List<List<int>> {
#endif
[0] = {
1,
2,
3
}
};
}
#endif
public static void ObjectInitializerWithInitializationOfDeeplyNestedObjects()

12
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.il

@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly '31sn40gd'
.assembly rzivg0mq
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
@ -25,15 +25,15 @@ @@ -25,15 +25,15 @@
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module '31sn40gd.dll'
// MVID: {EE7CB403-8040-4C94-B17A-F697CE60CA23}
.module rzivg0mq.dll
// MVID: {66592AAC-07E3-4F52-A96F-0428775E7A0F}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02FB0000
// Image base: 0x00E00000
// =============== CLASS MEMBERS DECLARATION ===================
@ -1513,8 +1513,8 @@ @@ -1513,8 +1513,8 @@
IL_0006: ret
} // end of method InitializerTests::.ctor
.method private hidebysig static void '<NotAnObjectInitializerWithEvent>b__7'(object sender,
class [mscorlib]System.EventArgs e) cil managed
.method private hidebysig static void '<NotAnObjectInitializerWithEvent>b__7'(object param0,
class [mscorlib]System.EventArgs param1) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 8 (0x8)

12
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.il

@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly awwuldf0
.assembly n52bfodk
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
@ -25,15 +25,15 @@ @@ -25,15 +25,15 @@
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module awwuldf0.dll
// MVID: {59891EFA-EBA3-4F9A-9034-4F24037CEC15}
.module n52bfodk.dll
// MVID: {2B30E2AC-D797-4A69-ACEC-93251C343504}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x03070000
// Image base: 0x037A0000
// =============== CLASS MEMBERS DECLARATION ===================
@ -1275,8 +1275,8 @@ @@ -1275,8 +1275,8 @@
IL_0006: ret
} // end of method InitializerTests::.ctor
.method private hidebysig static void '<NotAnObjectInitializerWithEvent>b__7'(object sender,
class [mscorlib]System.EventArgs e) cil managed
.method private hidebysig static void '<NotAnObjectInitializerWithEvent>b__7'(object param0,
class [mscorlib]System.EventArgs param1) cil managed
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
// Code size 6 (0x6)

45
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.opt.roslyn.il

@ -30,14 +30,14 @@ @@ -30,14 +30,14 @@
.ver 0:0:0:0
}
.module InitializerTests.dll
// MVID: {8AE31202-72A4-4C73-86BF-EE49F9DE8C56}
// MVID: {AA17E92F-AE3B-4AA5-91C9-716D2E842EE5}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02EC0000
// Image base: 0x01160000
// =============== CLASS MEMBERS DECLARATION ===================
@ -504,7 +504,7 @@ @@ -504,7 +504,7 @@
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9'
.field public static class [mscorlib]System.EventHandler '<>9__23_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__42_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__43_0'
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
@ -526,8 +526,8 @@ @@ -526,8 +526,8 @@
} // end of method '<>c'::.ctor
.method assembly hidebysig instance void
'<NotAnObjectInitializerWithEvent>b__23_0'(object sender,
class [mscorlib]System.EventArgs e) cil managed
'<NotAnObjectInitializerWithEvent>b__23_0'(object '<p0>',
class [mscorlib]System.EventArgs '<p1>') cil managed
{
// Code size 6 (0x6)
.maxstack 8
@ -536,7 +536,7 @@ @@ -536,7 +536,7 @@
} // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0'
.method assembly hidebysig instance bool
'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
'<Bug270_NestedInitialisers>b__43_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
{
// Code size 17 (0x11)
.maxstack 8
@ -546,7 +546,7 @@ @@ -546,7 +546,7 @@
IL_000b: call bool [mscorlib]System.String::op_Equality(string,
string)
IL_0010: ret
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__42_0'
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__43_0'
} // end of class '<>c'
@ -1064,6 +1064,31 @@ @@ -1064,6 +1064,31 @@
IL_0081: ret
} // end of method InitializerTests::MixedObjectAndDictInitializer
.method public hidebysig instance void
NestedListWithIndexInitializer() cil managed
{
// Code size 46 (0x2e)
.maxstack 8
IL_0000: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::.ctor()
IL_0005: dup
IL_0006: ldc.i4.0
IL_0007: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_000c: ldc.i4.1
IL_000d: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_0012: dup
IL_0013: ldc.i4.0
IL_0014: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_0019: ldc.i4.2
IL_001a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_001f: dup
IL_0020: ldc.i4.0
IL_0021: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_0026: ldc.i4.3
IL_0027: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_002c: pop
IL_002d: ret
} // end of method InitializerTests::NestedListWithIndexInitializer
.method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed
{
// Code size 77 (0x4d)
@ -1282,17 +1307,17 @@ @@ -1282,17 +1307,17 @@
IL_0033: callvirt instance void [mscorlib]System.Globalization.CultureInfo::set_DateTimeFormat(class [mscorlib]System.Globalization.DateTimeFormatInfo)
IL_0038: dup
IL_0039: ldloc.0
IL_003a: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_003a: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__43_0'
IL_003f: dup
IL_0040: brtrue.s IL_0059
IL_0042: pop
IL_0043: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9'
IL_0048: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_0048: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__43_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_004e: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object,
native int)
IL_0053: dup
IL_0054: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_0054: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__43_0'
IL_0059: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [mscorlib]System.Func`2<!!0,bool>)
IL_005e: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)

50
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.roslyn.il

@ -30,14 +30,14 @@ @@ -30,14 +30,14 @@
.ver 0:0:0:0
}
.module InitializerTests.dll
// MVID: {4E6BCF8B-3662-4EB0-88AA-8085A69A4D25}
// MVID: {3A200EF2-470A-47EB-B524-B0751246AB5E}
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( 01 00 00 00 )
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x02C10000
// Image base: 0x010E0000
// =============== CLASS MEMBERS DECLARATION ===================
@ -531,7 +531,7 @@ @@ -531,7 +531,7 @@
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
.field public static initonly class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' '<>9'
.field public static class [mscorlib]System.EventHandler '<>9__23_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__42_0'
.field public static class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> '<>9__43_0'
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
@ -554,8 +554,8 @@ @@ -554,8 +554,8 @@
} // end of method '<>c'::.ctor
.method assembly hidebysig instance void
'<NotAnObjectInitializerWithEvent>b__23_0'(object sender,
class [mscorlib]System.EventArgs e) cil managed
'<NotAnObjectInitializerWithEvent>b__23_0'(object '<p0>',
class [mscorlib]System.EventArgs '<p1>') cil managed
{
// Code size 8 (0x8)
.maxstack 8
@ -566,7 +566,7 @@ @@ -566,7 +566,7 @@
} // end of method '<>c'::'<NotAnObjectInitializerWithEvent>b__23_0'
.method assembly hidebysig instance bool
'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
'<Bug270_NestedInitialisers>b__43_0'(class [mscorlib]System.Globalization.NumberFormatInfo format) cil managed
{
// Code size 17 (0x11)
.maxstack 8
@ -576,7 +576,7 @@ @@ -576,7 +576,7 @@
IL_000b: call bool [mscorlib]System.String::op_Equality(string,
string)
IL_0010: ret
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__42_0'
} // end of method '<>c'::'<Bug270_NestedInitialisers>b__43_0'
} // end of class '<>c'
@ -1245,6 +1245,36 @@ @@ -1245,6 +1245,36 @@
IL_0088: ret
} // end of method InitializerTests::MixedObjectAndDictInitializer
.method public hidebysig instance void
NestedListWithIndexInitializer() cil managed
{
// Code size 50 (0x32)
.maxstack 3
.locals init (class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>> V_0)
IL_0000: nop
IL_0001: newobj instance void class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::.ctor()
IL_0006: dup
IL_0007: ldc.i4.0
IL_0008: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_000d: ldc.i4.1
IL_000e: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_0013: nop
IL_0014: dup
IL_0015: ldc.i4.0
IL_0016: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_001b: ldc.i4.2
IL_001c: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_0021: nop
IL_0022: dup
IL_0023: ldc.i4.0
IL_0024: callvirt instance !0 class [mscorlib]System.Collections.Generic.List`1<class [mscorlib]System.Collections.Generic.List`1<int32>>::get_Item(int32)
IL_0029: ldc.i4.3
IL_002a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::Add(!0)
IL_002f: nop
IL_0030: stloc.0
IL_0031: ret
} // end of method InitializerTests::NestedListWithIndexInitializer
.method public hidebysig static void ObjectInitializerWithInitializationOfDeeplyNestedObjects() cil managed
{
// Code size 82 (0x52)
@ -1499,17 +1529,17 @@ @@ -1499,17 +1529,17 @@
IL_003b: nop
IL_003c: dup
IL_003d: ldloc.0
IL_003e: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_003e: ldsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__43_0'
IL_0043: dup
IL_0044: brtrue.s IL_005d
IL_0046: pop
IL_0047: ldsfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c' ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9'
IL_004c: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__42_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_004c: ldftn instance bool ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<Bug270_NestedInitialisers>b__43_0'(class [mscorlib]System.Globalization.NumberFormatInfo)
IL_0052: newobj instance void class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool>::.ctor(object,
native int)
IL_0057: dup
IL_0058: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__42_0'
IL_0058: stsfld class [mscorlib]System.Func`2<class [mscorlib]System.Globalization.NumberFormatInfo,bool> ICSharpCode.Decompiler.Tests.TestCases.Pretty.InitializerTests/'<>c'::'<>9__43_0'
IL_005d: call class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0> [System.Core]System.Linq.Enumerable::Where<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>,
class [mscorlib]System.Func`2<!!0,bool>)
IL_0062: call !!0 [System.Core]System.Linq.Enumerable::First<class [mscorlib]System.Globalization.NumberFormatInfo>(class [mscorlib]System.Collections.Generic.IEnumerable`1<!!0>)

2
ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

@ -254,7 +254,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -254,7 +254,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
instruction = call.Arguments[0];
if (method.IsAccessor) {
var property = method.AccessorOwner as IProperty;
var isGetter = property?.Getter == method;
var isGetter = method.Equals(property?.Getter);
var indices = call.Arguments.Skip(1).Take(call.Arguments.Count - (isGetter ? 1 : 2)).ToArray();
if (possibleIndexVariables != null) {
// Mark all index variables as used

Loading…
Cancel
Save