From 3c720b2030a6cbbb88c88474c6d39c03c1743b31 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 14 Jan 2018 16:09:23 +0100 Subject: [PATCH] Implement ?. operator when the result of the call is not used For example: "if (x != null) x.M();" -> "x?.M();" --- .../TestCases/Pretty/NullPropagation.cs | 62 +- .../Pretty/NullPropagation.opt.roslyn.il | 652 --------------- .../Pretty/NullPropagation.roslyn.il | 779 ------------------ .../CSharp/CSharpDecompiler.cs | 1 + .../CSharp/Transforms/DeclareVariables.cs | 2 + .../IL/Transforms/ILInlining.cs | 3 + .../IL/Transforms/NullPropagationTransform.cs | 57 ++ 7 files changed, 103 insertions(+), 1453 deletions(-) delete mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.opt.roslyn.il delete mode 100644 ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.roslyn.il diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.cs index 3cd1c57ce..17606500d 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.cs @@ -86,11 +86,15 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty return this.GetString()?.Substring(this.GetInt()); } + public void CallSubstringAndIgnoreResult() + { + this.GetString()?.Substring(this.GetInt()); + } + private void Use(T t) { } -#if VOID_SUPPORTED public void CallDone() { this.GetMyClass()?.Done(); @@ -98,30 +102,33 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty this.GetMyClass()?.Field.Done(); this.GetMyClass()?.Property?.Done(); this.GetMyClass()?.Property.Done(); - this.GetMyClass()?.Method(GetInt())?.Done(); - this.GetMyClass()?.Method(GetInt()).Done(); - this.GetMyClass()?[GetInt()]?.Done(); - this.GetMyClass()?[GetInt()].Done(); + this.GetMyClass()?.Method(this.GetInt())?.Done(); + this.GetMyClass()?.Method(this.GetInt()).Done(); + this.GetMyClass()?[this.GetInt()]?.Done(); + this.GetMyClass()?[this.GetInt()].Done(); } public void CallDoneStruct() { this.GetMyStruct()?.Done(); +#if STRUCT_SPLITTING_IMPROVED this.GetMyStruct()?.Field?.Done(); this.GetMyStruct()?.Field.Done(); this.GetMyStruct()?.Property1?.Done(); this.GetMyStruct()?.Property2.Done(); - this.GetMyStruct()?.Method1(GetInt())?.Done(); - this.GetMyStruct()?.Method2(GetInt()).Done(); - this.GetMyStruct()?[GetInt()]?.Done(); - } + this.GetMyStruct()?.Method1(this.GetInt())?.Done(); + this.GetMyStruct()?.Method2(this.GetInt()).Done(); + this.GetMyStruct()?[this.GetInt()]?.Done(); #endif + } public void RequiredParentheses() { (this.GetMyClass()?.Field).Done(); (this.GetMyClass()?.Method(this.GetInt())).Done(); - // (GetMyStruct()?.Property2)?.Done(); +#if STRUCT_SPLITTING_IMPROVED + (GetMyStruct()?.Property2)?.Done(); +#endif } public int?[] ChainsOnClass() @@ -140,16 +147,18 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty } #if STRUCT_SPLITTING_IMPROVED - public int? SumOfChainsStruct() - { - return this.GetMyStruct()?.IntVal - + this.GetMyStruct()?.Field.IntVal - + this.GetMyStruct()?.Field?.IntVal - + this.GetMyStruct()?.Property2.IntVal - + this.GetMyStruct()?.Property1?.IntVal - + this.GetMyStruct()?.Method2(this.GetInt()).IntVal - + this.GetMyStruct()?.Method1(this.GetInt())?.IntVal - + this.GetMyStruct()?[this.GetInt()]?.IntVal; + public int?[] ChainsStruct() + { + return new int?[8] { + this.GetMyStruct()?.IntVal, + this.GetMyStruct()?.Field.IntVal, + this.GetMyStruct()?.Field?.IntVal, + this.GetMyStruct()?.Property2.IntVal, + this.GetMyStruct()?.Property1?.IntVal, + this.GetMyStruct()?.Method2(this.GetInt()).IntVal, + this.GetMyStruct()?.Method1(this.GetInt())?.IntVal, + this.GetMyStruct()?[this.GetInt()]?.IntVal + }; } #endif @@ -168,12 +177,10 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty this.Use(this.GetMyClass()?.Text ?? "Hello"); } -#if VOID_SUPPORTED public void InvokeDelegate(EventHandler eh) { eh?.Invoke(null, EventArgs.Empty); } -#endif public int? InvokeDelegate(Func f) { @@ -191,5 +198,16 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty } Console.WriteLine("end of method"); } + + private void Setter(MyClass c) + { + if (c != null) { + c.IntVal = 1; + } + Console.WriteLine(); + if (c != null) { + c.Property = null; + } + } } } diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.opt.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.opt.roslyn.il deleted file mode 100644 index a793fc08e..000000000 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.opt.roslyn.il +++ /dev/null @@ -1,652 +0,0 @@ - -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 -// Copyright (c) Microsoft Corporation. All rights reserved. - - - -// Metadata version: v4.0.30319 -.assembly extern mscorlib -{ - .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. - .ver 4:0:0:0 -} -.assembly NullPropagation -{ - .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 - 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. - - // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) - - .permissionset reqmin - = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} - .hash algorithm 0x00008004 - .ver 0:0:0:0 -} -.module NullPropagation.dll -// MVID: {024CEB8E-C4C6-4326-B706-A762E1916CDA} -.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: 0x032C0000 - - -// =============== CLASS MEMBERS DECLARATION =================== - -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation - extends [mscorlib]System.Object -{ - .class auto ansi nested private beforefieldinit MyClass - extends [mscorlib]System.Object - { - .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item.. - .field public int32 IntVal - .field public string Text - .field public class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass Field - .field private class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass 'k__BackingField' - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - .method public hidebysig specialname - instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - get_Property() cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::'k__BackingField' - IL_0006: ret - } // end of method MyClass::get_Property - - .method public hidebysig specialname - instance void set_Property(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass 'value') cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: stfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::'k__BackingField' - IL_0007: ret - } // end of method MyClass::set_Property - - .method public hidebysig specialname - instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - get_Item(int32 index) cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: ldnull - IL_0001: ret - } // end of method MyClass::get_Item - - .method public hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Method(int32 arg) cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: ldnull - IL_0001: ret - } // end of method MyClass::Method - - .method public hidebysig instance void - Done() cil managed - { - // Code size 1 (0x1) - .maxstack 8 - IL_0000: ret - } // end of method MyClass::Done - - .method public hidebysig specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void [mscorlib]System.Object::.ctor() - IL_0006: ret - } // end of method MyClass::.ctor - - .property instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Property() - { - .get instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - .set instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::set_Property(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass) - } // end of property MyClass::Property - .property instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Item(int32) - { - .get instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - } // end of property MyClass::Item - } // end of class MyClass - - .class sequential ansi sealed nested private beforefieldinit MyStruct - extends [mscorlib]System.ValueType - { - .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item.. - .field public int32 IntVal - .field public class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass Field - .method public hidebysig specialname - instance valuetype [mscorlib]System.Nullable`1 - get_Property1() cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj valuetype [mscorlib]System.Nullable`1 - IL_0008: ldloc.0 - IL_0009: ret - } // end of method MyStruct::get_Property1 - - .method public hidebysig specialname - instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - get_Property2() cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - IL_0008: ldloc.0 - IL_0009: ret - } // end of method MyStruct::get_Property2 - - .method public hidebysig specialname - instance valuetype [mscorlib]System.Nullable`1 - get_Item(int32 index) cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj valuetype [mscorlib]System.Nullable`1 - IL_0008: ldloc.0 - IL_0009: ret - } // end of method MyStruct::get_Item - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1 - Method1(int32 arg) cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj valuetype [mscorlib]System.Nullable`1 - IL_0008: ldloc.0 - IL_0009: ret - } // end of method MyStruct::Method1 - - .method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - Method2(int32 arg) cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - IL_0008: ldloc.0 - IL_0009: ret - } // end of method MyStruct::Method2 - - .method public hidebysig instance void - Done() cil managed - { - // Code size 1 (0x1) - .maxstack 8 - IL_0000: ret - } // end of method MyStruct::Done - - .property instance valuetype [mscorlib]System.Nullable`1 - Property1() - { - .get instance valuetype [mscorlib]System.Nullable`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Property1() - } // end of property MyStruct::Property1 - .property instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - Property2() - { - .get instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Property2() - } // end of property MyStruct::Property2 - .property instance valuetype [mscorlib]System.Nullable`1 - Item(int32) - { - .get instance valuetype [mscorlib]System.Nullable`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Item(int32) - } // end of property MyStruct::Item - } // end of class MyStruct - - .method private hidebysig instance int32 - GetInt() cil managed - { - // Code size 3 (0x3) - .maxstack 8 - IL_0000: ldc.i4.s 9 - IL_0002: ret - } // end of method NullPropagation::GetInt - - .method private hidebysig instance string - GetString() cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: ldnull - IL_0001: ret - } // end of method NullPropagation::GetString - - .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - GetMyClass() cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: ldnull - IL_0001: ret - } // end of method NullPropagation::GetMyClass - - .method private hidebysig instance valuetype [mscorlib]System.Nullable`1 - GetMyStruct() cil managed - { - // Code size 10 (0xa) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldloca.s V_0 - IL_0002: initobj valuetype [mscorlib]System.Nullable`1 - IL_0008: ldloc.0 - IL_0009: ret - } // end of method NullPropagation::GetMyStruct - - .method public hidebysig instance string - Substring() cil managed - { - // Code size 24 (0x18) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetString() - IL_0006: dup - IL_0007: brtrue.s IL_000c - - IL_0009: pop - IL_000a: ldnull - IL_000b: ret - - IL_000c: ldarg.0 - IL_000d: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0012: call instance string [mscorlib]System.String::Substring(int32) - IL_0017: ret - } // end of method NullPropagation::Substring - - .method private hidebysig instance void - Use(!!T t) cil managed - { - // Code size 1 (0x1) - .maxstack 8 - IL_0000: ret - } // end of method NullPropagation::Use - - .method public hidebysig instance void - RequiredParentheses() cil managed - { - // Code size 53 (0x35) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0006: dup - IL_0007: brtrue.s IL_000d - - IL_0009: pop - IL_000a: ldnull - IL_000b: br.s IL_0012 - - IL_000d: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_0012: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Done() - IL_0017: ldarg.0 - IL_0018: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_001d: dup - IL_001e: brtrue.s IL_0024 - - IL_0020: pop - IL_0021: ldnull - IL_0022: br.s IL_002f - - IL_0024: ldarg.0 - IL_0025: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_002a: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_002f: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Done() - IL_0034: ret - } // end of method NullPropagation::RequiredParentheses - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1[] - ChainsOnClass() cil managed - { - // Code size 474 (0x1da) - .maxstack 5 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldc.i4.s 9 - IL_0002: newarr valuetype [mscorlib]System.Nullable`1 - IL_0007: dup - IL_0008: ldc.i4.0 - IL_0009: ldarg.0 - IL_000a: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_000f: dup - IL_0010: brtrue.s IL_001e - - IL_0012: pop - IL_0013: ldloca.s V_0 - IL_0015: initobj valuetype [mscorlib]System.Nullable`1 - IL_001b: ldloc.0 - IL_001c: br.s IL_0028 - - IL_001e: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0023: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0028: stelem valuetype [mscorlib]System.Nullable`1 - IL_002d: dup - IL_002e: ldc.i4.1 - IL_002f: ldarg.0 - IL_0030: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0035: dup - IL_0036: brtrue.s IL_0044 - - IL_0038: pop - IL_0039: ldloca.s V_0 - IL_003b: initobj valuetype [mscorlib]System.Nullable`1 - IL_0041: ldloc.0 - IL_0042: br.s IL_0053 - - IL_0044: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_0049: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_004e: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0053: stelem valuetype [mscorlib]System.Nullable`1 - IL_0058: dup - IL_0059: ldc.i4.2 - IL_005a: ldarg.0 - IL_005b: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0060: dup - IL_0061: brtrue.s IL_006f - - IL_0063: pop - IL_0064: ldloca.s V_0 - IL_0066: initobj valuetype [mscorlib]System.Nullable`1 - IL_006c: ldloc.0 - IL_006d: br.s IL_008d - - IL_006f: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_0074: dup - IL_0075: brtrue.s IL_0083 - - IL_0077: pop - IL_0078: ldloca.s V_0 - IL_007a: initobj valuetype [mscorlib]System.Nullable`1 - IL_0080: ldloc.0 - IL_0081: br.s IL_008d - - IL_0083: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0088: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_008d: stelem valuetype [mscorlib]System.Nullable`1 - IL_0092: dup - IL_0093: ldc.i4.3 - IL_0094: ldarg.0 - IL_0095: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_009a: dup - IL_009b: brtrue.s IL_00a9 - - IL_009d: pop - IL_009e: ldloca.s V_0 - IL_00a0: initobj valuetype [mscorlib]System.Nullable`1 - IL_00a6: ldloc.0 - IL_00a7: br.s IL_00b8 - - IL_00a9: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - IL_00ae: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_00b3: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_00b8: stelem valuetype [mscorlib]System.Nullable`1 - IL_00bd: dup - IL_00be: ldc.i4.4 - IL_00bf: ldarg.0 - IL_00c0: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_00c5: dup - IL_00c6: brtrue.s IL_00d4 - - IL_00c8: pop - IL_00c9: ldloca.s V_0 - IL_00cb: initobj valuetype [mscorlib]System.Nullable`1 - IL_00d1: ldloc.0 - IL_00d2: br.s IL_00f2 - - IL_00d4: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - IL_00d9: dup - IL_00da: brtrue.s IL_00e8 - - IL_00dc: pop - IL_00dd: ldloca.s V_0 - IL_00df: initobj valuetype [mscorlib]System.Nullable`1 - IL_00e5: ldloc.0 - IL_00e6: br.s IL_00f2 - - IL_00e8: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_00ed: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_00f2: stelem valuetype [mscorlib]System.Nullable`1 - IL_00f7: dup - IL_00f8: ldc.i4.5 - IL_00f9: ldarg.0 - IL_00fa: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_00ff: dup - IL_0100: brtrue.s IL_010e - - IL_0102: pop - IL_0103: ldloca.s V_0 - IL_0105: initobj valuetype [mscorlib]System.Nullable`1 - IL_010b: ldloc.0 - IL_010c: br.s IL_0123 - - IL_010e: ldarg.0 - IL_010f: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0114: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_0119: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_011e: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0123: stelem valuetype [mscorlib]System.Nullable`1 - IL_0128: dup - IL_0129: ldc.i4.6 - IL_012a: ldarg.0 - IL_012b: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0130: dup - IL_0131: brtrue.s IL_013f - - IL_0133: pop - IL_0134: ldloca.s V_0 - IL_0136: initobj valuetype [mscorlib]System.Nullable`1 - IL_013c: ldloc.0 - IL_013d: br.s IL_0163 - - IL_013f: ldarg.0 - IL_0140: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0145: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_014a: dup - IL_014b: brtrue.s IL_0159 - - IL_014d: pop - IL_014e: ldloca.s V_0 - IL_0150: initobj valuetype [mscorlib]System.Nullable`1 - IL_0156: ldloc.0 - IL_0157: br.s IL_0163 - - IL_0159: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_015e: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0163: stelem valuetype [mscorlib]System.Nullable`1 - IL_0168: dup - IL_0169: ldc.i4.7 - IL_016a: ldarg.0 - IL_016b: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0170: dup - IL_0171: brtrue.s IL_017f - - IL_0173: pop - IL_0174: ldloca.s V_0 - IL_0176: initobj valuetype [mscorlib]System.Nullable`1 - IL_017c: ldloc.0 - IL_017d: br.s IL_0194 - - IL_017f: ldarg.0 - IL_0180: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0185: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - IL_018a: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_018f: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0194: stelem valuetype [mscorlib]System.Nullable`1 - IL_0199: dup - IL_019a: ldc.i4.8 - IL_019b: ldarg.0 - IL_019c: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_01a1: dup - IL_01a2: brtrue.s IL_01b0 - - IL_01a4: pop - IL_01a5: ldloca.s V_0 - IL_01a7: initobj valuetype [mscorlib]System.Nullable`1 - IL_01ad: ldloc.0 - IL_01ae: br.s IL_01d4 - - IL_01b0: ldarg.0 - IL_01b1: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_01b6: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - IL_01bb: dup - IL_01bc: brtrue.s IL_01ca - - IL_01be: pop - IL_01bf: ldloca.s V_0 - IL_01c1: initobj valuetype [mscorlib]System.Nullable`1 - IL_01c7: ldloc.0 - IL_01c8: br.s IL_01d4 - - IL_01ca: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_01cf: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_01d4: stelem valuetype [mscorlib]System.Nullable`1 - IL_01d9: ret - } // end of method NullPropagation::ChainsOnClass - - .method public hidebysig instance int32 - CoalescingReturn() cil managed - { - // Code size 18 (0x12) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0006: dup - IL_0007: brtrue.s IL_000c - - IL_0009: pop - IL_000a: ldc.i4.1 - IL_000b: ret - - IL_000c: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0011: ret - } // end of method NullPropagation::CoalescingReturn - - .method public hidebysig instance void - Coalescing() cil managed - { - // Code size 25 (0x19) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.0 - IL_0002: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0007: dup - IL_0008: brtrue.s IL_000e - - IL_000a: pop - IL_000b: ldc.i4.1 - IL_000c: br.s IL_0013 - - IL_000e: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0013: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::Use(!!0) - IL_0018: ret - } // end of method NullPropagation::Coalescing - - .method public hidebysig instance void - CoalescingString() cil managed - { - // Code size 34 (0x22) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.0 - IL_0002: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0007: dup - IL_0008: brtrue.s IL_000e - - IL_000a: pop - IL_000b: ldnull - IL_000c: br.s IL_0013 - - IL_000e: ldfld string ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Text - IL_0013: dup - IL_0014: brtrue.s IL_001c - - IL_0016: pop - IL_0017: ldstr "Hello" - IL_001c: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::Use(!!0) - IL_0021: ret - } // end of method NullPropagation::CoalescingString - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1 - InvokeDelegate(class [mscorlib]System.Func`1 f) cil managed - { - // Code size 25 (0x19) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0) - IL_0000: ldarg.1 - IL_0001: brtrue.s IL_000d - - IL_0003: ldloca.s V_0 - IL_0005: initobj valuetype [mscorlib]System.Nullable`1 - IL_000b: ldloc.0 - IL_000c: ret - - IL_000d: ldarg.1 - IL_000e: callvirt instance !0 class [mscorlib]System.Func`1::Invoke() - IL_0013: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0018: ret - } // end of method NullPropagation::InvokeDelegate - - .method private hidebysig instance void - NotNullPropagation(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass c) cil managed - { - // Code size 53 (0x35) - .maxstack 8 - IL_0000: ldarg.1 - IL_0001: brfalse.s IL_0015 - - IL_0003: ldarg.1 - IL_0004: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0009: brfalse.s IL_0015 - - IL_000b: ldstr "non-zero" - IL_0010: call void [mscorlib]System.Console::WriteLine(string) - IL_0015: ldarg.1 - IL_0016: brfalse.s IL_0020 - - IL_0018: ldarg.1 - IL_0019: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_001e: brtrue.s IL_002a - - IL_0020: ldstr "null or zero" - IL_0025: call void [mscorlib]System.Console::WriteLine(string) - IL_002a: ldstr "end of method" - IL_002f: call void [mscorlib]System.Console::WriteLine(string) - IL_0034: ret - } // end of method NullPropagation::NotNullPropagation - - .method public hidebysig specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void [mscorlib]System.Object::.ctor() - IL_0006: ret - } // end of method NullPropagation::.ctor - -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation - - -// ============================================================= - -// *********** DISASSEMBLY COMPLETE *********************** diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.roslyn.il b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.roslyn.il deleted file mode 100644 index 02ebb9c54..000000000 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/NullPropagation.roslyn.il +++ /dev/null @@ -1,779 +0,0 @@ - -// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 -// Copyright (c) Microsoft Corporation. All rights reserved. - - - -// Metadata version: v4.0.30319 -.assembly extern mscorlib -{ - .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. - .ver 4:0:0:0 -} -.assembly NullPropagation -{ - .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 - 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. - - // --- The following custom attribute is added automatically, do not uncomment ------- - // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) - - .permissionset reqmin - = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'SkipVerification' = bool(true)}} - .hash algorithm 0x00008004 - .ver 0:0:0:0 -} -.module NullPropagation.dll -// MVID: {AE2302E9-5EE9-4939-BCA6-21C8604BB095} -.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: 0x04900000 - - -// =============== CLASS MEMBERS DECLARATION =================== - -.class private auto ansi beforefieldinit ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation - extends [mscorlib]System.Object -{ - .class auto ansi nested private beforefieldinit MyClass - extends [mscorlib]System.Object - { - .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item.. - .field public int32 IntVal - .field public string Text - .field public class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass Field - .field private class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass 'k__BackingField' - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) - .method public hidebysig specialname - instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - get_Property() cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 7 (0x7) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::'k__BackingField' - IL_0006: ret - } // end of method MyClass::get_Property - - .method public hidebysig specialname - instance void set_Property(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass 'value') cil managed - { - .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: ldarg.1 - IL_0002: stfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::'k__BackingField' - IL_0007: ret - } // end of method MyClass::set_Property - - .method public hidebysig specialname - instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - get_Item(int32 index) cil managed - { - // Code size 7 (0x7) - .maxstack 1 - .locals init (class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass V_0) - IL_0000: nop - IL_0001: ldnull - IL_0002: stloc.0 - IL_0003: br.s IL_0005 - - IL_0005: ldloc.0 - IL_0006: ret - } // end of method MyClass::get_Item - - .method public hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Method(int32 arg) cil managed - { - // Code size 7 (0x7) - .maxstack 1 - .locals init (class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass V_0) - IL_0000: nop - IL_0001: ldnull - IL_0002: stloc.0 - IL_0003: br.s IL_0005 - - IL_0005: ldloc.0 - IL_0006: ret - } // end of method MyClass::Method - - .method public hidebysig instance void - Done() cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: nop - IL_0001: ret - } // end of method MyClass::Done - - .method public hidebysig specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void [mscorlib]System.Object::.ctor() - IL_0006: nop - IL_0007: ret - } // end of method MyClass::.ctor - - .property instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Property() - { - .get instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - .set instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::set_Property(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass) - } // end of property MyClass::Property - .property instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - Item(int32) - { - .get instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - } // end of property MyClass::Item - } // end of class MyClass - - .class sequential ansi sealed nested private beforefieldinit MyStruct - extends [mscorlib]System.ValueType - { - .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item.. - .field public int32 IntVal - .field public class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass Field - .method public hidebysig specialname - instance valuetype [mscorlib]System.Nullable`1 - get_Property1() cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1 V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj valuetype [mscorlib]System.Nullable`1 - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method MyStruct::get_Property1 - - .method public hidebysig specialname - instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - get_Property2() cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_0, - valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method MyStruct::get_Property2 - - .method public hidebysig specialname - instance valuetype [mscorlib]System.Nullable`1 - get_Item(int32 index) cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1 V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj valuetype [mscorlib]System.Nullable`1 - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method MyStruct::get_Item - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1 - Method1(int32 arg) cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1 V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj valuetype [mscorlib]System.Nullable`1 - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method MyStruct::Method1 - - .method public hidebysig instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - Method2(int32 arg) cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_0, - valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method MyStruct::Method2 - - .method public hidebysig instance void - Done() cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: nop - IL_0001: ret - } // end of method MyStruct::Done - - .property instance valuetype [mscorlib]System.Nullable`1 - Property1() - { - .get instance valuetype [mscorlib]System.Nullable`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Property1() - } // end of property MyStruct::Property1 - .property instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct - Property2() - { - .get instance valuetype ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Property2() - } // end of property MyStruct::Property2 - .property instance valuetype [mscorlib]System.Nullable`1 - Item(int32) - { - .get instance valuetype [mscorlib]System.Nullable`1 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyStruct::get_Item(int32) - } // end of property MyStruct::Item - } // end of class MyStruct - - .method private hidebysig instance int32 - GetInt() cil managed - { - // Code size 8 (0x8) - .maxstack 1 - .locals init (int32 V_0) - IL_0000: nop - IL_0001: ldc.i4.s 9 - IL_0003: stloc.0 - IL_0004: br.s IL_0006 - - IL_0006: ldloc.0 - IL_0007: ret - } // end of method NullPropagation::GetInt - - .method private hidebysig instance string - GetString() cil managed - { - // Code size 7 (0x7) - .maxstack 1 - .locals init (string V_0) - IL_0000: nop - IL_0001: ldnull - IL_0002: stloc.0 - IL_0003: br.s IL_0005 - - IL_0005: ldloc.0 - IL_0006: ret - } // end of method NullPropagation::GetString - - .method private hidebysig instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass - GetMyClass() cil managed - { - // Code size 7 (0x7) - .maxstack 1 - .locals init (class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass V_0) - IL_0000: nop - IL_0001: ldnull - IL_0002: stloc.0 - IL_0003: br.s IL_0005 - - IL_0005: ldloc.0 - IL_0006: ret - } // end of method NullPropagation::GetMyClass - - .method private hidebysig instance valuetype [mscorlib]System.Nullable`1 - GetMyStruct() cil managed - { - // Code size 15 (0xf) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1 V_1) - IL_0000: nop - IL_0001: ldloca.s V_0 - IL_0003: initobj valuetype [mscorlib]System.Nullable`1 - IL_0009: ldloc.0 - IL_000a: stloc.1 - IL_000b: br.s IL_000d - - IL_000d: ldloc.1 - IL_000e: ret - } // end of method NullPropagation::GetMyStruct - - .method public hidebysig instance string - Substring() cil managed - { - // Code size 30 (0x1e) - .maxstack 2 - .locals init (string V_0) - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: call instance string ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetString() - IL_0007: dup - IL_0008: brtrue.s IL_000e - - IL_000a: pop - IL_000b: ldnull - IL_000c: br.s IL_0019 - - IL_000e: ldarg.0 - IL_000f: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0014: call instance string [mscorlib]System.String::Substring(int32) - IL_0019: stloc.0 - IL_001a: br.s IL_001c - - IL_001c: ldloc.0 - IL_001d: ret - } // end of method NullPropagation::Substring - - .method private hidebysig instance void - Use(!!T t) cil managed - { - // Code size 2 (0x2) - .maxstack 8 - IL_0000: nop - IL_0001: ret - } // end of method NullPropagation::Use - - .method public hidebysig instance void - RequiredParentheses() cil managed - { - // Code size 56 (0x38) - .maxstack 8 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0007: dup - IL_0008: brtrue.s IL_000e - - IL_000a: pop - IL_000b: ldnull - IL_000c: br.s IL_0013 - - IL_000e: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_0013: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Done() - IL_0018: nop - IL_0019: ldarg.0 - IL_001a: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_001f: dup - IL_0020: brtrue.s IL_0026 - - IL_0022: pop - IL_0023: ldnull - IL_0024: br.s IL_0031 - - IL_0026: ldarg.0 - IL_0027: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_002c: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_0031: callvirt instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Done() - IL_0036: nop - IL_0037: ret - } // end of method NullPropagation::RequiredParentheses - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1[] - ChainsOnClass() cil managed - { - // Code size 479 (0x1df) - .maxstack 5 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1[] V_1) - IL_0000: nop - IL_0001: ldc.i4.s 9 - IL_0003: newarr valuetype [mscorlib]System.Nullable`1 - IL_0008: dup - IL_0009: ldc.i4.0 - IL_000a: ldarg.0 - IL_000b: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0010: dup - IL_0011: brtrue.s IL_001f - - IL_0013: pop - IL_0014: ldloca.s V_0 - IL_0016: initobj valuetype [mscorlib]System.Nullable`1 - IL_001c: ldloc.0 - IL_001d: br.s IL_0029 - - IL_001f: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0024: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0029: stelem valuetype [mscorlib]System.Nullable`1 - IL_002e: dup - IL_002f: ldc.i4.1 - IL_0030: ldarg.0 - IL_0031: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0036: dup - IL_0037: brtrue.s IL_0045 - - IL_0039: pop - IL_003a: ldloca.s V_0 - IL_003c: initobj valuetype [mscorlib]System.Nullable`1 - IL_0042: ldloc.0 - IL_0043: br.s IL_0054 - - IL_0045: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_004a: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_004f: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0054: stelem valuetype [mscorlib]System.Nullable`1 - IL_0059: dup - IL_005a: ldc.i4.2 - IL_005b: ldarg.0 - IL_005c: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0061: dup - IL_0062: brtrue.s IL_0070 - - IL_0064: pop - IL_0065: ldloca.s V_0 - IL_0067: initobj valuetype [mscorlib]System.Nullable`1 - IL_006d: ldloc.0 - IL_006e: br.s IL_008e - - IL_0070: ldfld class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Field - IL_0075: dup - IL_0076: brtrue.s IL_0084 - - IL_0078: pop - IL_0079: ldloca.s V_0 - IL_007b: initobj valuetype [mscorlib]System.Nullable`1 - IL_0081: ldloc.0 - IL_0082: br.s IL_008e - - IL_0084: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0089: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_008e: stelem valuetype [mscorlib]System.Nullable`1 - IL_0093: dup - IL_0094: ldc.i4.3 - IL_0095: ldarg.0 - IL_0096: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_009b: dup - IL_009c: brtrue.s IL_00aa - - IL_009e: pop - IL_009f: ldloca.s V_0 - IL_00a1: initobj valuetype [mscorlib]System.Nullable`1 - IL_00a7: ldloc.0 - IL_00a8: br.s IL_00b9 - - IL_00aa: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - IL_00af: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_00b4: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_00b9: stelem valuetype [mscorlib]System.Nullable`1 - IL_00be: dup - IL_00bf: ldc.i4.4 - IL_00c0: ldarg.0 - IL_00c1: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_00c6: dup - IL_00c7: brtrue.s IL_00d5 - - IL_00c9: pop - IL_00ca: ldloca.s V_0 - IL_00cc: initobj valuetype [mscorlib]System.Nullable`1 - IL_00d2: ldloc.0 - IL_00d3: br.s IL_00f3 - - IL_00d5: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Property() - IL_00da: dup - IL_00db: brtrue.s IL_00e9 - - IL_00dd: pop - IL_00de: ldloca.s V_0 - IL_00e0: initobj valuetype [mscorlib]System.Nullable`1 - IL_00e6: ldloc.0 - IL_00e7: br.s IL_00f3 - - IL_00e9: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_00ee: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_00f3: stelem valuetype [mscorlib]System.Nullable`1 - IL_00f8: dup - IL_00f9: ldc.i4.5 - IL_00fa: ldarg.0 - IL_00fb: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0100: dup - IL_0101: brtrue.s IL_010f - - IL_0103: pop - IL_0104: ldloca.s V_0 - IL_0106: initobj valuetype [mscorlib]System.Nullable`1 - IL_010c: ldloc.0 - IL_010d: br.s IL_0124 - - IL_010f: ldarg.0 - IL_0110: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0115: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_011a: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_011f: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0124: stelem valuetype [mscorlib]System.Nullable`1 - IL_0129: dup - IL_012a: ldc.i4.6 - IL_012b: ldarg.0 - IL_012c: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0131: dup - IL_0132: brtrue.s IL_0140 - - IL_0134: pop - IL_0135: ldloca.s V_0 - IL_0137: initobj valuetype [mscorlib]System.Nullable`1 - IL_013d: ldloc.0 - IL_013e: br.s IL_0164 - - IL_0140: ldarg.0 - IL_0141: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0146: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Method(int32) - IL_014b: dup - IL_014c: brtrue.s IL_015a - - IL_014e: pop - IL_014f: ldloca.s V_0 - IL_0151: initobj valuetype [mscorlib]System.Nullable`1 - IL_0157: ldloc.0 - IL_0158: br.s IL_0164 - - IL_015a: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_015f: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0164: stelem valuetype [mscorlib]System.Nullable`1 - IL_0169: dup - IL_016a: ldc.i4.7 - IL_016b: ldarg.0 - IL_016c: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0171: dup - IL_0172: brtrue.s IL_0180 - - IL_0174: pop - IL_0175: ldloca.s V_0 - IL_0177: initobj valuetype [mscorlib]System.Nullable`1 - IL_017d: ldloc.0 - IL_017e: br.s IL_0195 - - IL_0180: ldarg.0 - IL_0181: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_0186: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - IL_018b: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0190: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_0195: stelem valuetype [mscorlib]System.Nullable`1 - IL_019a: dup - IL_019b: ldc.i4.8 - IL_019c: ldarg.0 - IL_019d: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_01a2: dup - IL_01a3: brtrue.s IL_01b1 - - IL_01a5: pop - IL_01a6: ldloca.s V_0 - IL_01a8: initobj valuetype [mscorlib]System.Nullable`1 - IL_01ae: ldloc.0 - IL_01af: br.s IL_01d5 - - IL_01b1: ldarg.0 - IL_01b2: call instance int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetInt() - IL_01b7: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::get_Item(int32) - IL_01bc: dup - IL_01bd: brtrue.s IL_01cb - - IL_01bf: pop - IL_01c0: ldloca.s V_0 - IL_01c2: initobj valuetype [mscorlib]System.Nullable`1 - IL_01c8: ldloc.0 - IL_01c9: br.s IL_01d5 - - IL_01cb: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_01d0: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_01d5: stelem valuetype [mscorlib]System.Nullable`1 - IL_01da: stloc.1 - IL_01db: br.s IL_01dd - - IL_01dd: ldloc.1 - IL_01de: ret - } // end of method NullPropagation::ChainsOnClass - - .method public hidebysig instance int32 - CoalescingReturn() cil managed - { - // Code size 24 (0x18) - .maxstack 2 - .locals init (int32 V_0) - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0007: dup - IL_0008: brtrue.s IL_000e - - IL_000a: pop - IL_000b: ldc.i4.1 - IL_000c: br.s IL_0013 - - IL_000e: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0013: stloc.0 - IL_0014: br.s IL_0016 - - IL_0016: ldloc.0 - IL_0017: ret - } // end of method NullPropagation::CoalescingReturn - - .method public hidebysig instance void - Coalescing() cil managed - { - // Code size 27 (0x1b) - .maxstack 8 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldarg.0 - IL_0003: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0008: dup - IL_0009: brtrue.s IL_000f - - IL_000b: pop - IL_000c: ldc.i4.1 - IL_000d: br.s IL_0014 - - IL_000f: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_0014: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::Use(!!0) - IL_0019: nop - IL_001a: ret - } // end of method NullPropagation::Coalescing - - .method public hidebysig instance void - CoalescingString() cil managed - { - // Code size 36 (0x24) - .maxstack 8 - IL_0000: nop - IL_0001: ldarg.0 - IL_0002: ldarg.0 - IL_0003: call instance class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::GetMyClass() - IL_0008: dup - IL_0009: brtrue.s IL_000f - - IL_000b: pop - IL_000c: ldnull - IL_000d: br.s IL_0014 - - IL_000f: ldfld string ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::Text - IL_0014: dup - IL_0015: brtrue.s IL_001d - - IL_0017: pop - IL_0018: ldstr "Hello" - IL_001d: call instance void ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation::Use(!!0) - IL_0022: nop - IL_0023: ret - } // end of method NullPropagation::CoalescingString - - .method public hidebysig instance valuetype [mscorlib]System.Nullable`1 - InvokeDelegate(class [mscorlib]System.Func`1 f) cil managed - { - // Code size 31 (0x1f) - .maxstack 1 - .locals init (valuetype [mscorlib]System.Nullable`1 V_0, - valuetype [mscorlib]System.Nullable`1 V_1) - IL_0000: nop - IL_0001: ldarg.1 - IL_0002: brtrue.s IL_000f - - IL_0004: ldloca.s V_0 - IL_0006: initobj valuetype [mscorlib]System.Nullable`1 - IL_000c: ldloc.0 - IL_000d: br.s IL_001a - - IL_000f: ldarg.1 - IL_0010: callvirt instance !0 class [mscorlib]System.Func`1::Invoke() - IL_0015: newobj instance void valuetype [mscorlib]System.Nullable`1::.ctor(!0) - IL_001a: stloc.1 - IL_001b: br.s IL_001d - - IL_001d: ldloc.1 - IL_001e: ret - } // end of method NullPropagation::InvokeDelegate - - .method private hidebysig instance void - NotNullPropagation(class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass c) cil managed - { - // Code size 77 (0x4d) - .maxstack 2 - .locals init (bool V_0, - bool V_1) - IL_0000: nop - IL_0001: ldarg.1 - IL_0002: brfalse.s IL_000f - - IL_0004: ldarg.1 - IL_0005: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_000a: ldc.i4.0 - IL_000b: cgt.un - IL_000d: br.s IL_0010 - - IL_000f: ldc.i4.0 - IL_0010: stloc.0 - IL_0011: ldloc.0 - IL_0012: brfalse.s IL_0021 - - IL_0014: nop - IL_0015: ldstr "non-zero" - IL_001a: call void [mscorlib]System.Console::WriteLine(string) - IL_001f: nop - IL_0020: nop - IL_0021: ldarg.1 - IL_0022: brfalse.s IL_002f - - IL_0024: ldarg.1 - IL_0025: ldfld int32 ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation/MyClass::IntVal - IL_002a: ldc.i4.0 - IL_002b: ceq - IL_002d: br.s IL_0030 - - IL_002f: ldc.i4.1 - IL_0030: stloc.1 - IL_0031: ldloc.1 - IL_0032: brfalse.s IL_0041 - - IL_0034: nop - IL_0035: ldstr "null or zero" - IL_003a: call void [mscorlib]System.Console::WriteLine(string) - IL_003f: nop - IL_0040: nop - IL_0041: ldstr "end of method" - IL_0046: call void [mscorlib]System.Console::WriteLine(string) - IL_004b: nop - IL_004c: ret - } // end of method NullPropagation::NotNullPropagation - - .method public hidebysig specialname rtspecialname - instance void .ctor() cil managed - { - // Code size 8 (0x8) - .maxstack 8 - IL_0000: ldarg.0 - IL_0001: call instance void [mscorlib]System.Object::.ctor() - IL_0006: nop - IL_0007: ret - } // end of method NullPropagation::.ctor - -} // end of class ICSharpCode.Decompiler.Tests.TestCases.Pretty.NullPropagation - - -// ============================================================= - -// *********** DISASSEMBLY COMPLETE *********************** diff --git a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs index 731c7c964..186c3a252 100644 --- a/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs @@ -127,6 +127,7 @@ namespace ICSharpCode.Decompiler.CSharp new TransformAssignment(), // inline and compound assignments new NullCoalescingTransform(), new NullableLiftingStatementTransform(), + new NullPropagationStatementTransform(), new TransformArrayInitializers(), new TransformCollectionAndObjectInitializers(), new TransformExpressionTrees() diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs b/ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs index 355447889..d2c6462b5 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/DeclareVariables.cs @@ -186,6 +186,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms case UnaryOperatorType.Decrement: case UnaryOperatorType.Await: return true; + case UnaryOperatorType.NullConditionalRewrap: + return IsValidInStatementExpression(uoe.Expression); default: return false; } diff --git a/ICSharpCode.Decompiler/IL/Transforms/ILInlining.cs b/ICSharpCode.Decompiler/IL/Transforms/ILInlining.cs index 6b07e2b3f..2649cf16b 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/ILInlining.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/ILInlining.cs @@ -292,6 +292,9 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (parent is NullCoalescingInstruction && NullableType.IsNullable(v.Type)) { return true; // inline nullables into ?? operator } + if (parent is NullableUnwrap && NullableType.IsNullable(v.Type)) { + return true; // inline nullables into ?. operator + } // decide based on the target into which we are inlining switch (next.OpCode) { case OpCode.Leave: diff --git a/ICSharpCode.Decompiler/IL/Transforms/NullPropagationTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/NullPropagationTransform.cs index 34dfe061f..722fe1d2c 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/NullPropagationTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/NullPropagationTransform.cs @@ -118,6 +118,42 @@ namespace ICSharpCode.Decompiler.IL.Transforms return null; } + /// + /// if (x != null) x.AccessChain(); + /// => x?.AccessChain(); + /// + internal void RunStatements(Block block, int pos) + { + var ifInst = block.Instructions[pos] as IfInstruction; + if (ifInst == null || !ifInst.FalseInst.MatchNop()) + return; + if (ifInst.Condition is Comp comp && comp.Kind == ComparisonKind.Inequality + && comp.Left.MatchLdLoc(out var testedVar) && comp.Right.MatchLdNull()) { + TryNullPropForVoidCall(testedVar, true, ifInst.TrueInst as Block, ifInst); + } else if (NullableLiftingTransform.MatchHasValueCall(ifInst.Condition, out testedVar)) { + TryNullPropForVoidCall(testedVar, false, ifInst.TrueInst as Block, ifInst); + } + } + + void TryNullPropForVoidCall(ILVariable testedVar, bool testedVarHasReferenceType, Block body, IfInstruction ifInst) + { + if (body == null || body.Instructions.Count != 1) + return; + var bodyInst = body.Instructions[0]; + if (bodyInst.MatchNullableRewrap(out var arg)) { + bodyInst = arg; + } + if (!IsValidAccessChain(testedVar, testedVarHasReferenceType, bodyInst, out var varLoad)) + return; + context.Step("Null-propagation (void call)", body); + // if (testedVar != null) { testedVar.AccessChain(); } + // => testedVar?.AccessChain(); + IntroduceUnwrap(testedVar, varLoad); + ifInst.ReplaceWith(new NullableRewrap( + bodyInst + ) { ILRange = ifInst.ILRange }); + } + bool IsValidAccessChain(ILVariable testedVar, bool testedVarHasReferenceType, ILInstruction inst, out ILInstruction finalLoad) { finalLoad = null; @@ -136,7 +172,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (call.Method.IsStatic && !call.Method.IsExtensionMethod) { return false; // only instance or extension methods can be called with ?. syntax } + if (call.Method.IsAccessor && !IsGetter(call.Method)) { + return false; // setter/adder/remover cannot be called with ?. syntax + } inst = call.Arguments[0]; + if (call.Method.DeclaringType.IsReferenceType == false && inst.MatchAddressOf(out var arg)) { + inst = arg; + } // ensure the access chain does not contain any 'nullable.unwrap' that aren't directly part of the chain for (int i = 1; i < call.Arguments.Count; ++i) { if (call.Arguments[i].HasFlag(InstructionFlags.MayUnwrapNull)) { @@ -162,6 +204,11 @@ namespace ICSharpCode.Decompiler.IL.Transforms } } + static bool IsGetter(IMethod method) + { + return method.AccessorOwner is IProperty p && p.Getter == method; + } + private void IntroduceUnwrap(ILVariable testedVar, ILInstruction varLoad) { if (NullableLiftingTransform.MatchGetValueOrDefault(varLoad, testedVar)) { @@ -176,4 +223,14 @@ namespace ICSharpCode.Decompiler.IL.Transforms } } } + + class NullPropagationStatementTransform : IStatementTransform + { + public void Run(Block block, int pos, StatementTransformContext context) + { + if (!context.Settings.NullPropagation) + return; + new NullPropagationTransform(context).RunStatements(block, pos); + } + } }